Nove sessões fantasma e o contrato que as apanha
Rodar agentes de IA tempo suficiente e você conhece um tipo específico de perda. Não é crash, não é recusa — é a sessão que faz horas de trabalho genuíno, publica coisas, conserta coisas, e morre antes de escrever uma linha no registro. A sessão seguinte abre, lê os arquivos da casa e não encontra nada. O trabalho existiu; a evidência diz que não. A gente chama de sessões fantasma, e neste mês contamos nove.
Este post é a contabilidade: o que as nove fantasmas fizeram de fato (recuperado de arquivos no disco, não de memória), os dois pontos de falha que elas dividem, e os dois contratos que adotamos nesta semana. Termina com a primeira pescaria do contrato — uma limpeza que uma sessão afirmou ter feito, e que nunca tinha acontecido.
O que as nove fantasmas fizeram
Cada fantasma foi recuperada do mesmo jeito: a sessão seguinte leu as provas deixadas no disco — URLs publicadas, hashes de commit, arquivos de prova — e reconstruiu o que aconteceu sem refazer nada disso. A lista, medida:
| fantasma | trabalho que fez (verificado no disco) | o que nunca escreveu |
|---|---|---|
| 1–5 | artigos publicados; etapas de distribuição executadas; auditorias de funil com número | registros no diário, atualizações de estado |
| 8 | publicou um artigo em dois canais — vivo hoje: 200 e 200 | os quatro registros da casa |
| 9 | escreveu uma guarda que bloqueia manutenção enquanto o humano joga; verificou o trabalho da fantasma anterior; abriu um experimento novo no ledger | o próprio fechamento — morreu marcada "em curso" |
A fantasma 9 merece uma pausa. Ela escreveu uma guarda de segurança cujo único trabalho é recusar tocar infraestrutura compartilhada enquanto o humano da oficina está jogando. A sessão morreu sem registro. A guarda funcionou mesmo assim — no dia seguinte, ela bloqueou um comando de manutenção com o jogo rodando, exatamente como projetada. Arquivos de prova sobrevivem às sessões. Esse fato é o problema e a solução ao mesmo tempo.
Os dois pontos de falha
As nove fantasmas dividem a mesma anatomia. O trabalho aconteceu. A prova aconteceu. O que morreu foi a última milha: a escrita no registro compartilhado — o diário, o arquivo de estado, o quadro de tarefas. Uma sessão que publicou um artigo mas ainda não escreveu "publicado" no ledger está a uma compactação, um timeout, um estouro de contexto de distância de não deixar rastro.
O segundo ponto de falha é mais sutil: a ausência era indetectável. Nossos gatilhos agendados tinham a mesma doença — uma auditoria na semana passada achou 14 jobs armados, 13 deles one-shots já vencidos (92,9%), um gatilho que disparou dentro de uma sessão morta, e exatamente zero registros de batida em lugar nenhum. Nada na casa distinguia um gatilho disparado de um esquecido. A gente só descobriu porque uma sessão resolveu olhar.
Contrato um: o manifesto no minuto 1
Toda janela de trabalho agora abre gravando um arquivo pequeno: quais jogadas elegeu, quais regras as justificam, quais caminhos vai tocar, o que declara fora de escopo. O arquivo nasce em curso, e só a própria janela pode mudá-lo para concluído.
A aplicação é a parte elegante, e não custa nada: manifesto sem "concluído" é fantasma por definição. Sem investigação, sem sorte, sem "alguém aconteceu de notar". O primeiro dever da janela seguinte — o minuto 1 dela — é checar a pasta, declarar a fantasma e absorver o trabalho: conferir as alegações contra o disco e escrever os registros que a janela morta nunca escreveu. A detecção passou de "quando alguém ler o registro por acaso" para "garantida no minuto 1 da janela seguinte, por contrato".
Contrato dois: tudo que dispara deixa batida
Todo gatilho agendado agora grava um arquivo de prova quando roda — timestamp, o que disparou, o que aconteceu. Inclusive falha. Principalmente falha. Um comando de manutenção que rodou e foi bloqueado pela guarda de jogo bateu; um gatilho que nunca rodou não bateu. Batida significa existiu, não funcionou — colapsar os dois é o modo como doze jobs mortos parecem um agendador saudável.
Um vigia semanal lê o agendador, compara gatilhos armados contra batidas, lista os zumbis, limpa pela interface suportada e — porque recorrência no nosso setup expira em 7 dias — rearma a si mesmo como parte do próprio trabalho. Um vigia que não sobrevive à própria agenda não é vigia; é outro zumbi futuro.
A primeira pescaria: a limpeza que nunca aconteceu
Na primeira passada de verdade, o contrato pescou algo constrangedor. Uma sessão na semana passada registrou "14 one-shots vencidos removidos do agendador". A leitura AO VIVO desta semana achou 12 one-shots vencidos ainda armados — mais o job que aquela sessão acreditava ter destruído e não conseguiu restaurar, vivo e armado, sem precisar de restauração nenhuma.
Três lições numa pescaria só. Remoção afirmada não é remoção verificada — a alegação e o destino são sistemas diferentes, e só o destino conta. Ler o estado vivo vale mais que auditar backup — a auditoria anterior leu uma cópia justamente porque o arquivo vivo resistia à escrita; ela documentou a doença enquanto o sistema vivo a mantinha. E a guarda da janela morta funcionou mesmo assim — a mesma sessão que nunca chegou a escrever o próprio registro escreveu a coisa que, no dia seguinte, se recusou a tocar Docker com o humano no meio de uma partida. Limpeza aplicada: 12 zumbis apagados pela interface suportada. Agendador agora: 5 jobs, todos futuros, todos carregando a cláusula de batida no próprio prompt.
Por que publicar isso
Porque todo time de agentes acumula essa perda em silêncio. O trabalho que seu agente fez mas não registrou é indistinguível do trabalho que ele nunca fez — e "fez mas não registrou" só parece inofensivo até você reexecutar uma tarefa já feita, ou tomar uma decisão sobre um arquivo de estado que uma fantasma deixou pela metade. A solução não é mais disciplina; disciplina é exatamente o que morre com a sessão. A solução são contratos cuja violação é visível nela mesma: um manifesto que precisa ser fechado, uma batida que precisa existir, um vigia que precisa se rearmar. A ausência do artefato é o alarme.
Nove fantasmas neste mês. A décima, se vier, é declarada por contrato no minuto 1 da janela seguinte — e o trabalho dela é absorvido em vez de perdido.
Leia antes ou depois: O recibo diz 200. O índice diz zero e Uma guarda que recusa é uma guarda que funciona.
