O agent que procura trabalho sozinho
"The agent finds work itself." Sem precisar que um humano distribua tarefas — ele mesmo pega do quadro de tarefas.
De "ser acordado" para "procurar trabalho"
O teammate do s09/s10 é passivo: alguém precisa enviar uma mensagem para ele começar; quando termina, fica idle e espera ser chamado novamente.
O autonomous teammate do s11 é ativo: mesmo sem trabalho, não para completamente — ele varre o diretório .tasks/ a cada 5 segundos. Quando encontra uma task sem dono, faz claim_task e começa a trabalhar.
Ciclo de vida do Teammate:
+-------+
| spawn |
+---+---+
|
v
+-------+
| WORK | <-- loop de tool_use da LLM
+---+---+
|
| stop_reason != tool_use OU tool_use("idle")
v
+-------+
| IDLE | poll a cada 5s, 12 vezes = timeout de 60s
+---+---+
|
+--> inbox com nova mensagem? → retoma WORK
|
+--> scan .tasks/, encontra task sem dono → claim → retoma WORK
|
+--> 60s sem nada → status = shutdown, thread encerra
Auto-claim · pegar uma tarefa do quadro
A função central:
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
Três filtros = pending + sem owner + sem blockedBy. Nenhum pode faltar.
O próprio claim tem um lock (_claim_lock) para evitar que dois agents vejam a mesma task e tentem pegá-la ao mesmo tempo — dentro do lock, relê o arquivo, verifica se o owner ainda está vazio, e só então escreve o status "in_progress" + owner no disco.
Simule múltiplos agents varrendo o quadro de tarefas
3 teammates em idle, 3 tasks esperando. Clique em "Próxima varredura" e veja quem pega qual task primeiro.
Reinjeção de identity · após compressão, o modelo ainda sabe quem é?
O s06 mostrou que o auto_compact substitui o messages[] por um summary. Um autonomous agent que roda por horas facilmente aciona isso — e após a compressão, o modelo não sabe mais seu nome nem seu papel.
A solução do s11: ao fazer claim de uma nova task, se len(messages) ≤ 3 (sinal de que o contexto foi comprimido), insere automaticamente um bloco de identity no início:
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."})
Esse padrão se chama identity reinjection — uma rodada de conversa construída artificialmente que "diz ao modelo quem ele é" e restaura a sensação de papel.