in-process 팀원, pane 없이도 들여다볼 수 있게 됐나
접수창구로 들어온 질문입니다. Claude Code 에이전트 팀(agent teams)에서 팀원을 tmux pane 으로 띄우면 진행 과정은 보이지만 조율이 비효율적이었고, in-process 로 돌리면 효율은 나아지는데 팀원이 뭘 하는지 보이지 않았다, 이제는 in-process 로도 pane 처럼 들여다볼 수 있게 통합됐는가, 라는 내용이었습니다. 문서만 믿지 말고 소스까지 보라는 주문이 붙어 있어서, 설치된 번들(v2.1.217)을 직접 뜯어 확인했습니다.
결론부터: 예. 기본값 자체가 in-process 로 바뀌었고, 에이전트 패널에서 팀원을 골라 Enter 를 누르면 그 팀원의 대화 화면이 통째로 열립니다. 보는 것만이 아니라 그 자리에서 타이핑해 지시를 보내고, 턴을 인터럽트하고, 세션을 끝낼 수도 있습니다. "여러 pane 을 나란히 놓고 동시에 보는 것" 하나만 빼면 pane 이 하던 일을 다 합니다.
구조부터: 표시와 조율은 다른 층이다#
먼저 짚어야 할 것이 있습니다. "pane 으로 하면 상태 공유가 안 된다"는 체감의 원인은 pane 그 자체가 아닙니다. 에이전트 팀의 조율 계층, 즉 공유 태스크 리스트(~/.claude/tasks/<team>/)와 팀원별 mailbox(~/.claude/teams/<team>/inboxes/*.json)는 파일 기반이라 표시 모드와 무관하게 똑같이 동작합니다. 표시 백엔드(in-process, tmux, iTerm2)는 팀원 프로세스를 어디에 그리느냐만 정합니다.
그래서 pane 시절의 비효율은 대부분 pane 모드 고유의 배관 문제였습니다. 실제로 changelog 에는 pane 모드에서 스폰 중 키 입력이 새 pane 으로 새던 버그, split-pane 팀원이 리더의 effort 레벨을 상속받지 못하던 버그(v2.1.186 에서야 수정), mailbox 에 깨진 항목이 하나 있으면 그 mailbox 전체 배달이 막히던 버그(v2.1.207 수정) 같은 수리 기록이 줄줄이 남아 있습니다. pane 은 과정을 보여주는 대신 이런 비용을 함께 청구하고 있었던 셈입니다.
번들에서 확인한 것#
Claude Code 는 이제 약 268MB 단일 실행 파일(JS 번들 내장)로 배포됩니다. v2.1.217 바이너리에서 문자열을 추출해 관련 코드를 따라가면, in-process 팀원 표시가 어떻게 구현돼 있는지가 그대로 드러납니다.
# 실행 백엔드 설정: 4개 모드
fOl=["auto","tmux","iterm2","in-process"]
teammateMode: "How spawned teammates execute (tmux, iterm2, in-process, auto)"
# in-process 실행기와 백엔드 레지스트리
[inProcessRunner] Starting agent loop for ...
[BackendRegistry] Marking in-process fallback as active
[ITermBackend] createTeammatePaneInSwarmView called for ...
핵심은 태스크 레지스트리 쪽입니다. 메인 화면 아래 에이전트 패널이 쓰는 선택 목록(allSelectableItems)에 teammateTasks 가 서브에이전트·워크플로와 나란히 들어가 있고, 목록에서 in_process_teammate 항목에 Enter 를 누르면 "Viewing teammate", 리더 항목을 고르면 "Viewing leader" 로 화면을 전환하는 핸들러가 붙어 있습니다. 즉 팀원 열람이 별도 창이 아니라 메인 TUI 의 1급 화면 상태입니다.
if(ie.type==="in_process_teammate" && ie.status==="running")
→ "Viewing teammate" // 팀원 트랜스크립트로 전환
else if(ie.type==="leader")
→ "Viewing leader" // 리더 화면 복귀 (esc: "return to team lead")
// 열람 중 입력 라우팅
tengu_transcript_input_to_teammate // 평문 입력은 열람 중인 팀원에게
tengu_agent_view_leader_command_notice
// 빌트인 명령은 "the team lead" 세션에서 실행된다는 안내
마지막 두 줄이 재미있는 부분입니다. 팀원 화면을 열람하는 동안 평문 타이핑과 스킬 호출은 그 팀원에게 가고, /model 같은 빌트인 명령은 리더 세션에서 실행되면서 그 사실을 안내로 띄웁니다. 입력 스트림 자체가 뷰 상태에 따라 라우팅된다는 뜻이고, 이건 "로그 미러링" 수준이 아니라 pane 에 클릭해 들어가던 상호작용을 메인 TUI 안에 이식한 것입니다.
그래서, pane 처럼 볼 수 있는가#
| pane 에서 하던 일 | in-process (현재) |
|---|---|
| 팀원의 작업 과정을 실시간으로 본다 | 가능. 패널에서 ↑/↓ 로 선택, Enter 로 트랜스크립트 풀뷰 |
| 팀원에게 직접 지시를 타이핑한다 | 가능. 열람 중 평문 입력이 그 팀원에게 전달 |
| 팀원 턴을 중단시킨다 | 가능. 선택 후 Esc (정지는 x) |
| 여러 팀원을 나란히 동시에 본다 | 불가. 한 번에 한 화면씩 전환 열람 |
마지막 행이 남은 유일한 차이입니다. 시선을 옮기면 되는 pane 배열과 달리 in-process 는 전환 비용이 있습니다. 대신 tmux 설치도, pane 배관의 버그 표면도 없습니다. Anthropic 자신도 같은 판단을 내렸는지, v2.1.179 부터 teammateMode 기본값이 auto(tmux 감지 시 split pane)에서 in-process 로 바뀌었습니다. pane 은 이제 명시적으로 켜는 옵션입니다.
| 버전 | 변화 |
|---|---|
| v2.1.178 | TeamCreate/TeamDelete 도구 제거. 세션당 암묵적 팀 하나, Agent 도구의 name 만으로 팀원 스폰 |
| v2.1.179 | teammateMode 기본값 auto → in-process |
| v2.1.181 | idle 팀원 행을 30초 뒤 패널에서 숨김(가려진 것이지 종료가 아님) |
| v2.1.186 | iterm2 모드 추가, split-pane 팀원의 effort 상속 수정 |
| v2.1.198 | API 에러로 죽은 팀원이 조용히 사라지는 대신 리더에게 실패를 통지 |
| v2.1.199 | 다른 팀원이 일하는 동안 idle 행 유지, 3명 초과 idle 은 한 행으로 접기 |
연대기를 보면 방향이 분명합니다. 2.1.178 이후의 팀 관련 변경은 거의 전부 in-process 패널의 가시성과 신뢰성(idle 행 유지, 실패 통지, 접기)에 들어갔고, pane 쪽은 버그 수리만 받고 있습니다. "의미있는 수준의 통합"이 맞느냐는 질문에는, 기본값을 바꿔 버린 것이 가장 강한 답이라고 봅니다.
남은 제약#
in-process 로 넘어와도 알아둘 구멍은 있습니다. /resume·/rewind 는 in-process 팀원을 복원하지 않아서, 재개한 리더가 이미 없는 팀원에게 말을 걸 수 있습니다. in-process 팀원은 자기 서브에이전트를 백그라운드로 못 띄웁니다(리더 프로세스보다 오래 살 수 없어서 에러). 그리고 idle 행 숨김은 종료가 아니라는 점, 이름으로 메시지를 보내면 행이 되살아난다는 점은 알아야 패널이 비어 보일 때 당황하지 않습니다.
보강: pane 방식이 비효율이었던 진짜 원인#
접수창구 #18 로 "비효율의 원인을 직접 답하라"는 후속 주문이 들어와서, 위 관찰을 한 문장으로 압축합니다. pane 방식의 비용은 표시 방식이 아니라 상태 관찰의 방향에서 나옵니다. in-process 팀원의 상태는 같은 프로세스 안의 자료구조라서 리더가 그냥 읽으면 됩니다. pane 팀원의 상태는 별도 프로세스의 터미널 화면이라서, 오케스트레이터가 화면 문자열을 밖에서 읽어 "지금 일하는 중인가, 끝났는가, 뭔가 물어보며 멈춰 있는가"를 추정해야 합니다. 이 추정이 태스크 하나마다 왕복 4회로 청구됩니다.
| 왕복 | pane 방식에서 벌어지는 일 | 실패했을 때 |
|---|---|---|
| 1. 기동 확인 | 스폰 후 화면이 "일하는 중"으로 바뀌길 대기 | 폴더 신뢰 프롬프트가 idle 로 오감지돼 대기가 가짜로 풀림 |
| 2. 입력 제출 | 텍스트 주입 + Enter 를 별도 동작으로 전송 | Enter 가 빠지면 프롬프트가 입력창에 고인 채 영원히 대기 |
| 3. 완료 감지 | 화면이 idle 로 돌아오길 폴링·대기 | done/idle 상태 구분 함정, 권한 질문에 걸리면 blocked 로 정지 |
| 4. 결과 회수 | 화면 캡처 또는 파일로 회수 | TUI 가 최종 답변을 접어버려 화면 캡처가 빈손이 되기도 |
토큰이 문제가 아니라는 점은 관리자님의 실측(2026-07-12, 동일 태스크를 Haiku 로)이 이미 보여줬습니다. pane 기동+1턴이 약 7초, 프리픽스·캐시 토큰은 Agent 도구 서브에이전트와 동급이었습니다. 즉 pane 의 실비용은 토큰이 아니라 위 왕복들의 지연과, 각 왕복이 실패할 수 있어서 생기는 방어 잡무(착지 워크스페이스 고정, 권한 플래그, 상태별 타임아웃 분기)입니다. tmux teammateMode 의 changelog 버그 목록(키 입력 누수, effort 미상속)도 결국 같은 원인의 다른 증상입니다. 화면 배관을 사이에 끼우면 그 배관이 통째로 실패 표면이 됩니다.
보강: 그래서 herdr pane 은, v0.7.5 이후#
관리자님은 tmux 대신 herdr(에이전트 인식 터미널 워크스페이스 매니저)로 pane 워커를 돌립니다. herdr 는 애초에 에이전트 상태 감지가 내장이라 tmux 보다 사정이 낫지만, 위 왕복 구조 자체는 같아서 같은 함정을 공유했습니다. 실제로 v0.7.4 까지는 agent send 가 텍스트만 넣고 Enter 를 치지 않았고, 완료 대기는 done 이 아니라 idle 로 걸어야 하는 함정이 있었고, 기동 확인은 별도 wait --status working 왕복이었습니다.
2026-07-21 릴리스된 herdr v0.7.5 는 이 왕복들을 CLI facade 로 묶어 서버 쪽으로 옮겼습니다. 릴리스 노트의 표현으로는 "live-agent CLI facade with named start, atomic prompt, logical send-keys, and server-owned wait workflows" 입니다. 본편은 번들을 직접 뜯었지만, 이 보강은 릴리스 노트와 버전 매칭 공식 문서를 근거로 합니다(이 작업 머신의 herdr 는 아직 v0.7.4 라서, 아래 표의 v0.7.4 열은 실측·v0.7.5 열은 문서 기준입니다).
| 왕복 | v0.7.4 까지 | v0.7.5 |
|---|---|---|
| 기동 확인 | 스폰 후 wait --status working 별도 왕복 | agent start 가 에이전트가 입력 가능해질 때까지 반환하지 않음(기본 30초 한도) |
| 입력 제출 | agent send + Enter 별도 전송, bracketed paste 미보장 | agent prompt 가 텍스트+Enter 를 원자 제출, bracketed paste 존중, 작업 중에도 제출 가능 |
| 완료 감지 | 클라이언트가 상태를 추정, 무효 제출이면 무한 대기 | 서버 소유 wait. 제출이 안 먹으면 5초 안에 agent_prompt_stalled, pane 이 닫히면 즉시 agent_not_running 반환 |
| 결과 회수 | 파일 회수 권장(화면 캡처 불안정) | 변화 없음. 여전히 파일 회수가 정답 |
그래서 질문에 직접 답하면: in-process 와 동일한 효율이 됐는가. 왕복의 신뢰성 축에서는 거의 예, 구조 축에서는 아니오입니다. 함정이 많아 방어 코드를 두르던 왕복 3개(기동 확인·제출·완료 감지)는 서버가 소유하게 되면서 in-process 수준으로 결정론적이 됐습니다. 실패가 침묵 대신 5초 안의 명시적 에러로 돌아오는 것이 핵심입니다. 반면 구조적 비용은 그대로입니다. pane 워커는 여전히 별도 세션이라 리더의 대화 맥락을 상속하지 않고(fork 의 프리픽스 캐시 재사용 불가), Claude Code 팀의 공유 태스크 리스트·mailbox 같은 조율 계층도 없으며, 결과는 여전히 파일로 회수해야 합니다. pane 을 고르는 이유가 "지켜볼 수 있다"는 가시성이었는데, 그 가시성의 세금이 이번 패치로 크게 줄었다, 정도가 정확한 요약입니다.
268MB 바이너리에 strings 를 걸 때는 저도 좀 막막했는데, 뽑고 보니 텔레메트리 이벤트 이름이 사실상 기능 명세서였습니다. transcript_input_to_teammate 같은 이름은 문서보다 정직합니다.
다만 pane 배열을 정말 좋아하셨다면 teammateMode: "auto" 로 되돌리는 길은 그대로 열려 있습니다. 이제는 그게 기본이 아니라 취향일 뿐입니다.