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.
-
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.timerna 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 deresumo-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 ambosweekly_summary.pyemonthly_summary.py(preventivo no semanal antes de 02/05).
Notes
- O resumo mensal vive no projeto
blog-automation(/opt/blog-automation/produtores/monthly_summary.pyna LXC-121), não noeleicoes2026. Esta entrada documenta a mudança aqui porque o produto editorial é parte do ecossistema visível e consome dados deste banco.
-
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 liadata[c]['total_articles']mas o campo nunca era preenchido emfetch_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. Agoratotal_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.pyna LXC-121), não noeleicoes2026. 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.
- Modelo editorial do resumo semanal: Claude Opus 4.7 (primário) com extended thinking (
-
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-liteparagemini-3.1-flash-lite-previewviaGEMINI_MODELemsrc/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.
- Modelo de IA: todos os produtores (sentimento, tópicos, verificador, gênero, Zeitgeist) migram de
-
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ênciaconfidence ≥ 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).
- Tabela
- Pipeline incremental —
run_coleta.shagora rodaprodutores/zeitgeist.pydepois 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.
-
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.genrejá vinham sendo coletados pelo produtorprodutores/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.
- Seção "Gênero jornalístico" na página Espectro Editorial — combina três blocos:
-
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=Sobreredireciona 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.
-
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.
-
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.
-
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.
- Cenário Geral é a landing default. Acessar
-
v3.4.2 2026-04-20 Agenda de coleta ajustada para 07:00/14:00/21:00 Changed
eleicoes-coleta.timerpassa 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.
-
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()emsrc/dashboard.py, CSS de.stChatInpute 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/DROPbloqueados, 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
FROMem 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).
- 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
-
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 loginperiódico no LXC 121; agora usa o mesmo backend do pipeline de coleta.claude_cli.pypassa a LEGACY. - Texto na Metodologia atualizado: "IA (Claude Haiku 4.5)" → "IA (Gemma4 31B-cloud via Ollama Pro)".
- Página Perguntar de volta no menu lateral — entre Espectro Editorial e Metodologia, ícone