Sextafeira Flow · Constituição
Como o Sextafeira Flow funciona
Todo fluxo de CX é um grafo de estados nomeados, onde transições entre estados são disparadas por eventos, atividades acontecem ao entrar/sair de estados, e a posição do grafo + dados acumulados são persistidos de forma durável a cada ponto de bloqueio.
As 5 primitivas
Toda definição de nó, todo evento e toda mudança da plataforma se classifica em uma das 5 primitivas. Sem exceção.
Primitiva #1
STATE
Pergunta que responde: onde a conversa está agora?
Posição nomeada onde a instância pode dormir. Único ponto durável — sem state, não há suspensão.
Primitiva #2
EVENT
Pergunta que responde: algo aconteceu?
Sinal tipado entregue via mailbox. Único input externo. Inclui timer.fired e cron.tick como subtipos.
Primitiva #3
TRANSITION
Pergunta que responde: qual aresta seguir?
Aresta dirigida State→State, disparada por Event, opcionalmente protegida por guard. Única forma de motion.
Primitiva #4
ACTIVITY
Pergunta que responde: que efeito atômico produzir?
Trabalho atômico com efeito no mundo (send msg, call API, update CRM). Idempotente, retry-safe.
Primitiva #5
CONTEXT
Pergunta que responde: que dados a instância carrega?
Dados durável-persistidos do bureau. Lidos por guards, escritos por activities. Memória entre eventos.
Regras invioláveis
- STATE é o único ponto durável — instâncias dormem em estados. Sem isso, reboot perde flows em andamento.
- EVENT é o único input externo — toda entrada chega como event tipado.
- TRANSITION é a única forma de motion — não há "salto direto", toda mudança de estado é via transição declarada.
- ACTIVITY é a única coisa que muda o mundo externo — guards são puros, transitions só movem, states só são. Side-effect só dentro de activity.
- CONTEXT é a única forma de memória entre eventos — sem ela, fluxo seria stateless.
- Toda ACTIVITY DEVE ter retry policy + timeout + ser idempotente — sem isso, redes flutuantes geram dupla cobrança ou mensagem dupla.
- Replay é determinístico — re-aplicar EVENTs na ordem reconstrói o mesmo STATE+CONTEXT.
Anti-padrão #1 — Hook hardcoded
❌ Errado: chamar uma feature direto do código de outra. Acopla, não dá pra cliente trocar trigger.
async function resolveHandoff(args) {
// ... resolve logic ...
// hook hardcoded — acopla NPS dentro do handoff service
createSurveyFromHandoff(args.handoffId) // ❌
}✅ Certo: emitir no event-bus + flow assinante reage. Trigger configurável.
async function resolveHandoff(args) {
// ... resolve logic ...
eventBus.emit('handoff.resolved', { handoffId, ... }) // ✅
}
// Flow NPS é instalado pelo cliente, com trigger configurável.
// Cliente troca pra cron, webhook, manual, etc — sem tocar código.