2026-06-24_cadencia-cli-lifecycle-enum-en-vs-pt¶
Incidente: cadencia-cli — --lifecycle aceita enum em inglês mas o CRM usa português (UPDATE falha com 400 silencioso)¶
Data: 24/06/2026 Severidade: Média Projeto: cadencia-cli Duração do impacto: não afetou produção do produto; bloqueou um update de contato (contornado) Tags: #backend #api #supabase #cli #silenciosa #falha-detectada
O que aconteceu¶
Ao corrigir o lifecycle da cliente Nathalia Galardo (contato 6ab4f719, lead → cliente) durante o setup da sincronização Cal.com→CRM, rodei:
O comando retornou apenas Erro: Client error '400 Bad Request' for url '.../database/query' — sem dizer o motivo. O --first-name/--last-name no mesmo contato funcionaram; só o --lifecycle falhava.
Workaround usado: UPDATE contacts SET lifecycle='cliente' direto via Supabase Management API. Isso está fora do caminho oficial (a regra é operar via CLI/API do produto, não SQL direto no Supabase) — usado só como contorno pontual, autorizado pelo Felipe na hora.
Causa raiz¶
src/cadencia_cli/actions/contacts.py(update/create) repassa o valor de--lifecyclecru ao banco, sem validar nem traduzir.- O help e
docs/COMMANDS.mddocumentamlifecycle (lead/mql/sql/customer/churned)— valores em inglês. O enum real da colunacontacts.lifecycleusa português:lead,cliente.customernão existe → constraint rejeita → HTTP 400. - O CLI engole o corpo do erro do Supabase/PostgREST e mostra só
400 Bad Requestgenérico, escondendo a causa real.
Por que não foi detectado¶
- Sem teste de
updatecom valor delifecyclereal (válido e inválido). - Help/docs do CLI nunca foram conferidos contra o enum real do schema.
- Erros do backend não são propagados — a mensagem genérica impede diagnóstico rápido.
Como foi corrigido¶
Parcial. O dado da Nathalia foi corrigido (lifecycle='cliente', temperatura='quente', nome) via Supabase Management API — contorno pontual. O bug do CLI permanece — issue de correção aberta (ver Links).
Prevenção¶
Checklist / regras pra evitar recorrência¶
- [ ] CLI valida
--lifecycle(e checar--status,--lead-source,--temperatura) contra os enums reais do schema antes de enviar; rejeita com mensagem clara listando os valores válidos. - [ ] CLI propaga o corpo do erro do Supabase/PostgREST em vez de
400 Bad Requestgenérico. - [ ] Atualizar
docs/COMMANDS.md+ help com os valores reais (lifecycle: lead/cliente; confirmar os demais campos enum no schema). - [ ] Teste cobrindo
contacts updatecom lifecycle válido e inválido. - [ ] Não usar Supabase Management API direto como caminho operacional — só workaround pontual e registrado.
Pattern correto¶
LIFECYCLE_VALIDOS = {"lead", "cliente"} # enum real do schema (confirmar no DB)
if lifecycle is not None and lifecycle not in LIFECYCLE_VALIDOS:
raise typer.BadParameter(f"lifecycle inválido. Válidos: {sorted(LIFECYCLE_VALIDOS)}")
Regra atualizada em¶
- [ ]
docs/COMMANDS.mddo cadencia-cli (valores enum reais) - [ ] Help dos comandos
contacts create/update/list
Commits relacionados¶
- (pendente — correção na issue vinculada)
Links relacionados¶
- Issue de correção: DEV-833
- Contexto: setup sincronização Cal.com→CRM · mapa
stamper/context/mapa-cal-com.md
Registrado via sistema de incidentes. Ver INDEX.md para histórico completo.