Ir para o conteúdo

BrisaVerse — Roadmap de Produto

Versão 1.0 — Gerado em 2026-06-20 PM/Tech Lead: Claude Sonnet 4.6


1. Visão e Princípios

Declaração de produto

O BrisaVerse é uma segunda mente pessoal com IA — um sistema local-first que roda no servidor do próprio usuário, agrega o contexto real da sua vida (tarefas, notas, projetos, reflexões, eventos, decisões), e oferece uma IA que realmente conhece esse contexto. Ao contrário de ferramentas de PKM que exigem manutenção constante, o BrisaVerse captura com mínimo atrito (chat, voz, Telegram), organiza automaticamente com IA, e apresenta o resultado como um mapa vivo da vida do usuário — não como uma lista de documentos. Os dados são do usuário, ficam no servidor do usuário, e a IA serve o usuário em vez de extrair seus dados para enriquecer um produto de terceiros.

Princípios de design

  1. Captura zero-fricção, organização automática — o usuário nunca deve precisar decidir onde guardar algo na hora em que está com o pensamento em foco. Manda o texto, a voz, a foto. A IA classifica depois.

  2. Local-first é inegociável — dados não saem do VPS do usuário. Integrações com terceiros (Claude API, Google) são read-only ou têm opt-in explícito. Este é o maior diferenciador contra todo concorrente do mercado.

  3. IA como lente, não como destino — a IA não é o produto final. É a camada que transforma dados brutos em entendimento: conecta nós, detecta padrões, sugere, mas não substitui o julgamento do usuário. O usuário sempre vê os dados brutos além das inferências.

  4. Interface que convida, não que exige — o mural deve ser algo que o usuário quer abrir, não um painel de controle que gera culpa. Designs que criam pressão (% de tarefas, streaks) devem ser opcionais. O padrão é calmo.

  5. Evolução sem quebra — o sistema já existe e está em uso diário. Cada feature nova precisa ser aditiva: não pode exigir migração, não pode mudar como o todo.md é editado, não pode tornar o mural mais lento. Backward compatibility é o custo de ter um sistema que já roda.


2. Estado Atual vs. Visão

Feature Existe? Gap Prioridade
Mural visual com mapa de nós ✅ Sim UI melhorável (plano mural-v2) Baixa (funcional)
Tasks por domínio de vida ✅ Sim (todo.md + parser) Sem subitens visíveis no mural Média
Flows (projetos com etapas) ✅ Sim Sem timeline visual por flow Alta
Bot Brisa no Telegram ✅ Sim Sem captura de voz nativa Alta
ContextStore (SQLite) ✅ Sim Schema simples, sem embeddings Alta
Notas/ideias/gratidão ✅ Sim (log_event) Sem UI de busca + sem conexões semânticas Alta
Lores (histórico de concluídas) ✅ Sim Sem visualização de linha do tempo Média
MCP server ✅ Sim Expõe contexto mas sem vector search Média
Hoje (glance diário + TAPs) ✅ Sim Gerado externamente, não integrado ao mural Média
/notas page (feed) ✅ Sim Feed linear, sem filtros, sem busca Alta
Chat com contexto no app ❌ Não Existe só via Telegram/MCP Crítica
Timeline de vida ❌ Não Nenhum componente temporal/cronológico Alta
Nexus/grafo semântico ❌ Não Links são manuais ou inexistentes Alta
Captura por voz ❌ Não Só texto hoje Alta
Busca semântica ❌ Não Sem embeddings no ContextStore Alta
Multi-canal além do Telegram ❌ Não WhatsApp, email como entrada Baixa
Notificações proativas ⚠️ Parcial Briefings diários existem, sem contexto de vida Média
Multi-usuário ❌ Não Single-tenant hoje Muito baixa

3. Fases do Roadmap


Fase 0 — Fundação Sólida (Pré-condição)

Objetivo: Garantir que a base técnica aguenta o que vem a seguir, sem dívida técnica acumulada que bloqueie as próximas fases.

Duração estimada: 1-2 semanas

Critério de sucesso: ContextStore tem suporte a embeddings, mural carrega em < 500ms, suite de testes cobre os módulos core.

Features a construir

F0.1 — Migração do ContextStore para suporte a embeddings - Descrição: Adicionar coluna embedding (BLOB) e tabela notes dedicada (separada de events) no SQLite. Instalar sqlite-vec ou usar faiss local para busca por similaridade. Sem isso, a Fase 2 (nexus semântico) não existe. - Arquivos: brisa/context/store.py, nova migration store_v2.py - Esforço: M - Dependências: Nenhuma - Risco técnico: sqlite-vec é relativamente novo; alternativa é tabela de embeddings em arquivo separado (.npy ou faiss.index). Não usar PostgreSQL — quebra o local-first.

F0.2 — Modelo de embedding local ou via API - Descrição: Escolher e integrar um modelo de embedding. Opção A: sentence-transformers rodando local (custo zero, 500MB RAM extra). Opção B: text-embedding-3-small da OpenAI (já tem client no bot). Recomendação: Opção B no curto prazo (já existe infra de API), planejar Opção A para versão "totalmente offline". - Arquivos: brisa/context/embeddings.py (novo), brisa/context/store.py - Esforço: P - Dependências: F0.1

F0.3 — Extrair CSS e estabilizar templates - Descrição: Implementar o plano de mural-v2 já documentado em mural-v2-plano.md (quick wins: CSS em arquivo separado com variáveis, <details> para colapso, timestamp no topo). Isso não é cosmético — é pré-condição para adicionar componentes de chat e timeline sem virar espaguete. - Arquivos: brisa/mural/templates/index.html, novo static/mural.css - Esforço: P - Dependências: Nenhuma

F0.4 — Testes de integração para server.py - Descrição: tests/test_mural_server.py existe mas cobertura dos endpoints de flow e notas é baixa. Adicionar testes para os endpoints críticos antes de modificar o servidor. - Arquivos: tests/test_mural_server.py - Esforço: P - Dependências: Nenhuma

Desafios técnicos: - sqlite-vec pode não ter binários prontos para ARM se o VPS usa essa arquitetura. Verificar antes de comprometer. - Migração do schema SQLite precisa ser feita sem perder dados de context.db existente.

Desafios de produto: - Fase 0 não entrega nada visível. É fácil pular e pagar o preço depois. Não pular.


Fase 1 — Chat com Contexto Real (MVP Diferenciador)

Objetivo: Ter um chat dentro do mural web onde a Brisa responde usando o contexto real armazenado — notas, tasks, flows, eventos — com busca semântica. Este é o diferenciador central: nenhum concorrente faz isso com dados locais.

Duração estimada: 2-3 semanas

Critério de sucesso: Usuário consegue perguntar "o que eu estava pensando sobre X?" e a Brisa encontra a nota relevante mesmo sem a palavra exata. Respostas incluem citações dos contextos usados.

Features a construir

F1.1 — Endpoint de chat no server.py - Descrição: Novo endpoint POST /api/chat que recebe mensagem do usuário, busca contexto relevante via embeddings (F0.1/F0.2), monta prompt com contexto injetado e chama a API do Claude. Retorna resposta + lista de fontes usadas (para citação). - Arquivos: brisa/mural/server.py, novo brisa/mural/chat.py, novo brisa/context/retriever.py - Esforço: M - Dependências: F0.1, F0.2

F1.2 — Componente de chat no mural - Descrição: Painel lateral ou tela dedicada /chat com interface de chat (input + histórico da sessão). JS vanilla, sem framework. Estilo consistente com o mural. Suporte a Markdown na resposta (já existe no bot, replicar lógica). - Arquivos: brisa/mural/templates/chat.html (novo), static/chat.js (novo), brisa/mural/server.py - Esforço: M - Dependências: F1.1, F0.3

F1.3 — Histórico de sessões de chat - Descrição: Persistir conversas de chat no ContextStore (tabela chat_sessions). Não precisa ser infinito — últimas 30 sessões. Permite o usuário voltar a uma conversa e permite que a Brisa referencie conversas anteriores. - Arquivos: brisa/context/store.py, brisa/mural/chat.py - Esforço: P - Dependências: F1.1

F1.4 — Indexação automática de novas notas - Descrição: Quando uma nota/evento é adicionado ao ContextStore (via bot Telegram ou via mural), gerar embedding automaticamente e armazenar. Sem indexação em tempo real, a busca semântica fica desatualizada. - Arquivos: brisa/context/store.py (hook em log_event), brisa/context/embeddings.py - Esforço: P - Dependências: F0.1, F0.2

F1.5 — Re-indexação do histórico existente - Descrição: Script one-shot para gerar embeddings de todos os eventos já existentes no context.db. Isso garante que o chat já funciona bem no dia 1 com dados históricos. - Arquivos: scripts/reindex_embeddings.py (novo) - Esforço: P - Dependências: F0.1, F0.2

Desafios técnicos: - Janela de contexto vs. relevância: Não dá para jogar tudo no prompt. O retriever precisa selecionar bem os N chunks mais relevantes. Começar com top-10 por similaridade + re-ranking por data recente. - Latência: Chamada de embedding + busca + chamada de LLM pode somar 3-5 segundos. Usar streaming SSE para o chat não parecer travado. - Custo de API: Se o usuário chatear muito, o custo de embeddings e de chamadas Claude sobe. Monitorar. Usar cache de embedding (nunca re-embedar o mesmo texto).

Desafios de produto: - O chat vai ser bom na medida em que as notas forem ricas. Se o ContextStore tem poucos dados, as respostas vão parecer genéricas. O usuário pode se decepcionar antes de ter dados suficientes para o sistema brilhar. Mitigação: mostrar claramente "baseado em X notas" nas respostas. - Risco de o usuário substituir o Telegram pelo chat do mural e o bot ficar ocioso. Isso não é necessariamente ruim, mas é uma mudança de comportamento a monitorar.


Fase 2 — Captura Multi-Canal e Frictionless

Objetivo: Remover as últimas barreiras de captura. Voz no Telegram, captura rápida no mural, processamento automático de "dumps" de texto.

Duração estimada: 2 semanas

Critério de sucesso: Usuário consegue mandar um áudio de 1 minuto no Telegram com 5 coisas misturadas (tarefa, ideia, reflexão, evento, compra) e a Brisa classifica tudo corretamente, sem intervenção manual.

Features a construir

F2.1 — Transcrição de áudio no bot Telegram - Descrição: Quando o usuário manda um áudio/voice note no Telegram, o bot chama Whisper API (OpenAI) para transcrever, depois passa o texto transcrito pelo pipeline de classificação existente (o mesmo que processa mensagens de texto). Retorna confirmação com o que foi capturado. - Arquivos: brisa/bot/handler.py, novo brisa/integrations/whisper.py - Esforço: P - Dependências: Nenhuma (Whisper API já tem client via openai)

F2.2 — Classificação automática de dumps - Descrição: Formalizar o pipeline já documentado no WORKFLOW.md (mensagem "bagunça" → tarefa/ideia/reflexão/evento). Criar função classify_and_dispatch(text) -> list[CapturedItem] testável e reutilizável, que pode ser chamada pelo bot E pelo chat do mural. - Arquivos: novo brisa/context/classifier.py, brisa/bot/handler.py - Esforço: M - Dependências: Nenhuma (o comportamento já existe, é formalização)

F2.3 — Quick capture no mural - Descrição: Input flutuante no mural (botão "+" ou atalho de teclado) que abre um modal simples para digitar uma nota rápida. Sem categorização manual — a IA classifica. Funciona offline (salva local, sincroniza quando há rede). Alternativa ao Telegram para quem está na tela do computador. - Arquivos: brisa/mural/templates/index.html, static/mural.js, brisa/mural/server.py (endpoint POST /api/capture) - Esforço: M - Dependências: F2.2

F2.4 — Feedback de captura no Telegram - Descrição: Após classificar uma mensagem, o bot responde com um resumo estruturado do que foi capturado e onde foi guardado. Hoje a resposta é genérica. Com F2.2, pode ser precisa: "Adicionei 2 tasks em Projetos, 1 ideia e salvei 1 reflexão." - Arquivos: brisa/bot/handler.py - Esforço: P - Dependências: F2.2

Desafios técnicos: - Whisper tem custo por minuto de áudio. Para uso pessoal é negligenciável (< $0.01/minuto), mas é uma dependência nova. - Alternativa gratuita: faster-whisper rodando local (modelo small = ~500MB, ~2x tempo real em CPU). Vale como plano B se o custo de API incomodar.

Desafios de produto: - Classificação errada é pior que nenhuma classificação. O usuário precisa de um mecanismo fácil de correção ("isso não era uma task, era uma ideia"). Implementar botão de correção inline no Telegram (inline keyboard com opções de re-classificação). - Voz pode capturar coisas que o usuário não queria registrar (contexto, ruído, fala pra outra pessoa). Avisar que áudios são transcritos antes de ativar a feature.


Fase 3 — Timeline de Vida

Objetivo: Dar ao usuário uma visualização cronológica de sua vida: eventos, decisões, conclusões, reflexões — tudo em uma linha do tempo navegável. Este é o componente de "retenção" que diferencia de um simples app de notas.

Duração estimada: 3-4 semanas

Critério de sucesso: Usuário consegue navegar mês a mês e ver o que aconteceu, o que decidiu, o que concluiu. Sente que o sistema "lembra" de sua vida.

Features a construir

F3.1 — Schema de eventos enriquecido - Descrição: A tabela events atual tem source, kind, payload, created_at. Para timeline, precisa de: event_date (data do evento, diferente da data de criação), title (resumo para exibição), importance (0-3, para filtrar o que aparece na timeline), tags (JSON array). Adicionar via migration sem quebrar dados existentes. - Arquivos: brisa/context/store.py, scripts/migrate_events_v2.py (novo) - Esforço: P - Dependências: F0.1

F3.2 — Endpoint de timeline - Descrição: GET /api/timeline?from=YYYY-MM&to=YYYY-MM retorna eventos do período, agrupados por semana. Inclui: notas, conclusões de tasks (do Lores), conclusões de flows, eventos do Google Calendar (se integrado), reflexões. - Arquivos: brisa/mural/server.py, novo brisa/mural/timeline.py - Esforço: M - Dependências: F3.1

F3.3 — Página /timeline no mural - Descrição: Visualização tipo "scroll vertical" com meses como âncoras. Cada evento tem ícone por tipo (task concluída, nota, reflexão, evento), data e título. Clique expande o detalhe. Navegação por mês via sidebar ou botões prev/next. JS vanilla, sem biblioteca de timeline. - Arquivos: brisa/mural/templates/timeline.html (novo), static/timeline.js (novo), brisa/mural/server.py - Esforço: G - Dependências: F3.2

F3.4 — Auto-categorização de importância - Descrição: Quando um evento é registrado, a IA avalia importância (0=ruído, 1=cotidiano, 2=relevante, 3=marco). A timeline por padrão mostra importância >= 2. Isso evita que a timeline fique poluída com microtasks. O usuário pode editar a importância manualmente. - Arquivos: brisa/context/classifier.py, brisa/context/store.py - Esforço: M - Dependências: F2.2, F3.1

F3.5 — "Este dia, um ano atrás" - Descrição: Widget no mural (ou mensagem proativa no Telegram) que mostra eventos marcantes de datas equivalentes em anos anteriores. Só faz sentido após 6-12 meses de dados, mas a lógica pode ser implementada antes. - Arquivos: brisa/mural/templates/index.html, brisa/mural/server.py - Esforço: P - Dependências: F3.2

Desafios técnicos: - Performance: timeline com muitos eventos precisa de paginação. Implementar paginação por mês desde o início (não carregar tudo de uma vez). - "Lores" (tarefas concluídas históricas) não têm data de conclusão armazenada estruturadamente hoje — só data no cabeçalho da seção do todo.md. Precisar parsear o todo.md retroativamente para extrair datas de conclusão.

Desafios de produto: - Uma timeline vazia é deprimante. Nos primeiros 2 meses, o usuário vai ter pouco dado. Mostrar uma "timeline de arranque" que inclui as tasks concluídas históricas do todo.md para que não pareça vazio desde o início. - Privacidade emocional: a timeline vai ter reflexões pessoais. Garantir que não há compartilhamento acidental e que o login está sempre ativo.


Fase 4 — Nexus Semântico (Grafo de Contexto)

Objetivo: Construir o componente mais diferenciador do produto: conexões entre contextos inferidas por IA, não links manuais. O usuário escreve sobre "ansiedade com mudança de casa" e o sistema conecta automaticamente com a nota sobre "organizar casa" e o flow "Mudança Julho".

Duração estimada: 4-5 semanas

Critério de sucesso: Ao abrir o nexus de qualquer nota, o usuário vê pelo menos 3 conexões relevantes que ele não teria feito manualmente. Taxa de "essa conexão faz sentido" > 70% nas primeiras interações.

Features a construir

F4.1 — Engine de conexões semânticas - Descrição: Job periódico (ou trigger em nova nota) que calcula similaridade de embedding entre itens do ContextStore. Armazena conexões acima de threshold (ex: cosine > 0.75) em tabela connections(source_id, target_id, score, created_at). Não mostrar todas as conexões — só as top-K mais fortes. - Arquivos: novo brisa/context/nexus.py, brisa/context/store.py - Esforço: M - Dependências: F0.1, F0.2, F1.4 (embeddings dos itens)

F4.2 — Conexões cross-type - Descrição: O nexus não deve conectar só nota-nota. Deve conectar: nota ↔ task, task ↔ flow, reflexão ↔ evento, etc. Implementar score ponderado que leva em conta tipo (uma conexão nota↔flow vale mais do que nota↔nota trivialmente parecida). - Arquivos: brisa/context/nexus.py - Esforço: M - Dependências: F4.1

F4.3 — Página /nexus e visualização de grafo - Descrição: Visualização de grafo interativo. Opção A: D3.js force-directed (poderoso, 80KB gzip). Opção B: biblioteca mais leve como vis-network. Recomendação: D3.js — é o padrão, bem documentado, sem dependência de serviço externo. Nós com ícone por tipo, arestas com espessura proporcional ao score de similaridade. Click num nó abre o detalhe. - Arquivos: brisa/mural/templates/nexus.html (novo), static/nexus.js (novo), brisa/mural/server.py - Esforço: G - Dependências: F4.1, F4.2

F4.4 — "Por que estão conectados?" - Descrição: Quando o usuário clica em uma conexão no grafo, a IA explica em 1-2 frases por que aqueles dois itens estão relacionados. Isso transforma uma abstração matemática (score de similaridade) em insight humano. - Arquivos: brisa/mural/server.py (endpoint /api/nexus/explain), static/nexus.js - Esforço: P - Dependências: F4.3, F1.1 (infra de chamada Claude)

F4.5 — Nexus por nó do mural - Descrição: Cada nó do mural (Saúde, Projetos, Casa, etc.) ganha um mini-nexus: ao abrir o painel inline, mostra as top-5 conexões com outros domínios. Ex: nó "Casa" conectado com "Planejamento de vida" via nota sobre mudança de julho. - Arquivos: brisa/mural/templates/index.html, brisa/mural/server.py - Esforço: M - Dependências: F4.1, F4.2

Desafios técnicos: - Grafo com muitos nós (> 500 itens) fica ilegível. Implementar filtros obrigatórios: por período, por tipo, por domínio. Nunca mostrar o grafo completo sem filtro. - Threshold de similaridade é crítico: muito baixo = grafo com lixo; muito alto = grafo vazio. Começar com 0.75, expor como configuração para ajuste. - Custo de CPU: calcular todos os pares de N itens é O(N²). Com 1000 notas, são 500K cálculos. Usar índice HNSW (via faiss ou sqlite-vec) para aproximação.

Desafios de produto: - Este é o "momento uau" — mas também o que mais pode decepcionar se as conexões forem ruins. Não lançar sem validação prévia: gerar 20-30 conexões manualmente e pedir ao usuário para avaliar antes de abrir a feature. - O grafo pode virar um brinquedo bonito que ninguém usa de verdade. A ancoragem deve ser nos casos de uso reais: "encontrar uma nota que sei que escrevi mas não lembro onde", "ver o que está conectado com esse projeto", não "explorar o grafo por explorar".


4. Decisões Arquiteturais Críticas

4.1 — Embedding local vs. API (decisão urgente)

Trade-off: text-embedding-3-small (OpenAI) é conveniente (já tem client), mas cria dependência de API para uma feature core. sentence-transformers local é zero-custo e offline, mas exige 500MB+ de RAM e download de modelo.

Recomendação: Iniciar com API OpenAI para velocidade de desenvolvimento. Abstrair o provider em brisa/context/embeddings.py com interface embed(text) -> list[float]. Quando o produto estiver estável, trocar para local sem mudar o restante do código.

Impacto de errar: Se não abstrair agora, trocar depois exige mudança em 10+ lugares. Abstrair é 2 horas de trabalho que economiza dias.

4.2 — SQLite vs. outro banco para escala

Trade-off: SQLite é perfeito para single-user local-first. Mas com embeddings (vetores de 1536 dimensões), a busca por similaridade em SQLite puro é O(N) — varrimento completo. Com 10K notas, isso é lento.

Recomendação: Usar sqlite-vec extension para busca vetorial ANN. Se não funcionar no ambiente do VPS, usar arquivo faiss.index separado ao lado do context.db. Não migrar para PostgreSQL ou outro banco — quebra o princípio local-first e adiciona complexidade operacional que não faz sentido para single-user.

Impacto de errar: Busca lenta no chat = produto que parece ruim. Indexar desde o início.

4.3 — Onde fica o chat: mural web vs. Telegram vs. ambos

Trade-off: O bot Telegram já tem chat com contexto (via MCP + ferramentas). Construir chat no mural web é duplicar esforço? Não — são canais diferentes. Telegram = captura rápida, mobile, assíncrono. Mural = sessão longa, desktop, referência.

Recomendação: Ambos, mas o backend de retrieval é compartilhado (brisa/context/retriever.py). O bot chama via Python direto. O mural chama via endpoint HTTP. Sem duplicar lógica de busca.

Impacto de errar: Se tentar eliminar o Telegram em favor do mural, perde o canal de captura mais natural. Se ignorar o chat no mural, perde o caso de uso de sessão longa/reflexão.

4.4 — Todo.md como fonte de verdade vs. banco de dados

Trade-off: O todo.md é um arquivo texto editável manualmente, compartilhado entre Claude e Brisa, com formato regex-based. É frágil para features avançadas (subtasks complexas, metadados ricos, histórico de edições). Mas é o que existe, funciona, e o usuário edita diretamente.

Recomendação: Não migrar. O todo.md continua sendo a fonte de verdade para tasks. O que precisa de metadados ricos (ex: data de conclusão para timeline) deve ser capturado como evento no ContextStore no momento da conclusão, não como campo novo no todo.md. Isso preserva o formato sem adicionar fragilidade.

Impacto de errar: Quebrar o parser do todo.md invalida o mural inteiro. Tocar no formato do arquivo só com PRs revisados e suite de testes verde.

4.5 — Autenticação: token único vs. sistema de usuários

Hoje: Login por token único em cookie de sessão (90 dias). Simples, funciona para single-user.

Impacto futuro: Se o produto crescer para multi-usuário (Fase 5+), vai ser necessário reescrever auth do zero. A boa notícia é que a abstração is_authed() em server.py já isola a lógica — trocar a implementação não muda as rotas.

Recomendação: Não investir em auth sofisticado agora. Documentar o ponto de extensão. Só atacar quando houver um segundo usuário real.


5. Próximos 3 Passos Imediatos (próximas 48h)

Passo 1 — Validar viabilidade do sqlite-vec no VPS (2h)

# Verificar arquitetura e testar instalação
uname -m  # se x86_64, sqlite-vec tem binários prontos
pip install sqlite-vec
python -c "import sqlite_vec; print('ok')"
Se falhar, testar faiss-cpu como alternativa. Esta decisão desbloqueia toda a Fase 0 e é o maior risco técnico não validado.

Passo 2 — Implementar F0.1 (migração do schema) e F0.2 (embeddings) (4-6h)

Criar brisa/context/embeddings.py com provider abstracto e implementação via OpenAI. Adicionar tabela notes e coluna embedding no ContextStore. Escrever teste unitário que insere uma nota, gera embedding e recupera por similaridade. Se isso funcionar, a Fase 1 está desbloqueada.

Passo 3 — Criar /api/chat e testar via curl (2-3h)

Com F0.1 e F0.2 prontos, implementar o endpoint de chat mínimo: recebe texto, busca top-3 notas por similaridade, monta prompt, chama Claude API, retorna resposta JSON. Sem UI ainda — só o endpoint. Testar com curl usando perguntas sobre notas reais do ContextStore. Se a qualidade das respostas for boa, a Fase 1 tem MVP técnico validado.

Por que essa ordem: Valida o risco técnico mais alto (embeddings locais) antes de investir semanas de trabalho. Se falhar, o plano se ajusta antes de comprometer esforço de UI.


6. Métricas de Sucesso

O produto é para uso pessoal intensivo — as métricas tradicionais de produto (DAU, MAU, churn) não se aplicam. As métricas relevantes são de qualidade de uso e redução de fricção.

Métricas de captura

  • Notas por semana — baseline atual vs. após Fase 2. Meta: crescimento de 2x após captura por voz.
  • Tempo entre pensar e registrar — proxy: quantas notas são capturadas em contexto mobile (Telegram) vs. desktop (mural). Proxy de fricção.

Métricas de recuperação

  • Taxa de "encontrei o que procurava" — implementar botão de feedback (👍/👎) no chat do mural. Meta: > 80% de respostas úteis.
  • Buscas sem resultado — quantas vezes o chat retorna "não encontrei contexto relevante". Meta: < 20% das consultas.

Métricas de engajamento com memória

  • Abertura da timeline por semana — se o usuário nunca abre, a feature não está entregando valor.
  • Conexões no nexus exploradas por sessão — se fica em 0, o nexus é decorativo. Meta: > 3 por sessão nas primeiras 4 semanas pós-lançamento da fase.

Métricas de saúde técnica

  • Latência do chat — P95 < 3 segundos (incluindo embedding + busca + LLM).
  • Uptime do mural — meta: 99.5% (o usuário precisa poder confiar que está disponível).
  • Tamanho do context.db — monitorar crescimento mensal. Com embeddings, pode crescer rápido.

A métrica qualitativa que mais importa

Uma vez por mês: o usuário consegue responder "o que eu estava pensando sobre X há 3 meses?" com o BrisaVerse em menos de 30 segundos? Se sim, o produto está funcionando como segunda mente.


Apêndice — Riscos e Mitigações

Risco Probabilidade Impacto Mitigação
sqlite-vec não funciona no VPS Média Alto Usar faiss-cpu como fallback; validar no Passo 1
Qualidade de busca semântica decepcionante Média Alto Testar com 20+ queries antes de lançar; ajustar threshold
Custo de API (embeddings + Claude) sobe Baixa Médio Cache de embeddings; monitorar custo semanal desde Fase 1
Classificação automática errada demais Média Médio Implementar mecanismo de correção antes de lançar Fase 2
Mural fica lento com novos componentes Baixa Alto Benchmark de carga antes de cada fase; lazy loading de grafo
TODO.md parser quebra com mudanças Baixa Crítico Suite de testes; nunca mudar formato sem PR revisado
Escopo creep (querer fazer tudo de uma vez) Alta Alto Cada fase tem critério de sucesso claro; só avançar quando aprovado
Dados pessoais sensíveis no nexus Baixa Alto Garantir que acesso ao mural exige auth; nunca logar conteúdo de notas