fix(captain): memory allows 'Solicitou Pix ..., aguardando pagamento'
Some checks failed
Build and Push to GHCR (multi-arch) / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Build and Push to GHCR (multi-arch) / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Build and Push to GHCR (multi-arch) / merge (push) Has been cancelled

Previous commit made the extractor reject any reservation-shaped fact
without a literal payment confirmation in the conversation. That
killed the useful middle ground: a customer who requests a Pix and
hasn't paid yet is still a concrete signal worth remembering (for
follow-up, interest mapping, CRM). We were going from "hallucinated
reservation" to "nothing remembered".

Add the intermediate pattern:
- Payment confirmed → "Reservou X para Y em DD/MM/AAAA"
- Pix generated, no payment yet → "Solicitou Pix para X em DD/MM/AAAA, aguardando pagamento"
- Just a price quote → nothing

The "aguardando pagamento" suffix is required so the downstream recall
never confuses it with a closed reservation.
This commit is contained in:
Rodribm10 2026-04-22 05:01:24 -03:00
parent d2c2c6b7fe
commit 08a06c6528

View File

@ -58,18 +58,24 @@ class Captain::ContactMemories::ExtractionService
- Registro de estadia PASSADA: "fiquei na Alexa em 03/02", "nos hospedamos no fim de semana". - Registro de estadia PASSADA: "fiquei na Alexa em 03/02", "nos hospedamos no fim de semana".
- Cliente disse "já estou no hotel", "cheguei", "fazendo check-in agora". - Cliente disse "já estou no hotel", "cheguei", "fazendo check-in agora".
### ATENÇÃO — Pix GERADO ≠ Pix PAGO (diferença crítica) ### ATENÇÃO — Pix GERADO ≠ Pix PAGO (diferença crítica, mas registrável)
Quando o bot gera um Pix e o cliente ** agradece ou silencia**, isso **NÃO é reserva consumada**. Pix gerado é um convite pra pagar a reserva vira real quando o pagamento cai. Quando o bot gera um Pix e o cliente ** agradece ou silencia**, isso **NÃO é reserva consumada**. Pix gerado é um convite pra pagar a reserva vira real quando o pagamento cai. MAS a solicitação em si é um fato útil de registrar, porque é base pra follow-up.
| Situação na conversa | É `padrao_comportamental "Reservou X"`? | | Situação na conversa | `padrao_comportamental` aceitável |
|---|---| |---|---|
| Bot gerou Pix + cliente disse "obrigado" / nada | NÃO (nem "solicitou reserva" vale evite o tipo `padrao_comportamental` inteiro) | | Bot gerou Pix + cliente disse "obrigado" / silêncio | "Solicitou Pix para <suíte> <permanência> em DD/MM/AAAA, aguardando pagamento" |
| Bot gerou Pix + cliente disse "paguei" / "fiz o Pix" | SIM, pode registrar "Reservou X em DD/MM/AAAA" | | Bot gerou Pix + cliente disse "paguei" / "fiz o Pix" | "Reservou <suíte> <permanência> em DD/MM/AAAA" |
| Bot gerou Pix + aparece msg automática "Pagamento confirmado" | SIM | | Bot gerou Pix + msg automática "Pagamento confirmado" | "Reservou <suíte> <permanência> em DD/MM/AAAA" |
| Cliente pediu valor sem pedir pra reservar | NÃO | | Cliente pediu valor sem pedir pra reservar | NÃO (apenas consulta de preço) |
| Cliente disse "entro em contato amanhã pra reservar" | NÃO (intenção futura vazia) |
Regra prática: se você não consegue apontar uma frase LITERAL de pagamento confirmado (do cliente ou do sistema), **não extraia `padrao_comportamental` de reserva**. Melhor memória ausente do que memória mentirosa dizendo que o cliente reservou quando gerou Pix. Regra de ouro:
- Se CONFIRMOU pagamento `"Reservou X para Y em DD/MM/AAAA"` (afirma a reserva como concreta).
- Se pediu Pix `"Solicitou Pix para X <permanência> em DD/MM/AAAA, aguardando pagamento"` (registra a solicitação sem afirmar que fechou). A frase **precisa conter "aguardando pagamento"** ou equivalente, pra deixar claro que é pré-reserva.
- Se não teve Pix e nem reserva explícita não extraia nada sobre reserva.
Isso vale pra `padrao_comportamental` somente. Preferência, data comemorativa, restrição etc seguem as regras próprias de cada tipo.
### Sinais de INTENÇÃO FUTURA (NÃO MEMORIZE — retorne nada): ### Sinais de INTENÇÃO FUTURA (NÃO MEMORIZE — retorne nada):
- "Entro em contato amanhã para reservar" - "Entro em contato amanhã para reservar"
@ -136,15 +142,15 @@ class Captain::ContactMemories::ExtractionService
SIM: "Sempre chego tarde, entre 23h e meia-noite" (declarou hábito) SIM: "Sempre chego tarde, entre 23h e meia-noite" (declarou hábito)
SIM: "Costumo ficar só o pernoite" (declarou hábito) SIM: "Costumo ficar só o pernoite" (declarou hábito)
SIM: "Reservou Alexa para pernoite em 23/05/2026" APENAS se confirmação LITERAL de pagamento (cliente disse "paguei"/"Pix pago" OU mensagem automática "Pagamento confirmado"). Pix meramente gerado não conta. SIM: "Reservou Alexa para pernoite em 23/05/2026" APENAS se confirmação LITERAL de pagamento (cliente disse "paguei"/"Pix pago" OU mensagem automática "Pagamento confirmado"). Pix meramente gerado não conta.
SIM: "Solicitou Pix para Hidromassagem pernoite em 25/04/2026, aguardando pagamento" quando o bot gerou Pix mas o cliente ainda não confirmou pagamento. É útil pra follow-up e pra entender interesses.
SIM: "Escolheu 4hrs na visita de 14/03/2026" se efetivamente escolheu e fechou SIM: "Escolheu 4hrs na visita de 14/03/2026" se efetivamente escolheu e fechou
NÃO: "Costuma ficar 2 horas" (SEM DATA e SEM declaração banido) NÃO: "Costuma ficar 2 horas" (SEM DATA e SEM declaração banido)
NÃO: "Prefere permanência de 4 horas" (banido isso seria preferencia, que exige declaração explícita) NÃO: "Prefere permanência de 4 horas" (banido isso seria preferencia, que exige declaração explícita)
NÃO: "Vai chegar às 22h hoje" (intenção da conversa atual, não histórico) NÃO: "Vai chegar às 22h hoje" (intenção da conversa atual, não histórico)
NÃO: "Reservou X" quando o cliente disse "entro em contato amanhã para reservar" ou "quero reservar" (intenção futura violação da REGRA DE OURO). NÃO: "Reservou X" quando o cliente disse "entro em contato amanhã para reservar" ou "quero reservar" sem Pix gerado (intenção futura vazia).
NÃO: "Reservou X" quando o bot apenas cotou preço e o cliente não fechou explicitamente. NÃO: "Reservou X" quando o bot apenas cotou preço e o cliente não pediu reserva.
NÃO: "Reservou X em DD/MM" quando o bot GEROU Pix mas o cliente agradeceu / ficou em silêncio / não confirmação de pagamento na conversa. Pix gerado sem pagamento = pré-reserva, NÃO é ação consumada, NÃO vira memória. NÃO: "Reservou X em DD/MM" quando o bot GEROU Pix mas NÃO confirmação de pagamento use a variante "Solicitou Pix para X ..., aguardando pagamento" nesse caso.
NÃO: "Solicitou reserva de X" / "Pediu Pix para X" evite registrar a fase de intenção/pré-reserva como `padrao_comportamental`. Se a reserva foi paga, registra "Reservou X"; se não foi, não registra nada sobre essa tentativa. REGRA CRÍTICA: se você vai registrar uma escolha pontual, (a) especifique se é reserva confirmada (pagamento caiu) ou solicitação em aberto (Pix gerado sem pagamento), e (b) SEMPRE inclua a data no content. "Aguardando pagamento" é obrigatório quando não houve confirmação.
REGRA CRÍTICA: se você vai registrar uma escolha pontual, (a) a ação DEVE ter sido consumada com pagamento confirmado na conversa, e (b) SEMPRE inclua a data no content. Memória sem data vira ruído; memória sem consumação vira mentira.
5. **reclamacao** queixa EXPLÍCITA sobre algo que desagradou/frustrou/causou problema, com sentimento negativo claro. 5. **reclamacao** queixa EXPLÍCITA sobre algo que desagradou/frustrou/causou problema, com sentimento negativo claro.
SIM: "O ar-condicionado estava barulhento demais, não dormi direito" SIM: "O ar-condicionado estava barulhento demais, não dormi direito"
@ -183,7 +189,7 @@ class Captain::ContactMemories::ExtractionService
1. **Evidência OBRIGATÓRIA**: cada fato precisa de um trecho LITERAL da conversa. Se não tem trecho claro, não extraia. 1. **Evidência OBRIGATÓRIA**: cada fato precisa de um trecho LITERAL da conversa. Se não tem trecho claro, não extraia.
2. **Perguntas/dúvidas NÃO são reclamação nem memória**: se o cliente fez uma pergunta ("tem X?", "aceita Y?"), isso é informação que ele queria, não fato sobre ele. 2. **Perguntas/dúvidas NÃO são reclamação nem memória**: se o cliente fez uma pergunta ("tem X?", "aceita Y?"), isso é informação que ele queria, não fato sobre ele.
3. **Cortesia genérica NÃO é feedback**: "obrigado", "tá bom", "ok" NÃO viram feedback_positivo. 3. **Cortesia genérica NÃO é feedback**: "obrigado", "tá bom", "ok" NÃO viram feedback_positivo.
4. **Aplicar a REGRA DE OURO de ação-consumada vs intenção-futura**: "informou CPF" nunca é memória (é cadastro). "Escolheu X" ou "Reservou X em tal data" vira `padrao_comportamental` se o pagamento do Pix foi CONFIRMADO na conversa (cliente disse "paguei" ou apareceu msg automática "Pagamento confirmado"). Pix gerado sem confirmação de pagamento = pré-reserva, NÃO é ação consumada, NÃO vira memória. Discussão/intenção sem pagamento = NÃO EXTRAIA. 4. **Aplicar a REGRA DE OURO de ação-consumada vs intenção-futura**: "informou CPF" nunca é memória (é cadastro). "Reservou X em tal data" se houve confirmação de pagamento; se o bot gerou Pix sem pagamento, use o formato "Solicitou Pix para X em DD/MM/AAAA, aguardando pagamento". Cotação de preço pura ou "depois eu decido" = NÃO EXTRAIA. Sempre diferencie ação confirmada (Reservou) de solicitação em aberto (Solicitou Pix...aguardando pagamento).
5. **Ações do atendente NÃO são memória do cliente**: se o bot "incentivou X" ou "ofereceu Y", isso descreve o atendente, não o cliente. Ignore. 5. **Ações do atendente NÃO são memória do cliente**: se o bot "incentivou X" ou "ofereceu Y", isso descreve o atendente, não o cliente. Ignore.
6. **Máximo 5 fatos por conversa**. Se dúvida entre extrair ou não, DESCARTE. Qualidade > quantidade. 6. **Máximo 5 fatos por conversa**. Se dúvida entre extrair ou não, DESCARTE. Qualidade > quantidade.
7. **Se a conversa não tem NADA realmente memorável**, retorne `{"facts": []}`. Isso é o comportamento normal e esperado da maioria das conversas transacionais. 7. **Se a conversa não tem NADA realmente memorável**, retorne `{"facts": []}`. Isso é o comportamento normal e esperado da maioria das conversas transacionais.