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.
Confiança < 70%
App de Triagem — promover, editar ou dispensar. Sem triagem em 48h, dispensa automática (reversível na trilha).
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
/inventaComando 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
~1 segundo
Lookup tipo Bauducco essa semana — lista sinais com botão Abrir reunião. Sem síntese IA.
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 |
/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?
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
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.
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 |
| 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) |
| 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 |
| 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 |