Lastro — índice técnico
Lastro reúne dados públicos do TSE e números agregados da conversa nas redes. Nenhuma conclusão está embutida: os painéis mostram números e deixam o cruzamento para quem analisa.
Painéis
| Página | O que faz |
|---|---|
**/** — início | Página de entrada: apresenta o Lastro, as três ferramentas, o modo de usar em quatro passos (com um exemplo calculado na hora pelo briefing), materiais para baixar e as regras da casa. Código em assets/inicio.js. |
**/#/explorar** — explorador | Drill-down Brasil → região → estado → município com URL compartilhável; mapa, ranking, distribuição, relação entre indicadores e tabela (com CSV do recorte); ficha de cada território com participação, resultado presidencial, posição relativa, composição do eleitorado e abstenção por perfil 2022; comparação de até 4 territórios; modo escuro. Lê dados/ (gerado por ferramentas/gera_dados_app.py). |
**/#/briefing** — briefing de público | Para equipes de comunicação e audiovisual. Escolhe território (Brasil, região ou UF; sem capital; porte), público (gênero, faixa etária, escolaridade; atalhos prontos) e objetivo (persuadir, mobilizar, orientar o voto). Devolve público estimado, quanto dele ficou em aberto no 1º turno (abstenção, branco, nulo ou outro candidato, conforme o objetivo) e os 20 municípios onde ele mais se concentra, ordenados por volume (em eleição presidencial a margem municipal não muda o peso do voto), com link para os locais de votação no site independente Onde dá pra conversar; frases citáveis com fonte, diretrizes de conteúdo, o que não afirmar, cuidados legais, card PNG 1080×1350, CSV e link. Público estimado supõe independência entre gênero, idade e escolaridade (ordem de grandeza, não contagem); "indeciso" é aproximado por quem não escolheu nenhum finalista. Código em assets/briefing.js. |
**/#/rede** — redes sociais | Volume e tom (negativo, neutro, positivo) da conversa sobre a eleição nas redes, por tema, termo e faixa de 4 h; picos e palavras mais ditas. Bluesky, mais um bloco de fontes abertas: buscas em alta do Google Trends ligadas à eleição, manchetes do Google Notícias por tema e vídeos de uma lista revisável de canais do YouTube (monitor/canais_youtube.json), em dados/rede/abertas.json. Só agregados: ferramentas/importa_rede.py copia do monitor-de-rede por lista fechada e recusa a gravação se encontrar link ou perfil. Avisos de representatividade e acurácia do classificador ficam na própria tela. Código em assets/rede.js. |
**/relatorios/conjuntura-01/** | Boletim de conjuntura nº 01, Quem não escolheu: perfil da abstenção, dos brancos e dos nulos (HTML e PDF). Gerado por ferramentas/relatorio_conjuntura.py + ferramentas/pdf_relatorio.js. |
**/dashboard.html** | Dashboard anterior, mantido para referência. |
**/indicadores.html** | Todos os indicadores da base como cor, ordenação e filtro, um mapa só. Para varredura rápida. |
**/perfis.html** | Abstenção por perfil demográfico. Escolhe-se a dimensão (faixa etária, escolaridade, gênero, estado civil) e o perfil; o mapa mostra a taxa de abstenção daquele perfil em cada município. |
**/mudanca.html** | Margem do 1º turno entre 1º e 2º colocado × votos em jogo × composição do eleitorado. Filtros por margem máxima, mínimo de eleitores e mínimo de escolaridade baixa. |
**/abstencao.html** | Abstenção 2026 por município × densidade de um público-alvo demográfico. |
**/rio.html** | Rio de Janeiro em detalhe: bairro → zona eleitoral → seção (12.809 seções). |
**/cruzamento.html** | Cruzamento. Nível (município · zona · seção por UF), dois indicadores (X e Y), busca e mínimo de eleitores. Mostra mapa, dispersão com correlação de Pearson, ranking, histograma e tabela — os 525 indicadores da base entram como opção. A seção é carregada sob demanda (um arquivo por UF). |
Todos com fundo vetorial próprio (malha do IBGE) — sem serviço de tiles e sem chave de API.
Identidade visual
Tema claro único. Cores como papéis em assets/app.css (:root): verde-musgo #1F5C45 (principal), lilás #D9CCF5 (destaque), ocre #E39A4C (alerta e tom negativo), grafite #1B1D1A e pedra #F1F1EC. Fontes auto-hospedadas em assets/fontes/ (licença OFL, sem chamadas ao Google): Archivo condensada nos títulos, Hanken Grotesk no texto e IBM Plex Mono nos rótulos. Bordas de 2 px, cantos retos e sombras deslocadas. Cores de candidatos e a escala divergente do mapa não mudaram.
Acessibilidade
O dashboard e os painéis seguem práticas de acessibilidade verificáveis no próprio código:
- link "pular para o conteúdo", marcos semânticos (
header,nav,main,sectionrotuladas) - todos os controles são nativos (botão, seleção, campo) — funcionam por teclado e leitor de tela
- gráficos em SVG com nome acessível, e a tabela de dados serve de alternativa textual aos gráficos
- tabela com
<caption>, cabeçalhos comscopeearia-sortna ordenação - região
aria-liveanunciando o efeito dos filtros - contraste AA, foco visível, alvos de toque de 44px ou mais, respeito a
prefers-reduced-motion - nenhuma informação depende só de cor — todo valor aparece em número ao lado
Há um verificador estático no repositório: python3 a11y_check.py <arquivo.html>. Ele não substitui teste com leitor de tela, mas pega as falhas mais comuns.
Bases
Auditoria (07/10/2026): perfil e resultado conferem com os números oficiais do TSE até a unidade; ver [AUDITORIA.md](AUDITORIA.html).
dados/ — bases do explorador
Geradas por python3 ferramentas/gera_dados_app.py a partir de base_brasil_2026.csv e base_abst_perfil_2022.csv. Guardam contagens brutas por município; estado, região e Brasil são somados no navegador, então toda taxa é razão de somas. Rode o script de novo sempre que as bases da raiz mudarem.
base_uf_2026.csv e base_regiao_2026.csv — corrigidas em 10/2026
Reconstruídas por ferramentas/corrige_bases.py a partir da base municipal. A versão anterior somava c1_*…c12_* por posição (o 1º colocado de cada município, fosse quem fosse) e somava percentuais (Acre: c1_pct = 1403); margem_1o_2o_pts herdava o erro. Agora os votos são somados por candidato e reordenados no agregado, e toda taxa é razão de somas. Contagens (eleitores, comparecimento, perfil) não mudaram.
base_brasil_2026.csv — 5.757 linhas × 117 colunas
Uma linha por município. Fonte: portal oficial de resultados do TSE, eleição 2026 1º turno, totalização final; mais perfil do eleitorado 2026.
Colunas principais:
| Coluna | Significado |
|---|---|
uf, municipio, cod_municipio, regiao | identificação |
latitude, longitude | centroide do município (dos locais de votação) |
eleitores_aptos | eleitorado apto |
comparecimento, abstencoes | votantes e faltosos |
taxa_abstencao, taxa_comparecimento | informadas pelo TSE |
pct_abstencao, pct_brancos, pct_nulos, pct_validos | % sobre eleitores aptos |
votos_validos, brancos, nulos | contagens do 1º turno |
secoes_totalizadas, secoes_total | seções |
perfil_total | eleitorado no perfil 2026 |
faixa_*, escolaridade_*, genero_*, estado_civil_*, raca_* | composição do eleitorado (contagens brutas) |
c1_* … c12_* | candidatos à Presidência por volume no município (nome, partido, votos, %) |
margem_1o_2o_pts | (votos 1º − votos 2º) ÷ comparecimento, em pontos |
base_uf_2026.csv e base_regiao_2026.csv
Os mesmos indicadores agregados por estado (28 linhas) e por região (6 linhas).
base_abst_perfil_2022.csv — 216.507 linhas
Abstenção por perfil demográfico, por município. Formato longo: uma linha por município × dimensão × grupo. Fonte: TSE, Perfil de Comparecimento e Abstenção 2022, 1º turno.
| Coluna | Significado |
|---|---|
uf, cod_municipio, municipio | identificação |
dimensao | faixa_etaria · escolaridade · genero · estado_civil · cor_raca |
grupo | ex.: "21 a 24 anos", "ENSINO MÉDIO COMPLETO", "MASCULINO" |
aptos, abstencoes, taxa_abst | todas as faixas de idade (inclui voto facultativo) |
aptos_obrig, abst_obrig, taxa_obrig | só voto obrigatório — este é o número correto |
**Use taxa_obrig.** A taxa bruta mistura quem tem voto facultativo (16–17, 70 anos ou mais, analfabeto), o que infla artificialmente a abstenção dos extremos de idade.
base_secao_2026_<UF>.csv — 28 arquivos (27 UFs + ZZ), uma linha por seção eleitoral
Fonte: TSE, detalhe da apuração por seção eleitoral 2026 (eleitorado, comparecimento, abstenção, local de votação, modelo de urna) + votação por seção eleitoral 2026 (Presidente vem do arquivo nacional; Governador/Senador/Deputados do arquivo da UF) + eleitorado por local de votação 2026 (bairro, CEP, coordenadas).
| Coluna | Significado |
|---|---|
uf, regiao, cod_municipio, municipio | identificação |
zona, secao, local_votacao, bairro, cep | seção e local |
latitude, longitude | coordenada do local de votação |
aptos, comparecimento, abstencoes, taxa_abstencao | eleitorado e abstenção da seção |
secao_instalada, secao_anulada, modelo_urna | estado da seção na eleição |
pres_<candidato>, pres_branco, pres_nulo | votos por candidato a Presidente na seção |
gov_<candidato>, sen_<candidato>, gov_branco, gov_nulo, sen_branco, sen_nulo | cargos estaduais (só na UF) |
votos_dep_federal, votos_dep_estadual | total do cargo de deputado (o detalhe por candidato a deputado não entra: são centenas por UF) |
Total: 497.897 seções. O layout é o mesmo nos 28 arquivos; o conjunto de colunas varia porque cada UF tem seus próprios candidatos.
base_zona_2026.csv — 6.106 linhas, uma por zona eleitoral
base_municipio_secao_2026.csv — 5.571 linhas, uma por município
Os mesmos indicadores de base_secao_2026_<UF>.csv, somados. É a base que o painel /cruzamento.html carrega na abertura.
base_candidato_zona_2026.csv — 198.666 linhas
Formato longo: uf, cod_municipio, municipio, zona, cargo, candidato, votos. Traz todos os candidatos majoritários (Presidente, Governador, Senador) por zona — não só os mais votados. Para comparar candidatos, filtre por cargo.
base_mudanca.csv, base_nacional.csv, base_rio.csv
Bases que alimentam os painéis mudanca, abstencao e rio.
Fontes e datas
| Dado | Fonte | Data de referência |
|---|---|---|
| Abstenção, comparecimento, votos, candidatos | TSE — portal oficial de resultados | eleição 2026, 1º turno, totalização final |
| Abstenção e votos por seção eleitoral | TSE — dados abertos, "detalhe da apuração por seção eleitoral 2026" (gerado em 05/10/2026) e "votação por seção eleitoral 2026" | eleição 2026, 1º turno |
| Local de votação, bairro, coordenada | TSE — dados abertos, "eleitorado por local de votação 2026" (gerado em 06/10/2026) | 2026, 1º turno |
| Composição do eleitorado | TSE — perfil do eleitorado 2026 | 2026 |
| Abstenção por perfil demográfico | TSE — perfil de comparecimento e abstenção | 2022, 1º turno |
| Contornos de estados e município | IBGE — malhas territoriais | — |
Limitações — leia antes de usar em decisão
- Perfil demográfico é de 2022, não de 2026. O TSE publica abstenção por faixa/escolaridade/gênero até 2022. Para 2026 existe a abstenção geral por município (essa é de 2026), mas não aberta por demografia. O painel
/perfis.htmlinforma isso no cabeçalho. - Composição demográfica não prediz voto nem abstenção. Testado em escala nacional: a correlação entre densidade dos perfis e taxa de abstenção é praticamente nula (−0,10). Use o perfil para saber com quem falar e onde ele está, não como previsão.
- Abstenção não é voto recuperável. Parte de quem falta não vota nem com mobilização (mudou de cidade, desencanto, dificuldade de acesso). Qualquer número de "votos recuperáveis" é teto teórico, nunca previsão.
- Margem não é volatilidade. Margem apertada indica disputa, não movimento. Comparar com 2022 exigiria a série histórica, que este portal do TSE não serve.
- Cor/raça é inutilizável. Predomina "NÃO INFORMADO" (no Rio, 4,7 milhões de 5 milhões). Por isso foi retirado do painel de perfis.
- Cobertura: 5.569 dos 5.757 municípios têm perfil e coordenada. Os 188 restantes são quase todos do exterior (seções no exterior não têm centroide no Brasil).
- **A coluna
nulosomite 5.246 votos** que o TSE inclui no total oficial de nulos (3.674.249): em 1.668 municípios, comparecimento > válidos + brancos + nulos. Para o número oficial, use comparecimento − válidos − brancos (o explorador já faz isso). - 40 localidades no exterior não tiveram votação (aptos > 0, comparecimento e abstenção zerados). O explorador mostra suas taxas em branco, não como 0%.
- Distrito Federal não consta do arquivo de abstenção por perfil 2022.
- Serra do Navio (AP) e Fernando de Noronha (PE) não têm local de votação geocodificado; recebem a coordenada da sede municipal.
- Alguns municípios têm seções sem dado de abstenção — são seções criadas após a eleição anterior. No Rio são 591 seções e 177.279 eleitores (3,6%), aparecendo marcadas no painel
/rio.html. - A base por seção não tem o exterior. O arquivo "detalhe da apuração por seção" do TSE traz o membro
_ZZ(exterior) vazio. Por isso a soma das seções dá 157.646.356 aptos contra 158.745.463 do TSE — a diferença de 1.099.107 (0,69%) é praticamente toda do exterior (916.534 eleitores, que aparecem embase_uf_2026.csv). O resto — de 0,04% a 0,26% por UF — é diferença sistemática entre a soma das seções e o total oficial (seções não instaladas/anuladas e a nota de transferência temporária). Abstenções: 32.877.871 na base contra 33.469.244 do TSE (−1,77%), mesma causa. O relatório completo, UF por UF, está em/RELATORIO_AUDITORIA_SECAO.txt. - Abstenção por seção inclui voto facultativo. No nível de seção não há como separar 16–17 anos, 70+ e analfabetos (isso só existe em
base_abst_perfil_2022.csv, por município).taxa_abstencaoé abstenção ÷ aptos, sem esse recorte. - Voto de deputado não está por candidato. São centenas de candidatos por UF; na base por seção ficou só o total do cargo (
votos_dep_federal,votos_dep_estadual). Para candidato a deputado, usarbase_candidato_zona_2026.csvnão resolve — ele cobre só os cargos majoritários.
Rotina das redes sociais
O código da coleta está em monitor/ (ver monitor/LEIA-ME.md). A coleta roda num computador onde a busca do Bluesky responde; um comando faz tudo:
python ferramentas/rotina_rede.py
monitor/painel_pipeline.py atualizar(se mais de 5% das requisições falharem, para e não publica);painel_pipeline.py exportar;ferramentas/importa_rede.py(só agregados; recusa link ou perfil);- commit de
dados/rede/e push para omain; a Vercel publica em seguida.
Para agendar a cada 4 horas: powershell -ExecutionPolicy Bypass -File ferramentas\agenda_rotina_rede.ps1. Cada execução fica registrada em ferramentas/rotina_rede.log. Nova fonte: o monitor exporta os mesmos arquivos numa pasta própria e a rotina roda com --fonte youtube (ou outra).
Como reproduzir
Bases do repositório, nesta ordem:
python3 ferramentas/corrige_bases.py # agregados UF/região + coordenadas faltantes + dicionário
python3 ferramentas/gera_dados_app.py # dados/ do explorador
python3 ferramentas/valida_bases.py # integridade; sai com erro se uma base contradiz outra
python3 ferramentas/audita_bases.py # confronto com números oficiais do TSE + testes forenses
python3 ferramentas/aplica_paineis.py # painéis temáticos: dados inline, lógica em assets/paineis/
Painéis temáticos — dados e comportamento separados. Os geradores emitem cada painel com os dados inline (const PTS=…, const P=… etc.). aplica_paineis.py mantém só essas linhas e liga o painel a assets/mapa-tematico.js (mapa, escala de cor com legenda, lista acessível, "ver tudo", foco no item) e a assets/paineis/<painel>.js. Rode-o depois de qualquer regeração: sem ele, o painel volta à lógica antiga (arco-íris sem legenda, mapa achatado pelo layout).
valida_bases.py tem que terminar com 0 erro(s) antes de publicar. Os avisos que ele emite são características conhecidas do dado do TSE (listadas também em "Limitações").
Os geradores dos painéis temáticos ficam em ~/contra-desinfo/ (fora do repositório): base_final.py, abst_perfil_2022.py, base_secao_2026.py (base por seção, zona e município), agrega_candidato_zona.py, painel_*.py (inclui painel_cruzamento.py), painel.py (Rio), vetorial.py, gera_dicionario.py, auditoria_secao.py, harness.js, teste_numerico.js, a11y_check.py, publicar.sh, publicar_secao.sh. Dois cuidados: o painel antigo agora se chama dashboard.html — se publicar.sh ainda escreve index.html, ele apaga o explorador; e se base_final.py regerar base_uf_2026.csv/base_regiao_2026.csv, o erro dos c*_ volta. Rode corrige_bases.py depois dele, ou corrija a soma lá.