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

  1. v4.52.1 2026-09-11 Links de texto visíveis na prosa

    Corrigido

    • Link dentro de texto corrido aparecia como texto comum (achado do editor na página de método da série: "Candidatos" no verbete "Os 13" tinha link e ninguém veria). O reset global de <a> do painel, feito para a navegação e os cards, apagava cor e sublinhado também na prosa. A prosa, as ledes de hero e de seção passam a usar o token --link do DS 1.7.0 (par dark/light com contraste AA) com sublinhado, como o tema do blog já fazia. A cópia local do DS ganhou a camada de prosa do 1.7.0 (--link, --link-visited, --prose-*), que faltava.
  2. v4.52.0 2026-09-11 Método e glossário da série; acontecimentos na metodologia

    Adicionado

    • /metodologia/serie: a página de método e glossário da série "17 respostas sobre a imprensa" (decisão do editor, 02/09: uma página, extensão da metodologia, com âncora por verbete). Como cada peça nasce (apuração na véspera, escrita em sessão, um gráfico por peça, CC BY 4.0), o que os números medem e não medem, a programação lida do calendário da série e 27 verbetes com endereço próprio (declaratório, escada de voz, espectro, rajada, tapete…). É o link fixo da caixa "Como este texto foi feito". A metodologia principal ganhou ids nas seções e o link para a série; a página entra no sitemap.
    • Seção "Acontecimentos — o que aconteceu, não o assunto" na metodologia: a passada que nomeia acontecimentos a partir das rajadas por tópico e rotula cada matéria pelo fato de que trata; rubrica versionada no código.
  3. v4.51.0 2026-09-08 Análises da série com três posts; a extra dispara no fim da rodada

    Mudado

    • "Análises da série", na home, passa a mostrar os três posts mais recentes (decisão do editor, 08/09, no dia da primeira edição extraordinária): o mais recente à esquerda, como o card de sempre, com imagem e excerpt; os dois seguintes à direita, em cards compactos com imagem, etiqueta, data e título, sem excerpt. A etiqueta diz o tipo, Resumo semanal, Balanço mensal ou Extra, lida das tags do post no blog. No celular, coluna única.

    Corrigido

    • A edição extraordinária não se perde mais quando a coleta das 21h fecha depois das 22:30. O produtor era disparado por um horário fixo, e em 08/09 a primeira extra armada ("polícia federal", 113 matérias, 23 vezes a média do tópico) ficou sem texto porque o gatilho armou às 22:37; saiu com disparo manual. Agora a própria rodada dispara o produtor assim que fecha, e o horário fixo vira rede de segurança.
  4. v4.50.1 2026-09-04 Espelhos fora do índice; títulos de busca; o perfil do host vence o rótulo velho

    Mudado

    • Páginas-espelho de matéria (/cobertura/…) recebem noindex,follow. Elas já apontavam o canonical para o veículo, mas o Google seguia ranqueando 960 delas: 225 dos 278 cliques do painel em três meses (Search Console) vinham de buscas pela manchete dos outros — 149 de uma só, um quiz. Decisão do editor: não competimos com o veículo na busca. Os links continuam sendo seguidos.
    • /candidatos e /panorama com título e descrição de busca: "Candidatos a presidente 2026: os 13 nomes e a cobertura de cada um", com os nomes no texto (o painel aparecia na posição 92 para essa busca), e "Cobertura da imprensa nas eleições 2026, dia a dia".
    • Todas as rotas usam a assinatura atual do TemplateResponse (request primeiro) — as antigas falhavam no Starlette 1.x dos testes.

    Corrigido

    • O perfil revisado do host passa a vencer qualquer rótulo anterior do artigo. O refresh só trocava rótulos vazios, "unknown" ou propostos; 905 artigos ficaram com o rótulo do mapa manual antigo mesmo depois de o editor aprovar outro para o host — Diário Carioca com 391 "centro" e perfil "esquerda", Tribuna do Sertão com 267 "centro" e perfil "sem posição declarada". A proveniência gravada espelha o status do perfil (manual ou aprovado).
  5. v4.50.0 2026-09-04 Um slug por veículo: canonização por host

    Mudado

    • canonical_source() olha primeiro o HOST da URL. O mesmo veículo entrava com o nome do feed ("Diário Carioca") e com o domínio do buscador ("diariocarioca.com") e virava dois veículos: 319 hosts assim no acervo. Agora host conhecido vira o slug canônico, host desconhecido vira o próprio host, e o nome só decide quando a URL é opaca (Google News, encurtadores). Os cinco coletores e o backfill passam a URL. Efeito colateral bom: 85 artigos da Folha que vinham pelo feed da UOL como uol voltam para folha-sp, e as chaves-domínio do dicionário do blog que estavam "mortas" desde 31/08 voltam a casar. API: muitos slugs informais mudam (nome → domínio); os canônicos não.
    • archive.ph, archive.is, archive.today e web.archive.org na lista negra da coleta (arquivador não é veículo — a matéria é de outro; um deles saiu como "veículo" em Fontes consultadas do mensal). Os 4 artigos existentes saem do acervo com cópia de segurança. TSE e TRE-SP aprovados como oficial: estavam como proposta da máquina e por isso ainda contavam como imprensa.
    • Fila de canonização de 01/09: SpaceMoney, Ponta Negra News, Banzeiro News e Vero Notícias ganham slug canônico; junto com os da lista abaixo, são os "12 veículos" que esperavam desde a revisão do semanal.
    • Doze slugs do topo da coleta viram dez veículos canônicos (src/source_normalize.py). A BBC aparecia em três nomes (bbc, bbc-brasil, bbc.com), O Tempo e CBN em dois (o-tempo/otempo.com.br, cbn/cbn.globo.com), e Band, O Dia, Rádio Itatiaia, Diário Carioca, Agora RN, Imirante, Tribuna do Agreste e o Pravda em português só existiam como slug informal, sem nome de exibição. A peça 11 (O eco) agrupa republicações por slug — slug partido vira dois veículos onde há um. Atenção, API: source= muda para esses veículos (bbc → bbc-brasil, cbn.globo.com → cbn, otempo.com.br → o-tempo, band.com.br → band, odia.ig.com.br → o-dia, rádio-itatiaia → itatiaia, diário-carioca → diario-carioca, imirante.com → imirante, portuguese.news-pravda.com → news-pravda); os slugs antigos deixam de existir no acervo após o backfill.
    • Content-Signal: search=yes, ai-input=yes, ai-train=yes no robots.txt do painel. Decisão do editor (04/09): o que é CC BY 4.0 não bloqueia IA, e a permissão fica explícita em vez de ausente. A política gerenciada do Cloudflare só escreve ai-train=no; foi desligada e o sinal nasce na origem, aqui e no blog (tema 2.6.91).
    • espectro.py --sync-slugs: ressincroniza source_profile.slugs com os slugs dos artigos, para a página dos veículos escolher o nome de exibição certo depois de uma canonização.

    Corrigido

    • BBC News Brasil é centro, e a rubrica passa a dizer por quê. O mapa manual tinha marcado bbc.com como internacional em 02/09; a entrada nunca chegou aos artigos (o refresh casa o mapa pelo nome bruto da fonte, "BBC Brasil"/"BBC", não pelo host), e em 04/09 o editor decidiu que ela estava errada: a BBC News Brasil é o braço editorial da BBC para o Brasil, redação brasileira, imprensa nacional. Regra na rubrica (v1.5): a redação brasileira de um grupo estrangeiro não é internacional; o rótulo fica para o serviço mundial. Os 466 artigos seguem centro; os 2 que tinham pegado internacional pelo host voltam a centro.
  6. v4.49.2 2026-09-04 Um selo só para o que foi revisado à mão

    Mudado

    • "Classificação manual" e "Aprovado em revisão" viram um rótulo só, "Aprovado em revisão", na página /veiculos, no CSV/JSON e na API (proveniencia = aprovado). Decisão do editor: "ter dois rótulos não acrescenta em muito e só gera dúvida". Para quem lê, os dois significam a mesma coisa — um editor leu o veículo e confirmou o rótulo. A origem (mapa do projeto ou proposta da máquina aprovada) segue registrada no banco, em source_profile.status, como rastro; as fontes e a justificativa da apuração continuam aparecendo quando existem.
  7. v4.49.1 2026-09-04 Rubrica da passada sem a frase contraditória; fontes de imprensa na API; Perguntar filtra por veículo

    Adicionado

    • total_sources_imprensa no /api/v1/stats. O total_sources conta hosts do acervo bruto (com partidários, sindicais, movimentos e oficiais) e um painel de terceiro o exibiu como "fontes" (2.342). O campo novo conta só veículos de imprensa, a métrica do painel; o antigo fica, documentado como bruto.
    • Perguntar: filtro de veículo em sentimento_por_veiculo e artigos, por nome ou trecho (sem acento, sem caixa): "como a Folha trata o Lula" traz a Folha mesmo fora do top 10, sem o piso de 3 artigos.

    Corrigido

    • O prompt da passada de espectro dizia, em extrema-direita, "inclui veículos de propaganda estatal estrangeira hostil à democracia brasileira". Desde a regra de precedência (03/09), veículo estrangeiro é internacional antes de qualquer eixo: a frase contradizia a rubrica pública e não existe no CLASSIFICACAO.md. Removida; rubrica da passada em v1.4. Nada já classificado muda.
  8. v4.49.0 2026-09-03 Perguntar volta, privada, sem SQL escrito por modelo

    Adicionado

    • Página /perguntar (privada, em teste). A versão de abril, despublicada em 20/04 por respostas inventadas e vazamento entre turnos, foi revista (docs/perguntar-revisao-2026-09-03.md) e reconstruída no caminho oposto: o modelo não escreve SQL. Ele escolhe uma consulta de um catálogo fechado de dez (volume por candidato, sentimento, sentimento por veículo, veículos que mais publicam, tópicos, espectro, artigos, mapa de veículos, quem fala, comparação) e preenche os parâmetros; a consulta é código do painel, lê a view de imprensa com o recorte oficial, e a tabela sai na página com o nome da consulta e os parâmetros. A prosa só pode descrever a tabela. Cada pergunta é um turno só. Parâmetro fora do catálogo, candidato fora do elenco ou pergunta fora do tema recebem recusa curta. Log próprio (perguntar_log.db) e teto diário.
    • Escada de modelos na Ollama Cloud (PERGUNTAR_MODEL, começa em gpt-oss:20b), medida no llm_usage como o resto do pipeline via gemini_client.call_ollama. scripts/perguntar_gabarito.py: 30 perguntas com a consulta esperada; sobe quem acerta 90% sem inventar consulta.
    • Privada por token: PERGUNTAR_TOKEN no .env do serviço (a unit ganhou EnvironmentFile=-), cookie via ?chave=, 404 sem ele; fora da NAV, do sitemap e com Disallow no robots.

    Mudado

    • Handler de 404 e rotas novas usam a assinatura atual do TemplateResponse (request primeiro), válida no Starlette da LXC e no do Mac, onde a antiga já não existe.
  9. v4.48.0 2026-09-03 Taxonomia 1.2: movimento social e sindical saem de "partidário"

    Mudado

    • Dois rótulos novos de natureza, movimento-social e sindical (CLASSIFICACAO.md 1.2). Ao revisar os partidários, o editor separou dois grupos que não são partido: movimentos organizados (MST, MRT, MES/PSOL, MPR, coletivos e correntes internas de partido) e sindicatos, federações, confederações e centrais, de trabalhadores ou patronais, mais entidades de classe (ACSP, ABAD, Secovi). Os três são porta-voz: ficam na coleta e fora das métricas de imprensa (a view articles_imprensa passa a excluí-los, com a mesma exigência de proveniência manual/aprovado). Rubrica da passada em v1.3, com âncoras e a regra de desempate entre os três: quem controla a linha — partido registrado, movimento ou entidade de categoria. Revisão em config/espectro_revisao_porta_vozes.csv (66 perfis: os 37 partidario + 29 com sinal de sindicato, federação ou movimento no dono, host ou justificativa), com proposta pré-preenchida para o editor decidir.
    • Flickr entra na lista negra de redes sociais (um post de junho havia passado).
  10. v4.47.0 2026-09-03 Mapa dos veículos: página, dataset e rubrica públicos

    Adicionado

    • Página /veiculos. Uma linha para cada host da coleta (~1.870), com o rótulo que vale, a proveniência em selo — classificação manual (mapa do projeto), aprovado em revisão (proposta da máquina revisada pelo editor) ou proposto pela máquina — e o motivo: quem tem menos de 10 artigos não passou pela revisão humana, e a página diz isso ao lado do rótulo. Busca por nome, domínio ou dono; filtros por rótulo, UF da sede e proveniência. Justificativa e fontes da apuração só aparecem nos perfis revisados; o texto gerado sobre os demais fica guardado, não exibido. Contagem de artigos é viva (acervo bruto, com subdomínio somado no host-pai) e não a da hora da classificação.
    • Dataset /veiculos.csv e /veiculos.json. Só perfis revisados (decisão do editor, 03/09: 1.600 textos gerados por máquina sobre veículos reais, sem revisão, não saem como dado). Colunas: host, veículo, rótulo, eixo, proveniência, UF, alcance, tipo, dono, artigos, justificativa, nota de revisão (quando o rótulo final divergiu da proposta), fontes, perna de pesquisa, versão da rubrica e data de revisão. CSV em UTF-8 com BOM (Excel pt-BR) e vírgula; JSON com meta (licença, atribuição, geração). Licença CC BY 4.0, como tudo o que o projeto produz — agora dito também no rodapé do painel.
    • Rubrica pública em /veiculos/rubrica: o CLASSIFICACAO.md que o pipeline lê, renderizado. O conversor de markdown do changelog aprendeu ##, tabelas e --- para isso.
    • espectro.py --backfill-manual: os hosts do mapa manual (~300, 69 mil artigos assinados antes de existir a tabela) entram em source_profile com status manual, rótulo modal do host, sem dossiê nem modelo. Subdomínio de perfil existente não ganha linha (herdou o rótulo do pai). Assim o mapa é UMA tabela.
    • espectro.py --resolver-fontes: o grounding devolve as fontes como redirects do Google (vertexaisearch…/grounding-api-redirect/), que expiram; a coluna nova fontes_resolvidas guarda o destino do 302 e é o que a página e o CSV mostram. fontes fica como veio, prova do que o modelo viu.

    Mudado

    • Rótulos de exibição num dicionário único (LEAN_DETAIL_PT): as tabelas de veículos tinham cada uma a própria cópia, e os rótulos novos (partidário, oficial, internacional, sem posição declarada) saíam crus numa e traduzidos noutra.
    • NAV: "Veículos" entra no grupo Análise (05); os demais renumeram. Sitemap ganha /veiculos e /veiculos/rubrica.
  11. v4.46.1 2026-09-02 Threads fora de tudo; snapshot público pelo backup online

    Corrigido

    • 31 posts do Threads saem do acervo. A lista negra de redes sociais (29/08) tinha threads.net; o Threads passou a threads.com e 31 posts entraram entre 29/03 e 25/08. Domínio adicionado à lista, posts removidos com cópia de segurança (*_social_backup_20260902), como em 29/08. Rede social não é imprensa.
    • O snapshot público deixa de ser cp do arquivo. Às 14:41 a cópia saiu com o esquema rasgado ("index idx_polls_dedup already exists") e o painel ficou vazio por cinco minutos; o banco privado estava íntegro. Copiar o arquivo de um banco em modo WAL durante um checkpoint mistura páginas velhas e novas. Agora o snapshot usa o backup online do SQLite e passa por integrity_check antes de substituir o anterior; cópia inválida mantém a versão que estava no ar.
    • pt.org.br e pcdob.org.br aprovados como partidario pelo editor (primeiras decisões do CSV de revisão). Entram na regra de exclusão das métricas de imprensa.
  12. v4.46.0 2026-09-02 Espectro por veículo: a máquina propõe, o editor decide

    Adicionado

    • Passada de espectro dos veículos (src/produtores/espectro.py, tabela source_profile). O mapa manual cobria 164 nomes; no período inteiro havia 2.228 hosts sem espectro, 244 deles com dez artigos ou mais (Band, Reuters, GZH, Diário de Pernambuco, A Tarde entre eles). Cada host sem rótulo recebe agora um perfil em dois tempos: uma pesquisa factual com grounding (Gemini + busca) produz um dossiê com fontes, e a rubrica de CLASSIFICACAO.md é aplicada sobre esse dossiê. A chave é o hostname, não o nome do veículo — duas grafias de uma redação viravam dois rótulos. O rótulo proposto fica em source_profile.status='proposto' e nunca entra na coluna que o painel lê sem decisão humana: a revisão vive em config/espectro_revisao.csv, ordenada pela confiança que o modelo declarou (os hesitantes primeiro), e --aplicar a ingere. Sem fontes de grounding a confiança tem teto de 0,5; dossiê vazio, 0,3. Gabarito contra o mapa manual (fora das âncoras citadas na rubrica): 10/10. Incremental a cada coleta para hosts novos.

    Mudado

    • Taxonomia editorial 1.1 (CLASSIFICACAO.md). Três rótulos novos: partidario (veículo controlado por partido, campanha, sindicato ou movimento — o critério é o controle da linha, não a forma: vale para o jornal com redação e para o site institucional), oficial (Estado: TSE, Câmara, Senado, gov.br) e sem-posicao-declarada (redação identificável, cobertura local, nenhuma linha documentável). internacional para veículo estrangeiro, onde o eixo esquerda↔direita é irrelevante. Diário Causa Operária (PCO) e Vermelho (PCdoB) passam a partidario. Regra de leitura: partidário e oficial ficam na coleta, mas não contam como cobertura de imprensa — saem de tom, escada de voz e espectro (aplicação nas consultas do painel em curso).

    Corrigido

    • O Diário Causa Operária carregava dois rótulos (112 artigos como extrema-esquerda, 74 como esquerda) por variantes do nome da fonte. Unificado.