---
name: feedback_sino_ia_proposta_eixo_hora_trabalho
description: Regras da proposta comercial da Sino: vende hora-trabalho devolvida (770/970/1.470, implantação 970) e nunca "24 horas"; não diagnostica o cliente (setor + solução, nunca "ele não tem X"); traz o selo Provedor verificado pela Meta; e cobra a persona/avatar como produto
metadata:
  type: feedback
---

**Decisão do Último em 11/09/2026, ao revisar a proposta do [[project_analisa_lab_oeiras]]:**

1. **Eixo da proposta de valor = desafogar a hora-trabalho da equipe**, não "atendimento 24 horas". O 24h
   continua como benefício secundário. Veio da auditoria da Célia na clínica da Dra. Catarina
   ([[project_sino_ia_metodo_diagnostico_historico]], [[reference_relatorio_mensal_celia]]): madrugada era
   2,3% do volume; o gargalo é o pico da manhã, quando a equipe está ocupada. Números que ancoram:
   **48 h poupadas no mês (~2 h/dia útil), 2.904 mensagens escritas pela IA contra 7 da equipe, ~40% do que
   a recepção digita é saudação, preço e horário.** Em laboratório o argumento é ainda mais forte: o pico do
   WhatsApp cai junto com o pico da coleta, e um preparo mal orientado é exame refeito (custo de bancada).

2. **Escada de preço: R$ 770 / R$ 970 (indicado) / R$ 1.470, implantação R$ 970.** Substitui os
   1.000 / 1.500 / 2.000 herdados da Íris/RM. Estratégia: fechar no plano do meio e subir para Fidelização
   quando já existir base de pacientes (gatilho natural = campanha, ex. Novembro Azul). Não citar mais
   "avatar avaliado em R$ 900" quando a implantação é 970: fica parecendo que a implantação é só o avatar.

**Why:** "responder 24h" não convence quem não vê demanda de madrugada; "sua equipe para de digitar preço
e jejum no pico" é dor sentida todo dia e vira economia mensurável. E preço menor abaixa a barreira para
cliente de interior que ainda não conhece a Sino.

**How to apply:** em toda proposta nova de agente (PDF, web e vídeo da persona) o título e o bloco do
problema falam da hora da equipe; o antes/depois de WhatsApp se passa no PICO (manhã), não à noite; o
simulador de ROI tem duas linhas (pacientes que ficam + hora-trabalho devolvida, 48 h × custo da hora).
Ver [[feedback_nao_caricaturar_atraso_cliente]]: a equipe está ocupada fazendo o trabalho certo, nunca
"não responde". ⚠️ A proposta do Dr. Stephen ([[project_stephen_torres_oftalmo]]) já foi enviada com os
valores antigos; realinhar é decisão do Último.

**Ajuste 11/09/2026 (mesma noite):** o título do retorno era "O valor não é responder rápido. É devolver a hora da
equipe ao exame." O Último vetou: *"você mesmo se desvaloriza aí. O valor também é responder rápido e também é
devolver a hora da equipe."* Ficou "Responder na hora. E devolver a hora da equipe ao exame." Regra: **nunca negar um
benefício próprio para valorizar outro** (construção "não é X, é Y" some das propostas; soma, não troca).

---

## Nunca diagnosticar o cliente: setor + solução, nunca "ele não tem X"

**Correção do Último em 11/09/2026**, ao reler a proposta do [[project_analisa_lab_oeiras]]: a frase
"O Analisa não tem problema de reputação nem de procura" foi vetada. *"É lógico que ele não tem problema
de reputação; seria uma forma de ousadia e petulância fazer uma afirmação dessa para uma proposta no
cliente. Reconfigure isso e se atenha às soluções."*

**Why:** quem lê é o dono do negócio. Qualquer frase em que a Sino "avalia" o cliente (o que ele tem ou
não tem, quanto demorou a responder no nosso teste, o que "hoje não existe" lá dentro, o que "se perde")
soa como julgamento de quem chegou ontem. Mesmo elogio embrulhado em diagnóstico ("não tem problema de
X") pressupõe o direito de diagnosticar. Complementa [[feedback_nao_caricaturar_atraso_cliente]] (que
vale para a peça visual) e este arquivo (o que a proposta vende).

**How to apply:**
- Blocos de leitura do negócio viram **"Onde a Ana entra"** / **"O que o cliente já tem"**: listar o que
  ele tem (fatos públicos, positivos) e onde a solução se encaixa, nunca o que falta.
- O problema é descrito como **realidade do setor** ("em todo laboratório o pico do WhatsApp cai junto com
  o pico da coleta"), não como falha do cliente. Eyebrow "O desafio" → "A oportunidade".
- Números de teste ou de auditoria do próprio cliente (tempo de resposta que medimos, etc.) **ficam
  na memória, fora da proposta**. Números de OUTRO cliente (a Célia: 48 h, 2.904 msgs) podem entrar
  como prova da solução.
- Antes/depois de WhatsApp: o lado "antes" é uma **recepção genérica no pico**, não o nome do cliente;
  desfecho neutro ("respondeu assim que pôde"), sem "largou a bancada" nem "ficou no visualizado".
- ROI fala em **pacientes a mais / ganhos**, não em "pacientes que escapam" ou "orçamento que esfria".
- Vale para PDF, web e o roteiro do vídeo da persona.

**Extensão para o VÍDEO da persona (Último, 11/09/2026, roteiro da Ana):**
- **A persona não fala de risco nem de limite próprio.** "Eu não invento data" e "resultado eu nunca mando" foram
  vetados: *"ela depõe contra ela"*, *"não faça adversidade contra si; foque no que ela é boa e nas soluções"*.
  A garantia vira afirmação positiva ("já deixo a pessoa pré-agendada e a recepção confirma o dia") ou sai.
- **Nome completo do cliente na fala**: "O Laboratório Analisa faz muito bem a parte dele", não "o Analisa".
- **Cidades = suporte, não presença.** "Dou suporte a quem procura o Analisa de X, Y e Z", nunca "eu atendo em X"
  (dava a entender que a persona está fisicamente lá).
- **Fecho com proposta de valor acentuada**: "eu atendo na hora e desafogo o trabalho repetitivo da equipe, de
  forma assertiva. Uma empresa do porte do Laboratório Analisa merece uma atendente assim." (soma os dois
  benefícios + mensagem de que é o momento de uma empresa desse porte ter a ferramenta).
- ⚠️ Vale conferir se a mesma lógica se aplica aos cards da PROPOSTA ("Nunca inventa data", "jamais envia
  resultado"), que hoje estão lá como garantias ao comprador. Perguntar, não mudar por conta.

---

## Sempre trazer o selo Provedor de Tecnologia verificado pela Meta

Peça comercial da Sino que vende atendimento por WhatsApp ou Instagram **leva o selo de credencial da
Meta**. Decisão do Último em 10/08/2026: "nossa empresa tem agora certificada pela Meta, isso dá uma
credibilidade a mais".

**O texto exato:** "Provedor de Tecnologia verificado pela Meta". Apoio curto: "integração oficial de
WhatsApp e Instagram".

**Why:** é o que separa a Sino de quem pluga um aplicativo qualquer no WhatsApp do cliente. O
argumento de venda é o risco: integração oficial significa o número do cliente dentro das regras da
plataforma, **sem risco de bloqueio por uso irregular** — medo real de quem já viu número cair.

**Base factual** (não inventar outra): o Portfólio Sino `4454597641528979` está **Business-Verified
(26/06/2026)** e **Verificado como Provedor de Tecnologia (jul/2026)** — ver
[[project_sino_meta_app]]. "Meta Business Partner" é OUTRO programa e a Sino **não** o tem; não usar
esse termo.

**O arquivo do selo existe — usar ele, não desenhar:**
**`~/claude-workspace/carroseis/_selo-meta-provedor.png`** (326×308, **fundo branco OPACO** apesar de ser
RGBA; original em `~/Downloads/Provedor_meta2.png`). Para compor sobre cor ou vídeo usar
**`_selo-meta-provedor-alpha.png`** (11/09/2026: branco externo ao anel removido por flood fill, faixa da Meta preservada). É o selo circular verde "PROVEDOR OFICIAL · Meta · TECNOLOGIA", e o
verde casa com paleta de saúde. Em 10/08 eu tinha desenhado um selo tipográfico só com texto, e o
Último cobrou: "falta inserir o selo de Meta Provider Tech da Meta" — ele queria o selo real.

⚠️ Em `~/Downloads` há dois selos parecidos que são de **CONCORRENTES** (`enviou-agora...` e
`...digitro.png`): material de terceiro, nunca usar.

**How to apply:** o selo já traz "Provedor Oficial / Meta / Tecnologia", então o texto ao lado **não
repete** isso — complementa com o benefício ("Integração oficial de WhatsApp e Instagram" + "sem risco
de bloqueio por uso irregular"). No PDF entra na capa como pill translúcido (selo ~60px, título com
`white-space:nowrap` para não quebrar em 4 linhas); na web, como card de credibilidade (selo ~84px)
depois dos diferenciais e antes do preço. **Nunca redesenhar o logotipo da Meta** à mão — vale o mesmo
princípio de [[feedback_marca_sino_nunca_remontar]]. Aplicado em [[project_analisa_lab_oeiras]].

---

## Persona/avatar é PRODUTO com valor, não brinde

Ao montar proposta de agente de atendimento (Sino IA), a **criação da persona + avatar** (nome, tom humanizado, ilustração 3D exclusiva) é uma **peça de comunicação com valor próprio**, não brinde. É o core da Sino: dar rosto, nome e voz a uma marca.

**Why:** deixar isso implícito/grátis desvaloriza o trabalho e some com um diferencial forte. O avatar também é um ativo reutilizável (posts, placas, vídeo, campanhas da empresa), não só "figura do WhatsApp".

**How to apply:** na proposta, tornar visível como entregável avaliado (ex.: "criação da persona e do avatar exclusivo, valor R$ X"). Modelo que o Último aprovou p/ a Íris ([[project_stephen_torres_oftalmo]], 2026-07-14): **NÃO cobrar a mais, mas mostrar o valor** — apresentar como "valor R$ 900, incluso" na Implantação + um parágrafo destacando que é uma persona EXCLUSIVA, liberada pra uso nos materiais de comunicação da empresa. Ancorá o valor sem subir o preço. Vale p/ [[project_belavista_otica]] (Bela), [[project_rm_academia_agente]] (Rê) e futuros. Duas coisas distintas que têm valor: (1) a criação do ativo; (2) a licença de uso ampliado (fora do agente).
=== RAIOX ===
---
name: project_sino_raiox_diagnostico
description: "Diagnóstico de Presença Digital (Sino) — ferramenta de captação por IA (GPT-5.5); pipeline COMPLETO e testado (form→motor multicanal→relatório com mapa geo→Firebase Storage); pendente orquestração n8n + segmentos mandato/instituição"
metadata: 
  node_type: memory
  type: project
  originSessionId: 1e946ab6-471c-4a96-bf3d-15dafbae3771
---

Produto/oferta da **Sino · Comunicação e Marketing** em construção (jun/2026): **"Diagnóstico de Presença Digital"** (nome escolhido jun/2026; "Raio-X" rejeitado por clichê e "de Marca" rejeitado por não servir a mandato/instituição — "Digital" é guarda-chuva pros 3 públicos) — um diagnóstico automático por IA usado como **isca de topo de funil** pra captar clientes (segmentos: Empresa, Mandato político, Instituição).

**Conceito:** lead preenche formulário **leve e link-first** → IA **ancorada em dado real raspado** (Business Discovery API do IG, fetch do site) gera um scorecard + 3 prioridades → relatório chega por **e-mail** → CTA pra sessão humana de **30 min**. Regra crítica: a IA **nunca inventa** — só interpreta números reais que a coleta trouxe (senão aluga/queima a marca). Posicionamento evita a palavra **"grátis"** → usar *"sem compromisso · vagas limitadas"*.

**═══ ESTADO ATUAL & COMO RETOMAR (25/jun/2026) ═══**
**PRONTO e testado e2e:** pipeline `form → motor v2 (multicanal) → relatório → Firebase Storage`. Arquivos em `~/claude-workspace/sino-diagnostico/`: `diagnostico-motor.py` (coleta + IA GPT-5.5), `gerar-diagnostico.py` (orquestra + upload; imprime JSON `{url,email,nome,segmento,score,nivel}`), `diagnostico-relatorio.build.py` (`render_report(data)` + `_sample_data()`), `hospedar.py` (upload Firebase Storage via token do Firebase CLI), `raiox-form.build.py` (form — **WIZARD de 3 etapas (25/jun)**: (1) escolhe a área em 3 cards grandes Empresa/Mandato/Instituição (ícones SVG de linha na cor da marca: Empresa=vitrine, Mandato=pessoa, Instituição=prédio de colunas; SEM emoji, Último achou emoji amador) → avança auto. **ESCOPO esclarecido 25/jun: Instituição = PODER PÚBLICO (prefeitura/câmara/órgão público), NÃO ONG/associação;** Mandato = a PESSOA política (perfil pessoal, bandeiras, reeleição) × Instituição = o ÓRGÃO oficial (@prefeitura/@câmara). Objetivos da Instituição viraram de gestão pública (visibilidade de obras/serviços, prestar contas, aproximar a gestão do cidadão, utilidade pública, imagem da gestão); (2) dados do lead nome/email/whatsapp; (3) detalhes da área cidade/UF/@/site + (só Empresa) ramo+operação + concorrente + **objetivo DINÂMICO por segmento** (Empresa vende/atrai; Mandato reconhecimento/base/bandeiras — SEM "vender"; Instituição visibilidade/transparência; `OBJETIVOS` em JS, `fillObjetivo(seg)` repopula o select ao escolher a área) + (só Mandato) **bandeiras** (multi-pílula `.pills.multi`, ATÉ 3 de Saúde/Educação/Infraestrutura/Esporte/Cultura/Segurança/Agro-rural/Assistência/Religião → hidden `pautas`). Barra de progresso `.sdot`, valida por etapa em JS sem `required` nativo, título da etapa 3 adapta ("Sobre seu negócio/mandato/instituição"). Campos enxutos — removidos facebook/endereço/concorrente2/equipe). **ANÁLISE PAUTA×CONTEÚDO (25/jun, Mandato):** `presenca_ig` coleta `caption` (campo `legendas_recentes`=10 legendas reais, 180c); motor passa `pautas` ao dossiê; IA avalia em `leitura.pautas` se as legendas refletem as bandeiras (cita quais aparecem/faltam, SÓ ancorado em post real); relatório ganha seção **"Suas bandeiras × seu conteúdo"** (chips gradiente + read box, placeholder `__PAUTAS__` após o IG). Teste real prefeituradeoeiras/Mandato: IA pegou Esporte (Copão Rural)+Saúde (PAC Saúde) presentes, Educação ausente — zero invenção). **REFINOS pós-teste do Último (25/jun):** (a) **WhatsApp obrigatório** (validação na etapa 2, ≥10 dígitos); (b) card IG "Último post há Xd" trocado por **"Interações por post"** (`interacoes_medias`); (c) `analisar_site` agora detecta entrada não-URL ("não sei", texto com espaço/sem ponto) → `tem_site:False` (antes fingia análise); (d) **ficha Google suprimida p/ Mandato** (mandatário não tem ficha; pegava empresa errada — `ficha_google` só roda p/ Empresa/Instituição); (e) **foto de perfil do IG** no relatório (`profile_picture_url` da Business Discovery → `.ighead/.igav`, `<img referrerpolicy=no-referrer>`, carrega do fbcdn client-side); (f) **correlação seguidores × eleitorado** (só Mandato): linha determinística (NÃO IA) "N seguidores = X% do eleitorado de <cidade> (Y eleitores), nem todo seguidor é eleitor local" no bloco Território; (g) CTA sem travessão. **LIMITE honesto:** Business Discovery NÃO dá demografia (idade/sexo) dos seguidores de conta de TERCEIRO (só da própria via Insights) — pedido do Último de "perfil etário dos seguidores" é inviável; a correlação com eleitorado é o que dá pra fazer). **REFINOS 2 (25/jun):** (h) **Cidade dependente do Estado** — form tem Estado(UF select)→Cidade(select preenchido pela API IBGE `/localidades/estados/{UF}/municipios?orderBy=nome` no `change`, grafia OFICIAL = pareamento exato IBGE/TSE; fallback p/ input texto se o IBGE cair; testado: PI=224 munic, Oeiras presente); (i) correlação seguidores×eleitorado virou GANCHO de venda ("numa consultoria com a equipe da Sino dá pra verificar quanto desse público é realmente do município"); (j) Mandato NÃO coleta `google_ficha` (key ausente do dossiê → IA não vê) + regra 6 no sys_prompt (não mencionar Google no verdict/leitura p/ Mandato) — antes o verdict citava "sem ficha no Google"; (k) **foto de perfil também na tabela Você×concorrente** — `comparar_concorrentes` inclui `foto` (=`foto_perfil`) de cada perfil, render com avatar `.cmpav` na coluna Perfil), `servidor-teste.py` (porta 8765, stand-in do n8n; serve o form via Tailscale), `.env` (todas as chaves, gitignored).
**COMO TESTAR:** `cd ~/claude-workspace/sino-diagnostico && python3 servidor-teste.py` → abrir http://localhost:8765 → preencher (Empresa + cidade/UF + ramo + @ + @concorrente) → redireciona pro relatório no Firebase. OU direto: `python3 gerar-diagnostico.py '<json do form>'`.
**RELATÓRIO v2 entrega:** nota 0-10 colorida + régua · Mercado & Território (IBGE) · Concorrência & Saturação (funil 20→14→6) · **MAPA unificado** (Leaflet, gap colorido 🟪🟢🔴) · Instagram (métricas + leitura) · Seu site (checklist ✓/✗) · Sua ficha no Google · Você vs. concorrente (tabela) · 3 prioridades · CTA · Baixar PDF. Tudo ancorado em dado real (sem pilares abstratos).
**PENDENTE quando voltar:** (1) ✅ **ORQUESTRAÇÃO n8n FEITA (25/jun):** workflow LOCAL **`Ca0n1K1fahrMBkHb`** "Diagnóstico de Presença — Sino" (ATIVO): Webhook POST `/webhook/diagnostico-presenca` (responseMode responseNode + `options.allowedOrigins:"*"` = CORS) → **Code node** `execFileSync('/usr/local/bin/python3',[gerar-diagnostico.py, JSON.stringify(body)])` (~22s, dentro do limite do task-runner) → Respond `{url}` + Gmail alerta. `gerar-diagnostico.py` lê form de argv OU stdin, salva o lead no **Firestore** `sino-comunicacao/diagnosticos_leads` (`hospedar.salvar_lead_firestore`, token do Firebase CLI) e imprime JSON `{url,email,nome,whatsapp,cidade,uf,segmento,score,nivel,lead_id}`. Form `WEBHOOK_N8N`=`http://100.77.118.106:5678/webhook/diagnostico-presenca` (Tailscale). **Self-service CONFIRMADO no navegador:** preenche → 22s → redireciona pro relatório no Firebase. ⚠️ **`executeCommand` é DESABILITADO no n8n dele** → usar Code+execFileSync. ⚠️ **AÇÃO DO ÚLTIMO:** religar a credencial Gmail OAuth no n8n (`JrDIhubWWqvyxQA7` deu invalid_grant/expirada) p/ o alerta de e-mail funcionar — está com `onError:continueRegularOutput` (falha não quebra o fluxo). 🚀 **PUBLICAR (última milha):** hospedar o form público + expor o webhook n8n publicamente (hoje Tailscale/local). ⚠️ **FALHA DIAGNOSTICADA 25/jun:** form dava `net::ERR_CONNECTION_TIMED_OUT` no POST → causa = **Tailscale do Mac estava DESLOGADO** (`tailscale status`=Logged out, sem IP 100.x), então a IP `100.77.118.106` não roteava. n8n estava OK escutando em `*:5678` e o script roda em ~16-18s (Mandato, OK). **Webhook Tailscale só serve aparelhos do Último com Tailscale ON — NUNCA serve lead externo.** Mitigação de teste: `servidor-teste.py` agora reescreve a URL do Tailscale → `localhost:5678` ao servir, então testar no próprio Mac em localhost:8765 funciona sem Tailscale. Pra produção, expor n8n por túnel público (ngrok já roda na 8099 pro Reels/screenshots) e apontar o form pra essa URL pública. Ao reconectar Tailscale, CONFERIR se a IP continua 100.77.118.106 (pode mudar). ✅ **TÚNEL PÚBLICO MONTADO 25/jun (substitui Tailscale):** ngrok free só dá 1 domínio estático (`ravioli-hangnail-grandma.ngrok-free.dev`, antes no 8099). Solução = **reverse proxy `tunnel-proxy.py` (porta 9000)** que roteia por caminho: `/webhook/*`→n8n:5678, **resto**→8099 (PNGs Reels/screenshot, INALTERADO — mesma URL pública, Reels não muda nada). ngrok repontado 8099→9000 (`~/Library/Application Support/ngrok/ngrok.yml`, `ngrok start --all` via LaunchAgent `com.ooeirense.ngrok`). Proxy centraliza **CORS** (preflight OPTIONS 204 + ACAO:* ; strip dos access-control- do upstream p/ não duplicar). Proxy é **LaunchAgent `com.sino.diagnostico-proxy`** (KeepAlive — crítico: se cair, n8n E Reels caem). **WEBHOOK PÚBLICO = `https://ravioli-hangnail-grandma.ngrok-free.dev/webhook/diagnostico-presenca`**. Form (`raiox-form.build.py`) aponta pra essa URL + manda header **`ngrok-skip-browser-warning:1`** no fetch (pula o interstitial do ngrok-free; senão o browser recebe HTML em vez de JSON). `servidor-teste.py` reescreve essa URL→localhost:5678 ao servir (teste local rápido no Mac). Testado por navegador real (Puppeteer cross-origin localhost:8765→ngrok): ok:true 200 application/json {url}. ⚠️ URL muda só se a sessão ngrok reiniciar (domínio é estático/reservado → na prática É fixo). ✅ **FORM PUBLICADO 25/jun (fluxo público COMPLETO):** `hospedar.subir_form(html)` sobe `raiox-form.html` no Firebase Storage com **path+token FIXOS** (`formulario/diagnostico-presenca.html` + token `7c1f2a9e4b6d40338e5af0c2b1d9e6a4`) → **URL pública ESTÁVEL** = `https://firebasestorage.googleapis.com/v0/b/sino-comunicacao.firebasestorage.app/o/formulario%2Fdiagnostico-presenca.html?alt=media&token=7c1f2a9e4b6d40338e5af0c2b1d9e6a4` (re-subir mantém a URL). `subir_html` refatorado p/ `_upload(html,path,dl)`. **TESTADO e2e por navegador na URL pública (Puppeteer):** form Firebase → cascata IBGE (CORS ok dessa origem) → POST webhook ngrok → n8n → relatório → redirecionou pro relatório no Firebase + lead no Firestore. **Lead em qualquer lugar usa agora.** Depende do Mac ligado (n8n + proxy + ngrok, todos LaunchAgent 24/7). NÃO servir o form pelo próprio ngrok (GET de browser no ngrok-free = interstitial). ✅ **URL BONITA (25/jun):** site Hosting DEDICADO `sino-diagnostico` no projeto sino-comunicacao → **`https://sino-diagnostico.web.app`** (form servido na raiz). Deploy de `~/claude-workspace/sino-diagnostico/hosting/` (firebase.json `site:sino-diagnostico`, `public/index.html`=cópia do form). **Redeploy após rebuild:** `cp raiox-form.html hosting/public/index.html && cd hosting && firebase deploy --only hosting --project sino-comunicacao`. Site SEPARADO do principal `sino-comunicacao.web.app` (não colide com o site da Sino). **Custom domain EM ANDAMENTO (25/jun):** Último escolheu **SUBDOMÍNIO** `diagnostico.sinocomunicacao.com.br` (não o caminho /diagnostico, pois o apex `sinocomunicacao.com.br` já está no Firebase Hosting servindo o site `sino-comunicacao` = só placeholder 611 bytes hoje, e caminho/apex ficaria acoplado a esse deploy). Domínio adicionado ao site `sino-diagnostico` no Firebase (modo Avançado). DNS na HostGator (cPanel Zone Editor) já tem: **TXT** `diagnostico` = `hosting-site=sino-diagnostico` (verificação) + **A** `diagnostico` = `199.36.158.100` (IP Firebase Hosting; mesmo do apex). A propagou (8.8.8.8/1.1.1.1). ✅ **DOMÍNIO ATIVO (confirmado 25/jun):** `https://diagnostico.sinocomunicacao.com.br` servindo o form — `hostState:HOST_ACTIVE` + `ownershipState:OWNERSHIP_ACTIVE` + SSL `CERT_ACTIVE` (Google Trust Services, expira 23/set/2026). É a **URL canônica pra divulgar agora** (não mais a `.web.app`). NÃO usar o caminho sinocomunicacao.com.br/diagnostico (decisão: subdomínio é independente do site principal). A URL do Storage (subir_form) segue válida como fallback. ✅ **SITE INSTITUCIONAL DIRECIONA PRO DIAGNÓSTICO (25/jun):** o site da Sino (`~/SINO AGÊNCIA DIGITAL/SITE/sino/`, React+Vite, deploy Firebase Hosting site `sino-comunicacao` = `sinocomunicacao.com.br`) ganhou 2 CTAs apontando pra `https://diagnostico.sinocomunicacao.com.br` (target _blank): (a) botão **Diagnóstico** com degradê da marca no Navbar desktop / "Fazer Diagnóstico Gratuito" no menu mobile — breakpoint do menu movido `md`→`lg` p/ caber 2 botões; "Falar com Especialista" virou contorno; (b) **banner em destaque no Hero** (degradê cheio `#4f176a→#7b2490→#ff4545`, texto branco, selo "Gratuito · Sem compromisso" c/ dot pulsando, botão branco "Começar agora"). Editar em `src/pages/Home.tsx` (banner) e `src/components/layout/Navbar.tsx` (botões); redeploy `npm run build && firebase deploy --only hosting`. Deployado e confirmado em produção. ✅ **CARD WhatsApp/OG (25/jun):** link `diagnostico.sinocomunicacao.com.br` agora abre com card de imagem (antes era link pelado). Tags Open Graph + Twitter no `<head>` do `raiox-form.build.py`; imagem `og-diagnostico.jpg` (1200×630, ~150KB, <300KB exigido) em `hosting/public/`. **Refresh do cache da Meta** após trocar a arte: `curl -X POST "graph.facebook.com/v25.0/?id=<url>&scrape=true&access_token=<token IG>"` (re-crawl força WhatsApp/FB a relerem) + sufixo `?v=N` na URL pra furar cache local do app. A arte final em uso foi gerada pelo ChatGPT e fornecida pelo Último (ver [[feedback_sino_arte_proposta_fidelidade]]). ✅ **Formato BR (25/jun):** engajamento `1,26%` (vírgula) nos cartões IG + tabela de comparação. ✅ **Gmail alerta FUNCIONANDO (verificado 25/jun):** nó "Alerta e-mail" executou OK numa run ao vivo (exec 336894, status success) — credencial `JrDIhubWWqvyxQA7` mostra "Conta conectada" e o token está válido (não precisou reconectar). ✅ **OAuth consent JÁ está "Em produção" (conferido 25/jun na tela Google Auth Platform → Público-alvo do projeto `postador-o-oeirense`):** tipo Externo, 1/100 usuários. Então NÃO há o risco de expiração de 7 dias (isso só vale p/ modo "Em teste"). O invalid_grant antigo foi provável efeito da **rotação do client secret (abr/2026)** — já resolvido quando reconectou; alerta verificado OK. **NÃO clicar "Voltar para o teste"** (reintroduziria a expiração). Mesmo se algum dia cair, o lead NÃO se perde (vai pro Firestore). **Como verificar/religar:** n8n localhost:5678 → Credentials → "Conta do Gmail" → Sign in with Google; verificar de verdade = disparar lead no webhook e checar o nó "Alerta e-mail" em `/api/v1/executions/<id>?includeData=true`. (2) ✅ **Mandato FEITO (25/jun):** TSE eleitorado — `tse_pre_agregar.py` agrega o perfil 2024 PI (387MB CSV em `~/ÚLTIMO CAMPOS REIS/CURSOS/GEOREFERENCIAMENTO ELEITORAL/DADOS_TSE/PIAUI/SETEMBRO_2024perfil_eleitor_secao_2024_PI/`) → `tse_eleitorado_pi.json` (224 munic, 171KB, no projeto); `eleitorado_tse(cidade)` lê instantâneo (match por nome sem acento). Market block do Mandato vira **"Território & Eleitorado"** (total eleitores + gênero + faixa predominante) via TSE em vez de PIB; Oeiras=31.255 eleitores 2024. Instituição usa IBGE população (else branch). Só PI pré-agregado (outros estados = futuro). (3) Opcional: PageSpeed (velocidade real), revisitar nome. NB: `servidor-teste.py` pode estar rodando em background — reiniciar com o comando acima.

**Funil de 3 instrumentos (não competem):** (1) diagnóstico automático = topo, lead frio, IA raspa + 8 campos leves; (2) Google Form atual "Briefing Marketing Digital" (~30 perguntas auto-report, form id `1UsvRmi7b7BkVv0_5Lnt3kA8hYAKNffRr86ywG304u0Y` na conta `contato@sinocomunicacao`) = etapa de orçamento; (3) `BRIEFING.docx` / `BRIEFING_CANDIDATO.docx` (finalidade já é "Análise") = kickoff do cliente fechado. Os briefings ficam em `~/SINO AGÊNCIA DIGITAL/SINO PUBLICIDADE/SINO COMUNICAÇÃO/`.

**Scorecard = 8 pilares** (destilação do que o briefing já avalia): Posicionamento/Narrativa · Identidade Visual · Presença Digital · Conteúdo · Engajamento · Reputação/Mídia · Alcance/Distribuição · Resultados/Métricas. Faixas de maturidade (Reativo / Em desenvolvimento / Estruturado / Referência). Tom **sempre "oportunidade", nunca humilhação** — crítico pra mandato/instituição. Sacada-chave: o form atual pede pro lead se autodiagnosticar (pontos fracos); a ferramenta **inverte** — a IA entrega os pontos fracos.

**Formulário (PRONTO e verificado):** `~/claude-workspace/sino-diagnostico/raiox-form.build.py` gera `raiox-form.html` (autônomo, HANDO + logos base64 embutidos; hero gradiente + logo branca, rodapé claro + logo colorida; hero é SÓ o degradê — o motivo de circuito/pontos-e-linhas foi REMOVIDO 25/jun (Último achou primário, "prefiro não ter do que ter algo sem capricho"); container desktop alargado p/ max-width 760px, "leve expansão lateral" pedida — mobile inalterado). 8 campos: nome, email (destino do relatório), whatsapp, segmento (pílulas Empresa/Mandato/Instituição), **instagram (marcado PRINCIPAL = combustível da IA)**, site, facebook, objetivo (select), referência/concorrente, equipe sim/não. Submit tem gancho `const WEBHOOK_N8N=""` — vazio = modo demo (mostra tela "Recebemos!"); colar URL do webhook n8n liga o envio real. Identidade visual em [[reference_sino_identidade_visual]]; render/screenshot via Puppeteer do screenshot-server ([[project_ooeirense_screenshot_server]]).

**Relatório-entregável PRONTO:** `~/claude-workspace/sino-diagnostico/diagnostico-relatorio.build.py` → `.html` (6 blocos: header+nota **0-10 (MÉDIA dos pilares, 1 decimal, colorida por valor 🟥🟧🟩) + régua 0-10 colorida vermelho→âmbar→verde com marcador ▾** (trocado de /80-soma + barra de 4 fases em 24/jun — Último achou /80 confuso; motor: `nota_geral`=média, `nota_max`=10, BANDS em /10), "números reais", 8 pilares com barra colorida 🟥🟧🟩, 3 prioridades, CTA p/ sessão 30 min, rodapé+disclaimer). É template: blocos `SUBJECT/SCORE/STATS/PILLARS/PRIORITIES` viram dinâmicos no n8n. **Gotcha evitado:** número grande NÃO pode ser gradiente sobre header gradiente (some por falta de contraste) — usar branco sólido.

**Entrega (REVISADA jun/2026): SEM E-MAIL.** Email+WhatsApp são capturados no FORM (o lead já fica com a Sino no submit), então não precisa e-mail pra "coletar e-mail". Fluxo: form POSTa no webhook → mostra **loading com mensagens rotativas** (~20s do motor) → **redireciona direto pro relatório** (página hospedada no Firebase). Relatório tem botão **"⬇ Baixar em PDF"** (`window.print()` + `@media print` esconde o botão). Experiência instantânea > esperar caixa de entrada. (Estado antigo de "Recebemos! cheque o e-mail" removido; passo 3 do "como funciona" virou "Vê na hora".) **Servidor de teste local (sem n8n) p/ Último preencher ele mesmo:** `servidor-teste.py` (porta 8765) serve o form (injeta `WEBHOOK_N8N="/gerar"` on-the-fly) e o endpoint `POST /gerar` roda `gerar-diagnostico.py` e devolve `{url}` → form redireciona. Smoke test OK (~13s, nota 5.8/10). É o stand-in do n8n até montar o workflow.

**ROADMAP / feedback do Último (24/jun):** (a) **MAPA UNIFICADO FEITO (25/jun):** seção Leaflet+OSM no relatório (`.mapbox`, CDN unpkg leaflet 1.9.4 — CSS no `<head>`, JS antes do `</body>` lê `window.MAPA` injetado via `__MAPDATA__`). Motor: `geocode_google` (Geocoding API — HABILITADA no projeto `sinodiagnotisco` via navegador; descarta `location_type==APPROXIMATE`=centro da cidade, só plota preciso), `montar_mapa` unifica **CNPJ (todos)** [via `registros`{nome,endereco} de `saturacao_oficial_cnpj`, agora `limit=20`] + **Google (visíveis)** [`concorrencia_places` devolve `pontos` com lat/lng] → dedup por `_mesmo_negocio` → geocoda os só-CNPJ. Field mask de `ficha_google`/`concorrencia_places` ganhou `places.location`. Marcadores: 🟪 você (coords da `ficha_google` ou centro) / 🟢 no Google (visível) / 🔴 só no CNPJ (invisível); `nao_mapeados` contados, não plotados. Teste real Oeiras/Ótica: **21 pontos (13 Google + 8 CNPJ geocodados), 0 não-mapeados**. `dossie['mapa']` só p/ Empresa. **⚠️ GATING + FIX (25/jun):** mapa+concorrência rodam SÓ se `segmento==Empresa` E `form.ramo` preenchido (motor linha ~492 `if seg=="Empresa" and form.get("ramo")`). Teste real da Dra. Catarina (Empresa/Oeiras) veio SEM mapa porque o `ramo` chegou vazio — o `<select name=ramo>` era OPCIONAL (form `novalidate`, validação não checava ramo) e ela deixou no "Selecione"; `new FormData` omitiu o vazio → motor pulou tudo silenciosamente. **Correção deployada (25/jun):** (1) **ramo OBRIGATÓRIO p/ Empresa** (validação JS no submit bloqueia + scrollIntoView + `<span class=req>*`); (2) **`RAMO_OSM` expandido 9→24** (add padaria/academia/pet shop/advocacia/contabilidade/imobiliária/oficina-autopeças/móveis/eletrônicos/papelaria/joalheria/hotel-pousada/agropecuária/escola-curso/posto — todos com tag OSM testada via `norm()`); (3) **"Outro" virou texto livre** (`<input name=ramo_outro>` revelado por toggle JS quando ramo==Outro; no submit `data.ramo=data.ramo_outro` → alimenta o Places `textQuery` direto, então nicho fora da lista ainda gera mapa via Google). Removido "Serviços em geral" (bucket vago que zerava o mapa). Degradação elegante: ramo conhecido→OSM+Google; ramo digitado→só Places. (b) **8 PILARES abstratos → SUBSTITUÍDOS (24/jun, FEITO e testado e2e, nota 7.2/10):** análise v2 = **auditoria multicanal ancorada**. **Coletores novos** no motor: `analisar_site` (curl fetch + checks HTTPS/WhatsApp/redes/Google Tag/Meta Pixel/mobile/SEO/tempo → `pontos_fracos`), `ficha_google` (Places Text Search do nome do negócio = display name do IG → nota+avaliações do PRÓPRIO lead), `comparar_concorrentes` (Business Discovery nos @s `concorrente1/2` do form → ranking você vs concorrente), `detectar_whatsapp` (wa.me no site/bio). `presenca_ig` agora traz name/biography/website. **`pontuar_com_ia` reescrito:** saiu os 8 pilares, entra `{nota holística 0-10, verdict, mercado_insight, leitura:{instagram,site,google,whatsapp,comparacao}, prioridades[3]}` — cada `leitura` cita número real; no Google diz "concorrentes avaliam melhor" SEM os números deles (linha free/pago). **Form:** campos `concorrente1`/`concorrente2`. **Relatório:** seções "Seu site" (checklist ✓/✗ `.chk`), "Sua ficha no Google" (sua nota/avaliações), "Você vs. concorrente" (tabela `.cmp`), + read box `.read` no Instagram; removida a seção dos 8 pilares (CSS `.pillar` ficou órfão, inofensivo). Mapeamento em `gerar-diagnostico.py` (`montar_data_relatorio`). **✅ FIXES 25/jun (lote 3, motor+relatório, sem deploy — n8n recarrega do workspace):** (1) **Instagram com URL completa** — gente colava `https://instagram.com/perfil/?igsh=…` e o motor (que só fazia `lstrip('@')`) não reconhecia; novo `_ig_handle()` extrai o @ de qualquer formato (URL, query, /reel/, @, ponto/underscore) antes do Business Discovery. (2) **Cores no PDF** — faltava `print-color-adjust:exact` no `@media print`; sem isso o Chrome removia os fundos coloridos (degradê do header, score, funil, badges saíam brancos). (3) **Mapa no PDF** — Leaflet usa `transform` p/ posicionar tiles e saía em branco na impressão; fix = `crossOrigin:true` nos tiles + `invalidateSize()` no `beforeprint`/matchMedia('print'). Layout de impressão otimizado: `@page{margin:11mm}` + `break-inside:avoid` nos blocos-chave (.head/.sec/.mapbox/.funnel/.cmp/.prio). Verificado via Puppeteer PDF (printBackground) + screenshot print-media: cores e mapa saem. (4) **Nota explicativa do engajamento** no relatório (sob as métricas do IG, placeholder `__IGNOTE__`): "curtidas + comentários por post ÷ seguidores; não inclui salvamentos/compartilhamentos (API não dá) → real tende a ser maior". Cálculo no motor: `avg(like+comment dos ~20 últimos posts)/followers*100`. (5) **CTA final estava MORTO** (`href="#"`) → agora **link clicável do WhatsApp da Sino** `wa.me/5586981789622` (= (86) 98178-9622, fonte: site institucional Footer/Contact) com msg pré-preenchida personalizada com `s['nome']` do lead; botão virou "Agendar no WhatsApp →", placeholder `__CTAWA__` em render_report. (6) **CTA ganhou 2 botões secundários** (`.ctalinks`, estilo fantasma) — "Acessar nosso site" (`sinocomunicacao.com.br`) + "Seguir no Instagram" (`@sino_comunicacao`) sob a linha "Ainda não é a hora de conversar? Conheça mais a Sino:". Motivo: a página do diagnóstico é ISOLADA do site (campanha Google Ads aponta pra ela) → captar quem não vai agendar agora (visita site / segue redes), melhora o CPA. URLs estáticas hardcoded no template. Cuidado: `ficha_google` pega o TOP result do Places p/ "nome cidade uf" — podia pegar negócio errado se o nome for genérico. **✅ ATESTAÇÃO DA FICHA (25/jun, FIX):** `ficha_google` agora (a) pede `places.id`+`places.formattedAddress` no FieldMask + `locationBias` circle 30km nas coords da cidade do lead (mata xará de outra cidade); (b) **valida** match de nome (`_name_tokens` overlap ≥0.5) E cidade no endereço → `confianca` ∈ {confirmada, a_confirmar, divergente} + `maps_url` (`?q=place_id:`). Relatório apresenta em 3 níveis: **confirmada** mostra "Sua nota no Google"; **a_confirmar** condiciona ("se for a sua, está com nota X"); **divergente** não afirma nota (cautela). Sempre exibe bloco identificável (nome+endereço+link "ver no Google Maps") + badge de confiança → lead/Sino confirma visualmente. Prompt IA ganhou regra 7: só tratar nota do Google como do lead se `confianca=='confirmada'`. Roda no próximo diagnóstico (n8n recarrega o motor do workspace, sem deploy).

**REFINAMENTO v2 (jun/2026 — pedido do Último): sair do "audit de Instagram" (commodity) pra diagnóstico de 3 CAMADAS, calibrado pelo objetivo:** (1) **Mercado & Território** [o diferencial Sino — geomarketing/dados oficiais] — dados da cidade: Empresa=potencial de consumo/PIB, Mandato=eleitores/perfil, Instituição=população/socioeconômico + geomarketing da localização; (2) **Presença ampliada** — não só IG: encontrabilidade (Google/Maps/site/WhatsApp), reputação/avaliações, redes; (3) **Conteúdo & Resultado**. Régua da isca: relatório dá o PANORAMA (números+gaps p/ despertar); plano acionável fica pra sessão/proposta paga.

**3 fontes de dado PROVADAS ao vivo (jun/2026):** (a) **Business Discovery** — token @ooeirense (`17841477402712235`), `curl -g` OBRIGATÓRIO (chaves `{}` viram glob e zeram a resposta); devolve followers/media_count/like/comments/media_type de qualquer conta pública business/creator. (b) **IBGE SIDRA ao vivo** — pop Censo 2022 `apisidra.ibge.gov.br/values/t/4714/n6/<cod>/v/93/p/2022`; PIB municipal `t/5938/n6/<cod>/v/37/p/last%201` (Oeiras `2207009` = 38.161 hab, PIB R$740mi/2023, ~R$19,4mil/hab). (c) **TSE eleitorado = base LOCAL** (sem API REST limpa): `~/ÚLTIMO CAMPOS REIS/CURSOS/GEOREFERENCIAMENTO ELEITORAL/DADOS_TSE/PIAUI/perfil_eleitor_secao_2024_PI` + `~/SINO AGÊNCIA DIGITAL/ANALISE - POLITICA E ELEITORAL/eleitorado_local_votacao_2024` ([[project_tre_perfil_eleitorado_2026]] [[feedback_verificar_acervo_antes_de_baixar]]).

**Relatório já tem o bloco "Mercado & Território" no topo** (dados reais de Oeiras). **Form PRONTO:** + cidade/UF (obrigatório, destrava mercado) + bairro opcional (geomarketing) + — condicional a Empresa (JS toggle `#empresa-only`) — tipo de operação + ramo/setor (mapeia a concorrência). **Motor: ÚNICO, ramifica por segmento.** **Nome:** "Presença Digital" ficou apertado (escopo inclui mercado) — cogitar "Diagnóstico de Mercado e Presença" (não decidido).

**MOTOR PRONTO E PROVADO (jun/2026): `~/claude-workspace/sino-diagnostico/diagnostico-motor.py`** — engine Python (padrão `gerar-reels.py`, n8n invoca via execFile). Pipeline: recebe payload do form → **coleta** [IBGE localidades→cod município, SIDRA pop+PIB; Nominatim→lat/lon + Overpass/OSM concorrentes por ramo (mapa `RAMO_OSM` ramo→tag OSM); Business Discovery presença] → **correlação** (saturação por 10mil hab, PIB por concorrente) → **pontuação IA** (**`gpt-5.5`** — topo OpenAI abr/2026; upgrade de gpt-4o em 24/jun pra mais qualidade/respaldo; `reasoning_effort:"low"`, SEM `temperature` (modelo de raciocínio rejeita), `response_format json_object`; key no `.env`; ~11,5s/chamada) ancorada no dossiê. Devolve `{dossie, diagnostico}`. **nota_geral/nivel calculados deterministicamente** (soma das notas dos pilares), NÃO pela IA. **Análise v2 (24/jun): SEM pilares abstratos** — virou auditoria multicanal ancorada (ver roadmap (b) abaixo). Toda leitura cita número real; nada de chute. Todo HTTP via `/usr/bin/curl` (evita SSL Python 3.14). Teste real: Oeiras/Ótica → pop 38.161, PIB R$740mi, **10 óticas reais nominais** (Riveliny, The Ótica, Chilli Beans...), saturação 2,6/10mil hab, nota 48/80.

**Secrets em `.env` (jun/2026):** todos (CNPJá, Google Maps, IG_TOKEN, IG_ACCOUNT, OPENAI_KEY) movidos p/ `~/claude-workspace/sino-diagnostico/.env` **gitignored** (`.gitignore` criado; bloqueia `.env` + HTMLs gerados). Motor `_load_local_env()` carrega do `.env` se não vier do ambiente → `gerar-diagnostico.py` roda SEM exportar nada = **n8n-ready**. Removidos os secrets hardcoded do `.py`. (Cuidado: tokens longos digitados à mão dão erro — extrair via grep do CLAUDE.md.)

**Pendente — ORQUESTRAÇÃO n8n LOCAL** ([[project_monitor_secretarias]] [[project_ooeirense_screenshot_server]]): (1) webhook do form (n8n LOCAL) → execFile `gerar-diagnostico.py` (faz motor+IA+relatório+upload, imprime JSON `{url,email,nome,segmento,score,nivel}`) → responde `{url}` pro form REDIRECIONAR + **salvar o lead no FIRESTORE** (projeto `sino-comunicacao`, coleção ex. `diagnosticos_leads`) + **alerta por e-mail** ao Último avisando do novo registro (DECIDIDO 24/jun: Firestore+email; Último descartou Telegram+planilha que tinha escolhido antes). SEM passo de e-mail pro lead; (2) ✅ **FEITO (jun/2026):** `diagnostico-relatorio.build.py` refatorado p/ função `render_report(data)` (+ `_sample_data()` no `__main__`); orquestrador **`gerar-diagnostico.py`** faz o end-to-end `form → motor (montar_dossie + pontuar_com_ia) → render_report → HTML`. Testado: Oeiras/Ótica → 49/80, dado real (IBGE+CNPJ+presença+IA), sem badge PRÉVIA. **Card de concorrência FEITO (24/jun):** bloco "Concorrência & Saturação" no relatório = funil `Ativas no CNPJ → No Google/mapas → Têm site` (3 fsteps, último em coral) + linha de reputação + **srctag "Receita Federal (CNPJ ativos) · Google Maps · OpenStreetMap"**. **Clareza de fonte (pedido Último 24/jun):** rótulos expõem a fonte oficial; seção de presença retitulada **"Sua presença no Instagram"** + caption "Métricas coletadas direto do perfil @handle" (deixar inequívoco que são métricas do IG). Render só quando há `gap.ativas_cnpj` (Empresa); `competition` é campo opcional no `data` do `render_report`. Relatório agora CONSOLIDADO: nota 0-10 → mercado → concorrência → presença → 8 pilares → 3 prioridades → CTA → PDF; (3) ✅ **HOSPEDAGEM FEITA (jun/2026):** Firebase Storage da Sino — projeto `sino-comunicacao`, bucket `sino-comunicacao.firebasestorage.app`. Módulo **`hospedar.py`**: minta access token do refresh token do Firebase CLI (`~/.config/configstore/firebase-tools.json` + client_id/secret PÚBLICOS do firebase-tools `563584335869-...`/`j9iVZfS8kkCEFUPaAeJV0sAi`) → upload multipart com metadata `firebaseStorageDownloadTokens` → URL pública `firebasestorage.googleapis.com/v0/b/<bucket>/o/<path-encoded>?alt=media&token=<dl>`. **Gotcha:** Content-Type da parte de mídia DEVE bater EXATO com o do metadata (`text/html; charset=utf-8`) senão 400. Sem service account, sem instalar libs. Testado: relatório no ar, público, renderiza; (4) branch TSE p/ Mandato (base local, fase 2); (5) **saturação OFICIAL por CNAE via CNPJá JÁ WIRED no motor** (`saturacao_oficial_cnpj`, mapa `RAMO_CNAE` ramo→CNAE, **FUNCIONANDO (jun/2026)** — endpoint `GET api.cnpja.com/office` com operador `.in` no caminho COMPLETO do registro: `address.municipality.in=<cod>&status.id.in=2&mainActivity.id.in=<cnae[,cnae]>&limit=10` + header `Authorization: <token>`; resposta traz `count` (=saturação) e `records`. Token recebido (env `CNPJA_TOKEN`): `b82aade2-b672-4645-ae0e-7a319f27ff5b-ed72ab22-50cd-4100-9fe4-cfbe342c4e80`. **Teste real: Oeiras óticas (CNAE 4774100) = 20 ativas oficiais (CNPJ) vs 10 mapeadas (OSM) → saturação 5,2/10mil hab, gap real.** Correlação prioriza o `count` oficial; sem token degrada pro OSM. **API Open (open.cnpja.com) = só lookup individual grátis** (`/office/{cnpj}`; busca filtrada dá 404) — NÃO conta por CNAE; serve só p/ enriquecer o CNPJ do próprio lead de graça. Saturação exige a busca autenticada (já funcionando). **Plano anti-custo:** cachear `count` por município+ramo (~30 dias) → 1 query por cidade-setor, não por lead. Casa dos Dados = bloqueada por Cloudflare; BrasilAPI/CNPJá-open/Minha Receita só fazem lookup individual (não contam por CNAE). Fallback oficial sem custo recorrente = BigQuery/Base dos Dados (SA existe, falta instalar client). **Google Places (New) TAMBÉM já wired** (`concorrencia_places`, Text Search `places:searchText` com `X-Goog-FieldMask`, env `GOOGLE_MAPS_KEY`; devolve nota/avaliações/com_site/melhor_avaliado; degrada se sem chave). **Motor tem 3 fontes de concorrência, TODAS funcionando ✅ (jun/2026):** OSM (grátis, nominal) + CNPJ/CNAE (oficial, contagem) + Google Places New (qualitativo: nota/avaliações/site, `places:searchText`). **Places configurado via NAVEGADOR (extensão Claude for Chrome dirigida pelo Claude):** projeto Google Cloud **`sinodiagnotisco`** (sic, com typo no nome), Places API (New) ativada, chave criada `AIzaSyDyHy7ul2rC3l4sOcjXRxevgrcl2-WXbuU` (env `GOOGLE_MAPS_KEY`). **Teste real Oeiras/Ótica: 20 ativas (CNPJ) → 13 aparecem no Google → 10 mapeadas OSM → só 6 com site; nota média 4,1; líder Óticas Canoa 5,0/89 aval.** Correlação tem `gap_presenca_digital` = **funil 20→14→6** (ativas_cnpj → aparecem_online → com_site) + `concorrentes_no_google`. **Dedup `dedup_presenca_online`** funde OSM∪Google em `unicos_online` por overlap de token distintivo (`_name_tokens` remove genéricos tipo "otica/oeiras", com FALLBACK p/ todos os tokens em nomes 100% genéricos — senão "The Ótica Oeiras" zera e some). Oeiras/Ótica: 14 únicos (8 nas duas, 2 só OSM, 4 só Google); insight = ~6 óticas ativas não aparecem em lugar nenhum online. Chave Google (projeto `sinodiagnotisco`) **vem restrita às 35 APIs de Maps** (NÃO totalmente aberta — corrigindo afirmação anterior); apertar p/ só "Places API (New)" é impraticável por automação (o seletor não tem "limpar tudo", exigiria desmarcar ~34). Safeguard recomendado = **alerta de orçamento** no Google Cloud (Último ativar). Conexão da extensão: `list_connected_browsers`→`select_browser`→`tabs_context_mcp{createIfEmpty}` (precisa o usuário ter o Chrome com extensão aberto/conectado). **Cuidado de redação:** "PIB por concorrente" é fatia da economia, não faturamento.
