No ar · coleta até 01/11
dados de 30/10/2026, 21:02
PROJETO · HISTÓRICO DE VERSÕES
Versões
Todas as mudanças importantes do projeto, em ordem reversa cronológica. Formato segue Keep a Changelog; versões em SemVer.
Histórico de versões
Registro cronológico de tudo que mudou no painel — dados, metodologia e interface —, da versão mais recente para a mais antiga.
Página 13 de 14 · 167 versões no total.
-
v3.2.0 2026-04-18 Tema Light Editorial Creme + picker nativo Added
- Tema Light Editorial Creme como segunda paleta oficial. Fundo papel
#f5efe2/#ebe2cf, tinta navy#1a2332, accent gold#b8874a, borda creme#d4c7a8. Contraste calibrado para texto corrido (~9:1) e texto sutil (~6:1) sobre o papel. - Picker nativo do Streamlit integrado (menu ⋮ → Settings → Choose app theme) — três opções:
Dark,LighteUse system setting. Sem toggle custom. - Dict
COLORScomputado em runtime (_COLORS_DARK/_COLORS_LIGHT) para Plotly, que não interpreta CSS variables. Cores positive/negative ajustadas para manter contraste em ambos os temas (verde#27ae60/#1d8047, vermelho#e74c3c/#b4382c). - Variantes
[theme.light]e[theme.dark]no.streamlit/config.toml— Streamlit 1.35+ mostra as duas opções no picker.
Changed
plotly_layout()helper passou a consumirCOLORS['text'],COLORS['grid'],COLORS['hover_*']em vez de#ffffffhardcoded.- Radar (spider chart + scatter de quadrante) migrado para consumir
COLORS— antes bypassava o helperplotly_layout()e ficava ilegível no light. - Cards "Candidato destaque" e "Sentimento da semana" da página Início trocaram
background:#141d27hardcoded porvar(--bg2). - Eyebrow da sidebar (
Sobre artes e técnicas) consomevar(--accent-gold)em vez de hex fixo. - Links no cream:
var(--color-yellow)remapeado para o gold editorial#b8874a(amarelo vivo#eeee22era ilegível sobre papel). - Metodologia: referências "Claude Haiku 4.5" substituídas por "Gemma4 31B-cloud (Ollama Pro)" onde aplicável. Frequência de coleta atualizada (3×/dia).
- Página Perguntar migrada para Gemma4 — era a única parte do dashboard que ainda dependia do
claude_cli.py(precisavaclaude loginperiódico, credencial expirava silenciosamente). Agora usaollama_client.call_model()como o restante do pipeline. Mesma assinatura, zero mudança de comportamento para o usuário final.claude_cli.pypassa a LEGACY.
Not changed (por decisão editorial)
- PyVis (grafo force-directed de candidatos na página Comparativo) permanece em paleta dark mesmo no Light — fica como cards escuros sobre papel creme, look editorial aceitável.
- Cores de candidatos (Lula vermelho, Flávio azul, etc.) — semânticas partidárias, idênticas nos dois temas.
- Tema Light Editorial Creme como segunda paleta oficial. Fundo papel
-
v3.1.0 2026-04-18 Design system, iconografia Lucide, coleta 3×/dia e qualidade de dados Added
- Design system compartilhado —
src/static/design-system.cssconsome tokens desapienslabs-design-system(paleta, tipografia, dividers, gradients, utilitários). Hex hardcoded nodashboard.pycaiu ~43% (193 → 110 ocorrências). - Iconografia Lucide — Novo módulo
src/icons.pycom 24 ícones SVG inline. Helperslucide()elucide_data_uri()para uso inline e viamask-image. Aplicado em menu lateral, status badges, KPI cards, hero labels, guia de navegação, badges de tópicos emergentes e botão CSV. - Taxonomia editorial de 5 níveis — Coluna
editorial_lean_detailemarticles(extrema-esquerda / esquerda / centro / direita / extrema-direita).CLASSIFICACAO.mddocumenta critérios.scripts/refresh_editorial_lean_detail.pyfaz backfill incremental após cada coleta. - Verificador anti-falso-positivo (
src/produtores/verificador.py) e classificador de gênero jornalístico (src/produtores/genero.py) rodam via Gemma4 após cada coleta. - Página Início — janela da semana explícita — KPI "Artigos esta semana" mostra o intervalo concreto (ex:
13/04 (seg) – 18/04) com caption explicando que "esta semana" = segunda a hoje (resumo semanal do blog usa recorte sexta-a-sexta).
Changed
- Coleta 3×/dia —
eleicoes-coleta.timeragora roda 07:00, 13:00 e 20:00 BRT (antes 09:00 e 21:00). Consumo Tavily projetado em ~6.300 req/mês. - Produtores em Gemma4 31B-cloud — Após teste de migração para Sonnet 4.6 no mesmo dia, revertido por custo (~R$ 470/mês). Benchmark com 6 modelos cloud do Ollama Pro confirmou Gemma4 como melhor trade-off qualidade/formato/custo.
- Página Metodologia — referências a Claude Haiku atualizadas para Gemma4 31B-cloud; frequência de coleta atualizada.
Fixed
run_coleta.sh— contadores em alerta Telegram —grep -c ... || echo '0'gerava stdout multilinha que quebrava[ "$LOCKS" -gt 0 ]. Novo helpercount_lines()sanitiza, aplicado a FPS/ERROS/LOCKS.- DB locked em Tavily —
coletores/tavily.pymigrado para padrão short-lived (uma conexão por candidato). Mantinha uma conexão aberta por ~30 min, suscetível a lock sob concorrência. - Escopo de conexões padronizado —
candidate_utils.pyagora usaget_db_connection()(timeout=30 + busy_timeout=30000 + WAL) em vez desqlite3.connect()cru.
Data quality
- Backfill de
editorial_leanem 58 fontes (unknown caiu de 25,7% para 17,1% — redução de 32%).source_lean_map.pyexpandido de ~50 para 159 entradas. - Limpeza histórica de 305 falsos positivos via
verificador.py --horas 450.
- Design system compartilhado —
-
v3.0.1 2026-04-15 Tópicos Emergentes: ordenação e desempate Fixed
- 🗓️ Exemplos de artigos mais recentes —
Tópicos Emergentesagora ordena os 3 artigos de exemplo porpub_datedecrescente antes do.head(3). Antes o widget mostrava os primeiros na ordem natural do DataFrame (poridcrescente, aproximadamente os mais antigos da semana), fazendo parecer que não havia material do dia corrente mesmo quando já havia. - ⚖️ Desempate determinístico no score —
emerging_topics.sortagora usa(score, cnt_now)como chave. Em empate de score (comum quando vários tópicos aparecem pela primeira vez com cnt_now idêntico), o tópico com maior volume ganha, em vez da ordem implícita dovalue_counts()do pandas.
- 🗓️ Exemplos de artigos mais recentes —
-
v3.0.0 2026-04-13 Dark theme + design system Changed
- 🌙 Tema escuro completo — Migração de tema claro para escuro. Fundo navy
#1a2332, sidebar#141d27, bordas#1e2a38. Motivação: conforto visual / sensibilidade à luminosidade. - 🎨 Paleta de cores hierárquica — 12 cores com papéis definidos: branco puro para títulos, azul para KPIs, âmbar para explicações, amarelo para links.
- 📐 Escala tipográfica padronizada — De 27 tamanhos arbitrários para 8 níveis consistentes (hero → small).
- 🔤 Inter substitui Roboto Condensed — Labels e captions agora usam Inter, alinhando tipografia com o blog SapiensLabs.
- 📊 Gráficos Plotly adaptados —
plotly_layout()aplica cores claras em fontes, backgrounds transparentes, grid e zeroline sutis.
Added
- ✨ Helper
kpi_card()— Card KPI padronizado com border-left accent colorido. Substitui todos osst.metric()nativos. - 🏗️ Layout "Esta Semana" redesenhado — De 1/3+2/3 vertical para
[1,1,3]horizontal + sentimento por candidato em grid 3 colunas.
Removed
- 🚫 HRs pesados eliminados — 61
st.markdown('---')substituídos por divisórias sutis. - 🚫
st.metric()nativo removido — Substituídos porkpi_card()com cores accent por semântica.
- 🌙 Tema escuro completo — Migração de tema claro para escuro. Fundo navy
-
v2.6.4 2026-04-13 Filtros de qualidade no coletor Brave Fixed
- 🚫 Filtro de data no Brave —
save_articles()agora descarta artigos compublished_atanterior aMIN_PUBLISHED_DATE(2026-03-25), alinhando-se ao comportamento já existente no Tavily. Corrigido falso positivo: artigo de outubro/2025 da RTP sobre Michelle Bolsonaro havia sido importado. - 🎯 Validação de padrão do candidato — Antes de salvar, verifica se o texto do artigo casa com pelo menos um
CANDIDATE_PATTERNdo candidato primário. Evita que a API retorne resultados irrelevantes (ex.: Hertz a empresa, notícias da Colômbia) que eram aceitos por padrão. Log[SKIP] Falso positivopara rastreabilidade.
Removed
- 🗑️ 3 artigos falsos positivos removidos do banco — IDs 8833, 8850 e 8857: artigo da RTP (fora de data), notícia da Colômbia (sem relação com candidatos BR) e artigo sobre Hertz/Amazon (empresa homônima ao candidato Hertz Dias/PSTU).
- 🚫 Filtro de data no Brave —
-
v2.6.2 2026-04-12 Normalização de timezone nos coletores Fixed
- 🕐
published_atgravado em UTC — Todos os 5 coletores (Brave, Tavily, RSS, Google News, Sitemaps) agora gravampublished_atcom offset UTC explícito (+00:00). Anteriormente cada coletor usava um formato diferente (naive BRT, naive UTC ou misto), causando bug recorrente de timezone. - 🔄 Dashboard retrocompatível —
parse_published_dates()converte UTC→BRT ao exibir datas novas; datas legadas (naive BRT) passam sem alteração.
Changed
- ♻️
calendar.timegm()— RSS e Google News substituírammktime()porcalendar.timegm()para interpretar tuples feedparser como UTC, não como hora local. - 🗓️ Sitemaps com
dateutil—extract_news_entries()eextract_daily_entries()normalizam viadateutil.parse().astimezone(utc).
- 🕐
-
v2.6.1 2026-04-12 Filtro de período consolidado Changed
- 🔗 Controle unificado de período — Substituídos dois controles redundantes ("Janela de dados" selectbox + filtros "De/Até" por página) por um único
st.pillsna sidebar:7 dias | 30 dias | 90 dias | Tudo | Personalizado - 📅 Modo Personalizado — Ao selecionar "Personalizado", campos De/Até aparecem lado a lado para intervalo exato
- 🌐 Período global — Todas as páginas (incluindo Início e Cenário Geral) respeitam o período selecionado
- 🧹
apply_filters()simplificado — Contém apenas sentimento, espectro editorial e fontes; sem mais sobreposição com filtro de datas - 📐 Reposicionamento — Controle de período movido para abaixo da navegação
- 🔗 Controle unificado de período — Substituídos dois controles redundantes ("Janela de dados" selectbox + filtros "De/Até" por página) por um único
-
v2.6.0 2026-04-11 Reestruturação do dashboard Added
- 🏠 Nova página Início — Landing page com onboarding, destaques da semana, últimas análises SapiensLabs e guia de navegação
- 🌐 Cenário Geral — Antiga Início renomeada, foco em visualizações agregadas
- 📊 Heatmap de tópicos — Top N tópicos × semana com slider 5–30 + área 100% de participação relativa
- 📋 30 artigos mais recentes — Lista com título, fonte e data de publicação
- 🎨 Helper
_render_article_item()— Estilo unificado de listas de artigos em todas as páginas
Changed
- 🔁 Reordenamento — Timeline de cobertura precede Evolução dos tópicos em Cenário Geral
- ⚡ Otimizações — 7 índices SQLite,
PRAGMA cache_size=10000,BATCH_SIZEreduzido de 10 para 5
-
v2.5.2 2026-04-09 Fix parsing de datas + limpeza Fixed
- 🔧 KPI "Artigos hoje" corrigido — Pandas 2.3 descartava ~2.400 artigos como
NaTao parsearpublished_atcom formatos mistos de timezone. Substituído pordateutil.parser - 🧹 Limpeza do repositório — Removidos bancos .db, backups .bak, arquivos FUSE do git
- 🔧 KPI "Artigos hoje" corrigido — Pandas 2.3 descartava ~2.400 artigos como
-
v2.5.1 2026-04-07 Timeline diária Changed
- 📊 Timeline de cobertura com granularidade diária — Gráfico de área empilhada na página Início agora exibe menções por dia (era semanal), desde 25/03/2026
- 🗑️ Removido seletor de período — selectbox "Últimos 30/90 dias" eliminado; gráfico sempre mostra o período completo
-
v2.4.0 2026-04-06 Aldo Rebelo + sentimento por candidato Added
- 🗳️ Novo pré-candidato: Aldo Rebelo (DC) — Ex-deputado federal, ex-presidente da Câmara e ex-ministro nos governos Lula e Dilma. Filiado ao Democracia Cristã desde 2025
- 🔍 Busca retroativa: 251 artigos existentes vinculados ao novo candidato na tabela
article_candidates - 📊 Sentimento classificado: 251 pares artigo×candidato (93% neutro, 6% negativo, 1% positivo)
- ⚙️ Coleta futura configurada: Patterns regex, queries Brave e Tavily em
candidate_utils.py
Changed
- 📝 Metodologia: 13 pré-candidatos monitorados (era 10)
- 📈 Total: 13 pré-candidatos ativos, 2 dropped (Eduardo Leite, Tarcísio de Freitas)
-
v2.0.0 2026-04-03 Dashboard v2.0 (Redesign Completo) Added
- ✨ Página Início reformulada — Briefing executivo com:
- Hero "Esta Semana": top 5 tópicos emergentes (variação %), candidato destaque, sentimento semanal
- Timeline de cobertura (gráfico de área empilhada)
- Heatmap candidato×semana com toggle volume/sentimento
- Métricas compactas + grid de candidatos
- ✨ Página Comparativo — Análise lado a lado de dois candidatos:
- Métricas (total artigos, sentimento médio)
- Distribuição de sentimento (gráficos de pizza)
- Volume × Sentimento (dois gráficos de linha combinados)
- Tópicos individuais (barras horizontais)
- Tópicos compartilhados (gráfico divergente)
- Heatmap tópico×candidato
- Sentimento×tópico (gráfico de bolhas)
- ✨ Página Candidato v2 — Análise individual:
- Scatter tópico×sentimento (X=frequência, Y=sentimento, tamanho=candidatos)
- Média móvel 7d na tendência de sentimento com anotações
- Top 10 fontes com cores de sentimento
- ✨ Página Radar — Spider chart multidimensional:
- 5 eixos: volume, sentimento, fontes, positivos, recente
- Quadrante de posicionamento (volume×sentimento)
- ✨ Loading states — Spinners e progress bars em navegação
- ✨ Deep linking — Query params para navegação direta (
?candidato=lula&periodo=30d) - ✨ Filtros persistentes — Session state mantém seleções entre navegações
Fixed
- 🐛 Fix página Início — Proteger
to_periodcontra NaT empublished_at(crash resolvido) - 🐛 Fix página Radar — Usar
article_candidatesem vez de coluna legada - 🐛 Fix Cards últimos artigos — Cache + remoção de duplicatas
- 🐛 Fix Streamlit warning — Remover
value=dedate_input
Changed
- 📊 KPIs reposicionados — Movidos para ANTES de "Esta Semana" (melhor hierarquia visual)
- 🎨 Paleta SapiensLabs — Cores padronizadas (#0693e3 azul / #9b51e0 roxo)
- 🔤 Tipografia refinada — Antonio (títulos) + Archivo Narrow (corpo)
Data
- 📈 Banco atualizado: 3.375 artigos, 455 fontes, 9 candidatos
- ✅ Processamento completo: 586 artigos reclassificados com Anthropic API key corrigida
- ✅ Zero pendentes: Sentimento e tópicos 100% processados
- ✨ Página Início reformulada — Briefing executivo com: