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 12 de 14 · 167 versões no total.

  1. v3.8.0 2026-04-28 Resumo Mensal eleitoral: novo produto editorial

    Added

    • Resumo Mensal de Eleições 2026 — espelha a arquitetura do resumo semanal (Opus 4.7 + extended thinking + ordem das seções por volume), mas com fôlego de balanço — 1500–2000 palavras, identificando tendências consolidadas ao longo do mês, viradas de narrativa e comparações com o mês anterior quando os dados sustentam.
    • Janela editorial: dia 26 do mês anterior ao dia 25 do mês alvo. O ciclo fecha no dia 25; draft sai na manhã do dia 26.
    • Cron: monthly-summary.timer na LXC-121 dispara dia 26 de cada mês às 08h00 (BRT). Próximo disparo automático: 26/05/2026.
    • Tag dedicada: resumo-mensal (separada de resumo-semanal).
    • Suporte a catch-up retroativo via flag --month YYYY-MM. "Resumo de abril de 2026" (cobertura completa do primeiro mês desde 25/03/2026) gerado manualmente em 28/04/2026.
    • Página Metodologia do dashboard: seção "Resumos editoriais — produtos associados" reescrita pra cobrir as duas séries (semanal + mensal).

    Changed

    • Streaming obrigatório no SDK Anthropic — chamadas com extended thinking (12K) + max_tokens 28K + prompt grande passam de 10min e exigem client.messages.stream(). Aplicado em ambos weekly_summary.py e monthly_summary.py (preventivo no semanal antes de 02/05).

    Notes

    • O resumo mensal vive no projeto blog-automation (/opt/blog-automation/produtores/monthly_summary.py na LXC-121), não no eleicoes2026. Esta entrada documenta a mudança aqui porque o produto editorial é parte do ecossistema visível e consome dados deste banco.

  2. v3.7.3 2026-04-28 Resumo Semanal eleitoral: Opus 4.7 + ordem dinâmica por volume

    Changed

    • Modelo editorial do resumo semanal: Claude Opus 4.7 (primário) com extended thinking (budget_tokens=12000). Cadeia de fallback: Opus 4.7 → Opus 4.6 → Sonnet 4.6 → Haiku 4.5 — todos com thinking habilitado. Antes: Opus 4.6 sem thinking, com fallbacks Sonnet 4.6 → Haiku 4.5.
    • Ordem das seções do post: agora dinâmica, baseada no volume de menções da semana (decrescente). O pré-candidato com mais artigos publicados abre a análise; os demais aparecem em sequência. Antes: hierarquia fixa Lula → Flávio → Tarcísio → demais.
    • max_tokens: 8000 → 28000 (16K saída visível + 12K thinking).
    • Página Metodologia do dashboard: nova seção "Resumo semanal — produto editorial associado" descrevendo cron, modelo, ordem, continuidade narrativa e revisão humana.

    Fixed

    • Bug latente em generate_image_prompt — função lia data[c]['total_articles'] mas o campo nunca era preenchido em fetch_articles_data. Resultado: o prompt de imagem sempre caía no fallback genérico ("Two or three bold geometric shapes"), independentemente do número de candidatos ativos na semana. Agora total_articles é gravado por candidato (soma das contagens de sentimento) e a paleta/composição da imagem reflete o volume real.

    Notes

    • O resumo semanal vive no projeto blog-automation (/opt/blog-automation/produtores/weekly_summary.py na LXC-121), não no eleicoes2026. Esta entrada documenta a mudança aqui porque o produto editorial é parte do ecossistema visível e consome dados deste banco.
    • Próximo resumo com a nova configuração: sábado 02/05/2026.

  3. v3.7.2 2026-04-27 Upgrade de modelo e verificador anti-FP mais rigoroso

    Changed

    • Modelo de IA: todos os produtores (sentimento, tópicos, verificador, gênero, Zeitgeist) migram de gemini-2.5-flash-lite para gemini-3.1-flash-lite-preview via GEMINI_MODEL em src/gemini_client.py.
    • Verificador anti-FP: novo critério 6 — artigos sobre ciclos eleitorais anteriores (2014, 2018, 2022) sem gancho em 2026 são removidos. Corrige falsos positivos históricos indexados pelos buscadores.

  4. v3.7.0 2026-04-21 Zeitgeist: 6ª dimensão analítica

    Added

    • Nova página Zeitgeist — entre "Espectro Editorial" e "Análises" no menu. Mede a aderência do debate eleitoral a seis agendas globais estruturais: clima, transição energética, inteligência artificial, geopolítica, biodiversidade e crise da democracia.
    • Produtor src/produtores/zeitgeist.py — classificador multi-rótulo por artigo via Gemini 2.5 Flash Lite com JSON Schema enforced. Threshold de aderência confidence ≥ 0.5; evidência é trecho literal do texto para auditoria.
    • Schema:
      • Tabela article_zeitgeist(article_id, cluster, confidence, evidence, created_at) — N:M, com CHECK constraint nos 6 clusters canônicos.
      • Tabela article_zeitgeist_processed(article_id, processed_at) — distingue "ainda não classificado" de "classificado sem aderência" (a maioria dos artigos).
    • Pipeline incremental — run_coleta.sh agora roda produtores/zeitgeist.py depois do verificador. Só processa artigos ainda não classificados.
    • Visualizações na página:
      • KPIs globais (artigos classificados, com aderência, cluster dominante, total de vínculos).
      • Bar chart horizontal de volume por cluster.
      • Ranking de aderência global por pré-candidato (% dos artigos que tocam agenda global).
      • Heatmap Candidato × Cluster (composição temática individual).
      • Linha temporal semanal por cluster.
      • Heatmap Cluster × Espectro Editorial.
      • Expander com amostras aleatórias de evidências por cluster.
    • Classificação retroativa de todo o corpus (~10 mil artigos) feita em 21/04/2026.

    Rationale

    Material central dos capítulos 4 ("A corrida pelo enquadramento") e 9 ("O que a máquina viu") do livro A Lente e o Espelho. A implementação com volume atual (baixo) evita reprocessamento caro em setembro/2026 quando o corpus estará várias vezes maior.

    Notes

    • "Democracia" tem escopo estrito: só erosão institucional, desinformação sistêmica, regulação de plataformas e ataques ao STF/TSE — não cobre rejeição/aprovação presidencial ou disputas comuns entre candidatos.
    • "IA" exclui menções a ferramentas editoriais da redação ("LE.IA do Estadão", resumos gerados por IA) — só conta IA como agenda política/social.
    • "Geopolítica" não é ativada automaticamente por declaração política em solo estrangeiro; o conteúdo precisa desenvolver relações internacionais substantivamente.
    • A maioria dos artigos retorna lista vazia de clusters — é o comportamento desenhado.

  5. v3.6.0 2026-04-20 Gênero jornalístico no dashboard + reordenação do Cenário Geral

    Added

    • Seção "Gênero jornalístico" na página Espectro Editorial — combina três blocos:
      • Filtro por gênero (multiselect) que afeta todos os gráficos de espectro abaixo. Permite perguntas como "de que espectro vêm as opiniões sobre X?" ou "como análises se distribuem entre veículos?".
      • Distribuição global de gêneros — bar chart horizontal com o volume de artigos por categoria (Notícia, Análise, Opinião, Entrevista).
      • Cruzamento Gênero × Espectro editorial — heatmap com contagem absoluta de artigos em cada combinação (genre × editorial_lean).
    • Os dados de articles.genre já vinham sendo coletados pelo produtor produtores/genero.py (Gemini 2.5 Flash Lite), mas não tinham UI dedicada.

    Changed

    • Cenário Geral — reordenamento de seções:
      • "Pré-candidatos monitorados" (grid de cards) agora aparece logo depois dos KPIs globais, antes da Timeline de cobertura. Dá contexto quantitativo por candidato antes do gráfico temporal.
      • "Exportar artigos (CSV)" movido para depois da Timeline de cobertura. O botão sai do alto da página e fica próximo aos dados que o leitor acabou de visualizar.

    Reason

    • articles.genre (4 classes) era o único sinal de classificação estruturada sem representação no dashboard. O filtro em Espectro Editorial é a integração mais útil: cruza gênero com viés editorial e permite recortes analíticos novos.
    • O grid de pré-candidatos funcionava como um "sumário visual" escondido abaixo da Timeline. Subindo-o, a página abre com os números por candidato em primeiro plano.

    Fixed

    • Margens dos gráficos de gênero (patch pós-deploy) — bar chart de distribuição e heatmap Gênero × Espectro estavam cortando os rótulos dos eixos ("Notícia/Análise/Opinião/Entrevista" e "Esquerda/Centro/Direita"). Margem esquerda aumentada para 90px e títulos redundantes dos eixos removidos.

  6. v3.5.3 2026-04-20 Limpeza de UI: Sobre vira seção de Metodologia, Análises vira página própria

    Changed

    • Página "Sobre" mesclada no topo de "Metodologia" — descrição do painel, disclaimer de imparcialidade e guia de navegação agora abrem a página Metodologia. Remove duplicação e encurta o menu.
    • Análises vira página independente — o feed de matérias SapiensLabs saiu de Metodologia e virou entrada própria no menu, entre Espectro Editorial e Metodologia.
    • Exportar CSV reposicionado — botão de download agora aparece logo após os KPIs globais (antes ficava depois dos tópicos emergentes).
    • Mapa de tópicos (treemap) limitado a top 25 — mantido o mínimo de 5 menções. Reduz ruído visual da cauda longa.
    • Dropdown de Pré-candidatos ordenado por menções (desc) — antes alfabético; agora os candidatos mais discutidos aparecem no topo.
    • Agenda de coleta corrigida na UI — KPI "Última coleta" e Metodologia passam a exibir 07h, 14h e 21h (BRT), refletindo o timer configurado na v3.4.2.

    Removed

    • Banner de disclaimer no topo do Cenário Geral ("Monitoramento automatizado — não é pesquisa eleitoral"). O mesmo texto permanece na Metodologia, agora a primeira coisa que o leitor encontra ao abrir a página.
    • Link "Ver mapa completo de tópicos →" após os tópicos emergentes. Âncora desnecessária — o treemap está a uma rolagem de distância.
    • Função page_sobre() removida do código; rota ?page=Sobre redireciona para Metodologia.

    Reason

    • Encurtar o menu lateral e reduzir duplicação entre "Sobre" e "Metodologia" — o leitor que buscava transparência metodológica já caía em Metodologia, e o disclaimer editorial aparece agora no topo dessa mesma página.
    • Separar Análises em página própria dá destaque ao feed e evita enterrá-lo dentro da metodologia.
    • Treemap cheio de 100+ tópicos fragmentava a leitura. 25 já cobre >80% do volume.

  7. v3.5.2 2026-04-20 Cenário Geral: tópicos emergentes e treemap

    Added

    • Destaque da semana — o tópico emergente com maior score agora aparece visualmente destacado (card com borda âmbar e fundo tintado) antes dos demais na lista.
    • Grid de tópicos emergentes — ao invés de lista vertical, os 7 tópicos da semana aparecem em grid de 4 colunas horizontais, logo após a Timeline de cobertura.
    • Mapa de tópicos (treemap) — nova seção no Cenário Geral com treemap de todos os tópicos com 5+ menções desde o início da coleta. Área proporcional ao volume; coloração por densidade.

    Changed

    • Posição dos tópicos emergentes — movidos para imediatamente após a Timeline de cobertura (antes ficavam abaixo do heatmap candidato × semana).
    • Evolução de tópicos — volta a ser full-width, sem competir com os emergentes em layout de colunas.

    Reason

    • Tópicos emergentes são o sinal editorial mais imediato — faz sentido aparecer logo depois do contexto temporal que a timeline oferece.
    • O treemap resolve a pergunta "quais são os tópicos?" de forma visualmente direta, mostrando de uma vez a concentração nos 4 dominantes e a cauda longa.

  8. v3.5.1 2026-04-20 Timeline de cobertura sobe para logo após os KPIs

    Changed

    • Timeline de cobertura agora aparece full-width imediatamente após os KPIs globais, antes do Export CSV e do grid de candidatos. Antes ficava como terceira coluna do hero "Esta Semana", competindo com dois cards pequenos.
    • Hero "Esta Semana" agora exibe apenas "Candidato destaque" e "Sentimento da semana" lado a lado (2 colunas). Ganham mais respiro visual.

    Reason

    • A série temporal de cobertura é o dado contextual mais potente depois dos KPIs cumulativos — permite enxergar a evolução do volume por candidato de relance. Tê-la enfiada numa coluna lateral do hero subaproveitava o gráfico e fragmentava a leitura.

  9. v3.5.0 2026-04-20 Landing focada em relevância: Cenário Geral vira a porta de entrada

    Changed

    • Cenário Geral é a landing default. Acessar eleicoes2026.sapienslabs.com.br/ cai direto no painel de métricas; não há mais pedágio de onboarding entre o visitante e o dado.
    • Página Início removida. URLs antigas (?page=Início) redirecionam automaticamente para Cenário Geral.
    • Nova página Sobre (última do menu, antes de Changelog): agrega o conteúdo editorial que antes vivia na Início — "o que é este painel" + disclaimer de imparcialidade, feed Análises SapiensLabs e guia de navegação das demais páginas.
    • Banner fino de disclaimer no topo do Cenário Geral: "Monitoramento automatizado — não é pesquisa eleitoral" com links para Sobre e Metodologia. Dispensável via ✕ durante a sessão.

    Removed

    • Seções da Início que duplicavam o Cenário Geral: Destaques da Semana (4 métricas), Evolução por pré-candidato (tabela), Tópicos em destaque (tags). Esses fenômenos já eram cobertos com mais profundidade no Cenário Geral (hero "Esta Semana", heatmap, tópicos emergentes com exemplos clicáveis).

    Reason

    • O valor editorial de um observatório de mídia está no fluxo (o que mudou), não no estoque (artigos acumulados). Submeter o usuário a uma tela de onboarding antes do dado era um atrito injustificado — especialmente para leitores retornantes. A partir desta versão, o primeiro paint já mostra candidato destaque, sentimento da semana, timeline de cobertura e tópicos emergentes.

  10. v3.4.2 2026-04-20 Agenda de coleta ajustada para 07:00/14:00/21:00

    Changed

    • eleicoes-coleta.timer passa a disparar às 07:00, 14:00 e 21:00 BRT (antes 07:00, 13:00, 20:00). Intervalo de 7h entre coletas, mantendo a frequência 3×/dia.

    Reason

    • Afastar a coleta do meio-dia (horário de almoço) e da noite (20h concorria com outros jobs de coleta/monitoramento). 21h dá mais folga pra consolidar o dia.

    Fixed

    • Timer havia sido parado manualmente em 19/04 às 15:07 (decisão temporária durante rematch de sentimento) e não foi re-iniciado, causando gap de ~28h sem coleta. Timer re-ativado junto com a mudança de agenda.

  11. v3.4.1 2026-04-20 Página Perguntar temporariamente despublicada

    Removed

    • Perguntar fora do menu lateral e da guia de navegação da Início — retirada da UI pública enquanto a camada de precisão é endurecida. Função page_chat() em src/dashboard.py, CSS de .stChatInput e schema SQL documentado permanecem no código como dormant.

    Reason

    Testes manuais identificaram bugs incompatíveis com o posicionamento editorial do dashboard:

    • Contaminação de contexto entre turnos — número de uma pergunta vazava para a próxima (ex: "Bom dia" herdava "925 registros" da anterior).
    • Filtro de operações destrutivas em inglês apenas — DELETE/DROP bloqueados, mas "apague todos os artigos sobre Lula" passava batido.
    • Palavras sem sentido viram SQL — typos sem substantivo reconhecível eram traduzidos em consultas arbitrárias (retornavam contagem de algo).
    • Texto instrucional do prompt vazando — respostas apresentadas ao usuário incluíam literalmente "A consulta retornou N resultado(s)" apesar da instrução explícita contra.
    • Off-topic aceito como pergunta de dados — questões sobre o sistema geravam respostas fabricadas inventando categorias inexistentes no schema.

    Next

    Bloco fundacional antes de reativar:

    • Filtro destrutivo em PT (apagar/deletar/remover/excluir/limpar).
    • Validação sintática do SQL gerado (exigir FROM em tabela real do schema).
    • Branch explícito para saudação/smalltalk/meta — não cair em "SQL ou NAO_RELEVANTE".
    • Isolamento de histórico para evitar vazamento de contexto entre turnos.
    • Upgrade de modelo para gemini-2.5-flash (ou Pro) — Flash Lite é frágil em seguimento de instruções longas.
    • Conjunto de testes de regressão com 15 perguntas de referência (mix de contagens, rankings, N:N, smalltalk e tentativas destrutivas).

  12. v3.3.0 2026-04-18 Página Perguntar reativada e migrada para Gemma4

    Added

    • Página Perguntar de volta no menu lateral — entre Espectro Editorial e Metodologia, ícone help-circle (Lucide). Chat com IA para consultas em linguagem natural sobre os dados do painel: volume por candidato, sentimento por fonte, tópicos por espectro editorial etc.
    • Guia de navegação da página Início ganha entrada para Perguntar.

    Changed

    • Perguntar migrada do Claude CLI para Gemma4 31B-cloud (Ollama Pro). Era o último serviço que dependia de claude login periódico no LXC 121; agora usa o mesmo backend do pipeline de coleta. claude_cli.py passa a LEGACY.
    • Texto na Metodologia atualizado: "IA (Claude Haiku 4.5)" → "IA (Gemma4 31B-cloud via Ollama Pro)".