When vem da expression (ex. q.P1.isAnswered). Batch só em poucos casos (Then IA pesado).
Then
Payload (evento)
Notas rápidas
QuotaSets (N regras)
Cotas BR · 120 rows · context [uf, faixa]
Cota meta (link) · 200 rows · criteria.meta
NPS cruzado · 36 rows · locked
UI semelhante à lista de regras de Respostas/IA: seleciona um set, edita planilha daquele set.
Leveza na consulta (por session / valueChanged)
Não varrer a tabela inteira a cada tecla. Materializar contadores.
Write path: quando muda qualquer var de context[] → resolve rowId (hash criteria) → UPDATE ±1 + dispara automations onContextChange
Índice:(surveyId, quotaSetId, rowKey)
Hot cache:{rowId: {completed, target, status}}
metrics do set = lazy (painel), fora do webhook
Decisões
Chip “status” — o que era?
Era ler survey.status / session.status como gatilho (active/parcial…). Confuso. Removido dos chips. Status entra só como condição opcional no popover / expression avançada, não como atalho principal.
Questionário editado (nomes / células)?
SurveyIndex grava fingerprint das choices/rows usadas em cada QuotaSet
Se divergir e set locked → rows stale; automations de cota pausam; Studio pede Reconciliar
Expressões q.P1 quebradas → badge na lista de automations (“path inválido”)
Renomear pergunta: migration assistida (map old→new) via Index diff
Session IA = Automação (Then AI fixed)
Uma entidade:automation com name, expression, then, ai?.
Aba “IA” = mesma cascata de Automação com then: "ai" travado (sem expression multi-or especial).