Nas quartas de final da Agentic Football Cup, o Claudinho FC ia enfrentar o Um Prompt Um Sonho, o time de melhor campanha da copa. Ele tinha ganhado os três jogos da fase de grupos e liderava a tabela dos amistosos, com só 6 derrotas em 32 jogos. Contra a gente, já tinha ganhado de 4 a 0 e de 5 a 1. A gente tinha uma noite e uma manhã para se preparar, e o que fez diferença foi estudar os adversários.
Este é o segundo texto sobre o Claudinho FC na copa que a Dati fez de 21 a 23 de outubro, em cima de um simulador de futebol da AWS. Cada time tinha cinco agentes de IA, um por jogador, rodando no Amazon Bedrock AgentCore. A cada tick, uma rodada de 2 segundos, cada agente recebia o estado da partida e devolvia um comando. No primeiro texto eu contei como o nosso time passou a responder em uns 100 milissegundos, com o código decidindo a jogada e o modelo lendo o chat da técnica. Aqui eu conto como a gente se preparou para esse jogo.
O plano
No primeiro dia, eu reuni o meu time e disse que tinha um plano. Nos outros times havia gente com mais experiência que eu em programação, em AgentCore e em futebol, e nisso eu não ia ganhar deles. Mas eu tinha uma teoria, a de que time que está ganhando de lavada não mexe muito. Ele muda uma coisa ou outra, mas não troca o núcleo dos agentes, e por isso pode ser estudado. Se a gente passasse da fase de grupos, eu ia ter tempo e jogos para entender cada adversário e achar as falhas que eles mesmos não viam.
No fim da tarde do mesmo dia, antes de a fase de grupos começar, eu abri uma sessão do Claude Code só para estudar os adversários. Outras sessões cuidavam do nosso time. Todas liam os dados e propunham mudanças, mas quem decidia o que subia para o jogo era eu.
Os nossos jogadores eram Ctrl+Z no gol, Rollback e Token na defesa, Copy-Paste no meio e Deploy na Sexta no ataque. O portal tinha uma tabela dos amistosos entre os times, que não contava para a copa. Quando a fase de grupos começou, a gente era 12º de 14 nessa tabela, com 2 vitórias em 11 jogos, e mesmo assim passou com uma vitória e uma derrota.
O que o log mostrava
Para estudar os adversários, eu tinha duas fontes. A primeira era o log dos nossos próprios agentes. A cada tick, o servidor da copa manda o estado da partida, com a posição da bola e dos dez jogadores, os cinco nossos e os cinco do adversário. Desde o primeiro dia, o agente do goleiro gravava esse estado inteiro no log, uma linha por tick, porque a gente usava isso para achar os erros do nosso time. O log de cada runtime do AgentCore vai para o CloudWatch, o serviço de logs da AWS. Então todo jogo que a gente jogou ficou gravado com a posição de cada adversário.
Um script lia essas linhas numa janela de horário e resumia o jogo. Ele mostrava o placar, a formação deles em cada fase do placar, quantos deles ficavam na nossa metade, onde a gente perdia a bola e de onde eles chutavam. Contra o Um Prompt Um Sonho, ele mostrou que 17 das 20 bolas que perdemos em dois amistosos foram passes ou chutões nossos interceptados. Mas o log só cobria os jogos do Claudinho FC, então de dois times que chegaram às quartas a gente não tinha nada.
O que o vídeo mostrava
A segunda fonte era o vídeo, porque os jogos da copa eram transmitidos numa reunião que ficava gravada. Uma sessão do Claude Code baixou a gravação da fase de grupos, de umas duas horas, e achou o começo e o fim de cada partida pela transcrição da reunião. Eu pedi para ela instalar o ffmpeg, um programa que corta vídeo, e ela salvou um vídeo por jogo numa pasta.
Eu mandava cada vídeo para o app do Gemini, com um prompt pedindo uma ficha do time em JSON. A ficha tinha campos fixos, como de onde o time chuta, se o goleiro sai do gol e se o zagueiro finaliza, cada um com um nível de confiança.
Nos jogos em que havia vídeo e log, as sessões compararam os dois campo por campo e viram que o Gemini acertava o tipo de jogada. Ele acertou o placar, o momento dos gols, o tipo de perda de bola e o jeito de cada time sair jogando depois de sofrer gol. Um exemplo é o 0 a 5 que a gente tomou na sexta de manhã, que eu conto mais adiante. Nesse jogo, ele viu que a nossa saída depois do gol era ruim, e dois dos cinco gols nasceram dela.
O Gemini errava quem fez a jogada e de onde. No mesmo 0 a 5, ele errou o jogador em 4 dos 5 gols e o lugar de todos os chutes que dava para conferir. E quando o prompt pedia um campo que o vídeo não mostrava, ele preenchia.
Por isso o prompt mudou. A confiança alta passou a exigir dois momentos do vídeo, com 10 segundos ou mais entre eles. O Gemini também passou a ter que listar cada chute, com o número de chutes do relatório no prompt.
Juntando os dois
Dessa comparação saiu uma regra, a de que, onde tem log, o log manda na posição, em quem fez e em de onde fez. O vídeo responde o tipo de jogada e cobre os jogos que a gente não jogou. Quando os dois discordam, a discordância fica anotada.
Os 7 adversários que ainda estavam na copa viraram perfis em JSON, prontos no fim da noite do dia 22. Cada traço do perfil guarda o valor, a evidência, a fonte e a confiança.
Ainda naquela noite, essa base virou uma versão do nosso time feita para as quartas. Como eles roubavam os nossos passes longos, a versão nova só lançava a bola quando a linha estava livre, e no resto o jogador conduzia. O chute de longe passou a mirar o centro do gol, porque no log os gols entravam todos ali, e às 22h03 a versão nova já estava no ar.
Testar antes de subir
Toda mudança passava por duas checagens antes de ir para o jogo. A primeira era o replay, que roda as regras novas em cima do log de um jogo de verdade e mostra o que cada jogador teria decidido em cada tick. A segunda era a bancada, 78 situações de jogo montadas com a jogada que a regra espera em cada uma. Depois vinha o deploy no AgentCore, com um script que subia os cinco runtimes de uma vez, em 4 a 5 minutos.
A sexta de manhã
A versão das quartas jogou um amistoso na sexta de manhã contra o EstagIA FC, o time que a gente ia enfrentar na final, e perdeu de 5 a 0. Nesse jogo, a gente trocou 20 passes sem chutar nenhuma vez.
Logo depois do 0 a 5, eu mudei o time inteiro para uma regra só, a de que quem pega a bola chuta para o gol. O log confirmou a ideia, porque o chute que saía limpo entrava em mais da metade das vezes. O primeiro jogo com a regra, de novo contra o EstagIA, deu 0 a 3, com 19 chutes e nenhum gol.
A regra ficou até a final. O que mudou depois do 0 a 3 foi o jeito de mexer no time. As sessões queriam jogar a versão fora e começar outra, e eu perdi a paciência. Dali em diante, depois de cada jogo, a gente olhava no log o que cada jogador tinha feito e mudava um comportamento de cada vez. Essa é a vantagem do código que eu contei no primeiro texto, porque cada mudança valia em todo tick e o log do jogo seguinte mostrava se ela tinha funcionado.
Foram mais três amistosos assim, cada um com uma mudança, e uma delas funcionou de cara. No 0 a 3, os zagueiros tinham espaço e mesmo assim chutavam fraco de longe, então o jogador livre na nossa metade passou a conduzir a bola antes de chutar. Essa condução fez dois dos três gols do 3 a 1 contra o Donas da Bola, outro time que tinha chegado às quartas, e ficou até o fim da copa.
Outra mudança não funcionou. Ela começou com uma coisa que eu tinha percebido na tela, a goleira deles pegando quase todos os nossos chutes. O Gemini e o log confirmaram que as goleiras ficavam paradas no centro, então a gente passou a chutar no canto quando estava perto do gol. O canto foi 0 de 9, e todos os nossos gols da manhã saíram no centro. Pelo log, o chute no centro vinha de longe e passava do lado da goleira parada. O de canto vinha de perto, quase sempre com um marcador colado, e dois dos nove foram para fora.
Pela nossa análise, o EstagIA manteve o mesmo padrão de jogo de quinta até a final, e era isso que deixava medir cada mudança contra o mesmo adversário. A exceção foi o Donas da Bola, que no dia 22 respondia no tempo de quem usa o modelo e no dia 23 no tempo de quem decide por código. Pela mudança no tempo, a gente concluiu que ele tinha trocado o núcleo dos agentes de um dia para o outro. Ele também não vinha ganhando de lavada, porque tinha passado da fase de grupos com duas vitórias por um gol, então a troca combinava com a aposta.
A tarde
Nas quartas, a gente ganhou de 2 a 0 com dois gols do Token, chutando no centro de dentro da nossa metade. Depois do primeiro gol, eles subiram a linha para a nossa metade, como o perfil dizia que faziam quando estavam perdendo, e o chute longo no centro passou por todos. Os dois gols juntaram o que o log tinha mostrado, a mira no centro, da noite de quinta, e a condução do jogador livre, da sexta de manhã. O Gemini também tinha visto que os três gols que eles sofreram na fase de grupos foram chutes de longe. Como de onde o chute saía era o que o vídeo errava, essa pista entrou no perfil com confiança baixa. Quem decidiu o jeito de atacar foi o log.
Antes da semifinal contra o Dati Fut Talks, as sessões trouxeram uma proposta tirada do log. Nos nossos jogos contra eles, um zagueiro ficava parado no centro, na frente da goleira, e no replay quase todos os nossos chutes no centro teriam esse zagueiro no caminho. A proposta mandava esses chutes para o canto, mas vinha só da geometria do replay, e de manhã o canto tinha feito 0 de 9. Como subir uma versão nova pouco antes da semifinal também era arriscado, eu preferi não subir. A gente ganhou de 8 a 2, com aquele zagueiro pegando só 1 dos nossos 19 chutes. O replay mostrava a decisão de cada jogador, mas não o que ia acontecer com a bola. A semifinal era uma melhor de três, e depois vieram 1 a 3 e 4 a 3.
A final foi contra o EstagIA, o time do 0 a 5 e do 0 a 3 da manhã. Contando o amistoso de quinta, eram cinco jogos contra eles e cinco derrotas. O primeiro jogo da final foi 2 a 1, no gol de ouro, com um chute do Rollback de dentro da nossa metade.
No segundo jogo, que perdemos de 2 a 3 no gol de ouro deles, os três gols deles saíram do mesmo jeito que de manhã. Um chute nosso era interceptado perto do meio-campo, e eles chutavam no tick seguinte. Para o terceiro jogo, eu não mexi no time. Contra eles, a versão que jogou a tarde inteira tinha feito 2 a 1 e 2 a 3, e as versões da manhã tinham perdido os quatro jogos. O terceiro jogo foi 4 a 3, com dois gols do Copy-Paste chutando de dentro da nossa metade, e o Claudinho FC foi campeão.
O plano dependia de uma aposta, a de que time que está ganhando não muda, e ela valeu de dois jeitos. Nas quartas, o Um Prompt Um Sonho subiu a linha quando começou a perder, como o perfil previa, e os nossos dois chutes no centro passaram por ela. O EstagIA manteve o mesmo padrão desde quinta, e cada jogo da sexta de manhã contra ele mostrava se a nossa última mudança tinha funcionado. O chute no canto não funcionou e saiu. A condução do jogador livre funcionou e ficou até o título. Eu queria estudar os adversários para achar as falhas deles, e o EstagIA também me mostrou as nossas.









