Não é um dashboard.

É a infraestrutura para uma marca perceber, decidir e trabalhar em continuidade.

O SENSEI conecta sinais externos, memória de marca, decisões e entregas por contratos explícitos. Cada leitura precisa declarar a origem. Cada ação herda um escopo. Cada resultado volta como material para a próxima decisão, sem transformar hipótese em fato.

  • TypeScript
  • Next.js
  • Postgres
  • RLS
  • Zod
  • AI SDK

Uma inteligência de marca não pode ser uma cadeia de prompts.

O problema não é gerar mais uma resposta. É manter, sob pressão, uma versão coerente do que a marca sabe, do que o mundo está dizendo, do que foi decidido e do que a operação fez a seguir.

Estado antes de texto
O modelo trabalha sobre contexto organizado, não sobre uma pilha opaca de mensagens.
Proveniência antes de certeza
Uma fonte pode existir sem provar uma conclusão. A interface precisa preservar essa diferença.
Escopo antes de autonomia
Ações, buscas, documentos e resultados pertencem a uma marca e a permissões verificáveis.
Falha explícita antes de fluência
Quando não há dado, rota ou confiança suficiente, o sistema mostra o limite. Não preenche a lacuna com convicção.

O contexto é compilado, não colado.

A memória da marca não é um PDF jogado no prompt. O runtime junta regras aprovadas, documentos codificados, módulos, fatos, projetos, briefings e sinais recentes em um snapshot estruturado. Cada domínio permanece consultável e atualizável sem recomeçar a conversa do zero.

trecho condensado · src/lib/ai/build-brand-context.tssnapshot por marca
const [
  ontologyR, rulesR, brandOsDocR, modulesR, factsR,
  documentsR, briefsR, projectsR, pulseR,
] = await Promise.all([
  supabase.from("ontology_sections").select(...).eq("brand_id", brand.id),
  supabase.from("rules").select(...).eq("brand_id", brand.id),
  supabase.from("brand_os_docs").select(...).eq("brand_id", brand.id),
  supabase.from("brand_modules").select(...).eq("brand_id", brand.id),
  supabase.from("brand_facts").select(...).eq("brand_id", brand.id),
  supabase.from("projects").select(...).eq("brand_id", brand.id),
  supabase.from("pulse_content_items").select(...).eq("brand_id", brand.id),
]);

// buildBrandContext(brand) entrega um snapshot estruturado.

A implementação real usa uma única rodada Promise.allpara compor o contexto e mantém as leituras filtradas porbrand_id. O objetivo é dar ao modelo memória útil sem confundir volume bruto com contexto confiável.

O loop não termina na recomendação.

A arquitetura organiza uma sequência de trabalho. Pulse observa o mundo. Cultural IQ interpreta tensões. A marca decide. A produção materializa. O resultado é registrado para que a próxima rodada possa partir de uma base melhor.

  1. 01 · CapturarFontes, canais, creators, imprensa, concorrentes e dados próprios entram com tempo e origem.
  2. 02 · InterpretarSinais são classificados, agrupados e confrontados com o DNA, as personas e as regras da marca.
  3. 03 · DeliberarUma oportunidade vira decisão, artefato, plano ou pedido de investigação com contexto rastreável.
  4. 04 · OperarO time aprova, altera ou executa dentro de mandato. O que aconteceu permanece ligado à escolha.

O ciclo de aprendizagem é uma direção de arquitetura, não licença para afirmar causalidade automática. Resultado observado, atribuição e aprendizado causal são estados diferentes e precisam continuar distintos no produto.

Multi-tenant é uma fronteira de segurança, não uma convenção de UI.

Um workspace pode ter muitas marcas. Isso não transforma os dados em um pool compartilhado. A fronteira é imposta no servidor, reforçada por RLS e repetida nos handlers que expõem ações e dados.

trecho condensado · src/lib/brand-os/scoping/index.tsfail closed
export async function requireBrandAccess(
  brandId: string,
  userId: string,
  options?: { minRole?: BrandRole },
): Promise<RequireBrandAccessResult> {
  const membership = await assertBrandMember(brandId, options);

  if (membership.user.id !== userId) {
    return { ok: false, status: 401, error: "Sessão não confere" };
  }

  return { ok: true, brandId, userId, user: membership.user };
}

A função retorna uma união discriminada: acesso válido ou negação explícita. Uma sessão que não confere, um papel insuficiente ou uma marca ausente não segue para a execução como um caso ambíguo.

O dado desconhecido não vira zero. A fonte citada não vira prova.

A plataforma separa medido, estimado e ausente. Taxa de engajamento sem numerador e denominador continua nula. Alcance que a fonte não publica não recebe um zero decorativo. E uma resposta de IA só pode apresentar como fato aquilo que guarda rastro de consulta.

MedidoValor com população, período e fonte definidos.
EstimadoFaixa e confiança declaradas. Nunca disfarçado de observação.
AusenteSem número. O vazio é um estado do sistema, não um defeito visual.
trecho condensado · src/lib/pulse-platform/queries.tsconsulta paginada e ordenação honesta
query
  .eq("brand_id", brandId)
  .gte("published_at", since)
  .gte("relevance_score", minRelevance)
  .order(sortCol, { ascending: false, nullsFirst: false })
  .range((page - 1) * limit, page * limit - 1);

A ordenação usa nullsFirst: false porque uma fonte que não publicou alcance não deve ganhar prioridade sobre um conteúdo efetivamente medido. Esse tipo de decisão pequena é onde confiança deixa de ser só discurso.

O modelo pode trocar. O contrato não.

O SENSEI não depende de um único provedor para continuar operando. A execução resolve um conjunto de modelos por marca, registra o caminho de fallback e exige saída compatível com schema. Quota e rate limit podem acionar outro motor. Erro de forma não pode ser escondido atrás de uma resposta bem escrita.

trecho condensado · src/lib/ai/generate-with-fallback.tsschema primeiro
const { object, usage } = args.messages
  ? await generateObject({
      ...baseInput,
      messages: stripLoneSurrogatesInMessages(args.messages)!,
    })
  : await generateObject({
      ...baseInput,
      system: stripLoneSurrogates(args.system),
      prompt: stripLoneSurrogates(args.prompt) ?? "",
    });

return { object, provider, modelId, fallbackTrail: trail, usage };

A implementação mantém trail de provedor, modelo e erro. Falhas de quota são elegíveis a fallback. Falhas de autenticação ou validação de schema sobem como falha: trocar de modelo não conserta um contrato quebrado.

Confiança não é uma página. É uma suite de comportamento.

A base contém testes para os pontos onde um sistema de inteligência costuma mentir sem perceber: vazamento entre marcas, números sem denominador, histórico de conversa que se autojustifica, destinos OAuth que escapam da origem e regras de marca que falham por uma substring inocente.

  • pulse-truncation-and-cost.test.tsPaginação e períodos completos, sem contar só a primeira página.
  • engagement-sem-valor-inventado.test.tsAusência de medida permanece ausente, inclusive nos rankings.
  • thread-audit.test.tsSepara o que teve ferramenta do que foi apenas prosa do modelo.
  • destino-oauth-preserva-query.test.tsPreserva fluxo de autorização e recusa redirecionamento externo.
  • brand-gate/load.test.tsRegras e termos banidos precisam disparar no uso real, não no anti-exemplo.

Teste não é sinônimo de verdade no mundo. Ele garante que o sistema respeita seu próprio contrato quando encontra uma condição conhecida. Cobertura, qualidade de fonte e avaliação humana continuam sendo trabalho contínuo.

Onde a engenharia mexe para mudar o sistema.

A organização do código espelha as fronteiras do produto. Cada módulo deve poder evoluir sem dissolver escopo de marca, rastro de evidência ou regra de execução em um componente de interface.

src/
├─ app/                 superfícies, rotas e API handlers
├─ lib/brand-pulse/     ingestão, leitura e métricas de sinais
├─ lib/cultural-iq/     geração e consultas da leitura cultural
├─ lib/brand-os/        memória, regras, fatos e escopo por marca
├─ lib/ai/              contexto, roteamento e runtime de modelos
├─ lib/security/        sanitização, membership e guards
├─ lib/assistant/       threads, ferramentas e auditoria de respostas
└─ __tests__/           contratos que protegem o comportamento

A contratação que queremos não é para “adicionar features de IA”. É para construir sistemas que sejam mais úteis quando o contexto é incompleto, mais seguros quando a demanda aumenta e mais honestos quando o modelo não sabe.

Instrumentação pública.

Os indicadores abaixo são a parte auditável da interface. Cada um declara o que mede, de onde o dado vem, o que não prova e quando deveria permanecer vazio. Esta seção é intencionalmente detalhada: precisão operacional é um requisito de produto.

Saúde do Brand DNA %

Mostra o quanto da sua marca já está documentada na plataforma. Não é uma nota de qualidade da marca. É um termômetro de quanto do guia da marca (voz, cores, personas, arquitetura, mensagem) já está preenchido e pronto pra usar.

Como é calculado

Cada parte da marca recebe uma porcentagem de preenchimento: documentada por completo conta cheia; preenchida pela metade ou em revisão conta parcial; vazia conta zero. A saúde geral é a média dessas partes, agrupadas em quatro blocos: sistemas visuais, personas, arquitetura e mensagem.

De onde vem o dado

Do que você (ou a IA, com sua aprovação) preencheu no Brand DNA: as regras da marca e os documentos que você subiu. Quanto mais completo o guia, maior a saúde.

O que isso quer dizer pra marca

  • Mede o quanto está documentado, não o quanto a marca é boa.
  • Uma parte preenchida com texto raso conta igual a uma bem detalhada. A leitura de qualidade é sua.
  • Pra subir: complete as partes ainda vazias do Brand DNA. Comece pelos blocos com a porcentagem mais baixa.

Margem de Marca (MM%)

De cada R$ 100 de lucro bruto da companhia, quantos existem porque a marca existe. Tudo se compara ao mesmo fantasma: o equivalente sem marca no mesmo canal — a etiqueta branca na mesma gôndola, o concorrente local na mesma praça.

Como é calculado

Três contas medem esse fantasma: Preço (o que se cobra a mais, por unidade, líquido de custo e promoção), Procura (o que se gasta a menos para gerar um real de venda) e Defesa (o que se perde mais devagar quando o concorrente ataca). A soma desconta o que as contas medem em dobro e sai como faixa com valor central, derivada por simulação com as correlações declaradas.

Estatutos

Conta que o dado sustenta é derivada. Conta que o dado sustenta só em parte vira piso, publicado com “maior ou igual” — o teto que não foi medido não existe na tela nem no banco. Conta sem dado fica de fora e a marca aparece como “não estimada”: ausência de número é uma informação, não um defeito. Toda medição carrega fonte, data e método; sem os três, não entra.

Cultural IQ (nota de 0 a 100)

Uma leitura de IA sobre o momento cultural da sua marca no período. Junta os sinais que o Brand Pulse capturou, o guia da marca e os concorrentes que você configurou.

O que é

Uma leitura assistida do clima cultural da marca naquela janela de tempo. Para montá-la, a IA olha:

  • Sinais recentes do Pulse já classificados
  • As fontes de evidência da sua marca (guia e documentos)
  • Os concorrentes e territórios que você configurou
  • Personas, arquitetura e estratégia do Brand DNA

A partir disso, a IA gera a leitura e uma nota de 0 a 100.

O que NÃO é

  • Não é número exato. É uma estimativa de IA. Duas leituras no mesmo dia podem variar alguns pontos.
  • Não substitui pesquisa. É uma leitura assistida, não troca grupo focal nem survey.
  • Depende de ter sinal. Com pouquíssimos sinais no período, a plataforma avisa que há pouca evidência em vez de inventar uma nota.

Como ler

Use a nota como direção, não como placar. O movimento (subindo ou descendo) e a comparação com a leitura anterior valem mais que o número solto. Cruze sempre com o Pulse e o sentimento.

Pra ter leitura mais firme: mantenha suas keywords do Pulse capturando sinal e o Brand DNA preenchido. Quanto mais evidência, mais confiável a leitura.

Brand Pulse — os números do dia a dia

Volume / Menções

Quantas vezes a marca apareceu no período (padrão: últimos 7 dias), contando só os sinais que batem com as suas keywords. Contagem direta, sem peso.

Sentimento líquido

A diferença entre quem falou bem e quem falou mal, sobre o total. Cada sinal é classificado pela IA. Quando ainda não há sinal classificado, a tela mostra “—” e “sem sinais classificados”, em vez de fingir um zero.

Fatia da conversa (Share of Voice)

Quanto das menções é sobre a sua marca, comparado aos concorrentes que você configurou. Sem concorrentes cadastrados, a tela mostra “—” e “concorrentes não configurados” — não um falso 0,0%.

Convergências do Radar

Um evento só é persistido quando o mesmo cluster reúne pelo menos três tipos independentes entre creators, busca, comunidade, imprensa e concorrentes dentro de 14 dias. A fotografia guarda os conteúdos que formaram o movimento, a velocidade, a saturação e cinco sinais de crossover. Rede social diferente não conta automaticamente como fonte independente.

Pra essa fatia aparecer: cadastre seus concorrentes nas configurações do Pulse.

Alcance estimado

Uma estimativa de quantas pessoas o sinal pode ter alcançado, somada por menção. É ordem de grandeza, não medição exata. Algumas fontes não trazem esse dado e aparecem como zero.

Privacidade (LGPD)

Cada fonte de coleta tem sua base legal registrada — interesse legítimo, consentimento ou contrato. Pessoas físicas podem pedir a remoção dos próprios dados via /api/lgpd/forget. A solicitação gera um recibo por hash do titular. Nome e perfil não entram no histórico do pedido em texto aberto.

De onde vem uma recomendação do Sensei

Cada recomendação guarda o que foi lido para escrevê-la. São conteúdos reais coletados pelo Pulse nos últimos 14 dias, com data, canal, autor e link. O sistema numera esses conteúdos antes de mostrá-los ao modelo; o modelo aponta quais usou; e o sistema descarta qualquer rótulo que ele não tenha recebido. Rótulo inventado não vira fonte.

O que os números querem dizer

A frase aponta para 4 dos 12 conteúdos que leu tem três partes. 4 é quanto a recomendação apontou. 12 é quanto foi posto na mesa do modelo. Encontrados na janela é quanto existia no total. Os três são contagem, não nota.

O que o sistema mede é o apontamento, não a sustentação: ele garante que o conteúdo citado existe, foi lido nesta rodada e tem link, mas não julga se ele sustenta a frase. Por isso os links ficam na tela. Conferir uma leitura leva segundos, e é assim que se confere.

Quando a tela não mostra número

Se o Pulse não coletou nada relevante na janela, o Sensei não gera recomendação para aquela marca no dia e diz isso. Se a leitura do Pulse falhou, a tela diz que não medimos, o que é diferente de dizer que não há conversa. Recomendações geradas antes de 14/08/2026 não têm esse registro, e aparecem marcadas assim em vez de receberem uma procedência inventada depois.

Limites honestos

A régua de entrada (relevância 7 de 10) é a nota de um classificador de IA, não uma medida. O conteúdo é fato: existe, tem data, tem autor e tem link. O ranking dele é leitura de máquina. E a busca só cobre os termos que o Pulse já monitora, então a leitura é sempre “dentro do que monitoramos”, nunca “tudo o que está acontecendo”.

Um último aviso, porque ele importa: apontar um conteúdo prova que ele estava na mesa e foi lido. Não prova que ele sustenta a frase. Os links estão na tela justamente para você conferir em segundos.

De onde vêm as respostas

Quando a plataforma responde uma pergunta “com base na sua marca”, a resposta não sai do nada. Ela é montada a partir das fontes de evidência que você já preencheu:

  1. A pergunta é comparada com os dados da sua marca.
  2. A plataforma busca os trechos do guia e dos documentos que mais têm a ver com a pergunta.
  3. Mantém só os trechos realmente relevantes.
  4. Usa esse material como base para escrever a resposta.

Cada resposta fica registrada: qual tela pediu, qual recurso usou e quando. Assim dá pra auditar.

Quando há pouca evidência

Quanto mais completo o Brand DNA, mais material a plataforma encontra pra responder. Marcas com pouca documentação recebem um aviso de baixa evidência em vez de uma resposta inventada.

Pra respostas mais ricas: preencha mais do Brand DNA e suba os documentos da marca.

Disponibilidade da IA

A geração assistida não cai quando um motor de IA fica fora do ar. Se o motor principal trava ou atinge o limite, a plataforma passa pra outro automaticamente, sem você perceber.

Cada geração fica registrada — o que foi usado e quando — pra você poder auditar depois.

Histórico e exportação

Toda mudança importante na marca fica registrada num histórico que ninguém apaga, guardado por pelo menos 365 dias. Você pode baixar esse histórico em CSV ou JSON pelo botão na aba Histórico de cada marca.

Prontidão do Assistente (0 a 100)

Aparece no topo do Assistente. Mede o quanto a marca está pronta pra gerar conteúdo com a IA — não o quanto a marca é boa.

Como é calculado

A nota soma três coisas: quantos documentos da marca já estão preenchidos, quantas regras da marca já estão prontas e se houve atividade recente. Quanto mais completo e mais ativo, mais alta a nota.

O que cada faixa quer dizer

  • 80 ou mais → “Pronto para execução”
  • 55 a 79 → “Útil, com lacunas”
  • 1 a 54 → “Precisa reforço”
  • 0 → “Sem contexto carregado”

Pra subir a nota: preencha os documentos e as regras da marca que ainda faltam e mantenha a marca ativa.

Fontes prontas (X de Y)

No painel de qualidade. Cada fonte que alimenta o Pulse é checada pra ver se está conectada e pronta. Os estados possíveis são: pronta, parcial (funciona só em teste) e faltando conexão.

Como é calculado

É a conta de quantas fontes estão totalmente prontas dividido pelo total de fontes. Fonte pronta tem tudo conectado; parcial está conectada só pra teste; faltando ainda não tem a conexão.

O que isso quer dizer pra marca

  • Fonte parcial não conta como pronta — funciona em teste, mas pode falhar de verdade.
  • Mede só se a fonte está conectada, não a qualidade do que ela traz.

Regras da marca · documentos fonte

A linha “N regras · M docs” no topo do Brand DNA mostra o volume bruto: quantas regras a marca tem e de quantos documentos elas saíram.

Como é contado

  • Regras: o total de regras da marca, de qualquer tipo (bloqueio, alerta ou informação).
  • Docs: os documentos de onde saíram mais regras (mostra até 12).

O que isso quer dizer pra marca

  • O contador mostra até 12 docs.Se a marca tem mais, o número trava em 12. A lista completa fica em Brand OS › Load.
  • O contador de regras não separa por tipo. Pra ver a divisão (bloqueio, alerta, informação), abra Decisões.

Sistemas visuais documentados %

Aparece no Brand DNA como “N% sistemas documentados”. Mede o quanto das peças visuais da marca já está preenchido.

Como é calculado

É a média de preenchimento de seis peças visuais: logo, cores, tipografia, ícones, movimento e fotografia. Cada uma segue a mesma regra da Saúde do Brand DNA (ver acima): documentada por completo conta cheia, pela metade conta parcial, vazia conta zero.

O que isso quer dizer pra marca

  • As seis peças têm peso igual — logo documentado vale o mesmo que movimento.
  • Pra subir: preencha as peças visuais ainda vazias no Brand DNA.

Personas documentadas

Quantas personas a marca tem cadastradas no Brand DNA. Contagem simples.

Como é contado

É o número de personas. Conta a quantidade, não o quão completa cada uma é.

O que isso quer dizer pra marca

  • Uma persona só com nome conta igual a uma com tarefa-a-resolver, canais e frustrações. Pra ver o detalhe de cada uma, abra Personas.
  • Personas criadas pela IA e cadastradas à mão contam igual — não há distinção no número.

Sub-marcas

Quantas sub-marcas estão cadastradas na arquitetura da marca, dentro do Brand DNA. Contagem simples.

Como é contado

É o número de sub-marcas. Conta a quantidade, não a atividade de cada uma.

O que isso quer dizer pra marca

  • Sub-marca parada conta igual a sub-marca ativa. Pra ver onde cada uma manda, abra Arquitetura.