Hoje de manhã li duas coisas que não têm nenhuma relação entre si e que, lidas juntas, descrevem quase a mesma arquitetura. A primeira foi a release v1.3.1 das skills de Matt Pocock, publicada no GitHub neste domingo. A segunda foi um documento em formato de paper, «Prompting Grok Bot: SpaceXAI Blueprint Applied to Loops for an Agent Team», sobre como desenhar uma equipe de bots. Uma é um conjunto de skills para coding agents; a outra é um guia de prompts e rotinas. A release não menciona o ESAA, e não há motivo para que mencionasse. Mesmo assim, as peças que aparecem nelas são as que eu tentei formalizar em fevereiro no paper ESAA: Event Sourcing for Autonomous Agents in LLM-Based Software Engineering (implementação em ESAA-Core): um registro rastreável de cada passo, verificação antes da entrega, aprovação humana nos pontos de risco e a decisão de corrigir o ambiente em vez de corrigir o agente. Quando eu vejo isso, a pergunta que me interessa não é quem chegou primeiro. É o que o ambiente está fazendo para que todo mundo chegue ao mesmo lugar.
O que a biologia chama de convergência
Na biologia, convergência evolutiva é o nome para linhagens independentes que desenvolvem a mesma solução porque enfrentam a mesma pressão. O olho em câmera do polvo e o dos vertebrados são o exemplo clássico: a função é quase idêntica e a origem é separada. O que a convergência informa não é parentesco, é ambiente. Se dois grupos sem ancestral comum desenvolvem a mesma peça, a peça diz mais sobre o problema que ambos enfrentam do que sobre qualquer um dos dois. Uso a metáfora porque ela me obriga a uma disciplina que a discussão sobre agentes costuma esquecer: semelhança de função não é evidência de cópia, e quem a lê como cópia perde exatamente a informação útil.
A pressão, no caso dos agentes, me parece fácil de nomear. Gerar código ficou barato. O que continua caro é saber o que aconteceu, saber se funciona, saber quem decidiu e garantir que o mesmo erro não volte. Qualquer equipe que roda agentes em volume encontra esses quatro custos, e os encontra mais ou menos nessa ordem. As quatro peças são as respostas a eles.
A mesma peça em quatro lugares
Começo pelo registro. No implement-spec de Pocock, os tickets são lidos como um grafo de tarefas; subagentes implementadores trabalham cada um em sua própria worktree sobre a fronteira de tarefas prontas, e tudo aterrissa num único integration branch. Cada implementador confirma que sua worktree parte desse branch e incorpora a ponta da integração antes de reportar a tarefa como feita, de modo que cada merge é um fast-forward. O mecanismo é o git, não um event store, mas a função é a que me levou ao log append-only do ESAA: cada passo precisa deixar um rastro que outro agente, ou outra pessoa, consiga reconstruir sem depender da memória de quem executou. O documento sobre equipes de bots chega à mesma função por outro caminho, quando pede um único resultado por bot e exige evidência e handoff explícitos.
A verificação vem logo depois. Na mesma release, cada implementador constrói seu ticket com tdd, o fluxo fecha com code-review, e a skill pr exige que o corpo do pull request traga evidência de antes e depois de que a mudança funciona. O documento atribui a Lauren Tan (@poteto) uma prática que coloca a verificação em primeiro lugar e empurra os passos determinísticos para scripts. No ESAA, a mesma função aparece como o ciclo claim e complete com verificações declaradas, revisão por um papel de QA e a regra de que uma tarefa concluída não volta atrás. São três formas de dizer que «pronto» não é algo que o agente declara, é algo que o sistema confere.
A terceira peça é a aprovação humana no ponto de risco. A skill pr pede uma avaliação explícita do perigo do merge: se a mudança é uma porta de mão única ou de mão dupla, e qual é o seu blast radius. Repare que ela não pede ao humano que leia tudo. Ela prepara o humano para decidir no ponto em que a decisão pesa. O documento sobre equipes de bots chama isso de limite de aprovação e de ponto de parada explícito. O paper do ESAA trata o mesmo problema como contenção de blast radius por contratos de fronteira por tipo de tarefa. Não tomo a coincidência do termo como sinal de nada; «blast radius» é vocabulário antigo de operações. O que me interessa é que três desenhos independentes decidiram que a atenção humana é o recurso escasso e que ela deve ser gasta onde o erro é irreversível.
A quarta peça é a que mais me chamou atenção, porque é a menos óbvia. A skill retro olha para uma sessão de programação e sugere mudanças no ambiente do agente, não no código: ponteiros de navegação, checagens automáticas, padrões de código, arquivos de orientação, economia de ferramentas, acesso a informação. E classifica cada achado antes de agir. Uma violação mecânica vira uma checagem determinística (regra de linter, hook de pre-commit ou job de CI), e o CODING_STANDARDS.md fica reservado para o que é de fato julgamento. A release chega a dizer que um repositório sem nenhum guardrail é, por si só, um achado. O documento sobre equipes de bots fala em corrigir o ambiente e não o agente, e o paper do ESAA abre com a mesma aposta: o problema central não é melhorar o prompt, é reestruturar o sistema em torno de invariantes verificáveis.
Por que isso não é cópia
Existe um teste simples para separar convergência de imitação. Cópia transmite forma; convergência transmite função. Se alguém tivesse copiado o ESAA, eu esperaria encontrar a forma: um log append-only de eventos, um envelope JSON validado, uma projeção com hash, um orquestrador como único escritor. Não encontro nada disso nas skills de Pocock, que trabalham com git, worktrees e markdown, e o documento sobre bots opera em outra camada, a de papéis, prompts e rotinas. Os mecanismos são outros, e é justamente por isso que a semelhança de função tem valor como evidência. Se o mecanismo fosse o mesmo, eu não saberia distinguir uma ideia que se sustenta de uma ideia que se espalhou.
E preciso ser honesto sobre a minha própria posição nessa árvore. O ESAA também é convergência. Event sourcing é um padrão descrito por Martin Fowler em 2005, CQRS vem da mesma tradição, revisão de código e CI são prática antiga de engenharia de software. O que eu fiz em fevereiro foi montar essas peças para o caso específico de agentes baseados em LLM e escrevê-las como protocolo. Não reivindico prioridade sobre nenhuma delas, e não acho que alguém tenha copiado o ESAA. O que eu posso dizer é mais estreito e, para mim, mais útil: as mesmas funções continuam aparecendo, em lugares que não conversam entre si, o que sugere que elas não são preferência de estilo. São respostas ao ambiente.
Já tratei uma versão parecida dessa observação em O prompt descreve o ciclo; o ESAA o institui, a partir das instruções de um agente comercial. Ali o contraste era entre um ciclo narrado em linguagem natural e um ciclo gravado fora do modelo. O que muda agora é a direção do movimento. A skill retro não se contenta em narrar a regra: ela pede que tudo o que é mecânico saia do texto e vire checagem determinística. É o mesmo gesto que motivou o ESAA, aplicado por outra equipe, numa escala menor, com outras ferramentas.
Onde cada peça deve morar
A consequência prática da convergência não é «use o ESAA». É uma pergunta mais útil para quem opera agentes: em que camada cada uma das quatro funções está instalada? A mesma função pode morar num prompt, numa skill, num hook, num job de CI ou num orquestrador, e o que ela garante muda com a camada. Uma regra escrita num markdown depende de o modelo a seguir. Uma regra num hook de pre-commit depende só de o hook rodar. Um evento gravado por um orquestrador que é o único escritor depende só do orquestrador. A diferença não é estética; é a diferença entre uma obrigação e um invariante.
O critério da retro me parece o certo para decidir isso, e eu o aplicaria além dos padrões de código. O que é mecânico deve sair da prosa: registrar o passo, conferir que a verificação rodou, impedir que uma tarefa feita seja reaberta. O que é julgamento deve ficar com uma pessoa, mas o momento de chamá-la pode ser mecânico, disparado pelo tipo de mudança ou pelo tamanho do blast radius. Corrigir o ambiente, nesse sentido, é ir movendo cada função da camada em que ela é pedida para a camada em que ela é garantida. O ESAA-Security (paper, repositório) é um exemplo do mesmo movimento num domínio específico: em vez de pedir a um modelo que «ache vulnerabilidades» em prosa livre, a auditoria vira um pipeline em que cada achado só passa a existir depois de validado e registrado, como argumentei em Pare de pedir para a IA «achar bugs» no seu projeto.
O documento que li hoje traz números e datas que eu não consegui verificar, e por isso não os uso aqui. Ele entra neste texto como sinal, não como prova. A release de Pocock, essa sim, está publicada e diz exatamente o que descrevi. Dois sinais não fazem uma lei. Mas quando linhagens que não se conhecem começam a desenvolver o mesmo órgão, eu prefiro estudar a pressão a discutir a autoria, e a pressão, aqui, é clara: num sistema em que gerar ficou barato, sobrevive o que consegue provar o que fez.