chatwoot-develop/progresso/2026-01-17_hardening_reservas.md
2026-01-19 19:26:23 -03:00

3.8 KiB

Manifesto de Hardening: Arquitetura de Reservas & Pix (Jasmine/Daniela)

Data: 17/01/2026 Status: Estável (Com detalhes finos de valor em análise)

1. O Contexto

O sistema de reservas via WhatsApp (Jasmine -> Daniela) enfrentava instabilidades críticas que comprometiam a confiança do usuário:

  • Alucinação de Suíte: A IA inventava ou persistia na suíte errada (ex: "Alexa") mesmo quando o usuário pedia outra ("Stilo"), ignorando o contexto recente.
  • Loop de Confirmação: O agente entrava em loop perguntando "Posso reservar?" infinitamente.
  • Pix Quebrado: O código Copia e Cola chegava cortado ou mal formatado, impossibilitando o pagamento.
  • Datas Erradas: "Amanhã às 21h" era interpretado como "Hoje às 21h", gerando erro de disponibilidade.

2. Soluções Implementadas (A Muralha de Defesa)

🛡️ 1. Anti-Alucinação (O "Muro de Berlim")

Alteramos a lógica de leitura de histórico nas ferramentas CheckAvailabilityTool e CreateReservationIntentTool.

  • Como funciona: O sistema varre as mensagens do usuário de trás para frente. Ao encontrar a palavra-chave "Reiniciar" (ou "Resetar"), ele PARA a leitura.
  • Resultado: Qualquer suíte mencionada antes do reset se torna invisível para a ferramenta de validação. Isso impede que "fantasmas" de conversas passadas contaminem a nova reserva.
  • Aliases: Adicionamos suporte a apelidos (ex: "hidro" = "Hidromassagem") para evitar bloqueios indevidos.

📅 2. Resolução de Data Inteligente

Corrigimos o bug onde fornecer um horário (check_in_at) sobrescrevia a data (date).

  • Nova Lógica: Se o usuário diz "Amanhã" e depois "21:00", o sistema combina as duas informações (Base Date + Time), garantindo que a reserva caia no dia correto.

🔁 3. Check de Idempotência & Anti-Loop

Implementamos uma trava na CreateReservationIntentTool.

  • Lógica: Antes de criar uma reserva, verificamos se já existe um "draft" idêntico (mesma suíte/preço) criado nos últimos 5 minutos.
  • Ação: Se existir, a ferramenta BLOQUEIA a criação e retorna uma instrução imperativa: "Reserva JÁ EXISTE. Pare de criar e CHAME O PIX AGORA."
  • Resultado: Fim dos loops de "Reserva confirmada" repetidos.

💸 4. Pix Robusto & Formatado

  • Formatação: O GeneratePixTool agora retorna o código dentro de um bloco Markdown triplo (```), garantindo que o WhatsApp exiba como código monoespaçado (fácil de copiar).
  • Reconstrução (Frankenstein): Se a API do Banco Inter retornar um código cortado (iniciando com /spi/...), o sistema detecta e anexa automaticamente o cabeçalho padrão (000201...bancointer.com.br), salvando o pagamento.
  • Log de Caixa Preta: Adicionamos log do JSON bruto do banco para auditoria.

💰 5. Trava Global de Preço

  • Segurança: A ferramenta de criação agora compara o preço da reserva com a última cotação de disponibilidade feita na conversa.
  • Resultado: Se a IA tentar cobrar R$ 80,00 por uma suíte que foi cotada a R$ 60,00, o sistema bloqueia a transação.

3. Estado Atual & Próximos Passos

O fluxo "Happy Path" (Reiniciar -> Escolher -> Reservar -> Pix) está funcional e seguro.

Ponto de Atenção (Investigação Ativa):

  • Houve um relato de divergência no valor final do Pix (Texto diz R$ 40,00, Pix cobra R$ 60,00).
  • Ação: Adicionamos logs explícitos do ID da reserva no GeneratePixTool para rastrear se o sistema está pegando uma reserva "zumbi" antiga.

Arquivos Chave Alterados:

  • enterprise/app/services/captain/tools/check_availability_tool.rb
  • enterprise/app/services/captain/tools/create_reservation_intent_tool.rb
  • enterprise/app/services/captain/tools/generate_pix_tool.rb
  • enterprise/app/services/captain/inter/cob_service.rb