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.

  1. 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, Light e Use system setting. Sem toggle custom.
    • Dict COLORS computado 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 consumir COLORS['text'], COLORS['grid'], COLORS['hover_*'] em vez de #ffffff hardcoded.
    • Radar (spider chart + scatter de quadrante) migrado para consumir COLORS — antes bypassava o helper plotly_layout() e ficava ilegível no light.
    • Cards "Candidato destaque" e "Sentimento da semana" da página Início trocaram background:#141d27 hardcoded por var(--bg2).
    • Eyebrow da sidebar (Sobre artes e técnicas) consome var(--accent-gold) em vez de hex fixo.
    • Links no cream: var(--color-yellow) remapeado para o gold editorial #b8874a (amarelo vivo #eeee22 era 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 (precisava claude login periódico, credencial expirava silenciosamente). Agora usa ollama_client.call_model() como o restante do pipeline. Mesma assinatura, zero mudança de comportamento para o usuário final. claude_cli.py passa 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.

  2. 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.css consome tokens de sapienslabs-design-system (paleta, tipografia, dividers, gradients, utilitários). Hex hardcoded no dashboard.py caiu ~43% (193 → 110 ocorrências).
    • Iconografia Lucide — Novo módulo src/icons.py com 24 ícones SVG inline. Helpers lucide() e lucide_data_uri() para uso inline e via mask-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_detail em articles (extrema-esquerda / esquerda / centro / direita / extrema-direita). CLASSIFICACAO.md documenta critérios. scripts/refresh_editorial_lean_detail.py faz 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.timer agora 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 helper count_lines() sanitiza, aplicado a FPS/ERROS/LOCKS.
    • DB locked em Tavily — coletores/tavily.py migrado 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.py agora usa get_db_connection() (timeout=30 + busy_timeout=30000 + WAL) em vez de sqlite3.connect() cru.

    Data quality

    • Backfill de editorial_lean em 58 fontes (unknown caiu de 25,7% para 17,1% — redução de 32%). source_lean_map.py expandido de ~50 para 159 entradas.
    • Limpeza histórica de 305 falsos positivos via verificador.py --horas 450.

  3. v3.0.1 2026-04-15 Tópicos Emergentes: ordenação e desempate

    Fixed

    • 🗓️ Exemplos de artigos mais recentes — Tópicos Emergentes agora ordena os 3 artigos de exemplo por pub_date decrescente antes do .head(3). Antes o widget mostrava os primeiros na ordem natural do DataFrame (por id crescente, 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.sort agora 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 do value_counts() do pandas.

  4. 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 os st.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 por kpi_card() com cores accent por semântica.

  5. v2.6.4 2026-04-13 Filtros de qualidade no coletor Brave

    Fixed

    • 🚫 Filtro de data no Brave — save_articles() agora descarta artigos com published_at anterior a MIN_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_PATTERN do 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 positivo para 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).

  6. v2.6.2 2026-04-12 Normalização de timezone nos coletores

    Fixed

    • 🕐 published_at gravado em UTC — Todos os 5 coletores (Brave, Tavily, RSS, Google News, Sitemaps) agora gravam published_at com 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íram mktime() por calendar.timegm() para interpretar tuples feedparser como UTC, não como hora local.
    • 🗓️ Sitemaps com dateutil — extract_news_entries() e extract_daily_entries() normalizam via dateutil.parse().astimezone(utc).

  7. 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.pills na 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

  8. 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_SIZE reduzido de 10 para 5

  9. v2.5.2 2026-04-09 Fix parsing de datas + limpeza

    Fixed

    • 🔧 KPI "Artigos hoje" corrigido — Pandas 2.3 descartava ~2.400 artigos como NaT ao parsear published_at com formatos mistos de timezone. Substituído por dateutil.parser
    • 🧹 Limpeza do repositório — Removidos bancos .db, backups .bak, arquivos FUSE do git

  10. 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

  11. 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)

  12. 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_period contra NaT em published_at (crash resolvido)
    • 🐛 Fix página Radar — Usar article_candidates em vez de coluna legada
    • 🐛 Fix Cards últimos artigos — Cache + remoção de duplicatas
    • 🐛 Fix Streamlit warning — Remover value= de date_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