Configuracao do Rule Engine
O rule engine e o que diferencia o Levy Service de um CMMS generico. Regras observam telemetria ao vivo e criam tasks automaticamente. Uma frota bem ajustada bate mais de 50% de tasks criadas automaticamente em poucas semanas apos o go-live.
Este artigo cobre os sete tipos de trigger, o formato da config em JSON e como rodar dry-run de uma regra antes de ativar.
Onde as regras vivem
Regras sao gerenciadas em /dashboard/task-rules. Cada linha da tabela mostra:
- Name (seu rotulo)
- Trigger type (um dos sete abaixo)
- Action summary (qual task ela cria)
- Last run e last match count
- Um toggle Enabled
Regras ficam na tabela task_rules e respeitam RLS - cada regra pertence a um subaccount.
Os sete tipos de trigger
1. mileage
Dispara quando o hodometro de um veiculo cruza um limite relativo ao ultimo fechamento do mesmo type.
{
"trigger_type": "mileage",
"trigger_config": {
"interval_km": 2000,
"last_task_type": "scheduled_maintenance"
},
"task_type": "scheduled_maintenance",
"default_priority": "medium"
}
O cron /api/cron/task-rule-mileage avalia isso a cada hora.
2. time
Cadencia de calendario. Roda diariamente as 06:00 UTC.
{
"trigger_type": "time",
"trigger_config": { "every_days": 90 },
"task_type": "inspection",
"default_priority": "low"
}
Combine com mileage para "a cada 2000 km OU a cada 90 dias, o que vier primeiro" escrevendo duas regras.
3. condition_report
Dispara quando um condition report pos-corrida passa de uma severidade de IA.
{
"trigger_type": "condition_report",
"trigger_config": { "min_ai_severity": 4 },
"task_type": "repair",
"default_priority": "high"
}
Esse e um trigger por evento: o insert em condition_reports pelo app do rider chama onConditionReportCreated imediatamente, entao a task entra no quadro em segundos apos o fim da corrida.
4. low_battery
Bateria cai abaixo de um limite E o veiculo esta parado por uma janela configuravel. Impede que tasks sejam criadas no meio de uma corrida.
{
"trigger_type": "low_battery",
"trigger_config": {
"battery_threshold": 20,
"parked_minutes": 360
},
"task_type": "battery_swap",
"default_priority": "medium",
"action_config": { "assign_by_proximity": true }
}
Avaliado por /api/cron/task-rule-low-battery a cada 30 minutos.
5. rider_issue
Um rider envia um problema pelo fluxo ReportIssue do app movel. Por evento.
{
"trigger_type": "rider_issue",
"trigger_config": { "category": "mechanical" },
"task_type": "repair",
"default_priority": "high"
}
Se o rider anexa uma foto e a IA classifica como severidade 4+, a priority sobe para critical independente do default da regra.
6. iot_fault
Um codigo de falha cai em iot_events. Cobre flags Queclink, erros W0,4 BMS da OKAI e eventos de queda do acelerometro.
{
"trigger_type": "iot_fault",
"trigger_config": { "fault_codes": ["ACCEL_CRASH", "BMS_FAULT"] },
"task_type": "inspection",
"default_priority": "critical"
}
Eventos de queda criticos tambem viram o veiculo para maintenance instantaneamente via auto-flip trigger.
7. geofence
Veiculo sai da zona de operacao por mais de N minutos. Cria uma task retrieve.
{
"trigger_type": "geofence",
"trigger_config": { "outside_zone_minutes": 30 },
"task_type": "retrieve",
"default_priority": "high",
"action_config": { "assign_by_proximity": true }
}
Avaliado por /api/cron/task-rule-geofence a cada hora.
Action config
action_config fica ao lado de trigger_config e controla atribuicao, notificacoes e efeitos colaterais.
| Chave | Efeito |
|---|---|
assign_by_proximity | Escolhe o tecnico disponivel mais proximo via users.last_lat/last_lng |
assign_role | Restringe a proximidade por papel, ex. chargehand para battery_swap |
assign_team_id | Empurra para a fila de um time especifico |
change_vehicle_status | Vira o veiculo para maintenance mesmo com priority abaixo de high |
notify_slack | Dispara webhook do Slack ao match da regra |
Dry-run antes de ativar
Toda regra tem um botao Test que chama POST /api/task-rules/[id]/test. O dry-run avalia a regra contra sua frota atual e retorna os veiculos que casam sem criar tasks. Use isso antes de ligar uma regra nova para confirmar que ela nao casa com a frota inteira.
Por exemplo, se low_battery retorna 240 matches em uma frota de 250 veiculos, provavelmente seu parked_minutes esta curto demais.
Loops de regras e deduplicacao
Regras nao podem criar a mesma task duas vezes. O helper createTaskInternal checa por uma task aberta do mesmo task_type contra o mesmo veiculo e retorna skipped_duplicate: true se ja existe. Isso e logado em task_rule_runs para audit mas nao cria nova linha.
Isso impede o loop classico em que a regra dispara, a acao vira o veiculo para maintenance, a mudanca de status redispara a mesma regra e voce tem 10.000 tasks fantasmas antes do almoco.
A tabela de audit
Cada execucao de regra e logada em task_rule_runs com os veiculos que casaram, os IDs das tasks criadas e quaisquer duplicatas puladas. Use isso para debugar uma regra que "nao esta disparando" - ela pode estar rodando e casando zero veiculos, ou casando todos e sendo deduplicada.
Comece com tres regras, nao trinta
O erro mais comum e ativar todas as regras no primeiro dia. Comece com low_battery, uma regra de condition_report e uma de mileage. Adicione mais quando voce ver as primeiras rodando limpas por uma semana.