Solucao de Problemas
A checklist canonica para quando algo no stack de compliance nao esta se comportando. Percorre endpoints MDS, o ingester de Policy, enforcement em tempo real, o portal da cidade e e-mails de digest -- nessa ordem, porque essa e aproximadamente a cadeia de dependencias.
Endpoints MDS
401 em toda requisicao
Sintomas: validador da cidade retorna 401 Unauthorized em /vehicles/status.
Verificacoes:
- O token bearer esta ausente de
Authorization: Bearer <token>. Cidades as vezes colam o token sem o prefixoBearer. - O token foi revogado. Abra Configuracoes -> API e Integracoes -> Tokens MDS e confirme que o token esta ativo.
- O token pertence a uma subconta diferente. Um token por subconta; cidades testando acidentalmente em multiplas jurisdicoes verao isso.
Validador falha no campo version
Sintomas: mds-provider-validator reclama que o envelope de resposta reporta uma versao diferente de 2.0.1.
Verificacoes: confirme que src/lib/mds/v2/response.ts tem const MDS_VERSION = '2.0.1'. Se voce fez deploy de um build velho, redeploye.
Header MDS-JWT ausente em uma resposta
Sintomas: a cidade espera que toda resposta carregue MDS-JWT: <jwt> e o header esta ausente.
Verificacoes:
mds_jwks_keysnao tem linha comis_active = truepara a subconta. Acesse/api/mds/<subaccountId>/.well-known/jwks.jsonuma vez para forcar um lazy mint, depois tente novamente.- O par de chaves foi gerado mas a linha ativa tem
private_key_pemcorrompido (raro -- geralmente uma edicao manual mal feita). Olhe no Sentry por breadcrumbsMDS sign failed.
current_speed_limit_kph sempre 0
Sintomas: veiculos reportam current_speed_limit_kph: 0 mesmo quando deveriam estar em uma zona.
Verificacoes:
- O veiculo nao tem posicao GPS conhecida. Inspecione
vehicles.last_lat/last_lngevehicles.last_seen. - Nenhuma zona de operador ou geofence de politica contem o ponto. Execute
SELECT * FROM zones_containing_point('<subaccountId>', <lat>, <lng>)e confirme que pelo menos uma linha e retornada. - O
rule_typeda regra ativa eno_rideem vez despeed-- isso e um bloqueio, nao um limite de velocidade. A linha de status deve mostraris_disabled = trueem vez.
Ingester de Policy
Feed de politica da cidade retorna 404
Sintomas: entradas de log de auditoria com status = 'failed' e errors contendo HTTP 404.
Verificacoes:
- A URL em
mds_jurisdictions.policy_feed_urlesta errada. Teste do seu terminal:curl -i <url>. Cidades as vezes mudam caminhos entre endpoints provisorios e producao. - O token de auth expirou. Tente com e sem token para isolar.
Feed valida mas nao produz policy_geofences
Sintomas: auditoria mostra status = 'success' e linhas mds_policies existem, mas policy_geofences esta vazio.
Verificacoes:
- Toda regra referenciou geografias que a cidade nao publicou. Inspecione
errorsna linha de auditoria -- IDs de geografia nao resolvidos estao listados la. - A cidade publicou politicas para um tipo de veiculo que sua frota nao opera. Confirme que os
vehicle_typesdas regras incluem pelo menos um tipo que voce tem.
A mesma politica continua aparecendo em cada diff
Sintomas: o diff de cada poll mostra a mesma politica em modified, mesmo quando nada significativo mudou.
Verificacoes:
- A cidade esta regenerando o payload do feed em cada requisicao (diferente
published_date, whitespace, ordenacao). O atalho sha256 dispara apenas em payloads byte-identicos. Peca a cidade para estabilizar sua serializacao. - A cidade muda
published_dateautomaticamente -- alguns CMSes fazem isso. O diff e inofensivo mas ruidoso; pode ser filtrado na UI do log de auditoria.
Ativacao nunca dispara
Sintomas: uma politica esta pending, start_date passou, mas o status nunca vira active.
Verificacoes:
- O cron
mds-policy-activateesta falhando. Verifique/api/cron/mds-policy-activatenos logs de cron do Vercel. - O
start_dateesta no horario local da cidade mas armazenado como UTC sem conversao. O cron compara contranow() UTC; um fuso mal definido no feed faz ativacao disparar muito mais tarde do que o esperado.
Enforcement em tempo real
Regra ativada mas nenhum comando enviado
Sintomas: mds_policies.status = 'active' mas policy_enforcement_events tem zero linhas para a regra.
Verificacoes:
- Nenhum veiculo esta dentro da geometria.
SELECT COUNT(*) FROM vehicles WHERE ST_Contains('<rule_geometry>', ...)-- se zero, nao ha nada para aplicar. - Todos os veiculos tem GPS velho (>5 min). O skip e por design. Procure por eventos
error = 'stale_gps'na tabela. - Os veiculos nao tem linha
iot_devicesligada. Pulados comerror = 'no_iot_device'.
Comandos enviados mas veiculos nao reduzem velocidade
Sintomas: policy_enforcement_events mostra command_sent_at mas nenhum command_ack_at, e o veiculo continua em velocidade total.
Verificacoes:
- OEM offline ou adormecido. Abra o veiculo no dashboard e inspecione last_seen.
- O formato de comando errado chegou ao OEM. Inspecione
command_responsepara um codigo de erro -- a maioria dos OEMs retorna codigos de rejeicao em texto plano. - A senha IoT do veiculo esta errada. Confirme que
iot_devices.iot_passwordcorresponde ao que o OEM espera (veja Integracao OKAI, Integracao Queclink, etc.).
Sub-frota ve comandos, outra sub-frota nao
Sintomas: veiculos OKAI obedecem a slow zone, veiculos Segway nao (ou vice-versa).
Verificacoes:
- O ramo do despachador especifico do OEM esta ausente ou velho para o OEM. Confirme que
src/lib/iot/dispatch.tstem um case para esse OEM e o formato de comando corresponde a versao do protocolo do OEM. - Latencia Segway BLE-relay -- o comando foi enviado mas ainda nao confirmado porque o veiculo esta longe de qualquer telefone. Esta e uma lacuna conhecida; latencia para Segway pode exceder 30 segundos.
Portal da cidade
Magic link retorna "token invalido"
Sintomas: contato clica no link enviado e cai em uma pagina de erro.
Verificacoes:
- O token expirou (15 minutos). Pecam para solicitarem um novo.
- A linha do contato foi deletada ou
portal_access = false. - Dois links foram gerados em sucessao rapida; o primeiro consumido, o segundo parece velho.
E-mail de magic link nunca chega
Sintomas: contato envia o formulario, ve a mensagem "verifique seu e-mail", nenhum e-mail chega.
Verificacoes:
- Pasta de spam.
- O e-mail nao corresponde a uma linha
city_contactsexatamente (insensivel a caixa). Inspecione a linha. - A infra de e-mail rejeitou o envio (Sentry tera o bounce). Procure por gatilhos de filtro de spam no assunto ou corpo.
Portal nao mostra veiculos mesmo com frota implantada
Sintomas: contato municipal faz login, o mapa de frota esta vazio.
Verificacoes:
mds_jurisdictions.bboxesta errado -- muito apertado ou apontando para outro lugar. Confirme contra uma previa do mapa.- Todos os veiculos tem
last_lat/last_lngnulos. Inspecione pelo menos um.
E-mails de digest
Digest nao chegou no dia esperado
Sintomas: contato municipal esperava um digest semanal de segunda, nao recebeu.
Verificacoes:
last_digest_sent_atesta na semana atual -- o cron decidiu que a janela de cadencia nao tinha expirado. Provavelmente um digest anterior disparou na mesma janela.- O cron nao rodou. Logs de cron do Vercel para
/api/cron/compliance-digest. - O digest disparou mas o envio de e-mail deu erro. Verifique
city_compliance_reports-- se a linha existe mas nenhum e-mail chegou, a falha e a jusante.
Digest mostra uma condicao falhando que voce ja consertou
Sintomas: scoreboard no digest mostra vermelho em complaint_sla mesmo que todas as reclamacoes tenham sido respondidas.
Verificacoes:
- O digest cobre um periodo fechado (ontem para diario, semana passada para semanal). Nao recomputara retroativamente. O scoreboard atual em
/dashboard/compliance/{id}e a visao ao vivo.
Anexo PDF ausente em digest mensal
Sintomas: digest mensal chega mas pdf_url e null e o anexo esta ausente.
Verificacoes:
- O renderizador PDF deu erro. Sentry tera o stack trace. O corpo HTML/texto ainda dispara; o PDF e best-effort.
Onde procurar no banco de dados
| Pergunta | Tabela |
|---|---|
| Por que meu poll de Policy nao teve sucesso? | mds_policy_audit |
| Quais politicas estao ativas agora? | mds_policies WHERE status = 'active' |
| Quais regras vieram de cada politica? | mds_policy_rules WHERE policy_id = ... |
| Quais geofences materializaram de uma regra? | policy_geofences WHERE rule_id = ... |
| Quais comandos IoT dispararam para uma regra? | policy_enforcement_events WHERE rule_id = ... |
| Quais digests um contato recebeu? | city_compliance_reports WHERE delivered_to_contact_id = ... |
| Quais jurisdicoes o operador tem? | mds_jurisdictions WHERE subaccount_id = ... |
Quando tudo mais falha
Envie e-mail para support@levyelectric.com com:
- ID da subconta
- Slug da jurisdicao
- O
run_idde auditoria se o problema esta no ingester - O
policy_enforcement_events.idse o problema esta em enforcement - O
city_compliance_reports.idse o problema esta em um digest
Temos acesso direto aos logs e geralmente podemos localizar a falha em uma hora.