Às dez e meia da noite, um assistente de IA de outra empresa escreveu no WhatsApp de um cliente atendido por um dos nossos bots. Eles se cumprimentaram. Se despediram. Cinco minutos depois nosso bot se apresentou de novo, e assim seguiram a noite inteira: uma troca a cada 21 segundos, nove horas e meia sem pausa.
Em menos de três horas consumiram nove milhões de tokens e esgotaram o saldo do provedor do modelo. A partir daí o bot não conseguiu gerar uma frase sequer, para ninguém, por quase sete horas. A verificação de integridade seguiu verde o tempo todo. Cortamos manualmente pela manhã.
Em dinheiro foi pouco: pouco mais de nove dólares. Nenhum lead foi perdido, e isso foi sorte, não projeto. Era madrugada de quarta-feira. A mesma falha numa terça-feira de manhã teria deixado cada pessoa que escrevesse recebendo uma mensagem de erro, sem nenhum alerta para nos avisar.
Antes de consertar, separamos a causa do que a piorou. A causa foi uma só: não existia nenhum limite por contato. Um único número podia consumir todo o orçamento sem encontrar barreira nenhuma.
O resto foram amplificadores. A mensagem de erro pedia «pode repetir sua mensagem?», que com uma pessoa é boa atenção e com outro bot é uma máquina de movimento perpétuo: foi enviada mais de mil vezes. A memória do bot tinha um limite que apagava sua própria despedida, então ele se apresentou de novo 44 vezes. E o encerramento da conversa dependia do critério do modelo, que nunca o aplicou porque o outro bot foi impecavelmente educado.
Corrigimos cada falha com sua própria camada. Um limite de turnos por contato, que silencia sem bloquear. Backup real entre provedores, dessa vez no caminho que o bot realmente usa. Um teste a cada poucos minutos que pede ao modelo uma resposta do tamanho de um turno real, porque a falha foi de saldo e um teste barato teria passado sem notar nada. A verificação de integridade agora depende desse teste. Um detector de conversas que não avançam. Uma mensagem de erro que não convida mais a repetir. E os alertas técnicos chegam ao nosso canal, não ao do cliente.
Cada camada falha aberta: se um controle cai, deixa passar tráfego. Aceitamos esse risco porque um controle caído nunca deveria silenciar um cliente legítimo.
Ao verificar o conserto, apareceu algo que ninguém procurava. A transcrição de notas de voz estava quebrada havia três meses e meio. Ninguém percebeu porque o bot, com toda a educação, pedia para as pessoas escreverem.
Dali saiu uma regra que hoje aplicamos a tudo o que construímos. Projetar um sistema para não quebrar na frente do usuário continua certo, mas cada resposta educada diante de um erro precisa deixar uma contagem persistente de quantas vezes aconteceu. A verificação de integridade testa a função, não a infraestrutura. E nenhuma mensagem de erro convida a tentar de novo quando do outro lado pode haver uma máquina.