O desafio por trás da fraude

A Rinha de Backend 2026 propôs um módulo de detecção de fraude para transações de cartão. Cada requisição precisava ser transformada em um vetor de 14 dimensões, comparada ao dataset de referência e classificada a partir dos cinco vizinhos mais próximos.

O fraud_score é a proporção de fraudes entre esses cinco vizinhos. A resposta combina esse valor com a decisão de aprovar ou negar a transação. Tudo isso precisava rodar atrás de um load balancer, com pelo menos duas instâncias da API e um orçamento total de apenas 1 CPU e 350 MB de memória.

Precisão e latência contam ao mesmo tempo

A pontuação é o que torna o problema difícil. Falsos positivos, falsos negativos e erros HTTP reduzem a nota de detecção, enquanto a latência p99 determina uma segunda parcela do score. Uma solução precisa ser rápida e correta ao mesmo tempo.

Isso tornou o formato do índice e o caminho crítico da busca tão importantes quanto a implementação do endpoint. O dataset de referência precisava caber no orçamento de memória e continuar acessível com baixa variância de latência.

A solução em Rust

Escolhi Rust pelo controle de memória e pela previsibilidade em um serviço limitado por CPU, RAM e p99. O repositório usa um índice binário compacto, mapeamento de memória somente leitura compartilhado entre as instâncias e uma API otimizada para executar a busca k-NN.

A submissão final foi identificada no ranking com Rust, processamento bloqueante via pthread, wakeup com SCHED_FIFO, load balancer com SCM_RIGHTS, poda por bounding box em IVF e SIMD AVX2.

IA como pair programming, não como piloto automático

Usei IA do planejamento ao tuning, mas não no formato “gera tudo para mim”. O Claude Code ajudou a modelar o problema, discutir a estrutura de dados do k-NN e quebrar o trabalho em tarefas antes da primeira linha de código.

O desenvolvimento foi puxado por testes, com integração contínua desde o primeiro commit. Em um fluxo com agentes, código confuso se transforma em contexto ruim; contexto ruim, por sua vez, multiplica bugs e retrabalho.

  • Modelos premium ficaram reservados para decisões de arquitetura e investigação difícil.
  • Refactors e tarefas mecânicas foram direcionados a modelos open source pelo OpenCode.
  • Testes e CI funcionaram como limites objetivos para cada iteração assistida por IA.

Resultado final e aprendizado

No resultado final oficial, a submissão josehbr-rust terminou em 27º lugar, com p99 de aproximadamente 1,46 ms, score de 5.835,59 e nenhuma ocorrência de falso positivo, falso negativo ou erro HTTP no teste publicado.

O principal aprendizado não foi sobre fraude. IA não substitui entendimento técnico: ela acelera quem já trabalha com testes, CI, código legível e decisões verificáveis. Sob restrições severas, uma solução “quase certa” falha rápido, e um processo de engenharia disciplinado deixa de ser preferência para virar o que decide o resultado.