Call Signal Layer

Como reuniões Inventa viram sinais estruturados, passam por triagem e voltam pro dia a dia via Slack. Visão da arquitetura em produção (PoC Fase 1).

Atualizado em 09/06/2026 · Público · cs-architecture.pages.dev

6
Slices em produção
13
Marcas com canal Slack
3
Modelos IA no pipeline
Humano
Sempre no loop de triagem

1 · Entrada e extração

Reunião entra pelo Granola; IA extrai sinais sobre transcript diarizado completo (fallback: resumo).

flowchart LR
  granola["Granola
Reuniões Inventa"] captura["Captura
Poll 15 min"] storage["Armazenamento
Resumo + metadados"] pii["Proteção PII
Antes do LLM"] haiku["Triagem Haiku
Vale extrair?"] sonnet["Extração Sonnet
6 tipos de sinal"] entities["Entidades
Marcas · pessoas"] kv["Cache aliases
KV write-through"] db["Base de sinais
Postgres Neon"] granola --> captura --> storage --> pii --> haiku --> sonnet --> entities --> kv --> db

2 · Triagem — confiança da IA

Todo sinal passa por regras de confiança. Decisões ficam na trilha de auditoria (inclui revisão Opus).

Auto-promove

Confiança > 85%

Vai direto pro Slack, sem fila humana.

Revisão Opus

Confiança 70% – 85%

Opus valida, ajusta score e pode promover, dispensar ou mandar pra fila com promoção automática após 24h.

Fila humana

Confiança < 70%

App de Triagem — promover, editar ou dispensar. Sem triagem em 48h, dispensa automática (reversível na trilha).

3 · Ativação no Slack

Sinais aprovados são empurrados pro dia a dia — push antes de pull.

flowchart LR
  promoted["Sinal aprovado
Promovido"] brand["Canal da marca
#cliente-marca"] tracker["Commitments
#commitments-tracker"] themes["Temas
#cs-themes-semanal"] inventa["/inventa
Consulta com fontes"] reminders["Lembretes
48h + D+1"] promoted --> brand promoted --> tracker promoted --> themes promoted --> inventa tracker --> reminders

4 · Consulta /inventa

Comando no Slack para consultar o que saiu das reuniões — complementa o push de sinais nos canais. Responde só com sinais promovidos (triados ou auto-aprovados).

flowchart TB
  slack["Slack /inventa"]
  rules["Regras fixas
marca · periodo · tipo
sem LLM"] search["Busca sinais promovidos"] zero{"Zero resultados?"} retry["Amplia busca
periodo · tipo · modo"] haikuAdv["Haiku sugere reformular"] answer["Resposta com fontes"] slack --> rules --> search --> zero zero -->|nao| answer zero -->|sim| retry --> search retry -->|"ainda zero"| haikuAdv --> answer

Busca rápida

~1 segundo

Lookup tipo Bauducco essa semana — lista sinais com botão Abrir reunião. Sem síntese IA.

Pergunta aberta

2 – 4 segundos

O que rolou com Bauducco? — busca semântica, Haiku ordena candidatos, Sonnet redige com citações numeradas.

Etapa Como funciona LLM?
Entender a pergunta Regex + palavras-chave (marca, período, tipo) Não
Busca rápida Full-text search no Postgres Não
Busca semântica Embedding + Vectorize (similaridade) Não generativo
Ordenar candidatos Haiku escolhe os mais relevantes Sim
Redigir resposta Sonnet sintetiza com citações obrigatórias Sim
Zero resultados Retry automático (amplia filtros) → Haiku sugere reformulação Só no empty state
Confiança O /inventa não inventa reunião. Toda afirmação na síntese cita sinal real; cada card traz link pro Granola. Se nada aparece, o sistema amplia a busca (período, tipo, modo) e só então a IA sugere como reformular — sem afirmar que algo existe na base.

Exemplos: /inventa Bauducco essa semana · /inventa o que rolou com Bauducco? · /inventa quais riscos foram levantados nos últimos 14 dias?

5 · Novas fronteiras — Slack como fonte + camada MCP (novo · em rollout)

Duas expansões recentes. Ingestão via Slack amplia a captura de "só reuniões" para canais Slack observados (allowlist explícita) — threads viram a mesma R2 → extração que o Granola usa. Camada MCP expõe a inteligência do /inventa a clientes como Claude e Cursor, com identidade verificada via Cloudflare Access.

flowchart LR
  slackch["Canais Slack observados
allowlist (#ops, #cliente-*)"] boundary["cs-slack-bot /slack/events
guards + fila"] agg["Agregador de thread
(Durable Object + alarme)"] ingest["Mesma R2 → cs-ingest
pipeline existente"] slackch --> boundary --> agg --> ingest mcpcli["Claude / Cursor"] access["Cloudflare Access
(OIDC · identidade)"] mcp["cs-mcp /mcp
read-only · só promovidos"] brain["Inteligência /inventa
(busca promovidos)"] mcpcli --> access --> mcp --> brain

Slack como fonte (Slice 8)

Opt-in · allowlist

Só canais marcados como ativos são lidos. Threads são agrupados e, quando esfriam, viram sinal pelo mesmo pipeline. Posts do próprio bot são filtrados (sem loop). Triagem humana segue obrigatória.

Camada MCP (Slice 9)

Read-only · só promovidos

Servidor MCP remoto com OAuth (Access como IdP). Tools de busca reusam o cérebro do /inventa. Nunca expõe transcript bruto, PII, nem sinais pendentes/dispensados.

Tipos de sinal

Tipo Uso típico
Compromisso Prazo + responsável → lembretes
Decisão O que foi decidido na call
Risco Ameaça a prazo ou entrega
Sinal de cliente Feedback ou demanda de marca
Process gap Falha de processo interno
Ideia Proposta ainda não decidida

Observabilidade

Ferramenta O que monitora
Langfuse Qualidade IA — Haiku, Sonnet, Opus
cs-ops Custo LLM + baseline diário, Opus reviews, precision/recall IC95%, erros
cs-ops · alertas 8 alertas operacionais (disparo horário via cs-triage-api) → Slack/DM com dedup
Audit mode Amostra semanal de transcripts → marca sinais faltantes → signalRecall
Trilha de auditoria Promote · edit · dismiss · delta Opus
Granola — transcript diarizado O poller busca a transcrição completa via Granola API (?include=transcript). A extração prioriza utterances com speaker label; se indisponível, cai no resumo editorial (modo degradado).

Componentes técnicos

Workers Cloudflare, filas e storage — referência para engenharia.

Mapa de workers
Camada Worker / App Função
Entrada cs-poller Cron 15 min → R2 + fila cs-ingest
Extração cs-extraction-pipeline PII · Haiku · Sonnet · Opus · Vectorize
Fechar o loop cs-extraction-pipeline Slice 7: reunião posterior confirma commitment anterior (Vectorize + Haiku) → conclui sozinho + avisa no canal · cron horário
Triagem cs-triage-api + triage-app API + UI promote/edit/dismiss · filtro por área (cliente) · audit mode (Tier 2)
Busca web cs-triage-api + cs-inventa-app GET /search · compromissos do usuário · POST /commitments/:id/complete
Slack cs-slack-bot Posts promovidos + /inventa + botão Concluir (interactivity) + link cs-inventa-app por signal + listener #missed (link de transcript assinado 15 min) + boundary /slack/events (Slice 8)
Ingestão Slack cs-slack-ingest Slice 8: consumidor cs-slack-events + Durable Object SlackThreadAggregator (agrega thread, alarme de quiet-timer, fases resumíveis) → R2 → cs-ingest
Camada MCP cs-mcp Slice 9: servidor MCP remoto (/mcp) read-only/só promovidos + OAuth via Cloudflare Access (OIDC)
Compromissos cs-commitments-scheduler Cron horário · 48h + D+1 (só pending) · quiet hours 20–8h BRT
Temas cs-themes-digest Digest seg 9h BRT
Ops cs-ops Dashboard Analytics Engine + cost baseline + signalRecall + motor de 8 alertas (disparo horário via cs-triage-api)
/inventa — referência
Item Detalhe
Endpoint cs-slack-bot POST /slack/command
Dados Neon Postgres (FTS) + Vectorize cs-signals (synth)
Modelos Haiku rerank + empty advisor · Sonnet síntese (AI Gateway)
Latência FTS síncrono ~1s · synth ack + waitUntil 2–4s
Retry zero-result drop texto → drop tipo → período 30d → escalar hybrid · depois Haiku empty advisor
Filas e storage
Recurso Papel
cs-ingest Poller → extraction pipeline
cs-promoted Triagem → slack-bot
cs-slack-events Slice 8: slack-bot /slack/events → cs-slack-ingest
cs-transcripts (R2) Payload sanitizado por reunião
Neon Postgres Sinais, entidades, commitments, audit
Vectorize cs-signals /inventa synth + themes digest