No ar · coleta até 01/11 dados de 30/10/2026, 16: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 8 de 14 · 167 versões no total.

  1. v4.18.0 2026-08-14 Tópicos em alta sem inflação de base pequena

    Changed

    • "Tópicos em alta" (capa, Cenário Semanal e Mensal) trocou a métrica: a antiga (crescimento percentual × volume) fazia um tema que saltava de 1 pra 17 artigos (+1600%) vencer de temas grandes, e enterrava emergências reais — na semana desta mudança, "fraude eleitoral" saiu do zero pra 135 artigos e ficava fora do top 5. Agora a ordem usa razão amortecida com piso mínimo de volume; o selo mostra o múltiplo de crescimento ("4×") em vez de percentual, e "NOVO" marca tema sem ocorrência no período anterior. Mesma correção já aplicada ao antigo "candidato em destaque" (crescimento sobre base minúscula não é destaque).
    • A contagem das listas passou a ser por artigos distintos — o rótulo sempre disse "artigos", mas a métrica antiga contava vínculos tema-candidato, inflando temas de artigos multi-candidato.

  2. v4.17.2 2026-08-12 Metodologia atualizada pós-leaderboards

    Changed

    • Metodologia acompanha as mudanças recentes: o guia do Cenário Geral descreve o share of voice com viradas explicadas e os rankings com sentimento e espectro; a seção Tópicos documenta a régua de aceleração (tópico do momento da capa e motivo das viradas) e a "temperatura" das barras de sentimento nos rankings; a seção Veículos explicita que o badge de espectro é o nível predominante da fonte — mesma régua do ranking do Cenário Geral.
    • Referências mortas corrigidas: "Cobertura mais recente" (seção removida da home) e descrições da página 404 ("KPIs vivos", espectro em 3 níveis).

  3. v4.17.1 2026-08-12 Coletor Google News: cache de decode + circuit breaker

    Fixed

    • Google News voltou a operar sob controle de taxa. Desde 11/08 à tarde o coletor vinha zerado: o Google bloqueou as requisições de decodificação de URL (HTTP 429) porque cada rodada redecodificava ~1,7 mil URLs — quase todas já vistas — cinco vezes ao dia. Agora as URLs decodificadas ficam num cache permanente (falhas são retentadas só depois de 24h) e um circuit breaker interrompe as tentativas da rodada após 10 falhas seguidas, deixando o bloqueio expirar em vez de realimentá-lo. Nenhum artigo publicado foi afetado — a perda foi de cobertura de coleta no intervalo, compensada pelos demais coletores.

  4. v4.17.0 2026-08-12 Treemaps aposentados: tópicos e fontes viram leaderboards

    Changed

    • "Tópicos da cobertura" e "Fontes monitoradas" (Cenário Geral) deixaram de ser treemaps e passaram ao padrão leaderboard: uma linha por item com rank, volume e barra de sentimento (fatia positiva, neutra e negativa dos vínculos verificados). Área é codificação visual fraca pra um ranking de 20 itens e, em períodos curtos, transformava 1 artigo num bloco monumental; a cor, que era decorativa, agora carrega informação.
    • Fontes ganharam o badge de espectro editorial (nível predominante da fonte na série, em cinco níveis — mesma régua da tabela da Metodologia) e nome de exibição no lugar do slug técnico. A seção passa a responder quem publica mais, de que lado vem e com que tom cobre.

  5. v4.16.0 2026-08-12 Home como banca + revisão de legibilidade

    Added

    • "Tópico do momento" na home: o tema que mais acelerou nos últimos 7 dias frente ao próprio histórico (métrica de lift), com volume e tom por candidato — substitui o antigo "candidato em destaque". Em seção própria: tópico do momento e liderança da semana são recortes independentes, e lado a lado induziam leitura causal.
    • Share of voice no Cenário Geral, parametrizado por período (pills): fatia de cada candidato por semana fechada (30d/90d/tudo) ou por dia fechado (7 dias). Trocas de liderança anotadas no gráfico e explicadas em lista — tópico que puxou a virada + manchete real linkada; quando não há troca, o estado diz isso explicitamente.
    • Leaderboard compacto de candidatos nos três cenários: uma linha por candidato (rank, volume, barra de sentimento, variação), no lugar do grid de cards — os cards completos seguem em /candidatos.
    • Menu colapsável (hambúrguer) no mobile.

    Changed

    • Home reordenada como banca de jornal (pirâmide invertida): manchete da casa → semana até aqui (líder, tom e sobe/desce na mesma seção — mesma janela de comparação) → extremos → tópicos em alta → análises da série. Cortados o grid de KPIs de infraestrutura (virou linha de status no hero), "Cobertura mais recente" e "Explore o painel".
    • NAV: Cenário Semanal antes do Mensal — em campanha, o ciclo de leitura é semanal.
    • Legibilidade como regra global: tooltips dos gráficos com fundo opaco legível nos dois temas; anotações sem sobreposição, com alturas escalonadas; toda seção com intertítulo e explicação de leitura.
    • Pills de período viraram navegação normal (sem HTMX): o swap re-executava os scripts Plotly e, de forma intermitente, um gráfico perdia o hover. Página cheia cacheada resolve a classe inteira de bugs.

  6. v4.15.2 2026-08-11 Imagens dos resumos migradas pra Gemini 3.1 Flash Image

    Changed

    • Metodologia: imagens dos resumos editoriais agora são geradas por Gemini 3.1 Flash Image (Google) — o Google desativa os endpoints do Imagen 4 em 17/08/2026. A migração é no projeto blog-automation (utils/imagen_client.py, Interactions API); aqui muda só a linha da seção Resumos. Mesmas duas variantes (16:9 e 1:1) e a mesma paleta.

  7. v4.15.1 2026-08-10 Metodologia atualizada para a fase de campanha

    Changed

    • Página /metodologia reescrita para refletir a revisão de campanha: cadência de coleta 5×/dia (07h, 10h, 13h, 16h e 21h), campo fechado em candidaturas oficiais (contagem dinâmica do banco no lede), verificação anti-falso-positivo documentada como etapa das fontes de dados (todos os vínculos pendentes adjudicados a cada coleta, sem janela), guias de navegação com share of voice, gênero jornalístico, bipartite por sentimento e comparações por período equivalente.
    • Seção nova "Revisões de série": registro público das mudanças de 10/08/2026 que afetam a comparabilidade das séries — adjudicação retroativa de ~9,4 mil vínculos pendentes (~7,9 mil removidos como falso positivo), recalibração do prompt de sentimento, espectro em 5 níveis, comparações por período equivalente e nova cadência de coleta.
    • Tabela de veículos monitorados em 5 níveis: badge de espectro migrado de 3 pra 5 níveis (nível modal por fonte canônica), com badges também para agregadores e não classificados.
    • Seção "Como esse resumo foi feito" dos resumos publicados (weekly/monthly no blog-automation): frequência de coleta corrigida para cinco vezes por dia.

    Fixed

    • Dois erros factuais antigos na /metodologia, ambos verificados contra produção: a tabela de faixas do score dizia neutro = [−0,1; +0,1], mas as fronteiras reais do classificador são ±0,2 (conferido nas 78 mil classificações do banco); os resumos editoriais "saem às 08h00", mas os timers reais rodam segunda 06h30 (semanal) e dia 1º 06h45 (mensal). A descrição do insumo do sentimento também dizia "título e descrição" — o modelo recebe título + primeiros parágrafos do corpo quando capturado.
    • Página /api dizia "coleta três vezes por dia (07h, 14h e 21h)" — atualizada pra cadência real de cinco rodadas.

  8. v4.15.0 2026-08-10 Share of voice, o custo da opinião e resumos com memória

    Added

    • Share of voice semanal no Cenário Semanal: fatia de cada candidato no total de artigos por semana fechada desde abril, com as trocas de liderança marcadas no gráfico — o dado limpo revela que Flávio Bolsonaro assumiu a liderança de volume em quatro semanas (11/05, 22/06, 06/07 e 20/07) e Lula retomou nas quatro seguintes. Série que nenhuma página mostrava.
    • "O custo da opinião" na página de candidato: sentimento médio por gênero jornalístico (notícia, análise, opinião, entrevista). O gênero era classificado a cada coleta desde abril e nunca havia sido cruzado com candidato.
    • Grafo candidato↔tópico colorido por sentimento: a cor da aresta agora indica o tom médio daquele candidato naquele tema — o grafo vira mapa de vulnerabilidade e força por assunto. Barras de Zeitgeist do detalhe também ganham o tom por cluster.
    • Resumos editoriais (SapiensLabs) com três dimensões novas: linha editorial em 5 níveis (antes 3), gênero jornalístico com sentimento, e comparação com a janela anterior (volume + tom) — o prompt sempre pediu comparação temporal e o dado nunca chegava.

    Fixed

    • Página de candidato 14× mais rápida (5-6s → ~0,4s): a função que monta o detalhe rodava ~12 consultas agregadas a cada visita, sem cache — na página que mais recebe compartilhamento. Cacheada e incluída no aquecimento pós-coleta.

  9. v4.14.0 2026-08-10 Espectro em 5 níveis, janelas justas e a página que abre no presente

    Added

    • Espectro Editorial em cinco níveis — da extrema-esquerda à extrema-direita. A página colapsava a classificação detalhada (produzida a cada coleta desde abril) em três níveis grossos, somando os extremos aos vizinhos — exatamente onde mora o sinal mais forte do banco: a cobertura de Flávio Bolsonaro cresce monotonicamente da extrema-esquerda (-0,60) à extrema-direita (+0,27), e a de Lula é o espelho invertido (+0,25 na esquerda → -0,48 na extrema-direita). Renan Santos é o desviante: positivo no centro E na direita. Agregadores e veículos sem classificação ficam fora do espectro, com contagem declarada em rodapé.
    • Janela "48h" no Cenário Geral e pills reordenadas do presente para o passado (Hoje → 48h → 7 dias → ... → Tudo). A página passa a abrir nos últimos 7 dias — o padrão anterior ("Tudo") diluía o momento em cinco meses de série.

    Fixed

    • Comparações "vs anterior" agora usam o mesmo período da janela anterior (apontado na revisão editorial): na segunda-feira, compara-se com a segunda anterior; na terça, com segunda+terça; no domingo converge para a semana cheia — idem no mês, dia a dia. Antes, a janela corrente PARCIAL era comparada com a anterior INTEIRA: toda segunda de manhã o painel mostrava o campo inteiro "em queda de 90%", número que só fechava no domingo. A correção foi feita na fonte e alcança todos os consumidores: "Quem sobe · quem desce" da capa, grid e KPIs do Cenário Semanal, KPIs mensais, candidato em destaque, gráfico dumbbell e tópicos emergentes. Rótulos atualizados para dizer o que o número de fato é.

  10. v4.13.0 2026-08-10 Fase 1 da revisão de campanha: capa quente, URL /candidatos e SEO

    O dashboard vira a chave da era pré-campanha para a campanha (propaganda começa 16/08).

    Added

    • Capa quente. KPIs "Artigos hoje" e "Tom da semana" (sentimento médio ponderado por volume); seção "Quem sobe · quem desce" (top-3 altas e quedas de volume da semana vs anterior, piso de 10 artigos); seção "A semana em dois extremos" (manchetes mais negativa e mais positiva do candidato com cobertura mais dividida, rotuladas como leitura do classificador, linkando às fichas internas). Tudo derivado de dados que o painel já calculava — nada de coleta ou query nova.
    • Contagem regressiva para o 1º turno (04/10/2026) e carimbo de última coleta na sidebar — visíveis em todas as páginas. Antes, 11 das 14 páginas não tinham nenhum sinal de frescor.
    • Cartão social (og:image) e metadados completos: description, canonical, og:title/description/url/image e twitter:card em todas as páginas. Compartilhar qualquer página do painel deixa de gerar cartão cinza sem informação.

    Changed

    • URL do índice de candidatos migrada: /pre-candidatos → /candidatos, com redirect 301 permanente nas URLs antigas (links salvos continuam funcionando). Com 13 candidatos oficiais e 0 pré-candidatos, a URL antiga era a etiqueta da fase anterior em toda página compartilhada.
    • Navegação reordenada: Espectro Editorial sobe (é a página mais eleitoral do painel); API pública sobe para o grupo Análise; Zeitgeist e Análises formam o grupo "Aprofundamento"; Radar sai do menu (a rota continua acessível por link direto) — num campo de 13 candidatos, um gráfico limitado a 3 com eixos de normalização relativa induzia mais confusão que leitura.
    • Espectro e Comparativo agora abrem com os 13 candidatos — o padrão anterior (top-5 por volume) escondia 8 candidaturas oficiais da visão inicial, um viés de exposição herdado da era pré-campanha.
    • Página de candidato descontinuado: rótulo correto ("FORA DA CORRIDA" — antes dizia "PRÉ-CANDIDATO") e noindex (fica no ar como contexto histórico, fora do índice de busca).
    • Sitemap com lastmod honesto: páginas de dados carregam a data do último snapshot; páginas estáticas, a da última edição real (antes tudo dizia "hoje" — sinal de baixa confiança para buscadores).
    • Metodologia atualizada: título próprio ("Metodologia"), remoção da promessa vencida de validação em julho, dos canais desligados (Tavily) e de fontes removidas (Jornal Opção); modelo editorial corrigido para Opus 5.

  11. v4.12.0 2026-08-10 Fase 0 da revisão de campanha: estanca a fuga de dados do verificador

    Primeira leva da revisão de fase para o início da campanha eleitoral (16/08). Diagnóstico completo em três auditorias (dashboard, dados, pipeline) precedeu este lote — as mudanças abaixo atacam o que corrompia dados publicados.

    Fixed

    • Verificador sem janela temporal — corrige fuga estrutural que tornava candidatos pequenos invisíveis. A janela --horas 3 filtrava por a.fetched_at (timestamp do artigo), mas os coletores criam vínculos novos em artigos velhos no caminho de duplicata: o vínculo nascia verified=0 já fora de qualquer janela futura e nunca mais era verificado — logo, nunca aparecia no dashboard nem nos resumos (que filtram verified=1). Em 10/08, eram 9.407 pares invisíveis (100% deles com created_at > fetched_at), com perda REGRESSIVA: 54,7% dos pares de Edmilson Costa invisíveis, 51,4% de Samara Martins, 46,4% de Hertz Dias — contra 4,2% de Lula. O ranking publicado subestimava os candidatos pequenos em 20-55%. Agora o verificador processa WHERE verified = 0 sem janela (imune também ao desalinhamento UTC/localtime de created_at), a limpeza de órfãos idem, e o alerta do Telegram ganhou o campo Pendentes — invariante 0; qualquer valor ≠0 acusa a fuga na hora. --horas é aceito e ignorado (deprecado).
    • Body scraping deixa de re-baixar falhas permanentes. Coluna nova articles.body_status: 401/403/404/410 e paywall-sem-corpo são marcados 'permanent' e saem do SELECT. Antes, 5.478 artigos mortos eram re-baixados a cada coleta — ~2h30 de trabalho perdido por run, 3× por dia. A coleta cai de ~2h20 para menos de 1h.
    • Google News cobria só 8 dos 13 candidatos. Entraram Augusto Cury, Edmilson Costa, Hertz Dias, Rui Costa Pimenta e Samara Martins (com partido na query para os homônimos fortes); saíram 6 chaves de descontinuados. Os quatro mais ausentes eram os mesmos que mais perdiam na fuga do verificador — os dois defeitos se compunham.
    • Patterns que morreriam em 16/08. Quatro candidatos usavam pré-candidato como desambiguador de sobrenome; quando a imprensa passar a escrever só "candidato", esses ramos morreriam em silêncio (RSS e sitemaps dependem 100% dos patterns). Agora aceitam (pré-)?candidato, nas duas direções para Zema e Caiado ("o candidato Zema"). Vices entraram como desambiguadores dos titulares: Kassab→Caiado, Girão→Zema, Gaspar→Flávio, Delgado→Cury, Medina→Renan, Torquato→Clariana, Tenente Dalma→Avalanche, Vanessa Portugal→Hertz, Cleusa→Edmilson, Brício→Samara, Antônio Carlos Silva→Pimenta. "Chapa Caiado-Kassab é registrada no TSE" agora casa. 11 casos de teste novos (27 no total).
    • Prompt do sentimento ensinava a oposição errada. Citava Tarcísio e Michelle (ambos fora da corrida) como exemplos canônicos de oposição e nunca mencionava Flávio Bolsonaro — o 2º maior volume do banco. Agora traz o contexto real da corrida (governista Lula; oposição liderada por Flávio, com Caiado/Zema/Renan/Cury) e regra explícita para Jair/Michelle Bolsonaro (não-candidatos; só afetam Flávio com conexão explícita no texto). Prompt do verificador idem: Leite (dropped) removido, Caiado/Zema como ex-governadores, homônimo "Avalanche" documentado. Quebra leve de comparabilidade: sentimento de artigos sobre "oposição" difusa tende a deslocar de Tarcísio/Michelle para Flávio a partir desta versão.

    Changed

    • Vocabulário de fase na coleta. O grupo _geral do Google News ganhou 5 queries que não existiam em nenhuma camada: debate presidencial, pesquisa eleitoral, registro no TSE, horário eleitoral e propaganda eleitoral. O funil continua exigindo match de candidato — as queries alargam recall sem criar lixo.
    • Feeds mortos removidos (Carta Capital e Jornal Opção — 403 permanente desde julho; cobertura preservada via Google News/sitemap). O campo Fontes off do alerta volta ao piso 0 e passa a indicar falha real.
    • Docstrings e logs dos produtores atualizados para o modelo real (gemini-3.1-flash-lite) — diziam Ollama/Gemma4/Gemini 2.5 desde abril.

  12. v4.11.14 2026-08-07 Campo fecha em 13: Clariana Barão e Rui Costa Pimenta oficializados; 3 vices atualizados

    Changed

    • Clariana Barão (DC) → candidate. Convenção nacional em 05/08/2026, em São Paulo, com a advogada Fabiana Torquato na vice — chapa 100% feminina. É a primeira vez desde a fundação do DC, em 1995, que o candidato à Presidência não é o fundador José Maria Eymael. Múltiplas fontes com data e local: Blog do Mário Flávio, capitalnews, Congresso em Foco, Folha, Metrópoles.
    • Rui Costa Pimenta (PCO) → candidate. Mantido pre-candidate desde 04/08 por falta de convenção datada por fonte primária. Passadas 48h do prazo legal, manter esse status deixou de ser neutro: todo roundup pós-05/08 (Metrópoles, CartaCapital — "lista final… 13 chapas", em.com.br, Goiás 246, gauchazh, El Universal) o trata como candidato assentado, sem hedge algum — contraste nítido com Cabo Daciolo (explicitamente excluído por todas as fontes) e com a própria Clariana antes de sua convenção ("deve lançar"). dropped não se aplica: nada indica saída da corrida. A ambiguidade genuína foi para a notes, não para o status: o PCO não divulgou convenção nacional com data e local — o evento de 08/08/2026 em São Paulo é chamado pelo próprio partido de "lançamento", não convenção; a chapa (Antônio Carlos Silva "Toninho" na vice) foi escolhida na 38ª Conferência Nacional, instância interna.
    • 📝 Composição final: 22 monitorados = 13 candidatos, 0 pré-candidatos, 9 descontinuados. O campo das candidaturas presidenciais está fechado.

    Fixed

    • Três vices corrigidos de "indefinido" para nomeado, todos registrados nos dias seguintes ao prazo:
      • Flávio Bolsonaro (PL) — deputado federal Alfredo Gaspar (PL-AL).
      • Romeu Zema (Novo) — senador Eduardo Girão (Novo-CE); chapa já registrada no TSE em 06/08/2026.
      • Augusto Cury (Avante) — ex-deputado federal Júlio Delgado, que já vinha assessorando o candidato desde o início do ano.

    Reference

    • Achado que explica o padrão do PCO: um artigo regional (correiodopovo.com.br, 04/08) sobre a convenção estadual no RS registrou que o partido cumpre o prazo legal em nível estadual ("o PCO deve realizar sua convenção na quarta-feira"), mas revela os nomes da chapa nacional só no lançamento do dia 8. Isso é consistente com uma legenda pequena que separa o ato legal (convenção, silencioso pra imprensa) do evento de publicidade (lançamento, com data e local divulgados). Não achamos confirmação primária de que esse ato legal específico ocorreu até 05/08 para a chapa presidencial — a promoção se apoiou no peso da cobertura pós-prazo, não numa data de convenção.