SOL · pilar único SDR

Central completa da revisão. Página gerada por scripts/gerar-sol-sdr.py lendo a API do n8n PROD e os artefatos aprovados da revisão — nenhum número é digitado à mão.

Os três eixos — independentes

vida = pertencimento arquitetural (tag vida:*, só muda com evidência de aposentadoria). n8n = estado de runtime (campo active). revisão = varredura Workplace (tag workplace:*). Nenhum é derivado do outro.

26workflows atuais
1aposentados
26ativos
0inativos
7revisados
19pendentes

Revisão Workplace — onde estamos

derivado do backend em 21/08

Acompanhamento por estado, não por conversa. O progresso é acumulado: uma regressão vira REABERTO e incrementa o contador, sem apagar o que já foi feito.

AGORACAPTAÇÃO — Meta e Landing modularizados e provados E2E; WhatsApp ainda misturado no inbound
PRÓXIMA AÇÃO ÚNICASeparar a CAPTAÇÃO do WhatsApp direto (Recepção + Ingestão) sem quebrar a QUALIFICAÇÃO
cadeiatotalnão iniciados em revisãoprontosrevisados 
CAPTAÇÃO3——20/3
QUALIFICAÇÃO541—0/5
HANDOVER44——0/4
OPS99——0/9
OBSERVABILIDADE33——0/3

Por workflow

workflowcadeiaestadocorreções testesupabasevisualrevisadoreab.
sol.captacao.entrada-lead
histórico
  • 13/08 — auditoria no a no, 13 gaps
  • 13/08 — webhook autenticado + token rotacionado
  • 17/08 — origem/canal/Meta ids gravando
  • 18/08 — REABERTO: PUT da API quebrou o IF via webhook (corrigido no mesmo dia)
  • 18/08 — 4 correcoes: SM nao-silencioso, telefone terminal, evidencia 1o contato, retry
  • 18/08 — 4 correcoes aplicadas e validadas; renomeado para sol.captacao.entrada-lead
  • 18/08 — E2E provado em 2 leads organicos (sm_status Abertos + template_entregue true); lane Landing removida; renomeado para SOL - Captação - Ingestão de Leads Meta
CAPTACAOPRONTO4/4passousaneadoatualizadoNÃO1
sol.captacao.meta-poll
histórico
  • 13/08 — checkpoint por telefone: 32.544 execucoes/dia -> ~288
  • 17/08 — page_id real da Graph + campaign_id
  • 17/08 — falha da Graph deixou de virar success falso
  • 18/08 — provado na volta do OAuth: 9 represados, 7 entregues, 0 replay
  • 18/08 — renomeado para sol.captacao.meta-poll; no do cron passou a dizer a verdade (Cron 5min · 24h)
  • 18/08 — renomeado para SOL - Captação - Coleta de Leads Meta
CAPTACAOPRONTO4/4passoun/aatualizadoNÃO0
sol.captacao.meta-leadgen-receptor
histórico
  • 13/08 — auditado: tecnicamente completo, 0 execucoes desde que existe
  • 18/08 — aguarda decisao poll x webhook
  • 18/08 — arquivado: 0 execucoes desde que existe; endpoint /sol-meta-leadgen responde 404
CAPTACAOARQUIVADO0/0n/an/aatualizadoNÃO0
sol.inbound.whatsapp
histórico
  • 13/08 — auditado: 50 nos
  • 17/08 — branch de criacao grava WHATSAPP_DIRETO (parte da CAPTACAO)
QUALIFICACAOCORRIGINDO1/?pendenteparcialatualizadoNÃO0
2gZdr2EvcuB6UoRX
histórico
  • 18/08 — criado: separa a LEITURA da planilha do tronco
  • 18/08 — E2E linha 752 passou; 2 ciclos seguintes = 0 replay
CAPTAÇÃOPRONTOn/apassoun/aatualizadoNÃO0
TysfJ4xg1kvfKlx2
histórico
  • 18/08 — criado: tronco duplicado para dar independencia a Landing
  • 18/08 — E2E lead 612449: origem/pagina/canal/SM/template OK; contact_id NULL (pendente)
CAPTAÇÃOCORRIGINDO0/1passou com 1 ressalvaokatualizadoNÃO0

Bloqueadores reais

Só o que de fato impede fechar. Descoberta lateral vai para backlog e não trava o selo.

Placar da CAPTAÇÃO

retrato de 18/08 — 6 dias

A cadeia não fecha porque "o workflow roda". Fecha quando se responde, sem inferência: quantos entraram, por qual caminho, quantos viraram registro válido, quantos chegaram ao SolarMarket, quantos receberam a primeira abordagem, quantos ficaram pendentes, e se existe backlog.

Caminhos de entrada — estado real

caminhoestadoúltima entregaevidência
Meta Lead Ads · poll
sol.captacao.meta-poll (syCkKOzOyX7Uydbj)
OK2026-08-18 22:00RESTABELECIDO 18/08 14:55 UTC. Ficou parado 2 dias e 14 horas (16/08 00:20 -> 18/08 14:55, ~750 ciclos) por credencial OAuth invalidada. Ao voltar: Graph devolveu 131 leads, 131/131 com form_id 1355008362677886. Dos 9 leads represados, o checkpoint entregou 7 e barrou 2 corretamente (ja existiam por outro canal). Zero replay: 7 execucoes webhook para 7 leads.
Meta Lead Ads · webhook
sol.captacao.meta-webhook (pZ6aenKD92QjT755)
SEM EVENTOnunca0 execucoes retidas. Ativo e tecnicamente completo, mas a Meta nunca entregou nada nele.
Landing/Site · planilha
sol.captacao.entrada-lead — lane cron (Q8HFEmithXX9Do2b)
OK2026-08-18 23:20Cron de 5 min rodando: 250 execucoes retidas, 250 success.
WhatsApp direto · novo lead
sol.inbound.whatsapp (28WqoWNKIEanBI7G)
OK2026-08-18 21:4398 execucoes retidas, todas success. Conta como entrada SO quando o telefone nao existia antes: nesse caso a propria 1a mensagem cria o lead. Provado em 65/65 leads. E o unico caminho entregando volume hoje.

Entradas por dia

Entrada = telefone que não existia antes. META_LEAD_ADS + LANDING_PAGE + WHATSAPP_DIRETO. A última coluna, respostas, é mensagem de lead que já existia — isso é início da QUALIFICAÇÃO e está fora da conta de aquisição, de propósito. Linha marcada = nenhum lead do formulário Meta naquele dia.

diaentraramMETA_LEAD_ADSLANDING_PAGEWHATSAPP_DIRETO com SM1º contatoqualificadossem SM respostas
(não é entrada)
2026-08-1252—3524——
2026-08-138323844—2
2026-08-1486—2866—2
2026-08-1532—1320—1
2026-08-163—12310——
2026-08-1711—291116——
2026-08-1816112316123——

Backlog do formulário Meta

no último ciclo que leu a Graph122 leads no formulário
120 reais (2 eram teste da própria Meta)
desses, no Supabase120 — todos
represados no instante da quebra0
represados agoraNAO DETERMINADO

No instante da quebra a conta fechava exata: 162 meta_ads no Supabase = 120 reais do form (122 menos 2 leads de teste da propria Meta) + 42 do backlog do form anterior. Zero represado. Depois de 16/08 00:20 UTC nao ha como contar: a Graph nao responde para a credencial do poll, entao todo lead que entrou no formulario desde entao esta invisivel para nos.

Regra: Entrada da CAPTACAO = META_LEAD_ADS + LANDING_PAGE + WHATSAPP_DIRETO. Resposta de lead que ja existia NAO entra na contagem de entrada: e inicio da QUALIFICACAO. A coluna "respostas" abaixo esta fora da conta de aquisicao, de proposito.

QUALIFICAÇÃO NORMAL 100%

A regra que essa cadeia inteira defende: valor informado no formulário não é conta validada. O valor declarado é sinal comercial; a conta de energia é prova. Só o OCR abre o gate.

SOL SDR → CONTA → OCR → MÉDIA 3M → PRAZO → SCORE → DECISÃO → RESUMO → HANDOVER

Gates e garantias

garantiaestadocomo
conta sempre solicitadaoko valor do formulário não abre mais o gate
PDF/imagem + OCRokgpt-4o, READ_OK/PARTIAL/FAIL, guard anti-modelo
valor declarado preservadookvalor_conta intacto
valor OCR separadookvalor_conta_ocr, coluna própria
histórico de consumookconsumo_historico jsonb
média 3 mesesoksó meses reais; menos de 3 = NULL
prazo como gateokperguntado só após a conta validada
score definitivookrecalculado após OCR + prazo
qualificação precoce bloqueadaokfastQualify virou prioridade, não rota
resumo canônicookum objeto → whisper + SolarMarket + gestão
handover ordenadookts_qualificado < ts_handoff
telemetria operacionalok1ª resposta, tempo de resposta, mensagens IA
ledger de IAok1 chamada = 1 evento, preço congelado
idempotência econômicaokrequest_key UNIQUE; retry não cobra 2×

Prova ponta a ponta — lead 612449 / projeto SM 14770

captaçãoLANDING_PAGE / GOOGLE / OLIMPIA
declarado no formulárioR$ 850,00/mês
validado pelo OCRR$ 144,35 · READ_OK · confiança 95%
prazoMais para o futuro
score / temperatura35 · FRIO
statusQUALIFICADO
closerDanieli Nicasso
SLA do handoverts_qualificado < ts_handoff por 12s
conversa persistida13 mensagens
custo de IA do leadUS$ 0,098853

Consumo lido na conta

Dez/2025408 kWh
Jan/2026441 kWh
Fev/2026371 kWh
média 3 meses406,67 kWh

Cobertura do backend

indicadorvalor
leads na base280
com conta validada por OCR4
com média de 3 meses4
com 1ª resposta medida4
handover em ordem correta36
eventos no ledger de IA18
custo de IA acumuladoUS$ 0.246548

Nenhum evento de IA sem precificacao: todo uso registrado tem custo calculado.

1 leads historicos ainda tem ts_handoff anterior a ts_qualificado. Sao anteriores a correcao e nao foram saneados — o saneamento so entra depois que o escritor esta certo, e agora esta.

SLA do handover — série histórica

O writer antigo gravava ts_handoff no início do handover, em ramo paralelo, enquanto o filho regravava ts_qualificado no fim. Resultado: 34 leads com SLA fisicamente impossível — handover antes da qualificação.

situaçãoleadscomo
invertidos antes do saneamento34—
reconstruídos por evidência real33 20 pela execução n8n do handover · 13 pelo evento de transferência no Krolik
não reconstruíveis1mantidos como estavam, fora do SLA
timestamps fabricados0 nenhuma estimativa, nenhum swap de campo, nenhum "+1 segundo"

Distribuição do ts_handoff − ts_qualificado reconstruído: mín 0.656s · mediana 2.853s · p95 5.717s · máx 10.86s. Nenhum outlier absurdo.

Regressão no writer novo: 612453 +11.108s · 612457 +12.27s · 612449 +11.585s — todos positivos.

remanescentemotivo
lead 569563nenhum evento de transferencia no Krolik em ±5 min da qualificacao; execucao n8n fora da janela de retencao

Ressalva de leitura: Os historicos foram reconstruidos pelo instante da TRANSFERENCIA DO CHAT ao closer. O writer novo carimba ts_handoff quando o handover INTEIRO termina (SolarMarket + Krolik + gestao), alguns segundos depois. As duas metades da serie medem pontos ligeiramente diferentes do mesmo evento.

HANDOVER ENTREGA FECHADA

derivado do backend em 21/08

Qualificou → closer → SolarMarket → Krolik → whisper/resumo → gestão → transferência do chat → ts_handoff

o que a SOL entregaestado
roleta escolhe o closerprovado
SolarMarket etapa 114906 + responsável + notaprovado
whisper no chat do cliente (isWhisper)provado
3 destinos de gestão (Gabriel, Guilherme, Rafael)provado
chat transferido ao setor do closerprovado
ts_qualificado < ts_handoff (+12s no E2E real)provado
33 handoffs históricos saneados por evidênciaprovado

Fora do escopo do handover

sol.comercial.resposta-closer mede o que acontece DEPOIS que o comercial recebeu. É observabilidade comercial, frente futura — não faz parte da DoD do handover da SOL.

não validado hojecampo
primeira resposta do closerts_resposta_closer
quem respondeucloser_respondeu_krolik_id
tempo até respondertempo_resposta_closer_seg

Os três campos existem e são escritos, mas a auditoria de schema mostrou que ninguém os lê. Hoje não sabemos medir se o closer respondeu.

FUP & FAST FORWARD IMPLEMENTADO · AGUARDANDO E2E REAL

A regra nasceu de um princípio: Fast Forward nunca dispara só porque o score ou o valor são altos. Exige que a SOL tenha perguntado o prazo, que o cliente não tenha respondido e que o primeiro áudio tenha sido entregue — áudio gerado não conta.

Régua V1

JANELA ABERTAáudio quebra-gelo · texto 1 · texto 2 · áudio de fechamento
FAST FORWARDprazo perguntado + prazo sem resposta + 1º áudio ENTREGUE + silêncio → T0+2h (ou antes, se a janela fechar)
ELEGIBILIDADEconta validada por OCR → CONTA_VALIDADA · declarado ≥ R$ 500 → POTENCIAL_DECLARADO
PÓS-JANELA24h template 1 → 48h template 2 → 72h DESQUALIFICA
RESPOSTAem qualquer ponto interrompe a régua e volta à SOL

O que mudou

antesagora
Régua terminava em ~96h QUALIFICANDO o FRIO silencioso72h de silêncio chama [SOL] Desqualificar de verdade
template_2d em 72htemplate_2d em 48h — sem isso não havia como desqualificar também em 72h
Fast Forward não existiaexiste, e nunca dispara só por score ou valor alto
total_audios sem escritorincrementa após Krolik send-media confirmar
ledger subcontava lote1 evento por chamada de IA

Estado das provas

provaestado
Goldens da régua (9 cenários, código real)provado
Hotfix surrogate (emoji no limite)provado
Áudio FUP em produçãoprovado
Fast Forward E2E com lead realpendente
total_audios incremento ao vivopendente

As duas pendências dependem de operação real: um lead precisa percorrer prazo → silêncio → áudio → silêncio → Fast Forward. Não vamos fabricar esse lead.

Números

indicadorvalor
leads na base285
áudios de FUP entregues40
soma de total_audios0
eventos ElevenLabs no ledger9
Fast Forwards executados0
desqualificados35

total_audios em 0 com 40 áudios entregues é esperado: o campo não tinha escritor até 21/08. O contador começa do próximo áudio em diante — o histórico não foi retroagido, porque não havia como saber quais entregas foram de qual lead sem inferir.

Fim SOL — quando a SOL para

derivado do backend em 21/08

A SOL termina em exatamente dois caminhos. QUALIFICADO sozinho não é um deles: se não entregou ao closer, existe uma anomalia intermediária, não um desfecho.

caminhocondiçãoevidência mínima
SUCESSOQUALIFICADO + HANDOVER CONCLUÍDOstatus=QUALIFICADO · transferido_comercial=true · closer_id preenchido · ts_qualificado preenchido
ENCERRAMENTODESQUALIFICADOpor recusa explícita, ação humana legítima, ou FUP Frio 72h quando a regra nova entrar em produção

Onde estão os 285 leads

FIM SOL — SUCESSO (entregue ao comercial)91 
FIM SOL — DESQUALIFICADO35 
QUALIFICADO SEM HANDOVER — não é Fim SOL19 
AINDA EM JOGO140 

91 + 35 + 19 + 140 = 285. Conjuntos mutuamente exclusivos, zero sobreposição — conferido em query.

Não é Fim SOL

QUALIFICADO SEM HANDOVER — 19 leads anomalia histórica

Janela: 16/07 a 05/08/2026. Assinatura idêntica nos 19: closer_id nulo em 19/19 · ts_handoff nulo em 19/19 · ts_transferido nulo em 19/19 · mas ts_qualificado e projeto SM presentes em 19/19

É o GAP-05, já documentado no próprio código: até 08/08 o fluxo PAI marcava status=QUALIFICADO ANTES do handoff assíncrono. Se o filho falhava, o lead ficava meio-qualificado. O comentário no [SOL] SDR Engine registra exatamente "GAP-05, 19 casos".

FIX-04, aplicado em 08/08: quem marca QUALIFICADO passou a ser o FILHO, junto de closer_id e transferido_comercial. Último caso em 05/08 11:52 — três dias ANTES do fix. Zero casos novos desde então.

NÃO saneado nesta rodada. A auditoria detalhada fica para o bloco ANOMALIAS.

Desqualificados — 35

antes de 13/08: 28 · 13/08 em diante: 5 · sem ts_desqualificado: 2 · com ts_desqualificado: 33 · via esteira [SOL] Desqualificar: 11

11 passaram pela esteira [SOL] Desqualificar com handoff_tipo registrado; 24 não têm origem persistida e são anteriores à revisão. Nenhum foi desqualificado por silêncio — a régua nunca chamou desqualificação até a regra de 72h, que ainda não entrou em produção. Motivo não foi inferido onde o dado não existe.

Fast Forward IMPLEMENTADO + GOLDENS ✅ · E2E REAL ⏳

Fast Forward NÃO cria um terceiro Fim SOL. É outro caminho para o mesmo desfecho: FF → QUALIFICAR → HANDOVER → Fim SOL por sucesso. Zero ocorrências reais até agora.

Depois do Fim SOL

Primeira mensagem do closer, proposta, venda e fechamento são DOWNSTREAM. Não fazem parte do critério de término da SOL. A responsabilidade da SOL acaba na entrega.

Jornada — CAPTAÇÃO → QUALIFICAÇÃO → HANDOVER → FIM SOL

derivado do backend em 24/08

Visão canônica da SOL. OPS e OBSERVABILIDADE são camadas de suporte, não etapas da jornada. Continua pilar único SDR — as divisões abaixo são cadeia:*, não pilares. Elo marcado NÃO ANALISADO não foi provado.

etapaworkflow(s)objeto supabaseestadorevisão
CAPTAÇÃO
Meta / Landing / WhatsApp direto → entrada → Supabase → SolarMarket → 1º contato
SOL - Captação - Coleta de Leads Meta [SOL] Meta Leadgen SOL - Captação - Ingestão de Leads Metalead + conversa(capture)QUALIFICACAOprovado
QUALIFICAÇÃO
Inbound → SDR → conta → OCR → média 3m → prazo → score → decisão
sol.inbound.whatsapp [SOL] SDR Engine sol.followup.janela-24h sol.followup.reprocessa-parados sol.crm.garante-cliente-projetoconversa + campos de qualificaçãoQUALIFICACAOprovado
HANDOVER
Roleta → closer → SolarMarket → Krolik → whisper → gestão → ts_handoff
[SOL] Qualificar Lead [SOL] Desqualificar [SOL] Router Tag sol.roteamento.fallback-tagstransferido_comercial + closer_idQUALIFICADO / DESQUALIFICADOprovado
FIM SOL
QUALIFICADO + handover concluído, ou DESQUALIFICADO
—ts_handoff / ts_desqualificadoterminalprovado
OPS · camada de suporte
Ferramentas internas de leitura e correção
sol.crm.token [SOL] Ops Query (read-only) sol.ops.le-lead sol.ops.meta-form-readonly [SOL] Ops SM Lookup (read-only) [SOL] Ops SM GraphQL (read-only) [SOL] Ops Krolik Lookup (read-only) [SOL] Ops Sheet Read (read-only) sol.ops.altera-status-lead—transversalprovado
OBSERVABILIDADE · camada de suporte
Vigias, métricas e briefing
sol.observabilidade.silencio-inbound sol.comercial.resposta-closer [SOL] Briefing Diário (18h15 BRT)alertastransversalprovado

Workflows · 26

Linha enxuta; a ficha completa abre abaixo, na seção de fichas.

idworkflowetapavidan8nworkplacenósdecisão
2gZdr2EvcuB6UoRXSOL - Captação - Coleta de Leads Landing PageCAPTAÇÃOvivoativorevisado7revisado
syCkKOzOyX7UydbjSOL - Captação - Coleta de Leads MetaCAPTAÇÃOvivoativorevisado7pendente
TysfJ4xg1kvfKlx2SOL - Captação - Ingestão de Leads Landing PageCAPTAÇÃOvivoativorevisado30revisado
Q8HFEmithXX9Do2bSOL - Captação - Ingestão de Leads MetaCAPTAÇÃOvivoativorevisado37pendente
MIJwx1qcLAJW6Lrt[SOL] Briefing Diário (18h15 BRT)OBSERVABILIDADEvivoativopendente7pendente
1NW8E0etgiPUc8kn[SOL] DesqualificarHANDOVERvivoativopendente23pendente
vtkHm3dMPdQu4bsB[SOL] Ops Krolik Lookup (read-only)OPSvivoativopendente3pendente
eEkCmi1xfiXlAqYz[SOL] Ops Query (read-only)OPSvivoativopendente3pendente
wwnlcgDy8f3gvkTA[SOL] Ops SM GraphQL (read-only)OPSvivoativopendente4pendente
ElyzB7oOlfIyC39k[SOL] Ops SM Lookup (read-only)OPSvivoativopendente4pendente
4a7NUQbfsbMQTBQN[SOL] Ops Sheet Read (read-only)OPSvivoativopendente3pendente
S2lRZ4ihpAiMMCHj[SOL] Qualificar LeadHANDOVERvivoativorevisado40pendente
Vdc0MQeGJl5yvnp2[SOL] Router TagHANDOVERvivoativopendente21pendente
EsLDYIxZvp7jmr9D[SOL] SDR EngineQUALIFICAÇÃOvivoativorevisado15pendente
RkaGtxj71VYewn8Asol.comercial.resposta-closerOBSERVABILIDADEvivoativopendente9pendente
XNjrr2RSn2TEzfoosol.crm.garante-cliente-projetoQUALIFICAÇÃOvivoativopendente17pendente
zkgVYMEviJ3NvoZwsol.crm.tokenOPSvivoativopendente4pendente
voSpd9sEtmMoREAzsol.followup.janela-24hQUALIFICAÇÃOvivoativopendente24pendente
gP5UBqGVqdSmSrAbsol.followup.reprocessa-paradosQUALIFICAÇÃOvivoativopendente10pendente
28WqoWNKIEanBI7Gsol.inbound.whatsappQUALIFICAÇÃOvivoativorevisado62pendente
DJAnXCzk4ptkxZ1rsol.obs.registra-uso-iaNÃO ANALISADOvivoativopendente5—
KBLy8U1eSBjjCzWksol.observabilidade.silencio-inboundOBSERVABILIDADEvivoativopendente8pendente
ls6fMFxOKVNVJJF9sol.ops.altera-status-leadOPSvivoativopendente3pendente
PKcR12bXg2DHuZZpsol.ops.le-leadOPSvivoativopendente4pendente
RYCHPYTrFE0NSKd9sol.ops.meta-form-readonlyOPSvivoativopendente4pendente
PxsIxCyRuxDBU00ksol.roteamento.fallback-tagsHANDOVERvivoativopendente5pendente

Aposentados · 1

Arquivados no n8n em 14/08/2026 — fora da contagem, dentro da memória. Continuam exportados em Sol-estrategia/n8n/workflows/ e o arquivamento é reversível.

idworkflownóspor que saiu
pZ6aenKD92QjT755[SOL] Meta Leadgen9—

Fichas — 25 de 26 revisadas

Clique para abrir. Workflow ainda não revisado mostra só o que o n8n PROD sabe.

SOL - Captação - Coleta de Leads Landing Page2gZdr2EvcuB6UoRXrevisado em 21/08/2026decisão: revisado
papel — o que faz hojeVarre a planilha Google da landing a cada 5 minutos e entrega cada lead novo à Ingestão da Landing por POST autenticado. É o feeder do canal Google/Landing.
contrato — o que deveria fazerLer só o que ainda não foi processado, marcar fora-de-escopo na própria planilha e entregar um lead por POST, sem depender do tronco da Meta.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: SOL - Captação - Ingestão de Leads Landing Page
segurançawebhooks: nenhum
auth: AUTENTICADO · errorWorkflow: sim
retry: 2 tentativas no POST · onError continue: 0 nós
nome aprovadoSOL - Captação - Coleta de Leads Landing Page
APROVADO
posição na jornadaCAPTAÇÃO
entra de: planilha Google da landing
sai para: SOL - Captação - Ingestão de Leads Landing Page (webhook /sol-landing-inbound)
triggercron */5 * * * *
integraçõesGOOGLEAPIS N8N
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeE2E real
Linha 752 da planilha → lead 612449 → projeto SM 14770. Depois do split, o tronco da Meta registrou 0 execuções de cron — isolamento provado.

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

nenhum gap registrado

melhorias recomendadas

  • Nasceu da modularização de 18/08: antes a landing dividia tronco com a Meta e uma falha derrubava as duas lanes.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

revisado

revisado em 21/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/docs/CAPTACAO-DESENHO.md

SOL - Captação - Coleta de Leads MetasyCkKOzOyX7Uydbjrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeVarre a Graph API da Meta a cada 5 minutos e injeta os leads do formulário no webhook do Ads Capture. É o feeder real da captação hoje.
contrato — o que deveria fazerBuscar APENAS os leads novos desde a última varredura e entregá-los uma única vez ao fluxo de entrada, mantendo marca do que já foi enviado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: webhook /sol-ads-inbound
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: NÃO
retry: NENHUM · onError continue: 2 nós · 1 segredos inline
nome aprovadosol.captacao.meta-poll
RENOMEAR — o nó do cron mente
posição na jornadaCAPTAÇÃO
entra de: Graph API — form 1355008362677886
sai para: [SOL] Ads Capture (POST /sol-ads-inbound)
triggercron */5 * * * *
integraçõesCOM FACEBOOK
supabase lê: nada
escreve: nada
estados recebe: —
altera: —(não toca Supabase)
saída: —
testeNAO TESTADO
Leitura da Graph confirmada: 114 leads, paging none.

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • ✅ CORRIGIDO 13/08 — B1 · GET /leads?limit=200 SEM filtro de data, SEM cursor, SEM registro do que já enviou. Reenvia os 112 leads reais do form a cada 5 min: 32.256 POSTs/dia contra o Ads Capture.
  • B2 · O cron é */5 * * * * 24h/dia, mas o nó se chama "Cron 10min (8-20h)". Nome mente sobre o comportamento.
  • ✅ CORRIGIDO 13/08 — B3 · limit=200 sem paginação: quando o form passar de 200 leads, os mais antigos somem da varredura silenciosamente.
RISCO
  • R1 · Só a idempotência da RPC capture_lead impede que isso vire 112 WhatsApps duplicados por ciclo.
  • ✅ CORRIGIDO 13/08 — R2 · errorWorkflow configurado ([Tech] Alerta de Erro).
DRIFT
  • ✅ CORRIGIDO 13/08 — D1 · o receptor passou a validar o token; segredo rotacionado.
DUVIDA
  • Q1 · Manter poll ou migrar para o webhook page-wide (instantâneo)?

melhorias recomendadas

  • M1 · Guardar a marca d'água (created_time do último lead processado) e filtrar a busca por ela.
  • M2 · Alternativamente, tabela de leadgen_id já processado.
  • M3 · Corrigir o nome do nó do cron.
  • M4 · Paginar ou ordenar por created_time desc.
  • M5 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

SOL - Captação - Ingestão de Leads Landing PageTysfJ4xg1kvfKlx2revisado em 21/08/2026decisão: revisado
papel — o que faz hojeRecebe o lead da Coleta da Landing, grava em lead + conversa, cria cliente e projeto no SolarMarket em TRÁFEGO PAGO e dispara o template de 1º contato pelo Krolik.
contrato — o que deveria fazerRegistrar origem e canal sem inferir, criar o projeto na etapa certa, provar o 1º contato e nunca reportar sucesso falso quando o SolarMarket falhar.
ligaçõeschamado por: SOL - Captação - Coleta de Leads Landing Page
chama: ninguém
segurançawebhooks: POST /sol-landing-inbound
auth: AUTENTICADO · errorWorkflow: sim
retry: nós críticos · onError continue: 0 nós
nome aprovadoSOL - Captação - Ingestão de Leads Landing Page
APROVADO
posição na jornadaCAPTAÇÃO
entra de: SOL - Captação - Coleta de Leads Landing Page
sai para: sol.inbound.whatsapp (quando o cliente responde)
triggerwebhook POST /sol-landing-inbound
integraçõesSUPABASE SOLARMARKET KROLIK META
supabase lê: lead
escreve: lead, conversa
estados recebe: —(cria o lead)
altera: QUALIFICACAO
saída: QUALIFICACAO
testeE2E real
Lead 612449: LANDING_PAGE / GOOGLE / OLIMPIA, stage 114903 no writer vivo, template_entregue=true, planilha I=14770 J=SIM, zero replay.

campos gravados

origem_entrada · canal_aquisicao · pagina_origem · identificador_sm · sm_status · template_entregue · etapa_funil

mensagens

este fluxo não produz comunicação a cliente

gaps

nenhum gap registrado

melhorias recomendadas

  • Tronco copiado byte a byte do fluxo da Meta, para a regra de negócio ser idêntica; só entrada e saída mudam.
  • Telefone inválido virou estado terminal em vez de laço infinito.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

revisado

revisado em 21/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/docs/CAPTACAO-DESENHO.md

SOL - Captação - Ingestão de Leads MetaQ8HFEmithXX9Do2brevisado em 13/08/2026decisão: pendente
papel — o que faz hojePorta de entrada de todo lead de aquisição: recebe da Meta (webhook) e do site (planilha Google), normaliza, grava no Supabase, garante cliente/projeto no SolarMarket e dispara a primeira abordagem no WhatsApp.
contrato — o que deveria fazerReceber todo lead válido de aquisição, de qualquer canal, registrá-lo de forma completa, idempotente e rastreável, garantir o cadastro no SolarMarket, abrir a conversa com a primeira abordagem, e entregá-lo ao próximo estágio em estado inequívoco — concluído por inteiro ou visivelmente falho.
ligaçõeschamado por: sol.captacao.meta-trigger-aposentado, [SOL] Meta Leadgen, [SOL] Meta Leads Poll, [SOL] Captura Meta Form Novo (poll 5min 24h)
chama: [SOL] getSMToken
segurançawebhooks: POST /sol-ads-inbound
auth: SEM AUTH · errorWorkflow: sim
retry: NENHUM · onError continue: 13 nós · 3 segredos inline
nome aprovadosol.captacao.entrada-lead
RENOMEAR — pendente de GO
posição na jornadaCAPTAÇÃO
entra de: Meta Lead Ads (via [SOL] Captura Meta Form Novo) · planilha Google do site
sai para: sol.inbound.whatsapp (quando o cliente responde) · sol.followup.janela-24h
triggercron */5 * * * * | webhook POST /sol-ads-inbound
integraçõesCOM GOOGLEAPIS SUPABASE
supabase lê: nada
escreve: lead (PATCH), conversa (POST), rpc capture_lead
estados recebe: —(cria o lead)
altera: QUALIFICACAO
saída: QUALIFICACAO
testeNAO TESTADO
E2E com lead controlado exige GO (efeito externo: cria SM + envia WhatsApp).

campos gravados

canal_origem · chat_id · contact_id · email · etapa_funil · gclid · identificador_sm · origem · sm_status · status · telefone_normalizado · ts_ultima_interacao · ultimo_canal

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • ✅ CORRIGIDO 13/08 — B1 · Feeder em replay permanente: 32.544 execuções/dia (112 replays + 1 cron a cada 5 min). Retenção de execuções caiu para 85 MINUTOS — a exec 808717 (lead perdido) já responde 404. Auditoria forense da SOL virou impossível.
  • B2 · Falha do SolarMarket é silenciosa: 7 dos 8 nós SM são continueRegularOutput. SM fora do ar => lead gravado com identificador_sm vazio, sm_status="Abertos" mentindo, WhatsApp enviado, execução marcada success. O errorWorkflow nunca dispara.
  • B3 · Zero retry em 34 nós. Lead perdido comprovado: Marciel Freitas (Franca/SP, faixa R$1.200), ECONNRESET no capture_lead em 12/08.
  • B4 · Telefone inválido: descarte silencioso nas duas lanes. Na planilha a linha nunca é marcada (o continue acontece antes de qualquer write-back) => relida a cada 5 min, indefinidamente.
  • B5 · PATCH lead enriquecido roda mesmo com is_new=false e sobrescreve canal_origem: 5 leads que chegaram pelo WhatsApp foram reetiquetados como google_site.
RISCO
  • ✅ CORRIGIDO 13/08 — R1 · Webhook POST /sol-ads-inbound sem autenticação (options:{}). O feeder JÁ envia x-webhook-token; nenhum nó lê. Qualquer POST anônimo cria lead, cria cliente/projeto no SM e dispara WhatsApp.
  • ✅ MITIGADO 13/08 — R2 · A enxurrada acabou; o gate da RPC deixou de ser a única proteção.
  • R3 · Primeira mensagem depende de 8 chamadas SM sequenciais (timeout 30s cada). Mediana real medida: 12s — mas o pior caso teórico é ~2,5 min.
DRIFT
  • D1 · etapa_funil="TRAFEGO PAGO" gravado também em lead da planilha/site: 23 dos 28 leads google_site. O PATCH mora na sub-lane do SM, alcançada por qualquer lane.
  • D2 · canal_origem gravado em minúsculo pelo PATCH (meta_ads/google_site), contra maiúsculo da RPC e do inbound (WHATSAPP).
  • D3 · Nome do workflow não descreve a função; o nó do feeder chama-se "Cron 10min (8-20h)" mas roda */5 24h.
LEGADO
  • L1 · GET channel (Meta token) é vestigial — a saída não é usada pelo nó seguinte.
  • L2 · Branch false de IF veio da planilha não tem conexão: beco sem saída para lead Meta repetido.
  • L3 · Duas URLs do Supabase hardcoded (PATCH âncora FUP, PATCH lead contact_id) em vez de ler do 00_CONFIG.
  • L4 · client_id_sm nunca escrito (0%); project_id_sm em 40%.
DUVIDA
  • Q1 · Falha do SM: seguir e alertar, parar e alertar, ou seguir com fila de reparo?
  • Q2 · Manter a mensagem depois do SM (CRM garantido) ou disparar em paralelo (resposta imediata)?
  • Q3 · Telefone inválido: só marcar a planilha, ou notificar alguém para recuperar o lead na mão?

melhorias recomendadas

  • M1 · Dar memória ao feeder (filtro created_time > última varredura ou registro de leadgen_id já enviado) e corrigir o cron para a janela real — mata 99,98% da carga e devolve o histórico de execuções.
  • M2 · Validar o x-webhook-token que já chega (IF + Respond 401), mesmo padrão de Router Tag e inbound.whatsapp.
  • M3 · Se identifier vier vazio: não gravar sm_status="Abertos", marcar falha e alertar. Mensagem continua saindo.
  • M4 · Persistir campanha, meta_leadgen_id e form_id (feeder passa a carimbar form_id).
  • M5 · retryOnFail/maxTries=3/wait 2s no Supabase capture_lead (RPC é idempotente).
  • M6 · Validar telefone antes da bifurcação, com estado terminal em cada lane.
  • M7 · Gravar template_msg_id e template_entregue a partir da resposta do Krolik.
  • M8 · PATCH enriquecido só quando is_new=true.
  • M9 · Remover etapa_funil dos 2 PATCH (aqui e no inbound).
  • M10 · Padronizar caixa de canal_origem + backfill.
  • M11 · Higiene: remover nó vestigial, fechar o beco, tirar URLs hardcoded, renomear.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Briefing Diário (18h15 BRT)MIJwx1qcLAJW6Lrtrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeÀs 08h manda no WhatsApp do Rafael o resumo do funil do dia.
contrato — o que deveria fazerDar leitura diária confiável do estado da operação.
segurançawebhooks: GET /sol-briefing-run
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.observabilidade.briefing-diario
RENOMEAR
posição na jornadaOBSERVABILIDADE
entra de: cron 08h BRT
sai para: WhatsApp Rafael
triggercron 0 8 * * * | webhook GET /sol-briefing-run
integraçõesCOM SUPABASE
supabase lê: lead (GET)
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook run-now sem auth.
  • R2 · Sem errorWorkflow: se quebrar, o briefing só some.
DRIFT
  • D1 · Único SOL sem a tag "sol" e sem cadeia:*.

melhorias recomendadas

  • M1 · Tag sol + cadeia.
  • M2 · errorWorkflow.
  • M3 · Autenticar run-now.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Desqualificar1NW8E0etgiPUc8knrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeEncerra o lead ruim: marca DESQUALIFICADO, manda despedida, remove tags do robô, finaliza o chat e move o projeto para Declínio/Perdido no SolarMarket.
contrato — o que deveria fazerSer o único ponto que declara FIM SOL por desqualificação, com o CRM refletindo a perda.
ligaçõeschamado por: sol.inbound.whatsapp, [SOL] Router Tag
chama: [SOL] getSMToken
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: NENHUM · onError continue: 11 nós · 7 segredos inline
nome aprovadosol.handover.desqualifica
RENOMEAR
posição na jornadaHANDOVER
entra de: sol.inbound.whatsapp · Router Tag
sai para: FIM SOL
triggersub-workflow (chamado por outro)
integraçõesCOM SUPABASE
supabase lê: lead (GET/PATCH)
escreve: lead (GET/PATCH)
estados recebe: QUALIFICACAO
altera: → DESQUALIFICADO
saída: DESQUALIFICADO
testeNAO TESTADO
—

campos gravados

desqualificado · sm_status · status

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · 11 nós continueRegularOutput: se o SM falhar, o lead fica DESQUALIFICADO no Supabase e Aberto no CRM.

melhorias recomendadas

  • M1 · Verificar e alertar quando o encerramento no SM falhar.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops Krolik Lookup (read-only)vtkHm3dMPdQu4bsBrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeConsulta read-only à API do Krolik (contatos, chats).
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-krolik-7k3
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.krolik-lookup
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-krolik-7k3
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops Query (read-only)eEkCmi1xfiXlAqYzrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeConsulta read-only ao Supabase por webhook (GET only, tabela + querystring). É a base das auditorias e do futuro front.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-query-83c1
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.query-supabase
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-query-83c1
integraçõesSUPABASE
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Token fraco no corpo (5 caracteres). Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops SM GraphQL (read-only)wwnlcgDy8f3gvkTArevisado em 13/08/2026decisão: pendente
papel — o que faz hojeProxy read-only do GraphQL do SolarMarket.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] getSMToken
segurançawebhooks: POST /sol-ops-sm-gql-4t8
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.sm-graphql
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-sm-gql-4t8
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops SM Lookup (read-only)ElyzB7oOlfIyC39krevisado em 13/08/2026decisão: pendente
papel — o que faz hojeProxy read-only da API REST do SolarMarket, reusando o getSMToken.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] getSMToken
segurançawebhooks: POST /sol-ops-sm-9d2f
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.sm-lookup
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-sm-9d2f
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Ops Sheet Read (read-only)4a7NUQbfsbMQTBQNrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeLeitura read-only da planilha Google do site.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-sheet-6f4a
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.sheet-read
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-sheet-6f4a
integraçõesGOOGLEAPIS
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Qualificar LeadS2lRZ4ihpAiMMCHjrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeFecha o ciclo SOL do lead bom: garante cliente/projeto no SM, move de etapa, sorteia o closer na roleta, transfere no Krolik, avisa a equipe e marca QUALIFICADO + transferido_comercial + closer_id.
contrato — o que deveria fazerSer o único ponto que declara FIM SOL por qualificação, com handoff provado (transferido_comercial + closer_id) e notificação confirmada.
ligaçõeschamado por: sol.inbound.whatsapp, [SOL] Router Tag, sol.followup.janela-24h
chama: [SOL] getSMToken
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 1 nós · onError continue: 18 nós · 10 segredos inline
nome aprovadosol.handover.qualifica
RENOMEAR
posição na jornadaHANDOVER
entra de: sol.inbound.whatsapp · Router Tag · FUP
sai para: FIM SOL (closer assume)
triggersub-workflow (chamado por outro)
integraçõesCOM FACEBOOK SUPABASE
supabase lê: lead (GET/PATCH), closer (GET)
escreve: lead (GET/PATCH)
estados recebe: QUALIFICACAO
altera: → QUALIFICADO
saída: QUALIFICADO
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · 18 nós continueRegularOutput: falha no SM ou no Krolik não impede o lead de virar QUALIFICADO.
  • R2 · Se a transferência no Krolik falhar, o lead consta entregue no Supabase mas o closer não recebeu o chat.
DRIFT
  • D1 · Escreve ts_transferido junto com transferido_comercial — semântica correta aqui, mas o FUP usa o mesmo campo com outro sentido.

melhorias recomendadas

  • M1 · Verificar sucesso da transferência Krolik antes de declarar handoff.
  • M2 · Separar ts_transferido (handoff) de marcador de saída da régua.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] Router TagVdc0MQeGJl5yvnp2revisado em 13/08/2026decisão: pendente
papel — o que faz hojePonte manual: a equipe põe uma etiqueta no Krolik e este fluxo executa a ação (qualificar/desqualificar), removendo a etiqueta em seguida.
contrato — o que deveria fazerDar à equipe um controle manual seguro e auditável sobre o robô.
ligaçõeschamado por: sol.roteamento.fallback-tags
chama: [SOL] Qualificar Lead, [SOL] Desqualificar
segurançawebhooks: POST /sol-router-tag
auth: AUTENTICADO · errorWorkflow: sim
retry: NENHUM · onError continue: 8 nós · 10 segredos inline
nome aprovadosol.roteamento.router-tag
RENOMEAR
posição na jornadaHANDOVER
entra de: sol.roteamento.fallback-tags · chamada direta
sai para: Qualificar Lead · Desqualificar
triggerwebhook POST /sol-router-tag
integraçõesCOM SUPABASE
supabase lê: lead (GET/PATCH)
escreve: lead (GET/PATCH)
estados recebe: qualquer
altera: via sub-workflows
saída: QUALIFICADO/DESQUALIFICADO
testeNAO TESTADO
Webhook AUTENTICADO (IF token válido + Respond 401) — um dos 2 da casa.

campos gravados

origem

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · 8 nós continueRegularOutput mascaram falha na remoção da etiqueta (etiqueta órfã reprocessa).

melhorias recomendadas

  • M1 · Confirmar remoção da etiqueta antes de responder OK.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

[SOL] SDR EngineEsLDYIxZvp7jmr9Drevisado em 13/08/2026decisão: pendente
papel — o que faz hojeCérebro conversacional: monta contexto do lead + histórico, chama a Anthropic, aplica travas determinísticas na resposta e grava a mensagem de saída.
contrato — o que deveria fazerProduzir a próxima ação do SDR de forma auditável, nunca inventando estado, e sempre respeitando os gates de status.
ligaçõeschamado por: sol.inbound.whatsapp
chama: ninguém
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 1 nós · onError continue: 0 nós
nome aprovadosol.sdr.engine
RENOMEAR
posição na jornadaQUALIFICAÇÃO
entra de: sol.inbound.whatsapp
sai para: resposta ao cliente · sinal de qualificar/desqualificar
triggersub-workflow (chamado por outro)
integraçõesANTHROPIC SUPABASE
supabase lê: lead (GET/PATCH), conversa (GET/POST)
escreve: lead (GET/PATCH), conversa (GET/POST)
estados recebe: QUALIFICACAO
altera: campos de qualificação
saída: QUALIFICACAO
testeNAO TESTADO
—

campos gravados

telefone_normalizado

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Único nó com retry é a chamada à Anthropic; PATCH e INSERT não têm.
  • R2 · O score exibido em resumo pode divergir da coluna: a coluna é a fonte de verdade.
DUVIDA
  • Q1 · O prompt do SDR vive no nó; deveria versionar em repo?

melhorias recomendadas

  • M1 · Retry nos nós de gravação.
  • M2 · Versionar o prompt fora do nó.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.comercial.resposta-closerRkaGtxj71VYewn8Arevisado em 13/08/2026decisão: pendente
papel — o que faz hojeA cada 10 min verifica, nos chats do Krolik, se o closer respondeu o lead entregue, e grava o tempo de resposta.
contrato — o que deveria fazerMedir a qualidade do handoff — quanto tempo o comercial leva para assumir.
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 4 nós · onError continue: 0 nós · 1 segredos inline
nome aprovadosol.comercial.resposta-closer
NOME OK
posição na jornadaOBSERVABILIDADE
entra de: cron 10min
sai para: métrica no Supabase
triggercron */10 * * * *
integraçõesCOM SUPABASE
supabase lê: closer (GET), lead (GET/PATCH)
escreve: lead (GET/PATCH)
estados recebe: QUALIFICADO
altera: ts_resposta_closer
saída: QUALIFICADO
testeNAO TESTADO
Tem retry em 4 nós.

campos gravados

nome

mensagens

este fluxo não produz comunicação a cliente

gaps

DUVIDA
  • Q1 · Existe SLA definido de resposta do closer?

melhorias recomendadas

  • M1 · Alertar quando o SLA estourar (hoje só mede, não avisa).

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.crm.garante-cliente-projetoXNjrr2RSn2TEzfoorevisado em 13/08/2026decisão: pendente
papel — o que faz hojeSub-workflow idempotente que acha-ou-cria cliente e projeto no SolarMarket, buscando telefone com e sem 55 para não duplicar.
contrato — o que deveria fazerGarantir exatamente 1 cliente e 1 projeto por lead, sem duplicata, com falha explícita.
ligaçõeschamado por: sol.inbound.whatsapp
chama: [SOL] getSMToken
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: NÃO
retry: 4 nós · onError continue: 0 nós
nome aprovadosol.crm.garante-cliente-projeto
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: sol.inbound.whatsapp
sai para: ids do SM
triggersub-workflow (chamado por outro)
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
Tem retry em 4 nós — é o fluxo mais bem protegido da casa.

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Sem errorWorkflow configurado.

melhorias recomendadas

  • M1 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.crm.tokenzkgVYMEviJ3NvoZwrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeAutentica no SolarMarket (REST + GraphQL) e devolve os tokens. Chamado por 6 workflows.
contrato — o que deveria fazerSer o único ponto de autenticação SM, com cache e retry.
ligaçõeschamado por: [SOL] Desqualificar, [SOL] Ops SM Lookup (read-only), [SOL] Ads Capture, [SOL] Qualificar Lead, sol.crm.garante-cliente-projeto, [SOL] Ops SM GraphQL (read-only)
chama: ninguém
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: 2 nós · onError continue: 0 nós
nome aprovadosol.crm.token
NOME OK
posição na jornadaOPS
entra de: 6 workflows
sai para: tokens
triggersub-workflow (chamado por outro)
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
Tem retry nos 2 nós de auth.

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Sem cache: cada lead abre uma sessão nova. Foi o que derrubou o SM na rajada de 17/07 (42 auths simultâneos).

melhorias recomendadas

  • M1 · Cache do token com TTL.
  • M2 · Jitter/backoff quando chamado em lote.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.followup.janela-24hvoSpd9sEtmMoREAzrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeRégua de follow-up: a cada 5 min busca leads elegíveis, aplica a cadência de toques (texto, áudio ElevenLabs, template Meta), e faz auto-desqualificação com whisper.
contrato — o que deveria fazerReengajar quem não respondeu, respeitando a janela de 24h e o FIM SOL, sem jamais tocar lead entregue ou desqualificado.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] Qualificar Lead
segurançawebhooks: GET /sol-fup-run-8c2e
auth: SEM AUTH · errorWorkflow: sim
retry: NENHUM · onError continue: 2 nós · 1 segredos inline
nome aprovadosol.followup.janela-24h
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: cron 5min (8-18 BRT, seg-sáb)
sai para: cliente · Qualificar Lead (handoff FUP)
triggercron */5 8-17 * * 1-6 | webhook GET /sol-fup-run-8c2e
integraçõesCOM ELEVENLABS FACEBOOK SUPABASE
supabase lê: lead (GET/PATCH)
escreve: lead (GET/PATCH), conversa (POST)
estados recebe: ABERTO/QUALIFICACAO
altera: fup_count, ts_ultimo_fup
saída: QUALIFICACAO
testeNAO TESTADO
Filtro de elegibilidade lido: status in (ABERTO,QUALIFICACAO) AND ts_qualificado is null AND ts_transferido is null AND ts_desqualificado is null — 4 guardas, FIM SOL respeitado.

campos gravados

origem · telefone_normalizado · ts_transferido

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • B1 · Usa ts_transferido como marcador de "saiu da régua" na auto-desqualificação. Resultado: 105 dos 174 leads com ts_transferido NÃO são handoff (transferido_comercial=false, closer_id vazio). O campo está corrompido por sobrecarga semântica.
RISCO
  • R1 · chave da API ElevenLabs como string literal no header do nó, sem credencial n8n. É a única chave de terceiro em texto plano na SOL.
  • R2 · Webhook GET /sol-fup-run-8c2e sem auth dispara a régua inteira.
DUVIDA
  • Q1 · Política de domingo/feriado já foi fechada?

melhorias recomendadas

  • M1 · Trocar ts_transferido por um campo próprio (ex.: ts_saida_regua) e limpar os 105.
  • M2 · Mover a chave da ElevenLabs para credencial n8n.
  • M3 · Autenticar o webhook run-now.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.followup.reprocessa-paradosgP5UBqGVqdSmSrAbrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeFerramenta de reprocesso: recebe um lead por webhook, reenvia o template e reseta a régua.
contrato — o que deveria fazerPermitir reprocesso manual controlado, com autorização e trilha.
segurançawebhooks: POST /sol-reprocesso-krolik-9f2c
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 2 nós · 1 segredos inline
nome aprovadosol.followup.reprocessa-parados
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: chamada manual
sai para: cliente (template)
triggerwebhook POST /sol-reprocesso-krolik-9f2c
integraçõesCOM SUPABASE
supabase lê: nada
escreve: lead (PATCH), conversa (POST)
estados recebe: qualquer
altera: status, ts_ultima_interacao
saída: QUALIFICACAO
testeNAO TESTADO
—

campos gravados

desqualificado · nome · origem · status · telefone_normalizado · ts_ultima_interacao

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook POST sem auth que ENVIA mensagem ao cliente e reescreve status. Efeito externo disparável por qualquer um com a URL.
  • R2 · Sem errorWorkflow.
DRIFT
  • D1 · Pode ressuscitar lead em FIM SOL — o guard valida payload, não estado terminal.

melhorias recomendadas

  • M1 · Autenticar o webhook.
  • M2 · Bloquear lead em QUALIFICADO/DESQUALIFICADO.
  • M3 · errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.inbound.whatsapp28WqoWNKIEanBI7Grevisado em 13/08/2026decisão: pendente
papel — o que faz hojeRecebe toda mensagem do cliente pelo Krolik: normaliza, deduplica, grava conversa, chama o SDR, faz OCR de conta, aplica botões de prazo, e aciona qualificação ou desqualificação. É o coração da jornada.
contrato — o que deveria fazerSer a única porta de entrada de mensagem do cliente, com autenticação, idempotência e roteamento determinístico para SDR/qualificação, sem jamais atropelar atendimento humano.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [SOL] SDR Engine, [SOL] Qualificar Lead, [SOL] SM Ensure (acha-ou-cria), [SOL] Desqualificar
segurançawebhooks: POST /sol-wa-inbound
auth: AUTENTICADO · errorWorkflow: sim
retry: NENHUM · onError continue: 14 nós · 3 segredos inline
nome aprovadosol.inbound.whatsapp
NOME OK
posição na jornadaQUALIFICAÇÃO
entra de: Krolik (webhook evento 7)
sai para: SDR Engine · Qualificar Lead · Desqualificar · SM Ensure
triggerwebhook POST /sol-wa-inbound
integraçõesCOM FACEBOOK OPENAI SUPABASE
supabase lê: conversa (GET/POST), lead (GET/PATCH)
escreve: conversa (GET/POST), lead (GET/PATCH), rpc capture_lead
estados recebe: QUALIFICACAO/ABERTO
altera: QUALIFICACAO → QUALIFICADO/DESQUALIFICADO
saída: vários
testeNAO TESTADO
Autenticação confirmada por leitura: valida x-webhook-token + organizationId.

campos gravados

cidade · etapa_funil · identificador_sm · nome · origem · sm_status · status · telefone_normalizado · ts_ultima_interacao · valor_conta

mensagens

este fluxo não produz comunicação a cliente

gaps

BUG
  • B1 · Zero retry em 50 nós.
  • B2 · Grava etapa_funil="SOL SDR" sobrescrevendo o valor da captação sem ler o anterior (last-write-wins).
RISCO
  • R1 · Dedupe tem janela de 8s e é fail-open: 2 requests verdadeiramente simultâneos (<100ms) escapam.
  • R2 · 14 nós continueRegularOutput mascaram falha de Krolik/OpenAI/SM.
DRIFT
  • D1 · Token validado como literal inline no nó IF, não via credencial.
  • D2 · conversa.direcao usa "in" aqui e "outbound"/"out" em outros fluxos — 3 vocabulários na mesma coluna.

melhorias recomendadas

  • M1 · Externalizar o token para credencial/config.
  • M2 · Padronizar conversa.direcao em 2 valores.
  • M3 · Remover a escrita de etapa_funil.
  • M4 · Retry nos nós de gravação.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.obs.registra-uso-iaDJAnXCzk4ptkxZ1rNÃO ANALISADO

NÃO ANALISADO — este workflow ainda não passou pela revisão nó a nó. O que se sabe vem só do n8n PROD: 5 nós, ativo.

sol.observabilidade.silencio-inboundKBLy8U1eSBjjCzWkrevisado em 13/08/2026decisão: pendente
papel — o que faz hojeDe hora em hora, alarma se ninguém falou com a SOL há tempo demais, e se há handoff travado.
contrato — o que deveria fazerSer o vigia do funil — detectar silêncio anormal e entrega parada.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: [Tech] Avisos Telegram
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: sim
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.observabilidade.silencio-inbound
NOME OK
posição na jornadaOBSERVABILIDADE
entra de: cron horário
sai para: [Tech] Avisos Telegram
triggercron 0 * * * *
integraçõesSUPABASE
supabase lê: conversa (GET), lead (GET)
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Não vigia o replay: 32 mil execuções/dia passaram despercebidas porque ele só olha silêncio, nunca excesso.

melhorias recomendadas

  • M1 · Adicionar alarme de VOLUME anormal de execução, não só de silêncio.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.ops.altera-status-leadls6fMFxOKVNVJJF9revisado em 13/08/2026decisão: pendente
papel — o que faz hojeESCREVE: altera status/closer_id/identificador_sm do lead por webhook, com allowlist de campos.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: POST /sol-ops-patch-4e8b
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 0 nós
nome aprovadosol.ops.altera-status-lead
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook POST /sol-ops-patch-4e8b
integraçõesSUPABASE
supabase lê: nada
escreve: nada
estados recebe: —
altera: status, closer_id, identificador_sm
saída: —
testeNAO TESTADO
—

campos gravados

closer_id · status

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · RETIFICADO 13/08 — a auditoria classificou como "webhook público sem autenticação". ERRADO: o nó webhook não tem auth, mas o nó Code valida um token no corpo (`if (String(b.t) !== ...) throw unauthorized`), tem allowlist de status, valida ISO nos timestamps e limita o lote a 40. Não é aberto. O problema real é menor: segredo de 5 caracteres no corpo, sem rate limit, e resposta 500 em vez de 401. Severidade rebaixada de CRÍTICO para MÉDIO.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.ops.le-leadPKcR12bXg2DHuZZprevisado em 13/08/2026decisão: pendente
papel — o que faz hojeLeitura read-only de lead por webhook GET.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: GET /sol-sb-ro-k7
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.ops.le-lead
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook GET /sol-sb-ro-k7
integraçõesSUPABASE
supabase lê: lead (GET)
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth. Sem errorWorkflow.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.ops.meta-form-readonlyRYCHPYTrFE0NSKd9revisado em 13/08/2026decisão: pendente
papel — o que faz hojeLeitura read-only dos leads do formulário Meta pela Graph API. Foi esta ferramenta que provou o form real na auditoria.
contrato — o que deveria fazerFerramenta operacional interna: deve ser autenticada, auditável e nunca causar efeito externo não autorizado.
segurançawebhooks: GET /sol-form-ro-k7
auth: SEM AUTH · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós
nome aprovadosol.ops.le-form-meta
NOME OK
posição na jornadaOPS
entra de: chamada manual/interna
sai para: resposta JSON
triggerwebhook GET /sol-form-ro-k7
integraçõesFACEBOOK
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Webhook sem auth expõe dados pessoais de 114 leads (nome, telefone, e-mail, cidade) a qualquer um com a URL.

melhorias recomendadas

  • M1 · Autenticar o webhook (padrão IF token + Respond 401).
  • M2 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

sol.roteamento.fallback-tagsPxsIxCyRuxDBU00krevisado em 13/08/2026decisão: pendente
papel — o que faz hojeRede de segurança: a cada hora varre os contatos do Krolik procurando etiquetas manuais que o webhook do Router perdeu, e reenvia.
contrato — o que deveria fazerGarantir que nenhuma etiqueta manual fique órfã.
ligaçõeschamado por: ninguém (ponto de entrada)
chama: webhook /sol-router-tag
segurançawebhooks: nenhum
auth: n/a · errorWorkflow: NÃO
retry: NENHUM · onError continue: 1 nós · 3 segredos inline
nome aprovadosol.roteamento.fallback-tags
NOME OK
posição na jornadaHANDOVER
entra de: cron 1h
sai para: [SOL] Router Tag
triggercron hours=1
integraçõesCOM
supabase lê: nada
escreve: nada
estados recebe: —
altera: —
saída: —
testeNAO TESTADO
—

campos gravados

—

mensagens

este fluxo não produz comunicação a cliente

gaps

RISCO
  • R1 · Sem errorWorkflow.

melhorias recomendadas

  • M1 · Configurar errorWorkflow.

Nenhuma foi executada. Auditoria ≠ correção.

decisão Rafael

pendente

revisado em 13/08/2026 · fonte: n8n PROD · prosa completa em Sol-estrategia/docs/AUDITORIA-SOL-13-08.md

Funil — medido no Supabase

derivado do backend em 21/08

CAPTAÇÃO → SOL SDR → QUALIFICAÇÃO → HANDOVER. Cada linha é uma contagem direta, sem inferência. Onde o número engana, a ressalva vem junto.

etapaleadsleitura
CAPTADOS285Meta 173 · WhatsApp direto 75 · Landing 34 · 3 sem origem (anteriores à migration 0005)
COM PROJETO NO SOLARMARKET27312 sem projeto: falhas de SM que hoje gravam FALHA_SM em vez de sucesso falso
RESPONDERAM14852% dos captados — é aqui que a SOL começa de fato a trabalhar
EM SOL SDR68etapa_funil atual; os demais já saíram para qualificado ou desqualificado
CONTA VALIDADA POR OCR7só a partir de 19/08 o gate passou a exigir a conta — o histórico não retroage
COM PRAZO RESPONDIDO62prazo_decisao preenchido
QUALIFICADOS110MORNO 61 · FRIO 49 · QUENTE 0
ENTREGUES AO CLOSER91transferido_comercial=true
DESQUALIFICADOS35por recusa explícita ou ação humana — nunca por silêncio
EM JOGO AGORA18nem qualificado, nem desqualificado, nem transferido

Ressalvas — números que enganam se lidos sozinhos

template_entregue marca apenas 4 de 285O campo tem writer desde 18/08 e quase não dispara. Não significa que 281 leads ficaram sem primeiro contato — 273 têm projeto no SM e 148 responderam. É a MEDIÇÃO que falha, não a operação. Classificado como SUSPEITO na auditoria de schema.
110 qualificados x 91 entregues ao closer19 leads têm status QUALIFICADO sem transferido_comercial. São anteriores à correção da ordem do handoff; o writer novo grava os dois juntos.
zero QUENTE em 110 qualificadosA régua de score só chega a 70 com conta alta + prazo curto + pagamento à vista + cidade-alvo. Com conta validada em apenas 7 leads, o score vinha do valor declarado. Esperado que mude conforme o gate da conta rodar.
7 contas validadasO gate de OCR entrou em 19/08. Todo lead anterior foi qualificado sem conta — é justamente o que a regra nova impede daqui em diante.

Taxa de conversão comercial (proposta, fechamento, receita) não está neste banco. A SOL entrega ao closer e o funil dela termina aí.

Tempos

derivado do backend em 21/08

Duas séries de handover, medindo eventos diferentes. A página mostra as duas separadas de propósito — juntá-las numa média só produziria um número sem evento correspondente.

sérieestadonmínmedianamáx
SLA SOL — qualificação → handover (writer atual)
ts_qualificado → ts_handoff, leads posteriores à correção da ordem (19/08 04:00 UTC)
MEDIDO85,7s11,6s18,6s
Quanto tempo a SOL leva entre decidir qualificar e concluir a entrega ao comercial: SolarMarket, Krolik, closer, whisper e gestão.
SLA handover LEGADO reconstruído
reconstruído por evidência (20 execuções n8n + 13 eventos Krolik)
RECONSTRUÍDO330,7s2,9s10,9s
MEDE COISA DIFERENTE: o instante em que o chat foi transferido ao closer no Krolik — não o término do handover completo. Por isso a mediana é menor.

As duas séries NÃO formam uma média única. Uma marca a transferência do chat; a outra, o fim de todo o handover. Somá-las produziria um número que não corresponde a nenhum evento real.

fora da sériemotivo
1 lead (569563)sem timestamp confiável; excluído de qualquer agregado em vez de receber tempo inventado

Resposta da SOL ao lead SÉRIE NOVA

ts_primeira_resposta em 13 leads · tempo_resposta_seg em 5. Os escritores nasceram em 19/08. Amostra pequena por ser recente, não por falha. tempo_resposta_seg fica NULL de propósito no WhatsApp direto: quem abriu a conversa foi o cliente, não existe abordagem anterior para medir.

SLA comercial NÃO VALIDADO

73 de 91 leads entregues têm ts_resposta_closer · tempo_resposta_closer_seg · closer_respondeu_krolik_id preenchidos.

Os campos NÃO estão vazios — 73 dos 91 leads entregues têm os três preenchidos por sol.comercial.resposta-closer. Mas esse workflow nunca passou pelo ciclo de revisão, e o detector depende de distinguir origem de mensagem e de tratar fuso do Krolik (dhMessage vem em BRT sem offset — armadilha que já nos pegou). Enquanto não for auditado, o número existe mas não vira KPI.

Não publicado por falta de escritor ou evidência:

Meta — form e page reais, provados na Graph API

FORM ATUAL1355008362677886
112 leads reais de 114 no form
PAGE ATUAL183501845635669
DESDE17/07/2026
1º: 2026-07-17 · último: 2026-08-13
FORM ANTERIOR4509544755984242
backlog de 42 leads, injetado em 17/07 pelo poll hoje morto
campanha atualGeração de Leads Olímpia (Formulário com Lógica Condicional)
120248170693270511
anúncios: 01 - Vizinhos (111) · 01 - Pizza (6) · 01 - Antes e Depois (3)
regra canônicaFORMULARIO = ancora da captacao. CAMPANHA = contexto variavel do lead. O poll varre /{form_id}/leads e NUNCA depende do campaign_id: trocar, duplicar ou renomear campanha nao pode parar a captacao. campaign_id e campaign_name sao persistidos POR LEAD, para que se enxergue Form -> Campanha A -> X leads -> Y qualificados sem perder historico.

CONFLITO RESOLVIDO 17/08: houve divergencia sobre qual seria o form atual (1355008362677886 x 4509544755984242). A propria Meta decide, e ela carimba form_id e campaign_id em cada lead. Na ultima leitura boa (exec 872671, 16/08 00:15 UTC): 122/122 leads com form_id=1355008362677886 e 120/122 com campaign_id=120248170693270511 (os 2 sem campanha sao leads de teste da propria Meta). Ou seja, a campanha 120248170693270511 entrega NESTE form. O 4509544755984242 e o form ANTERIOR, de onde vieram os 42 leads do backlog de julho. Ressalva honesta: essa prova vale ate 16/08 00:15; depois disso a credencial OAuth caiu e nao ha como ver a Graph — se o formulario do anuncio tiver sido trocado depois, so saberemos ao reconectar. PROVADO por leitura da Graph API em 13/08/2026. O nome "Formulário com Lógica Condicional" é da CAMPANHA, não do formulário — foi essa a armadilha que levou à leitura errada anterior. Os 42 leads meta_ads que não estão neste form são o backlog do form anterior, injetado em 17/07 pelo poll hoje morto.

Anomalias — estado de hoje

derivado do backend em 21/08

Nem tudo que é estranho é bug. Cada achado cai em uma categoria — sem isso a página volta a contar como problema atual o que já morreu.

categoriaquantoso que significa
ANOMALIA ATIVA 1acontece hoje, reproduzível
RESÍDUO HISTÓRICO 3causa corrigida, dados antigos permaneceram
GAP DE MEDIÇÃO 2a operação acontece; o campo não captura direito
PENDÊNCIA DE VALIDAÇÃO 3implementado, falta E2E ou auditoria
ESTADO ESPERADO 2parece estranho, está correto
achadocategoriaqtdúltima
FUP inteiro em timeout no GET leads elegíveisANOMALIA ATIVA40 execuções21/08 18:00
causa: Encadear GET conversas p/ FF antes do GET leads elegíveis fez a query de leads rodar UMA VEZ POR LINHA de conversa (até 3000). Regressão introduzida por mim hoje às ~13:00 UTC.
estado: CORRIGIDA às 18:05 — executeOnce=true no nó, janela de 15 dias na busca de conversas. Ciclo seguinte: 1 execução, 16 leads, 437 conversas.
ação: Monitorar os próximos ciclos.
19 leads QUALIFICADO sem handover (GAP-05)RESÍDUO HISTÓRICO1905/08 11:52
causa: Até 08/08 o fluxo PAI marcava status=QUALIFICADO ANTES do handoff assíncrono; filho falhando deixava o lead meio-qualificado.
estado: FIX-04 aplicado em 08/08. Zero casos novos desde então — o último é três dias anterior ao fix.
ação: 19 registros aguardando decisão de saneamento. NÃO saneados nesta rodada.
24 desqualificados sem origem persistidaRESÍDUO HISTÓRICO24anteriores a 13/08
causa: handoff_origem só passou a ser gravado com a esteira [SOL] Desqualificar.
estado: 11 dos 35 já têm origem. Dos 2 desqualificados após 19/08, 1 ainda saiu sem origem.
ação: Investigar esse 1 caso pós-revisão antes de considerar o writer fechado.
1 lead com SLA de handover não reconstruívelRESÍDUO HISTÓRICO1 (lead 569563)12/08
causa: Nenhum evento de transferência no Krolik em ±5 min da qualificação; execução n8n fora da janela de retenção.
estado: Mantido como está, excluído de todo agregado de SLA.
ação: Decisão pendente: manter fora do SLA ou zerar ts_handoff.
template_entregue marca 4 de 207 elegíveisGAP DE MEDIÇÃO4/207—
causa: O writer é o PATCH âncora FUP (capture) nos dois fluxos de Ingestão, e só nasceu em 18/08. WhatsApp direto (75 leads) nunca recebe template — está fora do universo por desenho.
estado: Dos 14 leads capturados desde 18/08, 4 marcados. Ainda mede mal.
ação: NÃO é falha de entrega: 273 leads têm projeto no SM e 148 responderam. É o campo que não representa o universo.
forma_pagamento nunca preenchido em 285 leadsGAP DE MEDIÇÃO0/285—
causa: A régua de score dá +10 para pagamento à vista, mas a SOL não pergunta forma de pagamento — não é gate.
estado: Um dos quatro componentes do score é estruturalmente inalcançável.
ação: Nenhuma nesta rodada — mexer no score está fora do escopo congelado.
SLA comercial preenchido mas não auditadoPENDÊNCIA DE VALIDAÇÃO73/91—
causa: sol.comercial.resposta-closer escreve ts_resposta_closer, tempo_resposta_closer_seg e closer_respondeu_krolik_id, mas nunca passou pelo ciclo de revisão.
estado: Os campos NÃO estão vazios. O detector depende de distinguir origem de mensagem e de tratar o fuso do Krolik (dhMessage vem em BRT sem offset).
ação: Frente futura de observabilidade comercial.
Fast Forward sem ocorrência realPENDÊNCIA DE VALIDAÇÃO0—
causa: Implementado em 21/08 com 9 goldens no código real; nenhum lead percorreu ainda prazo → silêncio → áudio → silêncio.
estado: IMPLEMENTADO + GOLDENS ✅ · E2E REAL ⏳
ação: Aguardar operação real. Não fabricar lead.
total_audios sem incremento ao vivoPENDÊNCIA DE VALIDAÇÃO0—
causa: O campo não tinha escritor até 21/08, apesar de 40 áudios entregues.
estado: Writer criado e provado em dry-run com os 5 toques. Falta o primeiro áudio real pós-writer.
ação: Histórico NÃO foi retroagido: não havia como saber qual entrega foi de qual lead sem inferir.
Zero leads QUENTE em 285ESTADO ESPERADO0—
causa: Score máximo observado é 65. Chegar a 70 exige conta ≥ R$ 800 VALIDADA (+40) — e só 7 leads têm OCR, nenhum acima de 800. O outro caminho, pagamento à vista (+10), é inalcançável porque o campo nunca é preenchido.
estado: Coerente com a régua atual e com o fato de o gate da conta ter entrado em 19/08.
ação: Reavaliar quando houver amostra de contas validadas. Não mexer no score agora.
Apenas 7 contas validadas por OCRESTADO ESPERADO7/285—
causa: O gate que exige a conta entrou em 19/08. Todo lead anterior foi qualificado sem conta.
estado: É exatamente o que a regra nova impede daqui em diante.
ação: Nenhuma. O histórico não retroage.

O número antigo (13 anomalias, "nenhuma foi corrigida") era de 13/08 e a maioria já morreu. Este bloco recalcula o presente.

Não mensurável hoje

derivado do backend em 24/08

O que a operação ainda não consegue responder, e o campo que falta para conseguir.

Saúde do backend — o E2E deixou telemetria?

retrato de 19/08 — 5 dias

A operação funcionar não basta: ela precisa deixar rastro suficiente para administrar o produto. Auditoria do lead 612449 (execuções 890615 e 890617), campo a campo. Ausência de dado aparece como NÃO MENSURÁVEL, nunca como número bonito.

Cobertura de campos — lead

preenchidos41 de 87
gaps reais6 — campo que deveria estar preenchido e não está

❌ Gaps reais (writer ausente)

✅ NULL legítimo (não é falha)

SLA

SLAduraçãoinício → fim fonteconfiança
CAPTAÇÃO5slead.created_at → conversa[capture/out].tsbackendALTA
ENGAJAMENTO3.19h1ª abordagem → conversa[in].tsbackendALTA
SDR7sresposta do cliente → conversa[sdr/out].tsbackendALTA
QUALIFICAÇÃO13sresposta (proxy) → lead.ts_qualificadobackend, com proxyMÉDIA — não existe timestamp de entrada em SOL SDR
HANDOVERINVERTIDOlead.ts_qualificado → lead.ts_handoffbackendBAIXA — ts_handoff 02:31:25.323 é ANTES de ts_qualificado 02:31:30.689

Custo de IA

Observado na execução (evidência efêmera, não persistida): Anthropic · claude-sonnet-4-6 · input 315 · cache-creation 3894 · cache-read 0 · output 349.
Gap: Para responder "quanto custou este lead" seria preciso persistir usage por conversa + tabela de preço por modelo. NÃO criado neste turno.

outro custoestadoobservação
Krolik / template WhatsAppNÃO MENSURÁVELnenhum campo de custo; o fornecedor cobra por janela/template fora do n8n
SolarMarketNÃO APLICÁVELlicença, não custo por lead
ElevenLabs (áudio do FUP)NÃO MENSURÁVELsem persistência de caracteres/custo
OpenAI OCRNÃO MENSURÁVELnão houve OCR neste lead; e não há writer de usage

Dados que existem só no visual

Supabase — contrato de dados SOL

retrato de 19/08 — 5 dias

A · Tabelas

tabelafunçãolinhascolunas PKúnicaescrevemleem
leadRegistro operacional do lead — a verdade da jornada27787idtelefone_normalizado (UNIQUE no banco)entrada-lead, inbound.whatsapp, Qualificar, Desqualificar, FUP, Router, resposta-closer, ops.altera-statusSDR Engine, FUP, Qualificar, Desqualificar, silencio-inbound, Briefing, ops
conversaHistorico de mensagens, entrada e saida152514id—entrada-lead, inbound.whatsapp, SDR Engine, FUP, reprocessaSDR Engine, silencio-inbound
closerCadastro dos closers para a roleta27idsm_id, krolik_idops.altera-status (campo ativo)Qualificar (roleta), resposta-closer
configConfiguracao operacional da franquia: modelos de IA, faixas de score, horarios de FUP, tags do Krolik, stages do SolarMarket, vozes135franquia_id—NENHUMNENHUM — a configuracao efetiva vive hardcoded nos nos 00_CONFIG de cada workflow

B · Campos de lead por responsabilidade

IDENTIDADE · 13 campos

campotipopreenchidoquem escrevequem lêestado
idbigint277/277
100%
[SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.comercial.resposta-closer, sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, [SOL] SDR Engine, sol.captacao.entrada-lead, sol.comercial.resposta-closer, sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp, sol.observabilidade.silencio-inbound, sol.ops.altera-status-leadCANÔNICO
telefone_normalizadotext277/277
100%
[SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, sol.captacao.entrada-lead, sol.captacao.meta-poll, sol.followup.janela-24h, sol.inbound.whatsappCANÔNICO
franquia_idtext277/277
100%
——CANÔNICO
nometext277/277
100%
[SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, sol.captacao.entrada-lead, sol.comercial.resposta-closer, sol.crm.garante-cliente-projeto, sol.followup.janela-24hCANÔNICO
created_attimestamp with time zone277/277
100%
—[SOL] Briefing Diário Rafael (08h BRT), sol.ops.le-leadCANÔNICO
updated_attimestamp with time zone277/277
100%
——CANÔNICO
cidadetext235/277
85%
sol.captacao.entrada-lead[SOL] Desqualificar, [SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-leadPARCIAL
emailtext206/277
74%
sol.captacao.entrada-lead[SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-leadPARCIAL
estadotext31/277
11%
——SEM USO
ceptext31/277
11%
——SEM USO
bairrotext25/277
9%
——SEM USO
cpf_cnpjtext12/277
4%
——SEM USO
tipo_pessoatext4/277
1%
——SEM USO

CAPTAÇÃO · 15 campos

campotipopreenchidoquem escrevequem lêestado
canal_origemtext277/277
100%
sol.captacao.entrada-lead[SOL] Briefing Diário Rafael (08h BRT)CANÔNICO
ultimo_canaltext277/277
100%
sol.captacao.entrada-lead—SUSPEITO
origem_entradatext274/277
99%
sol.captacao.entrada-lead, sol.inbound.whatsappsol.inbound.whatsappPARCIAL
etapa_funiltext254/277
92%
[SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.inbound.whatsappsol.inbound.whatsappPARCIAL
canal_aquisicaotext204/277
74%
sol.captacao.entrada-leadsol.inbound.whatsappPARCIAL
pagina_origemtext33/277
12%
sol.captacao.entrada-lead—SUSPEITO
meta_page_idtext12/277
4%
sol.captacao.entrada-lead—SUSPEITO
meta_form_idtext12/277
4%
sol.captacao.entrada-lead—SUSPEITO
meta_leadgen_idtext12/277
4%
sol.captacao.entrada-lead—SUSPEITO
meta_campaign_nametext12/277
4%
sol.captacao.entrada-lead—SUSPEITO
meta_campaign_idtext12/277
4%
sol.captacao.entrada-lead—SUSPEITO
utm_sourcetext0/277
0%
——SEM USO
utm_campaigntext0/277
0%
——SEM USO
fbclidtext1/277
0%
sol.captacao.entrada-lead—SUSPEITO
gclidtext0/277
0%
sol.captacao.entrada-lead—SUSPEITO

QUALIFICAÇÃO · 30 campos

campotipopreenchidoquem escrevequem lêestado
scoreinteger277/277
100%
—[SOL] DesqualificarCANÔNICO
temperaturatext277/277
100%
—[SOL] DesqualificarCANÔNICO
statustext277/277
100%
[SOL] Desqualificar, [SOL] Qualificar Lead, sol.captacao.entrada-lead, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Reparo Rajada 17/07 (one-shot), [SOL] Router Tag, sol.followup.janela-24hCANÔNICO
total_mensagens_iainteger277/277
100%
——SEM USO
tem_geracaoboolean277/277
100%
——SEM USO
aguardando_contaboolean277/277
100%
—sol.followup.janela-24hCANÔNICO
total_audiosinteger277/277
100%
——SEM USO
valor_contanumeric235/277
85%
sol.captacao.entrada-lead[SOL] Briefing Diário Rafael (08h BRT), [SOL] DesqualificarPARCIAL
resumo_qualificacaotext122/277
44%
[SOL] Desqualificar—SUSPEITO
ts_qualificadotimestamp with time zone103/277
37%
[SOL] Qualificar Lead[SOL] Briefing Diário Rafael (08h BRT), sol.comercial.resposta-closer, sol.followup.janela-24h, sol.observabilidade.silencio-inboundPARCIAL
preferencia_contatotext85/277
31%
——SEM USO
prazo_decisaotext55/277
20%
sol.inbound.whatsappsol.inbound.whatsappPARCIAL
tipo_imoveltext34/277
12%
——SEM USO
ocr_statustext34/277
12%
——SEM USO
ocr_confiancanumeric34/277
12%
——SEM USO
instalacao_uctext32/277
12%
——SEM USO
distribuidoratext32/277
12%
——SEM USO
ts_desqualificadotimestamp with time zone32/277
12%
[SOL] Desqualificar, sol.followup.reprocessa-paradossol.followup.janela-24h, sol.observabilidade.silencio-inboundPARCIAL
consumo_kwh_mesnumeric29/277
10%
——SEM USO
consumo_historicojsonb24/277
9%
——SEM USO
tendencia_consumotext24/277
9%
——SEM USO
classificacao_contatext23/277
8%
——SEM USO
tipo_fornecimentotext23/277
8%
——SEM USO
consumo_kwh_minnumeric0/277
0%
——SEM USO
consumo_kwh_maxnumeric0/277
0%
——SEM USO
forma_pagamentotext0/277
0%
——SEM USO
tipo_telhadotext0/277
0%
——SEM USO
acrescimo_cargatext0/277
0%
——SEM USO
consumo_medio_3mnumeric0/277
0%
——SEM USO
consumo_medio_12mnumeric1/277
0%
——SEM USO

HANDOVER · 9 campos

campotipopreenchidoquem escrevequem lêestado
transferido_comercialboolean277/277
100%
[SOL] Qualificar Lead—SUSPEITO
ts_transferidotimestamp with time zone206/277
74%
[SOL] Qualificar Lead, sol.followup.janela-24h[SOL] Briefing Diário Rafael (08h BRT), sol.comercial.resposta-closer, sol.followup.janela-24hPARCIAL
handoff_tipotext90/277
32%
[SOL] Router Tag, sol.followup.janela-24h, sol.inbound.whatsappsol.observabilidade.silencio-inboundPARCIAL
handoff_origemtext90/277
32%
[SOL] Router Tag, sol.followup.janela-24h, sol.inbound.whatsappsol.observabilidade.silencio-inboundPARCIAL
ts_handofftimestamp with time zone87/277
31%
[SOL] Router Tag, sol.followup.janela-24h, sol.inbound.whatsappsol.observabilidade.silencio-inboundPARCIAL
closer_idbigint84/277
30%
[SOL] Qualificar Lead—SUSPEITO
ts_resposta_closertimestamp with time zone65/277
23%
sol.comercial.resposta-closersol.comercial.resposta-closerPARCIAL
closer_respondeu_krolik_idtext65/277
23%
sol.comercial.resposta-closer—SUSPEITO
tempo_resposta_closer_seginteger65/277
23%
sol.comercial.resposta-closer—SUSPEITO

INTEGRAÇÕES · 9 campos

campotipopreenchidoquem escrevequem lêestado
identificador_smtext265/277
96%
[SOL] Qualificar Lead, [SOL] Reparo Rajada 17/07 (one-shot), sol.captacao.entrada-lead, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), [SOL] Desqualificar, [SOL] Reparo Rajada 17/07 (one-shot), sol.inbound.whatsappPARCIAL
sm_statustext264/277
95%
[SOL] Desqualificar, [SOL] Qualificar Lead, sol.captacao.entrada-lead, sol.inbound.whatsapp—SUSPEITO
contact_idtext218/277
79%
sol.captacao.entrada-lead—SUSPEITO
chat_idtext202/277
73%
sol.captacao.entrada-leadsol.comercial.resposta-closer, sol.followup.janela-24hPARCIAL
project_id_smtext103/277
37%
[SOL] Qualificar Lead[SOL] DesqualificarPARCIAL
template_entregueboolean3/277
1%
sol.captacao.entrada-lead—SUSPEITO
client_id_smtext0/277
0%
——SEM USO
whatsapp_validoboolean0/277
0%
——SEM USO
template_msg_idtext0/277
0%
——SEM USO

OPERAÇÃO / SLA · 11 campos

campotipopreenchidoquem escrevequem lêestado
fup_countinteger277/277
100%
sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hCANÔNICO
reativado_fupboolean277/277
100%
sol.followup.janela-24h, sol.followup.reprocessa-paradossol.followup.janela-24hCANÔNICO
respondeuboolean277/277
100%
sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hCANÔNICO
ts_ultima_interacaotimestamp with time zone263/277
95%
sol.captacao.entrada-lead, sol.followup.reprocessa-parados, sol.inbound.whatsapp[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hPARCIAL
ts_ultimo_fuptimestamp with time zone170/277
61%
sol.followup.janela-24h, sol.followup.reprocessa-parados[SOL] Briefing Diário Rafael (08h BRT), sol.followup.janela-24hPARCIAL
ts_reativacaotimestamp with time zone158/277
57%
sol.followup.janela-24h, sol.followup.reprocessa-parados, sol.inbound.whatsappsol.followup.janela-24hPARCIAL
acao_manualtext8/277
3%
[SOL] Router Tag—SUSPEITO
ts_acao_manualtimestamp with time zone8/277
3%
[SOL] Router Tag—SUSPEITO
ts_primeira_respostatimestamp with time zone0/277
0%
——SEM USO
tempo_resposta_seginteger0/277
0%
——SEM USO
ts_template_reprocessotimestamp with time zone0/277
0%
——SEM USO

C · Os três canais da CAPTAÇÃO — leitura e ingestão

Mapeamento do que já existe. Onde leitura e ingestão vivem no mesmo workflow, está mostrado como está — nada foi separado por estética.

canalpapelworkflownó / branch entradasaída
METALEITURAsol.captacao.meta-pollCron 5min · 24h → GET page do form → GET leads form novo → GET telefones existentes (checkpoint) → Monta payloadsGraph API, form 1355008362677886POST /sol-ads-inbound
METAINGESTAOsol.captacao.entrada-leadWebhook Meta Lead → IF token válido → Parse Meta lead → tronco comumPOST /sol-ads-inboundlead + conversa + SM + 1a abordagem
LANDING PAGELEITURAsol.captacao.entrada-leadCron Google 5min → GET planilha Google → Novos leads (planilha) → É processar?planilha Google (gate coluna F)mesmo workflow
LANDING PAGEINGESTAOsol.captacao.entrada-leadNormaliza + monta → tronco comumsaida do no anteriorlead + conversa + SM + 1a abordagem
WHATSAPP DIRETOLEITURAsol.inbound.whatsappWebhook · sol-wa-inbound → Normaliza telefone → IF tel_status → IF token válidoevento 7 do Krolikmesmo workflow
WHATSAPP DIRETOINGESTAOsol.inbound.whatsappSupabase capture_lead → IF lead novo (entry) [TRUE] → PATCH status QUALIFICACAOsaida do no anteriorlead (so quando o telefone nao existia)

D · Contrato de saída — cobertura por canal

campoMETALANDINGWHATSAPP DIRETO
telefone_normalizado173/17333/3371/71
origem_entrada173/17333/3368/71
canal_aquisicao173/17331/330/71
pagina_origem0/17333/330/71
meta_form_id12/1730/330/71
meta_leadgen_id12/1730/330/71
identificador_sm173/17333/3359/71
chat_id111/17328/3363/71
contact_id127/17328/3363/71
template_entregue2/1731/330/71
status173/17333/3371/71
ts_ultima_interacao163/17331/3369/71

E · Funil derivado dos dados

HOJE — 0 entradas

atendidos 0 · sem atendimento 0 · QUALIFICADO 0 · DESQUALIFICADO 0 · ABERTO 0 · handover concluído 0 · handover pendente 0 · sem SolarMarket 0

ÚLTIMOS 7 DIAS — 49 entradas
META LEAD ADS 22 · WHATSAPP DIRETO 20 · LANDING PAGE 7

atendidos 49 · sem atendimento 0 · QUALIFICADO 19 · DESQUALIFICADO 3 · ABERTO 27 · handover concluído 19 · handover pendente 0 · sem SolarMarket 0

F · Não mensurável hoje

Supabase — estado do schema

derivado do backend em 21/08

Project hsnglsjmiefgxghljgsz · PostgreSQL 17.6 · 6 tabelas · 185 colunas, todas classificadas com evidência.

SUPABASE GLOBAL — 100% MAPEADO SUPABASE CAPTAÇÃO + QUALIFICAÇÃO — 100% VALIDADO

tabelalinhascolunasobservação
lead28590entidade central; 0 telefones duplicados
config135canônico DESACOPLADO — valores corretos, nenhum leitor
uso_ia6125ledger de custo de IA; 1 chamada = 1 evento
conversa165914histórico; direcao ainda tem 3 vocabulários (in/out/outbound)
preco_ia314preço versionado por vigência; alimentado por migration
closer27roleta comercial

Classificação das 185 colunas

classecolunaso que significa
CANÔNICO ATIVO55 escrito e lido, com writer identificado
NULL LEGÍTIMO51 só preenche em ramo específico, por desenho
LEGADO35 as 35 colunas de config: valor certo, leitor nenhum
SUSPEITO16 escrito e nunca lido — 4 deles são lidos por SQL/BI, não pelo n8n
ATIVO PARCIAL12 em uso, preenchimento parcial esperado
SEM USO COMPROVADO11 0 linhas e nenhum writer/reader
NULL ESTRUTURAL4 lido, writer ainda não disparou

Estados conhecidos — não são dúvidas

configcanônico desacoplado — stages, setor Krolik, modelos e limiares corretos, hardcoded nos nós 00_CONFIG
telemetria de IAcanônico ativo — uso_ia + preco_ia, idempotência provada
client_id_smreservado para multitenant futuro
whatsapp_valido · template_msg_id · ts_template_reprocessoHOLD
conversa.projeto_id_smHOLD — analisar quando necessário
tipo_telhado · acrescimo_cargalegado retido: o prompt manda NÃO perguntar
utm_source · utm_campaign · gclid · fbclidrastreabilidade de aquisição futura
total_audiosreservado ao FUP — writer criado em 21/08, contador começa daqui
RLSligado nas 6 tabelas, 0 policies: acesso só pela chave de serviço

Nenhuma coluna foi removida e nenhuma precisa ser agora. Campo sem uso hoje não é lixo — é estado conhecido e nomeado.

Evidência coluna a coluna em Sol-estrategia/docs/evidencias/auditoria-schema-sol.json.

Agentes · 14

⚠️ Este bloco não vem do n8n — vem do censo de 08/08/2026 e é mantido à mão.

agentepapelmodelovia
sol-briefingestagiariosem-modeloCode node
sol-desqualificadorworkersem-modelosub-workflow
sol-detector-resposta-closerestagiariosem-modeloCode node
sol-ocr-contaestagiariogpt-4ohttpRequest api.openai.com
sol-parse-metaestagiariosem-modeloCode node
sol-qualificadorworkersem-modelosub-workflow
sol-regua-fupworkersem-modeloCode node
sol-roleta-closerestagiariosem-modeloCode node
sol-router-tagestagiariosem-modelowebhook Krolik evento 22/31
sol-score-e-travasworkersem-modeloCode node
sol-sdr-conversaworkerclaude-sonnet-4-6httpRequest api.anthropic.com
sol-sm-ensureestagiariosem-modelosub-workflow
sol-voz-fupestagiarioeleven_turbo_v2_5httpRequest api.elevenlabs.io
sol-watchdogestagiariosem-modeloCode node
de onde vem cada número
workflows, ids, nós, eixos, contadores — API n8n PROD, leitura de 24/08/2026 13:03 BRT
fichas, jornada, gaps, mensagens — dados-revisao.json (extrato da revisão fluxo a fluxo)
funil, tempos, supabase — leitura direta do Supabase hsnglsjmiefgxghljgsz em 13/08/2026
meta (form/page) — Graph API v21.0, leitura de 13/08/2026
agentes — censo SOL de 08/08/2026 — mantido à mão

⚠️ SNAPSHOT, não runtime — e assim fica por decisão
O browser não lê o n8n: a chave da API não pode ir para o front. Esta página só muda quando alguém roda ./refresh-sol.sh e commita. É deliberado: ligar visual vivo exige o contrato n8n → Workplace → frontend, que é transversal a toda a plataforma — e não se cria arquitetura especial só para a SOL.

PENDÊNCIA TRANSVERSAL FUTURA — “VISUAIS VIVOS: contrato único n8n → Workplace → frontend para 100% da plataforma” (SOL · Reserve/Rental · demais empresas e pilares).

Campo sem fonte aparece como NÃO ANALISADO — nada é inferido.