O defeito está
na interseção.
Cada régua passa em revisão isolada. Somadas, duas delas alcançam a mesma audiência e cobram pressão semanal de 9,5 do mesmo contato, contra um teto de 6,0. Essa conta não consta de nenhum dos dois arquivos.
Seções desta página
Narrativa
Uma jornada com defeito de construção continua executando. O fluxo dispara, as mensagens saem, o relatório fecha com número positivo, e quem já converteu segue recebendo a sequência de quem não converteu. O efeito aparece semanas depois, no descadastro e na entregabilidade do domínio.
Declarar a jornada em YAML e auditar o arquivo antes da publicação. Critério de saída, lista de supressão, teto de frequência e grupo de controle são quatro campos que a interface de automação não solicita, e que por isso ficam em branco. No formato declarado, a ausência deles vira falha com identificador e exit code.
Doze regras. Dez leem uma jornada por vez, e duas leem o portfólio de jornadas ativas. As duas de portfólio são a razão de a ferramenta existir. L011 mede a sobreposição entre as definições de audiência, L012 soma a pressão semanal ponderada que essas jornadas cobram do mesmo contato e compara com o teto configurado.
A primeira versão de L011 usava índice de Jaccard e não acusava nada nos exemplos. Ela devolvia 0,5 justamente no caso que motivou a regra, porque um dos conjuntos tem um filtro a mais. Uma regra que erra o caso que a originou é pior que a ausência de regra, porque ela devolve resultado verde.
A auditoria em ação
O mesmo comando que roda na máquina roda no CI. A saída fica em português, que é o idioma da operação para a qual a ferramenta foi escrita, nas duas versões desta página.
Execuções da CLI
Conhecimento tácito de operação não escala em revisão manual. Escala quando vira regra executável, com identificador, severidade e exit code.
O defeito que nenhum arquivo contém
As duas regras de portfólio leem o que as revisões individuais não conseguem ver. Percorra as quatro etapas para acompanhar de onde sai o exit code 1.
Cada arquivo passa na revisão individual. Nada aqui está errado quando se lê uma régua por vez.
L011 compara as definições de audiência. A de checkout está contida na de winback, e o coeficiente de sobreposição devolve 1,0 contra um limiar de 0,6.
L012 soma a carga ponderada das duas réguas na janela de sete dias: 5,5 mais 4,0, ou seja 9,5 contra um teto de 6,0.
Erro de escopo portfólio devolve exit code 1, e o merge não passa. O defeito não estava em nenhum dos dois arquivos.
Pressão semanal
Cada jornada isolada cabe no teto de jornada. Somadas sobre o mesmo contato, elas estouram o teto de portfólio. São dois limites diferentes, e só o segundo depende de ler o conjunto.
abandonado winback_
inativos agregada
(L012)
escala 0 a 10 · pesos por canal: e-mail 1,0 · push 1,5 · SMS e WhatsApp 2,0
weekly_pressure = carga × 7 / max(duração_dias, 7)
Contagem simples de mensagens não serve, porque push, SMS e e-mail têm custo de atenção diferente. Cada canal recebeu um peso que reflete intrusividade percebida, e a pressão da jornada é a carga ponderada em janela de sete dias, com piso de sete dias no denominador. Sem o piso, um fluxo de checkout com três toques em 24 horas seria lido como 21 toques por semana, número que não ocorre porque a jornada termina antes. Falso positivo é a causa mais comum de abandono de linter, e calibrar essa fórmula foi o que mais consumiu tempo no projeto.
# limites são decisão de operação, versionados no repositório
max_weekly_pressure: 6.0
max_journey_pressure: 4.0
audience_overlap_threshold: 0.6
holdout_required_above: 5000
disabled_rules: []
downgrade_to_warning: [L007]
As decisões de cálculo
"Inativos há 60 dias" e "inativos há 60 dias que abandonaram o checkout" alcançam o mesmo grupo de pessoas: o segundo conjunto está contido no primeiro. Mesmo numerador, dois denominadores, dois veredictos.
Divide pela união. Como o conjunto contido é menor, a união cresce e o resultado cai abaixo do limiar. Verde no caso que originou a regra.
Divide pela cardinalidade do menor conjunto. Sob contenção, a interseção é o próprio conjunto menor, então o coeficiente é 1,0 e a regra passa a enxergar o conflito.
As doze regras
Codificam prática de operação de CRM, não convenção de engenharia de software. O escopo é a coluna que importa: dez leem uma jornada por vez, e duas leem o portfólio inteiro.
| ID | Escopo | Regra |
|---|---|---|
| L001 | jornada | Jornada ativa sem critério de saída |
| L002 | jornada | Branch sem caminho padrão |
| L003 | jornada | Loop sem limite de iterações |
| L004 | jornada | Audiência sem lista de supressão |
| L005 | jornada | Segmento sem decaimento temporal |
| L006 | jornada | Pressão de mensagem alta dentro da jornada |
| L007 | jornada | Canal intrusivo sem janela de silêncio |
| L008 | jornada | Jornada ativa sem grupo de controle |
| L009 | jornada | Métrica de sucesso ausente ou de vaidade |
| L010 | jornada | Reentrada sem período de carência |
| L011 | portfólio | Jornadas ativas concorrendo pela mesma audiência |
| L012 | portfólio | Pressão agregada acima do teto por contato |
Onde o modelo entra
A flag --explain envia os achados já fechados a um assistente de IA e imprime um resumo em prosa no stderr, para levar à reunião de revisão. Ela é opcional. O diagnóstico é integralmente determinístico: nenhuma das doze regras chama modelo, e sem chave de API o linter roda igual, com a flag avisando que a explicação está indisponível.
Um LLM no caminho crítico de uma auditoria troca um resultado reproduzível por um que varia entre execuções, e auditoria com essa propriedade não serve como critério de publicação. O critério que apliquei: onde existe regra determinável, escrevo regra. O modelo entra na síntese e na tradução do achado para a linguagem de quem decide.
A suíte
Três repositórios sobre a mesma tese: jornada de cliente é artefato versionável. Se ela pode ser declarada em arquivo, ela pode ser lida, auditada e revisada em pull request, com histórico e revisão por pares. Hoje ela vive dentro da interface da ferramenta de automação, onde não existe diff entre versões nem registro de por que aquele delay é de 48 horas.
A saída de um é a entrada do outro, o que torna objetivo o critério de aceite do agente: a jornada proposta precisa passar no linter.
Lê as jornadas declaradas em YAML e acusa o defeito antes da publicação, inclusive o que só existe entre duas réguas.
Esta páginaLê os eventos de produto e devolve o briefing de segmento com a jornada proposta, já validada pelo linter.
Guarda os prompts de leitura versionados, com asserções verificáveis e placar que mede regressão em CI.