Changelog
[v0.3.1] — 2026-06-21 🔧
Fixes pós-v0.3.0 — scroll-snap na aba Eventos e cards horizontais estabilizados.
Modificado
- Cards horizontais com scroll-snap — aba Rotinas e aba Eventos trocam por swipe; cada card trava ao soltar (scroll-snap-type + scroll-snap-align)
- Altura fixa por card —
100vh - header - navcom scroll vertical interno; elimina cards expandindo e quebrando o layout horizontal - Copa do Mundo na aba Eventos — card Copa movido para a aba ⚽ Eventos (antes aparecia em Rotinas)
[v0.3.0] — 2026-06-21 🚀
v0.3 completa — 8 sessões implementadas: briefings personalizados, 3 novas rotinas, Copa do Mundo, bot Telegram com tool_use, arquivamento e CI/CD.
Adicionado
- S1 — Briefings Personalizados (
mindflow/routines/briefing.py): detect_dominant_context()— analisa kinds e tópicos dos últimos 15 eventos e adapta o briefing automaticamente- Modo Por Intenção —
POST /api/routine/briefingaceita{"intent": "..."}para direcionar o foco -
Schema Metadados v1 —
/api/eventsalva payload normalizado comtype,routine_id,source,importance,tags,version -
S2 — Ajudar com brisa (
mindflow/routines/brisa.py): brisa_routine()— refina ideia vaga com DeepSeek tool_use-
Salva com
routine_id="brisa",importance=2 -
S3 — Bota o papo em dia (
mindflow/routines/papo.py): papo_routine()— absorve atualização do usuário, confirma e sugere próximos passos-
Salva o update como nota antes de processar
-
S4 — O Doutor (
mindflow/routines/doutor.py): doutor_routine()— analisa contexto dominante + diagnóstico viadetect_dominant_context()-
Salva com
importance=3(épico) -
S5 — Copa do Mundo (
mindflow/events/copa.py): - ESPN API pública com cache de 30 min
GET /api/events/copa— resultados recentes + próximos jogos-
Aba ⚽ Eventos no frontend com badge AO VIVO em vermelho e resultado em amarelo
-
S6 — Bot Telegram com tool_use (
mindflow/bot/handler.py): - Bot usa tool_use do DeepSeek com 3 ferramentas:
get_context,set_context,create_note - Loop de tool calls: processa resultados e gera resposta final
-
Schema v1 aplicado às capturas do bot (
source="telegram") -
S7 — Arquivamento + Guardrail soft:
ContextStore.archive_event(id)— adiciona flagarchived=Trueno payloadContextStore.recent_events_active()— exclui arquivados dos resultadosGET /api/context/setup-status— verifica setup inicial-
Banner amarelo dismissível (localStorage) ao abrir app sem setup — não bloqueia
-
S8 — CI/CD GitHub Actions (
.github/workflows/ci.yml): pytestem cada push/PR paramindflow/main- 85/85 testes verdes na entrega
Modificado
- Frontend — 3 cards clicáveis para as novas rotinas (S2-S4) com modal de intent para entrada de texto
- Nav — expandida para 3 abas (⚡ Rotinas | ⚽ Eventos | ⏱ Histórico)
GET /api/context/reindex— corrigido endpoint duplicado noserver.py
[v0.2.2] — 2026-06-21 🎨
Novo design Neo-brutalism Light Mode — gerado com Gemini, implementado pelo Tech Lead.
Modificado
- Design system completo — dark mode substituído por Light Mode Neo-brutalism:
- Fundo areia (#f4f4eb) com padrão de bolinhas
- Bordas grossas 3px pretas em todos os elementos
- Sombras duras deslocadas (5px offset), hover com sombra menor
- Cards com personalidade própria: Briefing (sombra roxa), Nota (sombra laranja)
- Mascote SVG animado (flutuando) no card de Escrever nota
- Grid 2x2 para cards "em breve" com badges rotacionados (+4°)
- Nav flutuante estilo pill com sombra dura
-
Histórico de briefings: expand/collapse com fundo amarelo no item ativo
-
Briefing history — novo padrão visual com time-tag + preview colapsável
- Fontes — JetBrains Mono 800 para labels, Space Grotesk 800 para títulos
Não modificado
- Toda a lógica JS e endpoints backend — funcionalidade 100% intacta
[v0.2.1] — 2026-06-20 🛡️
Bug hunt pós-v0.2.0 — XSS crítico, race condition, CSS e limites ausentes corrigidos.
Corrigido
- XSS via
innerHTML—escHtml()adicionado no JS +html.escape()no Python para todo conteúdo injetado no DOM action_id "go_notas"em loop — renomeado para"open_note_capture"com navegação direta, sem reentrada- Race condition feedback/form — timing ajustado de 1500ms vs 1000ms para 800ms vs 1000ms, evitando sobreposição de animações
type-btnstate ao reabrir form — estado dos botões de tipo resetado viaCustomEvent 'nota-kind-reset'nota-recentsem limite — lista de notas recentes limitada a máximo 5 itensDEEPSEEK_API_KEYausente silencioso — agora emitewarningexplícito se a chave não está definida- CSS
--void-2(typo) — corrigido para--void2em todos os seletores
[v0.2 — S2-S4] — 2026-06-20
Adicionado
- Quick Action Cards — Rotinas (aba ⚡ Rotinas como foco principal):
- Briefing: resume notas recentes via DeepSeek tool_use, salva histórico expansível
- Escrever nota: formulário inline que mostra nota capturada imediatamente
- Ajudar com brisa / Configurar setup: cards documentados como "em breve"
- Histórico de Briefings: expansível por data, carrega no DOMContentLoaded
- Descrições nos cards: cada rotina tem título + explicação do que faz
- /api/routine/{id}: endpoint POST que executa rotina com tool_use e retorna HTML
- /api/routine/history/{id}: endpoint GET que retorna histórico de execuções
Modificado
- Chat: desabilitado como aba (mantido como template comentado para uso futuro)
- Notas: integrada dentro da aba Rotinas como card "Escrever nota"
- Nav: reduzida para 2 abas (⚡ Rotinas | ⏱ Histórico)
- Rotinas como aba padrão (abre primeiro)
- Briefing sem ações inventadas: removido actions[] do schema (LLM retorna só texto)
- MINDFLOW_DB=/data/brisa.db: corrigido bug onde servidor escrevia em arquivo errado
Corrigido
- Histórico não carregava no load inicial (DOMContentLoaded fix)
- Nota capturada sumia sem confirmação visual
- Briefing retornava botões genéricos gerados pelo LLM (removidos)
- DB path errado (mindflow.db → brisa.db)
[v0.2 — S1] — 2026-06-20
Corrigido
- BUG-SESSION-001 — Token agora persistido no localStorage do browser.
Ao visitar com
?token=X, o token é salvo e enviado comoX-Mindflow-Tokenheader em todas as requisições. Sessão não depende mais de cookie — recarregar a página não pede login. Backend aceita headerX-Mindflow-Tokencomo alternativa ao cookie de sessão.
Bugs conhecidos (mindflow v0.1.0)
BUG-SESSION-001 — Sessão perdida ao atualizar página / trocar aba
Sintoma: Usuário é redirecionado para /login ao atualizar a página ou voltar de outra aba.
Root cause: SessionMiddleware usa cookie de sessão que pode ser descartado por: - iOS/Android agressivo com memória de abas em background - Traefik não propagando Set-Cookie corretamente em alguns casos - Cookie expirando antes do max_age de 90 dias
Fix planejado (v0.2.0): - Armazenar token em localStorage no frontend - Enviar token como header X-Mindflow-Token em cada requisição API - Eliminar dependência de cookie de sessão - Verificar token no middleware sem precisar de sessão server-side
Workaround atual: Acessar via URL com token:
https://mural.srv1723096.hstgr.cloud/?token=SEU_TOKEN
— BrisaVerse / mind-flow
Cada entrada marca o que mudou, quando e por quê. Mais recente no topo.
[v0.1.0-dev] — 2026-06-20 🌱
Novo ambiente limpo — mindflow v0.1.0 em construção.
Adicionado
- mindflow/ — novo projeto em
/workspace/mindflow/(Python, FastAPI, TDD) - Sessão 1 — context layer migrado: embeddings, VectorStore, ContextStore, reindex, auto_index, timeline (47 testes)
- Sessão 2 — API layer: 5 endpoints (chat, event, timeline, reindex), auth token+cookie (61 testes)
- Sessão 3 — Frontend mínimo: Chat + Notas + Histórico, 220 linhas total (HTML+CSS+JS)
- Container mindflow rodando na porta 8090 com Gemini embeddings reais
Decisão de produto
Brisa-core (v0.0.2) foi arquivado na branch backup/v0.0.x-full-mural. O desenvolvimento
principal continua no mindflow v0.1.0 com base limpa e TDD desde o início.
O backend legado (VectorStore, embeddings, timeline) foi migrado e simplificado.
O frontend complexo (nexus, mapa, flows) foi descartado em favor do mínimo funcional.
[Sessão 5] — 2026-06-20
Bug fixes
- BUG-003:
render()agora passatodo_pathem todos os 16 endpoints de flow (antes 9 chamadas omitiam o argumento) - BUG-004: IDs de stage gerados com UUID hex (
{flow_id}-{uuid4().hex[:8]}), eliminando colisão quandoflow_idjá contém-s - BUG-006:
vstore._connencapsulado — adicionadosget_indexed_fingerprints()eget_indexed_todo_texts()aoVectorStore;reindex.pymigrado para usar os métodos públicos - _TODO_PATH: Hardcoded em
bot/handler.py(/workspace/todo.md) — documentado como tech debt;BrisaConfignão tem campotodo_path, migração seria invasiva (config.yml + propagação), adiada
Verificação E2E
- Todos os 159 testes verdes após os fixes
- Embedding Gemini: dependência
google-genaiausente no container (issue de infra, não de código)
[v0.0.2] — 2026-06-20 🔧
Patch de qualidade — bug hunt das Sessões 4 e 5.
Corrigido
- BUG-001 — Teste
test_resposta_html_tem_estrutura_bubbleusava classe CSS antiga (chat-bubble) — corrigido parabrisa-says - BUG-002 — Crash de JS no erro de rede:
querySelector('.chat-msg')retornava null → fallback com.bubble - BUG-003 — 16 chamadas
render()em endpoints de flow semtodo_path→ passamtodo_pathagora - BUG-004 — Colisão de ID em
/api/flow/{id}/stage/add→ IDs comuuid4().hex[:8] - BUG-005 — XSS via
innerHTMLno bubble do usuário → substituído portextContent - BUG-006 — Acesso direto a
vstore._connemreindex.py→ encapsulado emget_indexed_fingerprints()eget_indexed_todo_texts() - Chat alucinando — VectorStore com mock embeddings retornava contexto aleatório → todo.md sempre injetado no system prompt com dados reais
Adicionado
- Gemini Embeddings reais —
BRISA_EMBEDDING_MODEL=gemini/gemini-embedding-001usandoGEMINI_API_KEYjá disponível no.env. Busca semântica com 3072 dims reais em vez de hash aleatório. - VectorStore.get_indexed_fingerprints() e get_indexed_todo_texts() — métodos públicos para dedup (encapsulamento)
- handle_voice() no bot Telegram — feedback "Brisa está ouvindo 🎙️⏳" ao receber áudio
- Chat visual
.brisa-says— respostas da Brisa usam orb roxo + bubble, mensagens do usuário alinhadas à direita - google-genai>=1.0 no pyproject.toml — Gemini embeddings persistem no rebuild
Tech Debt Documentado
_TODO_PATHhardcoded embot/handler.py— migração paraBrisaConfig.todo_pathadiada para v0.2.0
2026-06-20 (limpeza pós v0.0.2)
Corrigido
- CLEAN-002 — _TODO_PATH centralizado em
BrisaConfig.todo_path(antes hardcoded em 4 módulos: cmd_runner.py, bot/handler.py, server/mcp.py) - SYSTEM_PROMPT do bot — categorias atualizadas para a nova estrutura (Vida Pessoal, Stronda Cup, BrisaVerse, Infra, Casa, Saúde, Horizonte)
- Import duplicado em handler.py (BrisaConfig importado duas vezes após sed) — removido
Sem mudança (CLEAN-001)
- Comando gcal já não estava no help do Terminal — sem ação necessária
[v0.0.1] — 2026-06-20 🎉
Primeira versão funcional do mind-flow — Guardião de Contexto Pessoal.
O que está no ar
- Nexus — mapa dinâmico com 8 nós (categorias de vida), painel inline por nó com flows + tasks
- Chat da Brisa — perguntas em texto respondidas com contexto real do todo.md e histórico
- Timeline de vida — visualização cronológica de eventos + done tasks com filtros
- VectorStore — 135 itens indexados, busca semântica pronta para embeddings reais
- Bot Telegram — captura tasks/notas, feedback de voz ("Brisa está ouvindo")
- Documentação online — MkDocs em https://docs.srv1723096.hstgr.cloud
- 7 categorias por projeto: Vida Pessoal, Stronda Cup, BrisaVerse, Infra, Casa, Saúde, Horizonte
- 159/159 testes verdes
O que vem a seguir (v0.1.0)
- Streaming SSE no chat (respostas token por token)
- Captura de voz via Whisper
- Embeddings reais (OpenAI/Ollama) para busca semântica precisa
- CI/CD GitHub Actions
- Onboarding docker run < 5 min
2026-06-20 (sessão tarde)
Modificado
- Chat da Brisa (Nexus) — respostas usam o componente visual
.brisa-says(orb roxo + bubble dark, igual ao "Brisa diz" do mural). Mensagens do usuário alinhadas à direita com bubble roxo sutil. Loading usa o mesmo componente. - Documentação — sumários adicionados ao Plano Técnico e Plano UX; metadados na Pesquisa de Mercado; nav reordenada (Vocabulário → Frentes → BrisaVerse → Changelog); home reescrita com dois caminhos de leitura.
- Frentes + Vocabulário — criados em /docs/frentes.md e /docs/vocabulario.md com as 7 frentes temáticas (Superfície, Corrente, Frequência, Pulso, Espectro, Lores, Horizonte) e o vocab BrisaVerse.
- Cores docs — tema MkDocs atualizado para Copa 2026 (vermelho + âmbar).
Corrigido
- Chat da Brisa alucinando — raiz: VectorStore com mock embeddings retornava contexto aleatório, LLM inventava detalhes. Fix: todo.md sempre injetado no system prompt (atrasadas, vence hoje, resumo por categoria). VectorStore usado apenas como contexto adicional.
Adicionado
- Feedback de voz no Telegram —
handle_voice(): ao receber áudio, Brisa responde imediatamente com "Brisa está ouvindo... 🎙️⏳" antes de processar. Placeholder pronto para integração Whisper. - Changelog em /docs/CHANGELOG.md — sempre atualizado antes do commit.
- Review da doc em /docs/doc-review.md — análise do Technical Writer com plano de melhorias.
2026-06-20
Removido
- Crônicas Seladas (código legado) — seção duplicada na aba Lores que mostrava done tasks no formato antigo. Substituída pela Timeline de vida.
Adicionado
- Timeline de vida (
brisa/timeline/builder.py,/api/timeline) — visualização cronológica unificada de eventos do ContextStore + done tasks do todo.md. Filtros de importância (Tudo / Marcantes / Épicos) e tipo (Selados / Brisas / Ideias / Gratidão). Acessível na aba 📖 Lores. - Chat contextual (
/api/chat) — busca contexto no VectorStore e responde via DeepSeek. Componente de chat no Nexus (JS vanilla, fetch POST). Cold start com mock embeddings. - VectorStore (
brisa/context/vector_store.py) — banco vetorial com sqlite-vec + cosine similarity fallback. 135 itens indexados no startup (tasks + eventos do ContextStore). - EmbeddingProvider (
brisa/context/embeddings.py) — abstração com Mock (testes), LiteLLM (produção). Troca de modelo viaBRISA_EMBEDDING_MODELenv var. - Re-indexação (
brisa/context/reindex.py) —reindex_context_store()ereindex_todo()idempotentes. Endpoint/api/context/reindexon-demand. - Auto-indexação (
brisa/context/auto_index.py) —AutoIndexContextStore: qualquerlog_event()indexa automaticamente no VectorStore (degradação silenciosa). - Documentação online — MkDocs Material em
https://docs.srv1723096.hstgr.cloudcom pesquisa de mercado, roadmap, plano técnico e plano UX.
Modificado
- Aba Lores — virou Timeline de vida (antes: lista de Crônicas Seladas)
- mural_serve.py — inicializa VectorStore no startup + montado via bind mount (hot-reload)
- docker-compose.yml —
BRISA_EMBEDDING_MODEL=mock,mural_serve.pymontado:ro - CSS — extraído de
index.htmlparastyle.cssexterno (34KB → arquivo separado) - pyproject.toml — adicionado
litellm>=1.40
Corrigidos
import json/hashlibmovidos pro topo doreindex.py(estavam dentro de funções)- Flag
_use_vecsem efeito removida dovector_store.py restore_sched_css.pyeindex.html.bak2deletados (lixo no repo)
2026-06-19
Adicionado
- Mapa dinâmico Nexus — 8 nós gerados das categorias do todo.md (layout circular). Toca no nó → painel inline com flows + tasks do domínio.
- 7 categorias por projeto —
Vida Pessoal,Stronda Cup,BrisaVerse,Infra,Casa,Saúde,Horizonte(substituiu a genérica "Projetos Técnicos") - Flow brisaverse.json — roadmap das 4 fases como flow navegável no mapa
- Editor de itens — ✏️ em cada etapa do painel abre sheet com título, data, prioridade e nota
- Ações por estado — Selar / Bolsão / Ativar / Retomar com swipe gestual (→ selar, ← bolsão)
- Modal "Nova Brisa" — ponto único de captura (Brisei / Ideia / Tarefa / Novo mundo)
- Oráculo — movido para logo após o mapa no Nexus (voz da Brisa, dinâmica)
Modificado
- Aba Hoje — virou glance rápido (TAPs + urgentes + Copa). Sem lista completa de tarefas.
- Aba Nexus — gestão central com mapa + painel inline. Seções colapsáveis.
- Hot-reload — bind mount
/workspace/brisa-core/brisa:/app/brisa:ro(sem rebuild) - todo.md — reorganizado: categorias limpas, tags padronizadas, flows obsoletos arquivados
Corrigidos
- Bug "nenhuma etapa ativa" em flows com datas futuras (
store.pyfallback) taEdit()substituído por modal de edição (antes usavawindow.prompt())filterTasks()apontava para view inexistente (JS morto removido)/api/category/addganhou guard de duplicata- Docker mount sem
:ro(segurança) if tasks_clean or True:sempre-verdadeiro no generator- 9 bugs identificados no code review e corrigidos
Como ler
- Adicionado — nova feature ou arquivo
- Modificado — mudança em algo existente
- Corrigido — bug fix
- Removido — código deletado