스스로 일을 찾는 agent
「The agent finds work itself.」사람이 일을 배분하지 않아도 agent가 태스크 보드에서 직접 일을 가져옵니다.
"호출 대기"에서 "스스로 일 찾기"로
s09 / s10의 teammate는 수동적입니다: 누군가 메일함을 통해 메시지를 보내야 비로소 움직이고, 끝나면 idle 상태로 돌아가 다시 호출될 때까지 기다립니다.
s11의 autonomous teammate는 능동적입니다: 할 일이 없을 때도 완전히 멈추지 않고, 5초마다 .tasks/ 디렉토리를 스캔합니다—주인 없는 task를 발견하면 claim_task로 인수하고 바로 작업을 시작합니다.
Teammate lifecycle:
+-------+
| spawn |
+---+---+
|
v
+-------+
| WORK | <-- LLM tool_use 루프
+---+---+
|
| stop_reason != tool_use OR tool_use("idle")
v
+-------+
| IDLE | poll 매 5s, 총 12회 = 60s 타임아웃
+---+---+
|
+--> inbox에 새 메시지? → WORK 재개
|
+--> .tasks/ 스캔 중 미인수 발견 → claim → WORK 재개
|
+--> 60s 동안 아무것도 없으면 → status = shutdown, 스레드 종료
Auto-claim · 태스크 보드에서 일 "가져오기"
핵심 함수:
def scan_unclaimed_tasks() -> list: unclaimed = [] for f in sorted(TASKS_DIR.glob("task_*.json")): task = json.loads(f.read_text()) if (task.get("status") == "pending" and not task.get("owner") and not task.get("blockedBy")): unclaimed.append(task) return unclaimed
세 가지 필터 = pending + owner 없음 + blockedBy 없음. 하나라도 빠지면 안 됩니다.
claim 동작 자체에는 락(_claim_lock)이 걸려 있어, 두 agent가 동시에 같은 unclaimed task를 보고 경쟁하는 것을 방지합니다—락 안에서 한 번 더 읽고, owner가 여전히 비어 있는지 확인한 뒤, "in_progress" 상태와 owner 정보를 디스크에 씁니다.
여러 agent가 동시에 태스크 보드를 스캔하는 시뮬레이션
3명의 teammate가 idle 상태이고 3개의 task가 인수를 기다리고 있습니다. 「다음 스캔」을 클릭해 누가 먼저 가져가는지 확인해보세요.
Identity 재주입 · 압축 후에도 자신이 누구인지 알기
s06에서 배운 것처럼 auto_compact는 messages를 요약으로 교체합니다. autonomous agent가 한두 시간 실행되면 쉽게 트리거될 수 있습니다—압축 후에는 모델이 자신의 이름도, 역할도 모르게 됩니다.
s11의 해법: 새 task를 claim할 때 len(messages) ≤ 3이면(방금 압축된 것), 자동으로 messages 맨 앞에 identity 블록을 삽입합니다:
if len(messages) <= 3: messages.insert(0, { "role": "user", "content": f"<identity>You are 'alice', role: coder, team: my-team. Continue your work.</identity>", }) messages.insert(1, {"role":"assistant", "content": f"I am alice. Continuing."})
이 패턴을 identity reinjection이라고 합니다—인위적으로 구성한 한 라운드의 대화로 "모델에게 자신이 누구인지 알려주어" 역할 감각을 되찾게 합니다.