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 3 de 14 · 167 versões no total.
-
v4.58.4 2026-09-22 Capas inteiras na seção de análises da home Alterado
- As imagens de "Análises da série" aparecem inteiras, em 16:9 e sem teto de altura. O card principal cortava a capa em 240 px e os laterais em 21:9 com 130 px, sempre com
object-fit: cover: as placas da série perdiam a barra e a legenda da base. As três imagens vêm do blog em 1600×900, então 16:9 mostra tudo. As duas colunas seguem fechando na mesma altura (prévia conferida a 1100 e 1440 px).
- As imagens de "Análises da série" aparecem inteiras, em 16:9 e sem teto de altura. O card principal cortava a capa em 240 px e os laterais em 21:9 com 130 px, sempre com
-
v4.58.3 2026-09-19 A série fica com 18 respostas; a peça do STF vira extra Alterado
config/serie_calendario.json: a peça sobre a crise do STF sai da numeração e passa a ser um extra de 03/10, na chave novaextra_pos_serie(decisão editorial). A série continua com 18 respostas, o numeral "/18" já publicado nas capas e nos textos fica de pé, e não há retrabalho nas peças que citam o nome da série. A programação de/metodologia/serietermina em 02/10.- Com isso a suíte volta a ficar inteira verde:
test_calendario_real_integroexige que o numeral do nome da série seja igual ao número de respostas, e falhava desde 15/09.
-
v4.58.2 2026-09-19 A apuração da série passa pela mesma régua do painel Corrigido
- Peça 4 da série saiu com "sete chapas" onde eram seis. A apuração (
docs/serie/apuracao/04-dados.py) lia a tabelaarticlescrua, e não a viewarticles_imprensaque é a régua da casa desde 02/09: o Causa Operária, jornal do PCO, contava como cobertura de imprensa e punha Rui Costa Pimenta à frente de Edmilson Costa. Pela régua certa a chapa do PCO desce para a oitava posição e a fila de chapas sem mulher no topo passa de sete para seis. Caiu junto a afirmação recíproca ("as seis que têm mulher são as seis menos cobertas"): a do PCO fica entre elas. O texto publicado traz nota de correção datada. - O bloco "mulher como assunto" da mesma peça lia
topicssem passar por artigo nenhum — sem régua e sem teto de data, então contava veículo partidário e crescia a cada coleta. - Título e pergunta da peça 4 em
config/serie_calendario.json. O título acompanha a errata; a pergunta ainda dizia "as sete mulheres de 2026" desde antes da troca da chapa do PRTB, e são oito.
Adicionado
tests/test_articles_imprensa.pyvarredocs/serie/apuracao/. Cada peça da série publica número em página pública, e era por ali que o erro entrou. A guarda foi provada com um arquivo de controle.
- Peça 4 da série saiu com "sete chapas" onde eram seis. A apuração (
-
v4.58.1 2026-09-18 O glossário dizia "a maior parte"; a apuração disse "quase metade" Corrigido
- Verbete "matéria-lista" em
/metodologia/serie. Dizia que, para os candidatos menores, a matéria que cita cinco ou mais nomes é "a maior parte da cobertura". A apuração da peça 5 da série (janela de rede igual, 10/08 a 17/09/2026, só veículos de imprensa) mediu: de 40% a 49% para os seis menos cobertos, e nenhum passa da metade; para Lula e Flávio Bolsonaro, 5,9% e 8%. O verbete agora traz o número e registra a correção. - Artigos da Gazeta do Povo entravam com o slug no lugar do título. O sitemap diário do veículo não traz título, e o coletor derivava um da URL ("desespero lula reajuste bolsa familia"): 305 de 457 artigos desde 15/08. Nova etapa da coleta, entre o corpo e a classificação (
src/coletores/titulos.py): o artigo cujo título é exatamente o slug da URL recebe o título da página. O acervo é corrigido aos poucos, 80 por coleta. - Gatilho da edição extra cortava a lista de candidatos em cinco e os contava pela grafia literal do tópico, enquanto o volume do fato era contado pelo tópico canônico. Agora a lista vai inteira e as duas contas usam a mesma régua.
- Verbete "matéria-lista" em
-
v4.58.0 2026-09-17 O vigia do TSE passa a dizer quem, e a calar quando nada mudou Corrigido
- O filtro por cargo do vigia da cassação era código morto. O
motivo_cassacaodo TSE não traz coluna de cargo — as colunas são DT/HH_GERACAO, ANO, CD/NM_TIPO_ELEICAO, CD/DS_ELEICAO, SG_UF, SG_UE, NM_UE, SQ_CANDIDATO, NR_PROCESSO, DS_TP_MOTIVO e DS_MOTIVO. ODS_CARGOtestado era None nas 1.538 linhas: quem filtrava de verdade era o SQ, e o conjunto vinha só dos titulares, então cassação de vice passaria batido. Agora o cruzamento inclui vices e ocandidate_registry— sem ele, a linha do Marçal viraria invisível no dia em que o TSE julgar a substituição e ela sair do arquivo de candidatos. - Alerta que se repetiria todo dia. O aviso de 17/09 ("motivo_cassacao tem 2 linha(s) presidencial(is)") disparava por existência, e a linha veio para ficar. As duas são o **mesmo caso**: o registro nº 28 de Pablo Marçal, indeferido, com dois fundamentos legais — "Ausência de condição de elegibilidade" e "Inelegibilidade infraconstitucional(LC 64/90)". Agora o vigia tem estado, no molde do Pardal: fala na estreia e quando a lista muda. Arquivo indisponível não é lista vazia — nessa rodada o estado não se mexe.
- O alerta diz quem e por quê, agrupando os fundamentos por pessoa. "2 linhas presidenciais" obrigava quem lê a refazer a apuração inteira para saber do que se tratava.
- O aviso de substituição de chapa também ganhou estado. O CSV carrega a chapa velha até o TSE julgar, então o mesmo fato voltava rodada após rodada. A chave é canônica — número de urna, SQ do escolhido, quantas linhas concorrem e quantas estão aptas —, não o texto do aviso, que lista os nomes na ordem em que o arquivo serviu as linhas.
Nota de apuração: a linha de
candidate_registrydo slugpablo-marcalnão está com a chapa cruzada. Na chapa velha o vice era o próprio Leonardo Avalanche (SQ ...3883), que virou titular em ...4479 com Silvia de vice. As duas linhas estão certas; o slug do Marçal estádroppede os consumidores (apuração da série, ranking de patrimônio) filtram por isso.
- O filtro por cargo do vigia da cassação era código morto. O
-
v4.57.0 2026-09-16 O buraco de um mês na série de Avalanche fica declarado, não remendado Adicionado
- Revisão de série sobre a entrada tardia de Leonardo Avalanche (
/metodologia#revisoes). Ele foi lançado em convenção em 30/07, entrou no painel em 04/08, saiu em 16/08 quando o PRTB inscreveu Pablo Marçal no lugar dele e voltou em 16/09, depois de o TSE indeferir Marçal. **No mês em que esteve fora da lista, as buscas dedicadas ao nome dele ficaram desligadas** — ele só aparecia quando citado em matéria coletada por causa de outro candidato: 17, 8, 5 e 4 matérias por semana, contra 51 a 57 antes. A queda é da nossa coleta, não da imprensa, e a página diz isso com todas as letras. - A mesma ressalva no método da série (
/metodologia/serie), nos limites e no verbete "Os 13": peça que compare volume ou tom de Avalanche com os demais precisa declarar o buraco ou recortar a partir de 16/09.
Alterado
- Decisão (16/09): o mês perdido não será reconstruído. Havia como puxar o corpo dos artigos antigos dele e reclassificar, mas isso o tornaria o único dos treze medido com texto inteiro enquanto os outros doze seguem medidos por manchete — a cobertura com corpo extraído é de 28,2% nele, contra 24,3% de Flávio, 25,3% de Lula e 28,8% de Caiado, ou seja, ele é a média da casa, não a exceção. Reclassificar um só quebraria a comparação, que é o produto. **Vale daqui para frente: de 16/09 em diante ele é coletado como todos os outros.**
- Revisão de série sobre a entrada tardia de Leonardo Avalanche (
-
v4.56.0 2026-09-16 O PRTB trocou de candidato, e o coletor estava lendo a chapa errada Corrigido
- Duas chapas no mesmo número de urna cruzavam titular e vice. O TSE indeferiu o registro de Pablo Marçal em 11/09 (inelegível até 2032) e o PRTB protocolou a substituição pelo vice, Leonardo Avalanche, em 14/09, último dia do prazo. Enquanto o TSE não julga, o CSV serve as duas chapas no nº 28 — e o coletor fazia
pres[NR_CANDIDATO] = row, ficando com a última linha lida. A rodada de 15/09 gravou, no slug do Marçal, o titular dele com a **vice do Avalanche**. Agoraescolher_chapa()decide pelocandidatoAptodo REST (não pela ordem do arquivo) e casa o vice peloSQ_CANDIDATOvizinho, que é como o TSE numera quem se registra junto. Substituição vira aviso no log e no Telegram; sinal ambíguo pede conferência humana. Cinco testes emtests/test_tse_registry.py, com os dados reais do nº 28. - O alerta do coletor no Telegram morria calado em HTTP 400. Com
parse_mode=Markdown, o_demotivo_cassacao— nome de arquivo do próprio TSE, citado pelo vigia — abria uma ênfase que nunca fechava. O alerta ia para o log como "AVISO telegram" e ninguém era avisado de nada. Vai em texto puro: alerta que depende de escapar o conteúdo certo não é alerta. - Ficha congelada do Marçal. Como o mapa do PRTB passou a apontar para o Avalanche, a linha errada de 15/09 nunca mais seria sobrescrita. Reescrita com a chapa real dele (vice Leonardo Avalanche, SQ 280002553883) nos dois bancos.
Alterado
- Roster:
leonardo-avalanchevolta acandidate,pablo-marcalviradropped. Pela regra do roster (quem consta no TSE entra, mesmo sub judice): Avalanche estáPendente de julgamentoe apto; Marçal,Indeferidoe inapto. Seguem 13 candidatos ativos — a troca é 1:1. As duasnotesforam reescritas com a base factual e as datas. Avalanche ficoudroppedde 16/08 a 16/09, então nesse mês ele só tem menção cruzada (17 → 8 → 5 → 4 artigos por semana, contra 51–57 antes): a busca dedicada estava desligada, e esse buraco não se recupera. - Patterns do Avalanche ganham a vice nova (Silvia Hellen da Silva Pereira), sempre coladas ao titular — "Silvia" sozinha é nome comum demais. Scan retroativo desde 16/08: +10 pares.
- Duas chapas no mesmo número de urna cruzavam titular e vice. O TSE indeferiu o registro de Pablo Marçal em 11/09 (inelegível até 2032) e o PRTB protocolou a substituição pelo vice, Leonardo Avalanche, em 14/09, último dia do prazo. Enquanto o TSE não julga, o CSV serve as duas chapas no nº 28 — e o coletor fazia
-
v4.55.0 2026-09-13 A API pública discordava do painel em 526 artigos Adicionado
total_articles_imprensaearticles_today_imprensano/api/v1/stats. Passam a existir os pares que faltavam: os campos sem sufixo continuam sendo o acervo bruto — o tamanho da coleta — e os_imprensasão a medida de cobertura, a mesma que o painel exibe. Quem cita "quantos artigos" usa os segundos. A nota dometaexplica a diferença em vez de deixar o leitor descobrir sozinho.
Corrigido
- A API dizia 78.537 artigos enquanto a home dizia 78.011.
/api/v1/statslia a tabelaarticlescrua, com os porta-vozes (partidário, sindical, movimento) e os oficiais que a regra da casa exclui da cobertura de imprensa desde 02/09. São 526 artigos de diferença, e o painel passou nove dias discordando de si mesmo. O curioso é que o problema já tinha sido visto: em 04/09 ele foi corrigido no mesmo arquivo, mas só para as fontes — nasceu ali ototal_sources_imprensa, e os artigos ficaram para trás. - O resto da API v1 agora lê a mesma coisa que as páginas. Não era só o
stats: as fontes que cobrem cada candidato, as séries de sentimento e de tópicos, a listagem de artigos e a ficha por id liam o acervo bruto, enquanto as páginas equivalentes leem a view. Dezesseis consultas ao todo. Ficam deliberadamente brutas apenas as três contagens dostatsque existem para dizer o tamanho da coleta, e agora estão marcadas como tal no código. - A página
/apichamava detotal_articlesum número que era de imprensa. O valor exibido sempre veio da home, correto; o nome da variável é que apontava para o campo errado da API — e o rótulo dizia só "artigos". Nome, valor e rótulo agora concordam. - O hero de
sapienslabs.com.br/eleicoes-2026mostrava 78.652 artigos e 1.968 veículos. O script que sincroniza esses números todo dia contava o acervo bruto — e, no caso dos artigos, sem sequer aplicar o recorte de 25/03, apesar de o rótulo dizer "desde 25/03/2026"; o dos veículos dizia "imprensa BR" contando partidários e oficiais. Uma terceira régua, portanto, na página que apresenta o projeto. Corrigido para a régua do painel: 78.011 e 1.909. Os rótulos agora descrevem o que de fato é contado ("Artigos de imprensa", "Veículos · de imprensa, no Brasil"). O detalhe que torna isso urgente: é neste mesmo blog que sai a série *18 respostas sobre a imprensa*, e a página e os textos diriam números diferentes sobre a mesma coisa. - O teste-guarda não olhava a API.
tests/test_articles_imprensa.pyvarria uma lista de arquivos escrita antes deapp/api/v1.pyexistir; passava em verde sobre o arquivo onde o bug morava. Agora varreapp/inteiro por descoberta, com exceções explícitas: arquivo novo nasce coberto, e sair da cobertura exige um gesto que aparece no diff. Entrou também oscripts/update_site_stats.py, pela mesma razão — mora fora deapp/, mas apresenta número em página pública. Somam-se dois testes que prendem a simetria — contagem bruta sem par de imprensa reprova, e par que não leia a view reprova.
-
v4.54.1 2026-09-12 Todo domingo sumia do gráfico semanal Adicionado
- O seletor de período sabe dizer quais janelas o arquivo cobre. Aqui a guarda não dispara: a série começa em 25/03 e a maior janela do seletor são 90 dias. Ela entra porque o motor é transplantado entre os painéis, e guarda que existe só num deles é exatamente a que se perde na cópia seguinte — foi o que aconteceu com o selo de novidade, que nasceu aqui e desembarcou no monitor do STF sem a pergunta "há passado para comparar?". No irmão, com sete dias de acervo, a marcação acusa três dos seis botões.
Corrigido
- A semana do Zeitgeist não engole mais o domingo. "Evolução semanal por cluster" calculava o início da semana com
'-' || (strftime('%w', d) - 1) || ' days'. No domingo%wé 0, a conta dá −1 e o modificador sai como'--1 days'— inválido. O SQLite não reclama: devolve NULL. O resultado é que todo domingo desaparecia da série, calado, desde que o gráfico existe. Medido no acervo antes de corrigir: **1.220 artigos publicados em domingos e 1.428 pares artigo×cluster caindo em NULL**; com a expressão nova, zero. O cálculo virou a funçãosql_semana(), com a explicação do defeito junto, e ganhou cinco testes — inclusive o que prende o erro mais provável de quem for consertar por conta própria: jogar o domingo para a semana seguinte em vez da anterior. O mesmo defeito e a mesma correção foram para ostf-monitor.
-
v4.54.0 2026-09-12 O painel se cala quando não tem passado; a rubrica das entidades ganha quatro regras Corrigido
- Nenhuma régua comparativa aparece sem arquivo que a sustente. "NOVO" e "N×" dizem que um assunto não existia no período anterior — afirmação que vira mentira quando o banco simplesmente começa depois do início daquela janela. O caso apareceu no painel irmão do STF, que tem seis dias de acervo e por isso marcava os cinco temas em alta como novos, incluindo um inquérito que corre desde 2019: o selo descrevia a idade da coleta, não o noticiário.
tem_base_de_comparacao()agora compara o começo do arquivo com o início da janela anterior; sem cobertura, o selo some, a lista passa a ser ordenada por volume, o título vira "Os temas do período" e a legenda diz o que a lista realmente mostra. No Eleições a guarda nunca dispara hoje (o acervo cobre desde 25/03), e é exatamente por isso que ela entra: a janela mensal quebraria se algum dia recuasse para antes disso. Seis testes novos, quatro puros e dois que renderizam o partial. O mesmo código foi para ostf-monitor. - O detalhe da entidade não é mais decepado no meio da palavra. O teto de 40 caracteres cortava "chapa de Romeu Zema (Novo)" em "chapa de Romeu Zema (No" — e o painel passava a informar que o governador de Minas comanda um estado chamado "No". O teto subiu para 60 e o corte passou a respeitar a fronteira de palavra (
corta_detalhe), aparando pontuação órfã. Os 718 artigos cujos vínculos tinham sido truncados foram reprocessados com trilha de auditoria: 4.946 vínculos reescritos, zero falhas. A limpeza cega foi descartada no caminho — aplicar o corte novo sobre um texto já truncado apagaria "Master" de "Banco Master" sem ter como saber. - A coluna
grafiaguarda o que a matéria escreveu, não o nome normalizado. Ela existe para registrar como cada veículo se refere à pessoa, e estava recebendo uma cópia do nome canônico — o dado que ela deveria preservar se perdia na gravação. Quando o modelo não devolve grafia, o campo fica nulo em vez de copiar o nome.
Alterado
- Rubrica de entidades v1.2 — quatro decisões editoriais. Candidato a vice é
candidato, com "vice" no detalhe, nunca herdando o papel do titular. "Ex-candidato" saiu: quem nunca teve candidatura oficializada não é ex-nada, e volta a ser descrito pela profissão ou pelo cargo — ou "pré-candidato", o termo que a casa usava antes do registro. Senador que disputa a Presidência é senador ou candidato conforme o assunto da matéria, porque as duas descrições são verdadeiras e a precisão está no contexto. E parentesco só entra quando o texto o afirma: 25 vínculos descreviam Michelle Bolsonaro como esposa de Flávio, erro que a versão anterior deixava passar. "Ex-primeira-dama" fica, por decisão do editor — é o termo da imprensa e um lugar real na política brasileira. - Rubrica v1.3 — grafia e apelido. O prompt ganhou seção própria para a grafia (devolver o trecho como está na matéria) e a regra do apelido: "Lulinha" não vira um nome completo inventado. Um erro de nome que aparecia no painel era do veículo; outro o modelo tinha construído sozinho a partir do apelido.
- 33 fusões de alias curadas, com as cinco armadilhas preservadas: homônimos e quase-homônimos que pareciam a mesma pessoa e não são ficaram registrados no cabeçalho da tabela, para ninguém refazer a fusão por engano no futuro.
Adicionado
- A passada de entidades entra no
run_coleta.sh, depois da de acontecimento, com teto de 400 artigos por rodada e sem ceder a vez (já está dentro da coleta). Provada em produção: 71 artigos, 461 entidades, 1,9 minuto. - Gabarito de 60 casos em
docs/serie/apuracao/gabarito-entidades.csv, com coluna humana e nota: 51 acertos, 85%. As divergências foram de classificação, não de invenção — nenhuma pessoa extraída deixou de existir no texto. O verbete "Entidades" da página de método carrega o carimbo da aferição e as quatro regras.
- Nenhuma régua comparativa aparece sem arquivo que a sustente. "NOVO" e "N×" dizem que um assunto não existia no período anterior — afirmação que vira mentira quando o banco simplesmente começa depois do início daquela janela. O caso apareceu no painel irmão do STF, que tem seis dias de acervo e por isso marcava os cinco temas em alta como novos, incluindo um inquérito que corre desde 2019: o selo descrevia a idade da coleta, não o noticiário.
-
v4.53.1 2026-09-12 As análises descem para depois do dado Alterado
- "Análises da série" sai da segunda posição da home e vai para a quarta, logo depois de "Os últimos dias na cobertura" (decisão do editor, 12/09 de madrugada). A seção abria a página antes de qualquer número: o leitor recebia a leitura editorial da casa antes da evidência que a sustenta, e a arte do bloco principal ocupava a primeira dobra inteira no celular. A ordem agora é o assunto que domina → a curva dos últimos dias → o que escrevemos sobre isso → manchetes extremas → cobertura crua. A seção continua acima do rodapé porque é o único caminho da home para o blog. Só o
{% include %}mudou de lugar; o partial e o feed estão intactos.
- "Análises da série" sai da segunda posição da home e vai para a quarta, logo depois de "Os últimos dias na cobertura" (decisão do editor, 12/09 de madrugada). A seção abria a página antes de qualquer número: o leitor recebia a leitura editorial da casa antes da evidência que a sustenta, e a arte do bloco principal ocupava a primeira dobra inteira no celular. A ordem agora é o assunto que domina → a curva dos últimos dias → o que escrevemos sobre isso → manchetes extremas → cobertura crua. A seção continua acima do rodapé porque é o único caminho da home para o blog. Só o
-
v4.53.0 2026-09-12 A série passa a 18 peças; passada de acontecimento aprovada Alterado
- A série vira "18 respostas sobre a imprensa" (decisão do editor, 11/09 à noite). Entrou a peça 16, "Quem a imprensa escolhe para explicar" (30/09) — quem a imprensa chama para interpretar a disputa, quantos analistas, de que instituições e com que concentração. Ela nasceu de uma pergunta sobre a passada de entidades e é irmã da 15: as duas saem da mesma classificação, uma é a rede de quem faz a política, a outra a lista de quem a explica. Os planos de governo passaram para 01/10 e o fecho para 02/10, dois dias antes do primeiro turno. O total também deixa de ser 17, que é o número histórico de um dos candidatos.
config/serie_calendario.jsoné a fonte única: a página de método, o lembrete de véspera e o pacote de apuração leem dali. - O verbete "Entidades" da página de método diz agora que a passada registra tanto quem faz a política quanto quem a imprensa chama para explicá-la, com papel de lista fechada; ficam de fora o que não é pessoa e quem assina a matéria.
- Teste do lembrete de véspera reescrito. Ele afirmava títulos provisórios e ficava vermelho a cada revisão editorial (aconteceu em 11/09). A mecânica da mensagem passou a ser testada contra um calendário sintético; do calendário real só se afirma o que não pode mudar — dias seguidos, numeração contígua, pauta de trabalho única, nada em branco e o número do nome batendo com o de respostas.
Adicionado
- Gabarito da passada de acontecimento: 55/60 = 91,7%, aprovado (piso 80%). O rótulo do acervo fechou com 77.557 artigos e 34.950 acontecimentos, sem faltantes, em 4h35, cedendo a vez à coleta. Julgamento linha a linha em
docs/serie/apuracao/gabarito-acontecimento.csv; análise das cinco divergências no rodapé dedocs/serie/acontecimento-rubrica.md.
- A série vira "18 respostas sobre a imprensa" (decisão do editor, 11/09 à noite). Entrou a peça 16, "Quem a imprensa escolhe para explicar" (30/09) — quem a imprensa chama para interpretar a disputa, quantos analistas, de que instituições e com que concentração. Ela nasceu de uma pergunta sobre a passada de entidades e é irmã da 15: as duas saem da mesma classificação, uma é a rede de quem faz a política, a outra a lista de quem a explica. Os planos de governo passaram para 01/10 e o fecho para 02/10, dois dias antes do primeiro turno. O total também deixa de ser 17, que é o número histórico de um dos candidatos.