Consolidar as rotas de email por evento em um modelo global dinamico, resolvendo o destinatario a partir do cadastro do usuario e registrando recipient_email e recipient_name em cada entrega do outbox para melhorar rastreabilidade e operacao.
Permitir captura opcional de email no Telegram, salvar o endereco no cadastro do usuario e reaproveitar esse dado em revisao, pedido e aluguel, incluindo prompts de consentimento e reenvio imediato do resumo apos a confirmacao.
Ampliar a configuracao do provider Brevo e dos scripts operacionais com sender por rota, reply-to, cc, bcc, tags, headers, listagem de rotas e entregas, alem de migracoes de bootstrap e cobertura automatizada validada com 100 testes OK.
Adicionar base de integracoes externas com rotas configuraveis e outbox auditavel no banco mock.
Criar provider de email via Brevo, templates padrao por evento e scripts para cadastrar rotas e processar entregas pendentes.
Publicar eventos de negocio em compra, cancelamento de pedido, agendamento de revisao, abertura de locacao, pagamento e devolucao de aluguel sem alterar a regra de negocio central.
Adicionar testes de servico e hooks de dominio e validar a suite automatizada com 248 testes OK.
- prioriza selecoes e refinamentos corretos em mensagens multiassunto
- adiciona retries defensivos no envio do Telegram sem derrubar o worker
- reidrata o ultimo contrato de locacao apos restart e responde consultas informativas
- restringe a heuristica de informacoes de aluguel para nao sequestrar compra e troca
- preserva expires_at no backend memory e ajusta o stress smoke para usar CPF mock valido
- adiciona regressões automatizadas e valida com 230 testes mais stress smoke pesado
Persiste o ultimo update_id processado pelo satellite e retoma o polling a partir desse cursor no restart, usando a idempotencia por mensagem como rede de seguranca para reentregas.
Move o turno bloqueante do orquestrador para worker thread com asyncio.to_thread, mantendo no loop async apenas o que e realmente assincrono e endurecendo o backend de estado em memoria para acesso concorrente com RLock.
Amplia a cobertura do satellite com testes para cursor persistido, bootstrap inicial, atualizacao monotona do update_id e offload do processamento bloqueante, mantendo a suite completa verde com 218 testes.
Define uma chave de idempotencia por mensagem do Telegram usando chat_id e message_id, com fallback para update_id, para impedir reprocessamento de updates repetidos ou reentregues.
Reaproveita a resposta ja calculada nas duplicatas e registra o cache recente por chat no backend de estado, preservando exatamente uma execucao dos efeitos de negocio.
Amplia a cobertura com testes para mensagem duplicada, mesmo texto com message_id novo e preservacao do comportamento atual do satellite.
Extrai o bootstrap de banco e seed para uma rotina dedicada, mantendo init_db apenas como alias legado de compatibilidade para evitar quebra nos fluxos existentes.
Remove o bootstrap automatico do startup do app HTTP e do container principal, deixando o processo de atendimento responsavel apenas por subir a aplicacao e nao por preparar schema ou popular dados.
Alinha compose, exemplos de systemd, documentacao e testes para o novo fluxo explicito de bootstrap, com a suite completa validada em 211 testes.
Centraliza a sanitizacao de cpf, placa, external_id e identificadores de comprovante para evitar que esses dados sejam persistidos crus no historico conversacional e nos logs operacionais.
Aplica a mascaracao no trace do orquestrador, na auditoria de turnos e no tratamento de erros do satellite do Telegram, preservando apenas fragmentos uteis para troubleshooting.
Amplia a cobertura com testes para persistencia mascarada, leitura de registros legados e payloads de log sanitizados, mantendo a suite completa verde com 209 testes.
Adiciona cenarios de corrida para abertura de locacao e agendamento de revisao, disparando tentativas simultaneas sobre o mesmo recurso critico para validar que apenas uma operacao vence a disputa.
Usa sessoes SQLite compartilhadas entre threads e locks de teste controlados para reproduzir contencao real sem alterar a logica de producao.
Garante por assercoes de resultado e estado persistido que sobra apenas um contrato de locacao e um agendamento valido apos a concorrencia.
Serializa o processamento do Telegram por chat com workers dedicados e semaforo global, evitando que uma mensagem lenta bloqueie os demais atendimentos enquanto preserva a ordem dentro de cada conversa.
Protege a abertura de locacao com row lock no veiculo e adiciona lock de slot para agendamento e remarcacao de revisao, reduzindo o risco de corrida em reservas simultaneas.
Amplia a cobertura com testes para paralelismo no satellite do Telegram, lock da locacao e lock dos horarios de revisao.
Exige confirmacao positiva da marca d'agua SysaltiIA no retorno multimodal antes de permitir o registro de comprovantes e notas fiscais.
Bloqueia respostas sensiveis sem o marcador de validacao e preserva o bloqueio direto no satellite do Telegram.
Amplia a cobertura com testes para prompt, coercao da resposta e fluxo bloqueado no multimodal.
Evita acoes indevidas de devolucao e pagamento herdadas so pelo contexto recente do aluguel.
Refina a identificacao de modelo para ignorar anos e pedidos genericos, mantendo a listagem aleatoria quando nao houver preferencia especifica.
Adiciona regressoes para follow-ups de locacao, filtros de frota e limpeza de contexto.
- adiciona frota, contratos e eventos de aluguel ao banco mock, ao seed operacional e ao bootstrap para habilitar o dominio de locacao de ponta a ponta no ambiente local
- cria o rental_service e o rental_flow com listagem da frota, selecao guiada por numero/placa/modelo, abertura e devolucao de contratos e continuidade incremental no orquestrador
- integra o processamento multimodal no Telegram para comprovantes e multas de aluguel, amplia o estado conversacional com contexto de locacao e fixa a resposta deterministica da listagem para permitir escolha apos a consulta
- adiciona cobertura para servico, seed, separacao entre compra e locacao, follow-ups do fluxo, resumo de contexto e cenarios multimodais do Telegram
# Conflicts:
# app/db/mock_seed.py
# app/services/orchestration/orchestrator_config.py
# tests/test_conversation_adjustments.py
- passa a aceitar apenas CPFs validos informados pelo usuario na hidratacao mock, mantendo score, limite e restricoes como dados derivados automaticamente do documento informado
- impede que o mesmo CPF fique vinculado a dois usuarios diferentes, retornando erro de dominio claro no pedido e preservando o fluxo aberto para que o cliente informe outro CPF
- atualiza o seed local para gerar CPFs validos e deterministas, alinhando a base mock aos testes manuais e evitando registros incoerentes no ambiente de validacao
- amplia a cobertura de regressao para seed, order service e fluxo conversacional de compra com CPF invalido ou ja vinculado
- prioriza cancelamento e listagem corretos sobre drafts antigos de compra, limpa o contexto apos reprovacao definitiva de credito, orienta CPF invalido sem reiniciar o fluxo e reduz listagens de estoque para opcoes curtas e consistentes com a selecao exibida
- adiciona um caminho dedicado para avaliacao de veiculo na troca com aliases normalizados, formatter deterministico e protecao contra desvio indevido para fluxos de revisao ou respostas livres do modelo
- estabiliza cancelamento, remarcacao e listagem de revisoes, reaproveita motivo informado na mesma mensagem, mantem listagens completas em formato compacto e fragmenta automaticamente respostas longas antes do envio ao Telegram
- amplia a cobertura de regressao para compra, revisao, fila conversacional, avaliacao de troca e particionamento de mensagens no satellite
- aceita referencias parciais ao modelo a partir da ultima lista de estoque, incluindo prefixos relevantes como T-Cros para T-Cross, sem reiniciar o fluxo de pedido
- ordena a busca de estoque em ordem decrescente quando ha teto de orcamento, mantendo crescente apenas quando o cliente pede explicitamente a opcao mais barata
- amplia as regressões do fluxo de pedido para cobrir selecao textual reaproveitada, confirmacao por modelo e a priorizacao de ofertas mais proximas ao valor informado
- eleva os alvos do seed local para 180 veiculos, 320 clientes e 80 pedidos, reduzindo o esgotamento precoce do estoque em roteiros manuais
- distribui os precos em faixas deterministicas com ruido leve para concentrar mais opcoes em orcamentos comuns como 70 mil
- torna o seed idempotente em bases ja populadas com top-up incremental e adiciona regressao para esse comportamento
- impede que mensagens como 'Liste os meus pedidos' sejam consumidas pelo atalho de order_create quando ainda existe draft de compra aberto
- corrige o reaproveitamento indevido da ultima falha de credito em fluxos de vendas ativos, permitindo que a listagem siga para o handler correto
- adiciona regressao cobrindo o cenario de order_list com pending_order_drafts para evitar que a resposta fique presa no erro anterior
- adiciona a tabela conversation_turns ao schema mock com request_id, conversation_id, user_id, canal, mensagem, resposta, status, intent, domain, action, tool, erro e latencia por turno
- integra o OrquestradorService para registrar historico tanto em turnos concluidos quanto em falhas, aproveitando o trace do turno e os metadados de execucao
- cria o ConversationHistoryService com persistencia e consulta list_turns com filtros simples para auditoria interna
- inclui cobertura para persistencia do historico, leitura filtrada e registro de turnos completed/failed na camada de orquestracao
- consome follow-ups curtos de revisao aberta antes do LLM para preservar data, horario e rascunhos ativos entre mensagens
- melhora a extracao de modelo a partir de resumos curtos e aceita respostas isoladas como Onix quando esse eh o ultimo campo faltante
- faz a remarcacao aceitar amanha 11h ou amanha seguido de 11h sem cair em um novo agendamento de revisao
- prioriza review_reschedule, review_cancel e review_list sobre respostas livres do modelo e amplia a cobertura de regressao da orquestracao
- protege a criacao de pedidos com lock nomeado no MySQL e tentativa de row lock no veiculo antes da persistencia
- reaproveita a checagem final de reserva apos o lock para evitar dupla reserva do mesmo veiculo em atendimentos concorrentes
- adiciona regressao dedicada para garantir o uso de with_for_update e o conflito vehicle_already_reserved
- inclui um stress smoke para validar persistencia de estado, ciclos completos de pedido e corrida de reserva com Redis
- torna o normalizador de decisoes mais tolerante a saidas quase validas do modelo, aceitando pseudo-JSON, aliases de topo e degradando call_tool ou ask_missing_fields incompletos para coleta estruturada\n- normaliza aliases de tools de revisao, reaproveita argumentos de drafts abertos antes de executar tool direta e aceita today/tomorrow no parsing tecnico de data relativa\n- prioriza confirmacoes pendentes de troca de contexto antes dos follow-ups de venda para evitar que respostas como sim reabram listas de estoque por engano\n- melhora o fluxo de revisao para manter drafts diante de respostas temporais como 14h ou 16h e para pedir apenas horario e campos realmente faltantes quando a data ja foi capturada\n- amplia a cobertura de regressao para confirmacao de context switch, normalizacao de tool calls legadas, continuidade de revisao incremental e confirmacao de horarios sugeridos
- adiciona helper central de tempo UTC e passa a reutiliza-lo nas rotinas de expiracao, persistencia temporaria e geracao de identificadores operacionais\n- amplia o build_context_summary com fluxo ativo, memoria generica formatada, ultima tool executada, troca de contexto pendente, fila, selecao de estoque e rascunhos de revisao e pedido\n- reaproveita snapshots de fluxo quando uma chave temporaria do bucket nao estiver mais disponivel, mantendo mais contexto util para o modelo\n- padroniza a expiracao do estado em memoria, no Redis e nos fluxos de pedido para reduzir inconsistencias entre turnos e reinicios\n- adiciona testes dedicados para garantir a qualidade do resumo enviado ao modelo em cenarios de revisao, compra e fallback por snapshot
- atualiza docker-compose, Dockerfile e service do systemd para subir o bootstrap de banco e o Telegram satellite como runtime principal do projeto\n- revisa .env.example, README, TEST_CASES e guia de deploy para refletir a arquitetura atual com MySQL, Redis, Vertex AI e canal Telegram\n- endurece o parsing de configuracao com aliases controlados para DEBUG e normalizacao de ENVIRONMENT e CONVERSATION_STATE_BACKEND\n- centraliza a inicializacao legada do app HTTP em app.db.init_db e faz o bootstrap respeitar flags de seed e falhar explicitamente quando algum backend nao sobe\n- adiciona cobertura dedicada para parsing de settings e para o bootstrap de banco do runtime
- adiciona snapshots de fluxo, collected_slots e last_tool_result ao estado conversacional, incluindo persistencia no backend em memoria e no Redis\n- endurece o reaproveitamento de revisao, o reset imediato de contexto e a retomada incremental sem perder drafts apos respostas fracas do modelo\n- prioriza follow-ups operacionais de vendas antes do LLM para selecao de estoque, CPF, nova busca e continuidade de pedido/cancelamento\n- normaliza aliases de tools de compra, persiste selecoes pendentes de estoque e preserva sugestoes com budget_relaxed entre turnos\n- melhora a policy de troca de contexto para confirmacoes ambiguas, novos pedidos operacionais e onboarding orientado apos mudanca de dominio\n- amplia a cobertura de regressao para revisao, compra, cancelamento, reset global e execucao estruturada do orquestrador
- troca o modelo padrao do projeto para gemini-2.5-pro no settings e no .env.example\n- ajusta a cadeia de fallback para priorizar a linha 2.5 antes do 2.0 flash\n- trata respostas do Vertex com multiplos content.parts, combinando texto e function_call sem depender de response.text\n- adiciona cobertura dedicada para garantir o parse correto de respostas mistas do SDK
- impede que uma compra explicita durante revisao aberta seja enfileirada cedo demais com prompt pendente do fluxo atual
- deixa a mudanca seguir para a confirmacao normal de context switch via pending_switch
- adiciona teste para garantir que a policy nao devolve resposta antecipada nem fila automatica nesse cenario
- exige confirmacao explicita quando a busca de estoque retorna apenas 1 veiculo antes de avancar no pedido
- preserva confirmacao pendente da unica opcao e evita criacao implicita ao receber CPF ou texto livre
- captura data relativa parcial em drafts de revisao reaproveitados e passa a pedir apenas o horario faltante
- adiciona testes para opcao unica em pedidos e para reaproveitamento com data relativa seguida de horario
- reconhece respostas como 'hoje' e 'amanha' no reuso do ultimo veiculo mesmo sem horario
- preserva a data-base relativa e permite completar o agendamento em uma segunda mensagem so com o horario
- adiciona teste para reaproveitamento com data relativa seguida de horario
- preserva data sem horario no reuso do ultimo veiculo e pede apenas o horario faltante
- impede que a resposta 'nao' na confirmacao de reuso cancele o fluxo global de revisao
- abre um novo draft de agendamento quando o usuario recusa reutilizar os dados do ultimo veiculo
- adiciona testes para data parcial no reuso e para resposta negativa sem contaminar o fluxo
- saneia argumentos da tool no registry e converte erros de assinatura em falhas controladas
- normaliza argumentos de listagem de agendamentos e rebaixa call_tool incompleto de revisao mesmo com domain inconsistente
- limpa confirmacoes pendentes de revisao quando o usuario inicia um novo agendamento
- adiciona cobertura para listagem de revisoes com kwargs extras e para retomada segura do agendamento
- prioriza o fluxo de agendamento e reuso do ultimo veiculo sobre respostas livres e remarcacao sem protocolo
- normaliza aliases de tools e argumentos de revisao e rebaixa call_tool incompleto para coleta incremental
- impede listagem de pedidos em mensagens de agendamentos e reforca respostas deterministicas de revisao
- extrai data/hora valida de frases longas e descarta ruido invalido em data_hora
- adiciona logs de progresso e amplia a cobertura de testes conversacionais e do contrato estruturado
- adicionar save_user_context ao contrato do repositorio de estado para diferenciar leitura de persistencia explicita
- salvar o user_context apos mutacoes em memoria generica, fila, selecao pendente, troca de dominio e contexto de estoque
- alinhar o backend Redis ao comportamento do store local, evitando perder orcamento, cpf e selecoes entre turnos
- cobrir a persistencia do contexto com os harnesses de teste usados nos fluxos de venda e policy
- extrair CPF diretamente da mensagem quando o llm falhar em preencher o draft de pedido
- extrair orcamento de formatos tecnicos como '70 mil', 'R$ 45000' e 'ate 50 mil' sem depender da decisao semantica do modelo
- relistar estoque em mensagens de continuidade quando o draft ja estiver aberto e o contexto de compra estiver suficiente
- cobrir com testes os cenarios de follow-up no Telegram em que o llm nao devolve cpf ou orcamento
- evitar que respostas answer_user ou ask_missing_fields do modelo interrompam compras ja caracterizadas
- manter o order_flow como caminho deterministico quando cpf, orcamento ou perfil ja permitem avancar
- preservar a arquitetura com o modelo decidindo o turno e o backend apenas coordenando a continuidade
- cobrir com teste de regressao o caso reproduzido no servidor para compra com orcamento e cpf
- aceitar aliases de intent retornados pelo Vertex como place_order e create_order
- converter aliases de campos faltantes como modelo_carro para vehicle_id no fluxo de compra
- redirecionar decisoes de compra quase-validas para collect_order_create em vez de cair no fallback
- cobrir com testes os formatos divergentes retornados localmente e no servidor
- adicionar uma extracao estruturada focada em orcamento e perfil de veiculo para fluxos de vendas
- acionar esse enriquecimento apenas quando o turno ja for de compra e os campos vierem vazios
- manter o backend alinhado ao contrato do modelo sem reintroduzir heuristicas locais
- cobrir o enriquecimento com teste de contrato para o fluxo de decisao
- remover o fallback semantico local de orcamento e perfil do fluxo de vendas
- enriquecer o turno sempre com uma extracao dedicada de entidades apos a decisao estruturada
- endurecer os prompts para obrigar o modelo a preencher orcamento_max e perfil_veiculo em pedidos de compra
- manter o fluxo alinhado ao contrato do modelo sem reintroduzir regex conversacional
- adicionar fallback tecnico para capturar orcamento diretamente da mensagem de compra
- inferir perfil de veiculo no fluxo de vendas quando a memoria generica vier incompleta
- garantir a listagem automatica de estoque mesmo quando o modelo nao preencher orcamento_max
- cobrir o cenario com teste focado de pedido sem hints estruturados do llm
- invalidar resultados antigos quando orcamento ou perfil de veiculo mudarem durante a compra
- relistar o estoque automaticamente ao iniciar um novo pedido com contexto atualizado
- preservar drafts de pedido em erros recuperaveis e limpar apenas o campo invalido
- remover IDs da vitrine de estoque e orientar a escolha pelo numero da opcao exibida
- normalizar HTTPException em um contrato estruturado com code, message, retryable e field
- preservar drafts de revisao em erros recuperaveis sem perder o restante do contexto
- delegar a resposta final de tools ao modelo com formatter deterministico apenas como fallback
- registrar request_id, conversation_id e tempos de llm/tool para rastrear cada turno
Passa a aproveitar orcamento e perfil guardados na conversa para sugerir estoque quando a compra ainda nao tem veiculo definido, preservando a selecao na memoria e guiando o usuario ate o fechamento do pedido.
Tambem impede que veiculos reservados continuem aparecendo como disponiveis, devolve o status do veiculo na resposta deterministica do pedido e amplia os testes de regressao dos fluxos de compra e cancelamento.