세션을 두세 개 동시에 띄워놓고 일하다 보면, 한쪽에서 끝난 작업 결과를 다른 쪽에 알려주려고 직접 복사해서 옮기는 경우가 생깁니다. A 세션에서 스키마 마이그레이션이 끝났는데 B 세션은 그걸 모르고 옛 스키마 기준으로 코드를 계속 짜고 있으면, 나중에 합칠 때 다시 맞춰야 합니다. 사람이 중간에서 "A 끝났대, 이거 참고해"라고 전달해주지 않으면 세션들은 서로의 상태를 전혀 모릅니다.
어떤 작업이었나
이번 세션과는 별도로 다른 저장소 작업을 보던 세션이 있다고 가정하고, 지금 세션에서 그 세션한테 뭔가 물어볼 수 있는지 확인해보고 싶었습니다. 터미널 탭을 왔다 갔다 하면서 "그쪽 작업 끝났어?"를 매번 직접 묻는 대신, 세션이 알아서 다른 세션에 말을 걸게 할 수 있는지가 궁금했습니다.
AI를 어떻게 활용했나
먼저 ListAgents를 호출해서 지금 이 세션이 누구한테 말을 걸 수 있는지 확인했습니다.
ListAgents()
돌아온 결과는 이랬습니다.
This session is twothumb-92 [5ec80a] — the name other sessions use to message it
(it is not listed below; a message to it would be a message to yourself).
No reachable agents — no other Claude session is running on this machine right
now (peer messaging itself is available; a session appears here once it is started).
기대했던 건 "다른 세션 목록"이었는데, 지금 떠 있는 세션이 이것 하나뿐이라 당연히 빈 목록이 나왔습니다. 대신 이 세션 자신의 이름(twothumb-92)과 짧은 식별자([5ec80a])가 먼저 눈에 들어왔습니다. 이 이름이 바로 다른 세션이 나를 호출할 때 쓰는 주소입니다.
문서를 찾아보니 ListAgents가 보여주는 목록은 세션 안에서 띄운 서브에이전트, 같은 팀의 팀원, 같은 머신에서 도는 다른 로컬 세션, 그리고 Remote Control로 연결된 경우 클라우드 세션과 다른 머신의 세션까지 포함한다고 되어 있었습니다. 지금은 이 세션 혼자 돌고 있으니 당연히 아무것도 안 뜬 겁니다. 실제로 메시지를 보내려면 받을 세션이 먼저 어딘가에서 살아있어야 한다는 전제조건을 그제서야 이해했습니다.
목록에 상대가 뜬다고 가정하면, 메시지를 보내는 쪽은 SendMessage를 이렇게 씁니다.
SendMessage({
to: "payments-worker",
message: "스키마 마이그레이션 끝났어. tenant_id 컬럼 추가됐고, main에 리베이스해도 안전해."
})
to에는 ListAgents가 보여준 이름을 그대로 넣으면 됩니다. 문서에 따르면 이렇게 전달되는 건 순수 텍스트뿐이고, 보내는 쪽의 대화 기록이나 파일은 같이 넘어가지 않습니다. 상대 세션이 그 내용을 참고해서 파일을 열어보고 싶으면, 받은 세션이 자기 권한으로 직접 열어야 합니다.
처음에 헷갈렸던 부분
ListAgents가 빈 목록을 돌려줬을 때 처음엔 권한 문제인가 싶어서 설정을 다시 확인했습니다. 실제 원인은 단순히 "말 걸 대상이 없다"는 것뿐이었는데, 에러 없이 "no reachable agents"라고만 나오니 설정이 잘못된 건지 상대가 없는 건지 바로 구분이 안 됐습니다.
같은 머신에서 도는 세션과, 클라우드나 다른 머신에 있는 세션은 보이는 방식이 다르다는 점도 헷갈렸습니다. 같은 머신의 세션은 소켓으로 바로 연결되어 있어서 떠 있으면 바로 목록에 나오는데, 클라우드 세션이나 다른 머신의 세션은 Remote Control로 연결되어 있어야만 목록에 등장합니다. 지금처럼 Remote Control 연결 없이 혼자 도는 클라우드 세션에서는 애초에 다른 머신의 세션을 찾을 방법이 없다는 뜻이었습니다.
받는 쪽 권한도 그대로 적용된다는 점을 놓치기 쉬웠습니다. 메시지로 "이 파일 지워줘"라고 보내도 상대가 그걸 승인 없이 바로 실행해주는 게 아니라, 받는 세션 자신의 권한 설정과 승인 절차를 그대로 거칩니다. 메시지 하나로 다른 세션의 권한을 건너뛸 수 있는 구조는 아니었습니다.
결과와 얻은 팁
ListAgents를 먼저 불러보면 지금 세션이 누구한테 말을 걸 수 있는지, 그리고 다른 세션이 나를 부를 때 쓸 이름이 뭔지 바로 확인됩니다. 빈 목록이 나와도 에러는 아닙니다 — 단순히 상대가 아직 없다는 뜻입니다.- 메시지로 넘어가는 건 텍스트뿐이라, "이 파일 참고해서 고쳐줘" 같은 요청을 보내도 파일 자체는 안 넘어갑니다. 받는 세션이 자기 경로에서 그 파일을 직접 찾을 수 있어야 의미가 있습니다.
- 권한은 받는 쪽 기준으로 따로 적용됩니다. 보내는 세션이 전체 권한을 가지고 있어도, 받는 세션이 더 좁은 권한으로 떠 있으면 그 메시지가 요청하는 작업은 받는 쪽 승인 절차를 그대로 거칩니다. 한쪽 권한을 다른 쪽에 빌려줄 수는 없습니다.