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).
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
Todo sinal passa por regras de confiança. Decisões ficam na trilha de auditoria (inclui revisão Opus).
Confiança > 85%
Vai direto pro Slack, sem fila humana.
Confiança 70% – 85%
Opus valida, ajusta score e pode promover, dispensar ou mandar pra fila com promoção automática após 24h. O dono da reunião recebe DM com botões Promover/Dispensar (e o parecer do Opus) antes da decisão automática.
Confiança < 70%
App de Triagem — promover, editar ou dispensar. Sem triagem em 48h, dispensa automática (reversível na trilha). O dono também recebe DM com Promover/Dispensar ~2h antes.
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
DM ao responsavel + canal"] promoted --> brand promoted --> tracker promoted --> themes promoted --> inventa tracker --> reminders
Sinais ainda pendentes geram DM ao dono da reunião com botões Promover / Dispensar — logo após a extração e ~2h antes da decisão automática (24h promove · 48h dispensa). Promover posta no canal da marca; dispensar não.
/inventaComando no Slack para consultar o que saiu das reuniões — complementa o push de sinais nos canais. No Slack, toda pergunta passa por busca semântica e volta com síntese e fontes. Responde só com sinais promovidos (triados ou auto-aprovados).
flowchart TB slack["Slack /inventa"] rules["Regras fixas
marca · periodo · tipo
sem LLM"] search["Busca semantica
nos promovidos + sintese"] 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
embedding + Vectorize
Toda pergunta — de Bauducco essa semana a o que rolou com Bauducco? — vira busca semântica, captando a intenção e não só as palavras-chave.
~2 – 4 segundos
Haiku ordena os candidatos e Sonnet redige um resumo com citações numeradas. A lista FTS direta fica só como fallback quando a síntese não retorna.
| Etapa | Como funciona | LLM? |
|---|---|---|
| Entender a pergunta | Regex + palavras-chave (marca, período, tipo) | Não |
| Busca semântica (padrão) | Embedding + Vectorize (similaridade) | Não generativo |
| Fallback FTS | Full-text search no Postgres (quando a síntese não retorna) | Não |
| 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 |
/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?
Expansões recentes. Ingestão via Slack amplia a captura de "só reuniões" para
canais Slack observados (allowlist explícita). Fireflies entra como
segunda fonte de reunião, em paralelo ao Granola (migração gradual) — webhook global super-admin, sem
chave por usuário. Ambas 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 fireflies["Fireflies
(webhook super-admin global)"] ffhook["cs-fireflies-ingest /webhook
verifica HMAC + fila"] fffetch["Busca transcript
(GraphQL · chave única)"] fireflies --> ffhook --> fffetch --> 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
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.
Paralelo ao Granola · migração
Webhook global (Enterprise super-admin) + uma chave de API org-wide — sem fricção por usuário. A reunião transcrita é buscada via GraphQL e entra no mesmo pipeline. Roda junto com o Granola até o desligamento gradual.
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.
| 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 |
| 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 |
?include=transcript). A extração
prioriza utterances com speaker label; se indisponível, cai no resumo editorial (modo degradado).
Workers Cloudflare, filas e storage — referência para engenharia.
| Camada | Worker / App | Função |
|---|---|---|
| Entrada | cs-poller | Cron 15 min → R2 + fila cs-ingest |
| Entrada (Fireflies) | cs-fireflies-ingest | Webhook super-admin global → busca transcript (GraphQL, chave única) → R2 + fila cs-ingest · paralelo ao Granola |
| 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) |
| Admin / config | cs-triage-api + cs-admin-app | Console admin (Tier 2): runtime config com audit (app_config → KV cs-app-config, lido por 7 workers sem deploy), allowlist de canais de ingest e cohort Granola |
| Compromissos | cs-commitments-scheduler | Cron horário · 48h + D+1 (só pending) · DM ao responsável + #commitments-tracker · 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) |
| 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 | Sempre synth: ack imediato + waitUntil 2–4s (FTS direto só como fallback) |
| Retry zero-result | drop texto → drop tipo → período 30d → escalar hybrid · depois Haiku empty advisor |
| 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 |