여러 agent가 파일 메일함으로 통신한다
subagent에서 teammate로: 일회성 → 지속; 익명 → 이름 있음; 통신 없음 → 파일 메일함.
Subagent와 Teammate의 차이점은?
S04의 subagent는 간단합니다: spawn → 실행 → summary 반환 → 소멸. 일회성이고 이름이 없으며 부모/자식 간에 양방향 통신이 없습니다.
s09의 teammate는 이름이 있고, 반복적으로 깨울 수 있으며, 메시지를 주고받을 수 있는 독립적인 agent입니다:
subagent (s04): spawn -> execute -> return -> destroyed
teammate (s09): spawn -> work -> idle -> work -> ... -> shutdown
두 메커니즘의 용도는 다릅니다:
- subagent는 "구체적인 탐색 하나를 수행"할 때 적합합니다 (예: PR 하나 review).
- teammate는 "지속적으로 역할을 담당"할 때 적합합니다 (예: 장기 reviewer, 새 commit이 있을 때마다 깨워줌).
메일함은 JSONL 파일
팀원들이 어떻게 통신할까요? s09는 가장 단순한 메커니즘을 사용합니다: append-only JSONL 파일.
.team/ config.json # 팀원 명단 inbox/ alice.jsonl # alice에게 보내는 메시지는 여기에 append bob.jsonl lead.jsonl
send는 open("alice.jsonl", "a").write(msg)이고, read는 전체 파일을 읽고 JSONL을 파싱한 다음 truncate으로 비웁니다 (drain 의미론).
왜 메모리 큐가 아닌 파일을 쓰나요? 파일은 자연적으로 지속됩니다. agent 재시작, 프로세스 충돌, 심지어 서버 재부팅 후에도—메일은 그대로 있습니다. 읽을 수 있고 grep할 수 있어서 디버깅 경험이 매우 좋습니다.
lead에서 alice까지 메시지의 전체 흐름 보기
아래 widget에서 alice에게 메시지를 보내고 각 단계에서 디스크에 무슨 일이 일어나는지 보세요.
5가지 메시지 유형
s09는 5가지 메시지 유형(VALID_MSG_TYPES)을 정의하지만 앞의 두 가지만 구현됩니다. 나머지 세 가지는 s10 프로토콜 강의에서 추가됩니다:
message— 일반 텍스트 메시지.broadcast— 자신 외 모든 teammate에게 전송.shutdown_request/shutdown_response— 우아한 종료 요청/응답 (s10).plan_approval_response— 계획 승인 (s10).
왜 선언만 하고 구현하지 않을까요? s09는 "프로토콜 확장"을 개방형으로 만들고 싶어서입니다—메시지 유형은 열거형이고, 새 유형을 추가하려면 딕셔너리에 한 줄 추가하고 _exec 라우터에서 처리하면 됩니다.