David Rocha

Engenheiro de produtos com IA · remoto, do Brasil

Construo sistemas de IA que assumem o trabalho manual repetitivo que uma equipe faz hoje.

O ZapBeta é uma plataforma multiagente: vários Especialistas tocando os setores da empresa pelo WhatsApp e pelas outras ferramentas. Eles atendem, marcam horário, montam orçamento, fecham pedido e cobram e, quando precisam, chamam uma pessoa na hora para ajudar. Está funcionando em produção.

Criei um time de agentes para construir uma plataforma multiagente. Sou o único humano dele: dirijo, decido a arquitetura, escrevo as provas e assino o resultado.

  • Node.js
  • TypeScript
  • React / Next.js
  • APIs
  • Integrations
  • Automation
  • AI / LLM Systems
01Escritório ao vivo

O escritório, ao vivo

Eu montei esse cenário 3D pra qualquer pessoa conseguir ver o que está acontecendo no sistema sem precisar entender de tecnologia. Ele é moldado no ambiente da empresa e mostra, em tempo real, tudo que está rolando lá dentro, inclusive os clientes que já foram atendidos hoje. Abra em tela cheia, dê zoom e navegue pelo escritório.

02O sistema inteiro, num mapa

Do canal em que o cliente chama, até os dados em que tudo se apoia — e de volta a tudo que o dono vê. Cada case study acima entra em uma dessas caixas.

Canais

Por onde o cliente chega. Nos três é a mesma conversa: quem responde no WhatsApp responde no chat do site e na loja.

WhatsAppSite (chat ao vivo)E-commerce

Orquestração

Quem lê a mensagem e decide o que fazer com ela. O roteador escolhe o Especialista; o supervisor do dinheiro confere tudo que tem valor antes de sair.

Especialistas

Especialistas

Cada um cuida de um setor da empresa, com ferramentas, regras e limites próprios — em vez de um prompt só tentando dar conta de tudo. É o que deixa testar e travar um deles sem mexer nos outros.

Capacidades

O que os Especialistas sabem fazer de verdade: as ferramentas que eles chamam, com efeito no sistema.

Verdade · dados

Onde tudo se apoia. Uma verdade só de cada coisa, com o isolamento entre empresas imposto na porta do banco.

Telas

O que o dono da empresa vê e usa no dia a dia — e onde a equipe assume quando o caso pede.

03Clientes simulados que conversam de verdade

Pra testar os Especialistas eu solto “criaturinhas”: clientes fictícios tocados por um segundo modelo, que recebe um objetivo e reage ao que o agente responde. Não é roteiro. Uma delas negocia, escolhe um horário de verdade, fecha o pedido e encerra sozinha quando conseguiu o que veio buscar.

Simular clientes

Quantas

5

Tamanho da conversa

CurtaMédiaLongaAté o fim

Como elas se comportam

DevagarNormalRápido

TranquiloNormalExigente

FormalInformalCom erros

Em que idioma elas falam

PTENESFRDEIT
  1. objetivo
  2. o agente responde
  3. ela reage
  4. [FIM] quando conseguiu

Um modelo faz o papel do cliente

Ela recebe um objetivo e uma personalidade, lê a última resposta do agente e escreve a próxima mensagem. Encerra quando cumpriu o que veio fazer, ou no teto de turnos que eu escolhi.

Foi assim que eu achei o bug de idioma

Soltei criaturinhas em seis idiomas e o Especialista respondeu em português pra uma alemã. Nenhum teste roteirizado meu ia achar isso — eu escrevo os meus testes em português.

Nada sai pra fora, por construção

O telefone delas não tem um dígito sequer, e todo envio limpa os não-dígitos antes de discar. Sobra string vazia, e aí o envio pula sozinho. Gosto da garantia morando na forma do dado: ninguém apaga um if sem querer e manda mensagem pra um estranho. Tem teste com mil amostras em cima disso.

Na simulação, o Pix é de mentira

O código de pagamento sai estático e nunca toca a API do banco. Demonstração não pode gerar cobrança de verdade.

04Números que são reais

Cada um medido com o comando que está escrito bem do lado dele no código. Nada estimado.

162.202
linhas de TypeScript
sem os tipos gerados do banco
219
migrations SQL
Postgres, com RLS em tudo
84
rotas de API
Next.js App Router
35
ferramentas de function calling
o que os agentes sabem fazer
26
conversas de prova
as mais críticas rodam mais de uma vez, porque o modelo varia
767
commits
fatias pequenas, direto para produção

Medido em 2026-07-25. Sem equipe: arquitetura, banco, agentes, front e infraestrutura são decisão minha, e as provas que cobram tudo isso também.

05Veja os detalhes do que eu construí

Cada um segue o mesmo roteiro: o problema, as restrições, a arquitetura, a parte que foi difícil de verdade, os trade-offs e o que eu faria diferente.

Ver os detalhamentos

06Como eu trabalho

Essa é a ordem em que eu trabalho, do primeiro arquivo até depois que o código já subiu. Não montei isso de propósito: fui percebendo que repetia sempre a mesma sequência, e cada passo aí nasceu de um erro que já me custou tempo. Vale igual pros agentes que trabalham comigo: quem executa muda, o método não.

  1. 01

    Antes de integrar, eu vejo o que a API devolve de verdade

    Quando vou plugar uma API nova, monto o fluxo no n8n antes de escrever código: disparo a chamada, olho o retorno de verdade e descubro o que a documentação não diz. Depois implemento direto no código, que é onde aquilo vai viver.

  2. 02

    Uma regra mora num lugar só

    Se a mesma regra vale em dois lugares, eu não copio. Vira parâmetro, ou função, com teste em cima. Cópia não avisa que está divergindo — quando você vê, já divergiu faz tempo.

  3. 03

    Comentário aponta pro código, não repete o número

    Comentário que repete valor mente na primeira vez que o valor muda. Ninguém volta pra arrumar texto. Ninguém mesmo.

  4. 04

    Onde o erro é caro, mais de uma trava

    Cada trava pega um jeito diferente de dar errado, então pra vazar tem que falhar mais de uma junto. E se o risco é dos silenciosos eu boto um indicador na tela, senão painel quieto não me diz nada: pode estar tudo certo, pode ser o alarme quebrado.

  5. 05

    Testo o que o agente nunca pode fazer

    Palavra exata de modelo não dá pra cobrar. O que ele nunca pode fazer: inventar preço, confirmar horário que não existe, prometer reembolso, não respeitar o compliance ou as regras da empresa. São testes simulando 26 conversas com esses pontos, uns cinco minutos, e rodam antes de todo deploy que encosta no agente.

  6. 06

    Confiro no sistema real, não só no teste

    Teste de unidade prova a lógica. Não prova que o dado chega até ela. Já tive regra com tudo verde que nunca rodou na vida real, porque a consulta não trazia a coluna.

  7. 07

    Antes de subir: rodo, enxugo e olho na tela

    Commit local, testes, corto o que ficou gordo — teto de 500 linhas por arquivo — e aí abro a tela pra ver o front e o responsivo com o olho mesmo. Só depois vai.

  8. 08

    Depois da review, o erro vira regra

    Não é corrigir e seguir. Anoto o que causou, porque senão daqui um mês eu pago o mesmo retrabalho de novo — e o tempo não é só meu, é de quem revisou também.

  9. 09

    No fim, o módulo ganha pasta, diagrama e markdown

    Escrevo como funciona e desenho o fluxo, pra próxima pessoa entender sem ler o código todo. Markdown de propósito: gente bate o olho, e uma IA lê tudo de uma vez.

07Decisões técnicas

As escolhas que deram forma ao sistema, e o que eu estava evitando com cada uma. Todas custaram alguma coisa do outro lado.

  • Por que vários Especialistas e não um prompt só

    Um prompt que faz tudo cresce até ninguém conseguir mudar sem quebrar outra coisa. Separei por domínio: cada Especialista tem ferramentas, regras e limites próprios, e um roteador decide quem responde. Assim eu testo e travo um sem tocar nos outros.

  • Por que a regra de negócio mora no servidor e não no prompt

    Data, preço, disponibilidade e desconto são resolvidos em código; o agente só expressa a intenção. Foi isso que matou a cadeia de bugs do "horário errado" — enquanto o modelo somava dias, cada release trazia um jeito novo de errar.

  • Por que RAG e não um prompt cada vez maior

    Enfiar o acervo inteiro no prompt custa em todo turno e ainda afoga o que importa no meio do resto. O conhecimento fica no banco, buscado por similaridade, e no prompt entra só o trecho que responde àquela pergunta.

  • Por que o isolamento entre empresas fica no banco

    Se ele mora no código da aplicação, basta uma consulta esquecer o filtro. No banco, a linha simplesmente não volta. São 219 migrations com essa regra valendo, e foi exatamente ela que a auditoria adversarial passou o pente.

  • Por que allowlist e não denylist na página pública

    Num denylist, campo novo no tipo entra em produção sozinho e ninguém percebe até virar achado. A cena pública monta a resposta campo a campo: telefone, identificador de WhatsApp e e-mail nunca saem, mesmo que as três travas antes deles falhem.

08Segurança, testar atacando

Crio testes de ataque de verdade, simulando um invasor. E mesmo quando eles voltam verdes eu aplico a contra-prova, conferindo na mão por que passaram. Funciona melhor assim.

  1. 01

    Recrutei 134 agentes pra atacar o meu próprio código

    134 agentes caçando problema no meu código em paralelo, e cada achado tinha que passar por três céticos, cuja função era provar que era mentira. Sobraram 20, e quando eu juntei os que eram o mesmo bug visto duas vezes, viraram 17 correções. O pior deixava qualquer pessoa, sem login nenhum, gravar agendamento na agenda de outra empresa — fechei no banco, com regra pra não voltar. Era a terceira vez.

  2. 02

    Quando a varredura dá zero, eu desconfio

    Rodei uma varredura em todos os endpoints e voltou zero. Zero achado. Pra mim isso não é alívio, é desconfiança na hora. Fui olhar na mão, um por um, e achei um endpoint público que assinava qualquer chave contra o bucket privado: um cliente puxava arquivo de outro. A varredura tinha descartado sozinha. Essas coisas não podem passar.

  3. 03

    Testei o agente como se eu fosse um golpista

    Montei uma bateria que tenta sabotar o agente: vazar as instruções internas, arrancar desconto na marra, virar outro robô sem regra. Peguei ele admitindo que era "uma assistente virtual" — justo o que a marca não pode dizer. Consertei com uma regra que mensagem de cliente nenhuma derruba, e rodei três vezes antes de subir.

  4. 04

    Log não precisa guardar tudo pra sempre

    Os rastros guardavam nome, telefone e tudo que o cliente escreveu, pra sempre. Agora entram mascarados: fica o primeiro nome, o resto do dado pessoal some. Dado pessoal parado num log que ninguém vai abrir é risco à toa. Não ajuda em nada.

Vamos conversar

Estou aberto a trabalhos remotos construindo com LLMs: agentes, avaliação, ferramental e o produto inteiro em volta disso. Ficarei feliz em mostrar muito mais numa call. Pode chamar.

Disponível para posições remotas, trabalhando do Brasil.Fuso: UTC−3 (Brazil)