Vibe coding é caça-níquel. Engenharia com agentes é disciplina.
A linha entre brincar com demo e operar em produção: spec antes, dataset de eval, revisão de diff obrigatória em todo agente.

Aprovei um diff de agente porque a suíte ficou verde. Três dias depois, um caso que nenhum teste cobria derrubou um fluxo de estorno em produção. O código estava certo pela única medida que eu tinha olhado, e errado pela única que importava.
A ficha caiu ali: o que eu chamava de trabalho não era engenharia, era caça-níquel. Eu puxava a alavanca do prompt, torcia pra sair verde e tratava o verde como prova. Funciona até o dia em que não funciona, e aí a conta chega com juros.
A diferença não está na ferramenta
Vibe coding e engenharia com agentes usam o mesmo modelo, o mesmo editor, muitas vezes o mesmo prompt inicial. Quem olha de fora não distingue. A separação é invisível porque ela é de método, não de stack.
Vibe coding é prompt-and-pray: você descreve, o agente gera, você lê por cima, roda, e se passou, mergeia. É ótimo pra protótipo, pra explorar, pra descartar. O problema começa quando esse mesmo gesto atravessa a fronteira da produção sem trocar de roupa.
Engenharia com agentes é o gesto oposto. O agente é rápido e confiante, e confiança sem verificação é exatamente o perfil de quem você não deixa mergear sozinho. Então você monta a verificação em volta dele.
Spec antes, não depois
O primeiro corte é escrever a spec antes do prompt. Não um parágrafo vago, mas o contrato: o que a função aceita, o que ela recusa, o que nunca pode acontecer. Estorno não excede o valor pago. Idempotência na retry. Erro de rede degrada, não corrompe.
Sem isso, o agente inventa o contrato pra você, e ele inventa o mais fácil de satisfazer, não o mais certo. Um diff verde contra um contrato que o próprio agente escolheu é um espelho, não um teste.
O loop que passei a exigir
Depois do estorno, parei de aprovar diff no olho. Montei três travas, e nenhuma delas é ferramenta nova:
- Dataset de eval, não suíte de teste. Teste prova um caso conhecido. Eval roda o comportamento contra dezenas de casos, inclusive os adversariais que eu de propósito escrevi pra quebrar, e me dá uma taxa de acerto, não um verde binário.
- Revisão de diff obrigatória, linha a linha, com a pergunta certa. Não “compila?”, e sim “o que este diff faz quando a entrada é hostil?”.
- Fronteira explícita em volta da saída do agente, do mesmo jeito que eu trato qualquer integração instável.
Uma linha de eval vale mais que a intenção:
// eval: um contrato que o agente não pode quebrar, nem nos casos que escrevi pra derrubar
test('estorno nunca excede o valor pago', () =>
expect(refund(order).amount).toBeLessThanOrEqual(order.paid));
A pergunta deixa de ser “passou no teste?” e vira “com que frequência acerta, e o que acontece nas vezes em que erra?”.
Isso não desacelera o agente. Desacelera a minha vontade de acreditar nele.
O que a disciplina compra
O verde de uma suíte responde uma pergunta pequena: este caso específico, que alguém lembrou de escrever, ainda passa. Ele não diz nada sobre os casos que ninguém escreveu, e é sempre um desses que chega em produção.
Vibe coding aposta que os casos que faltam não vão aparecer. Engenharia com agentes assume que vão, e transforma essa suspeita em dataset, em revisão, em fronteira. A ferramenta é a mesma. O que muda é se você está operando uma máquina ou puxando uma alavanca.
Caça-níquel paga às vezes. É esse “às vezes” que engana.