Mudanças de setembro de 2026
72 mudanças registradas neste mês. O registro completo, com a explicação de por que ele existe, está em o que mudou.
23 de setembro de 2026
- /dispersao — o gráfico mais perigoso da coleção, e por isso o mais cheio de guardas ferramenta
Dois números por ente, um ponto cada: é o gráfico que mostra se duas medidas variam juntas, e é o que mais facilmente produz uma conclusão que o desenho não sustenta. Três guardas estão no código e explicadas na página. Não há linha de tendência, de propósito: ela transforma uma nuvem de pontos numa afirmação sobre a causa e sobre o futuro, e nenhuma das duas está no dado — há teste conferindo que a cena não tem traçado nenhum. A correlação não é escondida, porque esconder não protege ninguém (quem quer o argumento a calcula em outro lugar) e mostrá-la com a ressalva junto é a chance de dizer o que ela não significa; ela nunca aparece sozinha, nem no aviso nem no rodapé da tabela. E o tamanho do ente entra como terceira medida opcional, porque a explicação mais comum para duas medidas de ente público andarem juntas é banal: as duas acompanham o tamanho. O raio do círculo segue a raiz do valor, porque o olho compara área e não raio, com teste para isso. O exemplo é deliberadamente autoexplicativo: municípios e população por estado dão correlação de 0,75 por um motivo que ninguém chamaria de descoberta. Doze testes. - /histograma — o meu município é incomum? ferramenta
A pergunta civicamente útil de uma distribuição não é "qual a distribuição", e sim se um valor é incomum: um número isolado não responde nada, e o mesmo número contra a distribuição de todos os entes do porte responde muito. Por isso a ferramenta aceita um valor em destaque e diz em que percentil ele cai. Duas decisões não são de estilo. A primeira é mediana e quartis em vez de média sozinha, porque dado público é quase sempre assimétrico e poucos entes enormes puxam a média para longe de onde está a maioria — a média aparece, mas ao lado da mediana, e a ferramenta avisa quando as duas se afastam. A segunda é declarar o número de faixas, porque mudá-lo muda a forma do desenho e é o jeito mais fácil de fazer uma distribuição parecer o que se quer. Aí apareceu um detalhe que valia a pena tratar com honestidade: a largura da faixa é arredondada para um valor redondo, então o número pedido nem sempre é o obtido — em vez de fingir que bateu, a ferramenta diz quantas pediu e quantas saíram. Treze testes, incluindo a conferência de que nenhuma faixa perde o maior valor. A trava criada na rodada anterior fez efeito na hora: reprovou o build porque a página de ferramentas ainda não citava o histograma. - Os exemplos de cada ferramenta cabem num link, e /graficos vira galeria ferramenta
Cada ferramenta tinha um exemplo embutido atrás de um botão, o que obrigava a pessoa a chegar na página e descobrir sozinha que ele existia. Agora o exemplo tem endereço: /barras?exemplo=1 abre a ferramenta já funcionando, e o /mapa, que tem três, responde a ?exemplo=ride, ?exemplo=mpc e ?exemplo=diarios. O que vai para a URL é o nome do exemplo, nunca o conteúdo — exemplo é dado institucional do próprio site, e a regra de que o dado do visitante não entra no endereço continua inteira, que é o que impede um CSV de despesas de vazar no histórico do navegador. Com isso o /graficos deixa de ser só um índice e passa a ser galeria: treze links que abrem cada ferramenta com dado real do próprio site — municípios por recorte territorial, os Ministérios Públicos de Contas por estado, o registro de mudanças por mês, um CSV de portal com sete defeitos, uma tabela com nove erros de forma plantados. As treze foram verificadas uma a uma no navegador, sob os cabeçalhos de produção. - Mais dois playbooks: IBGE e Querido Diário texto
O roteiro do IBGE é o do denominador: sem população, "a cidade que mais gastou" é só "a maior cidade". Cobre as três APIs que importam — agregados para população e PIB, localidades para traduzir nome em código, malhas para desenhar —, a chamada de cada uma, e o passo a passo para juntar com o dado fiscal, que funciona porque o SICONFI usa o mesmo código de ente. Traz duas armadilhas de contagem que aparecem em qualquer trabalho sério: o país já tem mais municípios do que a malha geográfica publica, e somar Brasília com o Distrito Federal conta a mesma população duas vezes. O roteiro do Querido Diário começa pela ressalva que define o uso, e não pela chamada: menção em diário é publicação, não fato apurado, e ausência de menção não é ausência de ato, porque a cobertura não é nacional e busca por texto falha com abreviação e documento digitalizado sem reconhecimento de caractere. O roteiro insiste em buscar o termo em variações e no CNPJ, em guardar a edição e não só o resultado (diário é substituído por errata), e em confirmar em segunda fonte antes de afirmar. O índice deixa de listar os dois como "ainda não escritos" e passa a nomear só os dois que faltam. - /ferramentas prometia "todas as ferramentas" e não conhecia treze delas correção
A página de ferramentas envelheceu em silêncio enquanto o site ganhava treze páginas interativas: ela ainda descrevia duas visualizações quando já havia oito, e nenhuma das seis ferramentas de tratamento de dado. Promessa que envelhece é pior que promessa que nunca foi feita, porque o visitante confia nela. A página passa a ter três blocos novos — ver os dados, trabalhar o dado, método e fontes — e a trava [14] ganha uma regra: toda página com script próprio, isto é, toda ferramenta interativa, precisa estar citada no corpo de /ferramentas. A primeira versão da trava nasceu desdentada e o teste negativo mostrou por quê: ela olhava a página inteira, e o rodapé do layout linka todas as rotas, então a conferência passava sempre. Agora ela olha só o conteúdo próprio da página, e reprova de verdade. - /inclinacao — quem subiu e quem caiu entre dois momentos ferramenta
Barras lado a lado respondem "quanto"; a inclinação responde "em que direção e com que intensidade", que é outra pergunta — e é a certa quando há exatamente dois momentos: antes e depois de uma lei, dois exercícios, dois quadrimestres. A decisão que define o gráfico é a escala única para os dois lados: se cada coluna tivesse a sua, as retas mostrariam posição relativa e não mudança, e a inclinação viraria enfeite. Há teste conferindo que o mesmo valor nos dois lados cai na mesma altura. Partir de zero não recebe percentual inventado, item com um momento só fica de fora e é nomeado, e acima de vinte itens a ferramenta avisa que as retas se cruzam demais. O resumo automático ganhou um cuidado que quase passou: quando nada caiu, ele chamava a menor alta de "maior queda" — o teste no navegador mostrou a frase errada, e agora o extremo só é nomeado quando existe. As cores são três, para subiu, caiu e igual, sem vermelho nem verde: subir não é bom nem ruim por si. Dez testes. - Auditoria de acessibilidade das ferramentas novas: duas violações, as duas corrigidas correção
Vinte rotas auditadas com o axe nos dois temas, e com as ferramentas carregadas de conteúdo — porque gráfico, tabela e avisos só existem depois que alguém clica em ver um exemplo, e auditar a página vazia não mede o que a pessoa usa. Duas violações sérias apareceram, nenhuma delas trivial. A primeira foi causada pela correção da rodada anterior: o bloco de código que passou a rolar horizontalmente ficou inalcançável por teclado, porque região rolável precisa receber foco. A segunda existia desde a rodada 53 no /fluxo-do-orcamento: quando faltavam valores, a mensagem era escrita como texto solto dentro de uma lista, o que um leitor de tela anuncia errado. As duas foram corrigidas e a segunda virou trava, que reprova qualquer script que escreva texto direto numa das listas com aviso em vez de criar um item — negativamente testada. Depois disso, zero violação em vinte rotas e dois temas. Quatro verificações a mais fecharam a auditoria: reflow a 400% de zoom sem estouro horizontal em cinco rotas, o /mapa oferecendo "Avançar" em vez de animar quando o sistema pede menos movimento, o botão de exportar alcançável só com a tecla Tab, e o peso real de uma página de ferramenta — onze requisições, 37 KB sem compressão, todas do próprio site. De passagem, a auditoria confirmou a política de segurança por um caminho inesperado: o navegador recusou injetar o próprio axe, que foi exatamente o que a política deveria fazer.
22 de setembro de 2026
- /citar — o que falta para um número virar prova ferramenta
Um número sem procedência não sustenta pedido, recurso nem representação, e é o primeiro ponto que a outra parte ataca. Citar dado público tem uma dificuldade própria que a página explica: a página muda, o arquivo é substituído, o portal sai do ar — por isso a data de acesso não é formalidade, é o que permite dizer "no dia em que consultei, estava assim", e vem preenchida com hoje por padrão. A ferramenta monta três formas ao mesmo tempo, escolhidas pela finalidade: a frase curta que cabe na legenda de um gráfico, a referência no padrão ABNT para documento formal, e o registro BibTeX para gerenciador de referências. As três aparecem mesmo incompletas, porque ver a citação tomando forma é o que ensina o que falta nela — e o que falta está listado logo acima. Cinco conselhos práticos fecham a página, entre eles guardar o arquivo e não só o link, preferir o número do processo ao endereço porque ele sobrevive à reforma do site, e o lembrete de que citação diz de onde o dado veio, não que ele esteja certo. O teste no navegador achou um defeito que valia para o site inteiro: bloco de código não quebra linha e estourava 418 pixels de largura numa tela de 320. Agora rola dentro de si mesmo, e as 22 páginas principais foram medidas a 320 pixels sem estouro nenhum. - Exceção de peso por padrão de nome, e a exceção órfã passa a reprovar trava
A divisão do registro por mês resolveu a capa e deixou um mês ativo demais: setembro de 2026 chegou a 24,3 KB de HTML. Resumir uma entrada para caber no limite seria apagar parte do rastro que /etica promete, então a resposta certa aqui é exceção declarada, e não mais divisão. A exceção é para o padrão "mudancas/*", porque o registro ganha uma página por mês e uma linha por mês na lista de exceções envelheceria em silêncio. O motivo está escrito: as páginas de arquivo são prosa pura, sem máquina nem dado embutido, o crescimento é limitado por desenho porque cada uma cobre um mês só, e o leitor chega a elas deliberamente pelo índice. O teto de máquina continua valendo integral — o que não pode crescer é o código, e ele não cresce ali. A trava ganha de passagem uma regra nova, na direção oposta: exceção que não casa com página nenhuma reprova o build, porque teto esquecido é dívida silenciosa tanto quanto teto alto demais. Negativamente testada. - /juntar-dados — a tabela que encolhe sem ninguém notar ferramenta
Quase toda pergunta interessante precisa de duas tabelas: despesa com população, contrato com fornecedor, pedido com órgão. E é na junção que o dado público mais silenciosamente se perde — "Luziânia" de um portal não casa com "LUZIANIA" de outro, e o resultado é uma tabela menor do que deveria, sem aviso nenhum. A ferramenta devolve as três coisas juntas: o que casou, o que ficou só de um lado e o que ficou só do outro, com linha e valor. A taxa de casamento vem em primeiro lugar no resumo, porque é o número que importa: se 80% casaram, os 20% que faltam podem ser justamente os que mudariam a conclusão. Chave repetida na segunda tabela é declarada e a primeira ocorrência vence, em vez de multiplicar linhas em silêncio, que é o erro mais caro de uma junção. Coluna com o mesmo nome dos dois lados ganha sufixo em vez de sobrescrever. Homônimos se resolvem por uma coluna de desempate, e a junção por código do IBGE é oferecida como a mais segura, com aviso quando um código de sete dígitos não fecha pelo verificador. Quando nada casa, a ferramenta diz o diagnóstico mais provável em vez de devolver resultado vazio sem explicação. Nove testes. - /validar-dados — o que dá para conferir sem consultar ninguém ferramenta
Erro de forma é o que faz uma linha sumir de um gráfico sem ninguém perceber, e boa parte dele se detecta sem sair do lugar. A ferramenta confere cinco coisas linha a linha: os dois dígitos verificadores do CNPJ, o dígito verificador do código do município, a sigla da unidade da federação, a existência do dia no calendário e o formato do valor monetário. As mensagens explicam o erro em vez de só nomeá-lo — código com seis dígitos é apontado como "falta o verificador", que é o erro clássico de quem copia de planilha antiga; CNPJ com todos os dígitos iguais é reconhecido como preenchimento de teste que escapou para a produção; e valor no formato americano lido como brasileiro é descrito pelo que causa, que é o número sair mil vezes maior ou menor. Três limites ficam escritos na página: a ferramenta não diz se o dado é verdadeiro, porque forma certa não é conteúdo certo; não corrige nada, porque corrigir dado alheio em silêncio é pior que apontar o erro; e não confere CPF de propósito, porque este site não trata de dado pessoal. Onze testes, com CNPJ real da tabela de entes do Tesouro. O palpite do que cada coluna deveria ser vem do nome, mas quem confirma é a pessoa. - /marcador — o valor contra a régua que a lei estabeleceu ferramenta
Quase todo gráfico compara um ente com outro. Este compara um ente com o limite legal, e por isso é o mais concreto do site: o limite não é opinião, é a Lei de Responsabilidade Fiscal com artigo e número. A despesa total com pessoal tem teto em percentual da receita corrente líquida, repartido por Poder — 54% para o Executivo municipal e 6% para o Legislativo, entre outros —, e antes do teto há dois patamares que dão sentido ao desenho: 90% do limite obriga o Tribunal de Contas a emitir alerta, e 95% é o limite prudencial, que veda aumento de remuneração, criação de cargo e hora extra. Os três estão no gráfico e na tabela. Os percentuais dos onze Poderes e esferas foram conferidos no texto da lei no Planalto, e os três dispositivos que faltavam entraram em /base-legal com o que dizem e onde são usados. A leitura vem com cinco ressalvas, entre elas que a receita corrente líquida é o denominador e varia: uma alta do indicador pode ser queda de receita e não aumento de despesa, o que é uma pergunta melhor do que uma acusação. A paleta não usa vermelho — ultrapassar o limite é fato com efeito legal definido, não condenação. Nove testes, incluindo a classificação exata nos três patamares. - O registro de mudanças ganha arquivo por mês, porque a trava de peso cobrou correção
A trava [15] reprovou o build: /mudancas chegou a 24,1 KB de HTML para um limite de 24. Era previsível — a página cresce a cada rodada — e a resposta certa era dividir, não subir o teto, porque o registro precisa ser completo e completo não cabe numa página só para sempre. Agora a capa mostra as vinte mudanças mais recentes em texto inteiro e manda o resto para uma página por mês, com a contagem de cada uma à vista: nada foi resumido nem retirado. A divisão usou rota dinâmica, o que expôs três lugares que não sabiam lidar com ela e teriam publicado uma rota literal "[mes]": o índice de busca, a página de busca e o sitemap. Os três passam a expandir os meses a partir do mesmo dado que gera as páginas, e não de um cadastro à mão que envelheceria em silêncio. O redirecionamento de barra final virou curinga, porque uma linha por mês também não escalaria, e a trava aprendeu a aceitar o curinga que cobre o diretório — negativamente testada. A busca por "agosto" e "setembro" agora acha os arquivos do mês. - /playbooks e o roteiro do SICONFI — o método de extração, não o resultado texto
Um playbook é um roteiro de extração: de onde vem o dado, qual chamada funciona, o que conferir antes de acreditar, o que declarar como lacuna e o que o resultado não prova. Quem roda é o leitor, na própria máquina e com as próprias ferramentas — o site publica o método, não o dado, que é a mesma decisão explicada em /durabilidade. O índice traz cinco regras que valem para todos os roteiros, entre elas que toda linha extraída carrega a URL de onde saiu e a data em que foi vista, e que o que não se achou também é dado. O primeiro roteiro é o do SICONFI do Tesouro, a fonte mais rica de dado fiscal do país e uma das poucas que responde sem cadastro: explica cada parâmetro da chamada, lista cinco armadilhas verificadas ao vivo, dá o caminho em sete passos até o CSV e termina nas perguntas que o dado responde bem e nas quatro coisas que ele não prova. A armadilha principal é a que custou mais tempo na verificação: o Distrito Federal responde como esfera de estado, não como Distrito Federal, e consultar do jeito que a documentação sugere devolve zero linha sem erro nenhum — a pior forma de falhar, porque parece ausência de dado. O índice também diz, em voz alta, quais roteiros ainda não existem, em vez de deixar a lista parecer completa. - /limpar-dados — o CSV que o portal brasileiro realmente exporta ferramenta
Baixar o arquivo do portal é a parte fácil; a difícil é que ele quase nunca vem em forma de tabela. A ferramenta conhece sete defeitos, e nenhum é hipotético: são os que apareceram nos arquivos usados para construir o /mapa e o /barras. Acento gravado em windows-1252 e lido como UTF-8, que não é problema estético — o nome deixa de casar com a tabela do IBGE e a linha some do mapa. Título e período soltos acima do cabeçalho, que fazem todo leitor de CSV tomar a linha errada como cabeçalho. Linha de total misturada com registro, que vira barra gigante no gráfico e conta dobrada na soma. Cabeçalho repetido no meio, marca de relatório paginado. Coluna sem nome e coluna inteiramente vazia, restos de célula mesclada. Espaço sem quebra e de largura zero, invisíveis e suficientes para o nome não casar. Linha com menos células, que desloca as colunas em cascata. A regra que governa tudo: a ferramenta descreve antes de corrigir, e toda linha retirada sai listada com número, motivo e conteúdo, além de um arquivo separado só com elas. Limpeza silenciosa é perda de informação — quem publica precisa poder dizer o que mexeu. Onze testes. - /ler/grafico — como não mentir com um gráfico, inclusive com os deste site texto
A peça que fecha a série de visualização ensinando a desconfiar dela. Um gráfico é um argumento com aparência de fato: não mente por ter número errado, porque os números costumam estar certos — mente pelo recorte, pela escala e pelo que ficou de fora, e faz isso com a credibilidade de quem parece só estar mostrando o dado. A página traz seis perguntas na ordem em que devem ser feitas diante de qualquer gráfico, e depois destrincha sete truques um a um: eixo truncado, denominador ausente, período escolhido a dedo, reais de anos diferentes, o que sobrou fora do recorte, correlação apresentada como causa, e cor que empurra a conclusão. Cada truque vem com como percebê-lo e com o que este site faz a respeito — inclusive admitindo onde a escolha aqui é discutível, como a opção de cortar o eixo na série temporal. Uma seção é sobre quando o gráfico é seu, que é quando as perguntas ficam mais difíceis, porque a conclusão já se sabe. E uma última diz o que gráfico nenhum prova: intenção, irregularidade, nem nada sobre pessoas. As páginas de gráfico passam a apontar para as seções correspondentes. - /deflacionar — comparar reais de anos diferentes sem mentir ferramenta
A ferramenta que fecha o par com a série do IPCA versionada na rodada 66. Corrige um valor só, para quem tem um número na mão, ou uma tabela inteira, e sempre devolve o fator aplicado junto com a frase pronta para publicar — porque valor corrigido sem declarar a base engana tanto quanto valor não corrigido. O exemplo mostra o ponto de uma vez: o mesmo R$ 1 milhão nominal repetido em 2015, 2018, 2021 e 2024 vira R$ 1,70 milhão, R$ 1,50 milhão, R$ 1,25 milhão e R$ 1,08 milhão em reais de agosto de 2026 — quatro números idênticos que representam quatro poderes de compra diferentes. Ano solto é tratado como dezembro daquele ano, que é a convenção para valor anual, e a ferramenta avisa quando faz isso em vez de decidir em silêncio. Mês fora da série de 1980 em diante não é inventado: a linha fica de fora e o motivo aparece. A página diz o que a correção não resolve — índice setorial para obra, porte diferente entre municípios, e o fato de que somar percentuais mensais é errado. A série de 10 KB entra por import() dinâmico, como a população: zero requisição externa, medido sob os cabeçalhos de produção. - /per-capita — desfaz o engano mais comum de dado público ferramenta
"A cidade que mais gastou" quase sempre é a maior cidade: um ranking em valores absolutos é, na prática, um ranking de tamanho de município, e é assim que uma comparação honesta na aparência produz conclusão falsa. A ferramenta divide qualquer valor pela população estimada do IBGE e mostra a inversão acontecer — no exemplo, o município de maior despesa absoluta é o terceiro por habitante. O casamento aceita nome ou código do IBGE de sete dígitos, confere o dígito verificador e distingue três coisas que costumam virar um "erro" só: código digitado errado, código válido que não está na tabela, e nome que existe em vários estados — "Bom Jesus" existe em cinco, e sem a UF a ferramenta se recusa a chutar. A página diz o que per capita não corrige: custo de vida, custo de obra, inflação, e o mérito do gasto. Treze testes. A tabela de população, com 113 KB, entra por import() dinâmico só quando alguém usa a página — o que põe em uso a descoberta da rodada 54, de que import() de módulo do próprio domínio passa sob a política de segurança do site; medido de novo aqui, com zero requisição externa. O teste no navegador achou um defeito: a coluna de ano era escolhida como coluna de valor, e todo município saía valendo R$ 2.025. - Motor de gráfico não importa motor de gráfico — agora é trava, não disciplina correção
O mesmo erro aconteceu duas vezes: um gráfico novo pegou uma funçãozinha de formatação de dentro do motor de outro gráfico e arrastou o layout inteiro junto, estourando o orçamento de peso. Na rodada 71 foi o /linha puxando a leitura de colunas do /barras; na 73 foi o /treemap puxando a formatação, e o build ficou em 12,0 KB para um limite de 12 — passei a correção para o commit seguinte em vez de deixar o defeito de pé. A formatação por unidade mudou-se para src/lib/unidade.ts, que não depende de motor nenhum, e a trava [15] passa a reprovar qualquer arquivo de src/lib que exporte um layout e importe outro que também exporte. Erro que se repete não é descuido, é ausência de trava. Resultado: treemap caiu de 12,0 para 10,0 KB, waffle de 11,6 para 9,7, e a página mais pesada fora da exceção do mapa é o /linha com 11,0 de 12. - /treemap — onde está o grosso, com a tinta do rótulo escolhida pelo fundo ferramenta
Quarto gráfico geral, para quando a pergunta é qual parte domina um total e as partes são dezenas — despesa por função, contratos por fornecedor, pedidos por órgão. O algoritmo é o squarified: em vez de fatiar sempre na mesma direção, escolhe a que deixa os retângulos mais próximos de quadrados, porque tira fina e comprida é quase impossível de comparar com outra, e é o defeito que faz treemap mal feito virar enfeite. Há teste conferindo que as áreas somam o quadro inteiro, que cada área é proporcional ao seu valor, que nada se sobrepõe nem sai do quadro, e que quatro partes iguais não passam de 2:1 de proporção. A página diz quando não usar esta ferramenta: o waffle mostra melhor até oito partes, e as barras respondem melhor quando a pergunta é quanto exatamente cada um. O teste no navegador achou um defeito de acessibilidade que nenhum teste de unidade pegaria: o rótulo era escrito sempre na cor do papel, e na ponta clara da rampa sequencial o texto sumia. Agora a tinta é escolhida pela luminância do próprio retângulo, com o mesmo cálculo da WCAG que o verificador de contraste já usava — medido nos dois temas, nenhum rótulo abaixo de 7:1. - /waffle — cem quadradinhos no lugar da pizza ferramenta
Terceiro gráfico geral, e o que responde "que fração do todo é esta parte". A pizza sai de cena por um motivo que a página explica: comparar ângulos é uma das coisas que o olho humano faz pior, e contar posições está entre as que faz melhor — numa pizza, 7% e 9% são praticamente indistinguíveis, e a inclinação da fatia muda a percepção do tamanho. No waffle a pergunta "quanto é 7%" se responde contando sete quadradinhos, e o denominador fica sempre à vista, porque os cem estão no desenho, inclusive os que ninguém preencheu. A repartição usa o método do maior resto, o mesmo do quociente eleitoral, porque arredondar cada parte por conta própria daria 99 ou 101 quadradinhos e o desenho ficaria com um buraco ou uma sobra sem explicação — há teste conferindo que a soma fecha em cem para conjuntos de divisão feia. Fatia que vale menos de meio ponto percentual recebe um quadradinho para não sumir, e a ferramenta declara que isso a mostra maior do que é: o desenho não consegue ser exato nessa escala, mas pode ser honesto sobre a distorção. Valor negativo é recusado por escrito, com a alternativa indicada. Onze testes. - O orçamento de peso cobrou, e o código melhorou em vez de o teto subir correção
Assim que o /linha entrou, a trava [15] reprovou o build: 12,2 KB comprimidos de máquina para um limite de 12. A causa era real e não era o gráfico novo — o /linha importava duas funções de leitura de coluna de dentro do motor do /barras, e isso arrastava todo o layout das barras para o pacote da linha. A escolha de colunas saiu para src/lib/colunas.ts e o tipo de unidade para src/lib/unidade.ts, cada um sem dependência de motor nenhum. A extração aconteceu no segundo consumidor, e não antes, que era a regra combinada quando a função nasceu dentro do /barras: a forma da abstração veio da repetição, não do palpite. Resultado: 12,2 caiu para 10,6 KB, e a página mais pesada do site fora da exceção do mapa voltou a caber com folga. Nenhum teto foi levantado — é o caso de uso para o qual a trava existe. - /linha — a série temporal, com o eixo do tempo proporcional ao tempo ferramenta
O segundo gráfico geral. Quatro decisões que não são de estilo. O eixo do tempo é proporcional ao tempo real: se faltam sete anos entre dois pontos, o buraco aparece como buraco — espaçar os períodos por igual é o jeito mais fácil de esconder uma interrupção na série. Lacuna não vira reta: período sem valor interrompe o traçado, porque a reta que atravessa o vazio é uma afirmação sobre um número que ninguém publicou; ponto sozinho entre duas lacunas vira marca, em vez de sumir. O eixo começa em zero por padrão, mas aqui, ao contrário da barra, cortar às vezes é legítimo — variação de 1% sobre valor enorme some no zero —, então a opção existe e, quando ligada, o aviso sai impresso dentro da imagem, porque ela circula sem a página. E não há linha de tendência, de propósito: ela sugere causa e projeta futuro, e o site não faz nem uma coisa nem outra. Onze testes, incluindo a conferência de que nove anos de intervalo ocupam nove vezes o espaço de um. A rodada começou com uma página morta: o import do script faltou na última linha do .astro e a página carregava sem erro nenhum no console, só sem funcionar. A trava [14] passa a conferir que toda ferramenta carrega o próprio script, e não apenas o do layout. - O verificador passa a pingar as dez APIs, por conteúdo trava
A página de fontes promete que o estado de cada API é conferido; agora ele é. O npm run validate ganha o grupo "APIs de dado" e verifica por conteúdo — não basta responder, tem que responder o que se espera, e a trava de forma reprova entrada marcada como "responde" sem o trecho a procurar. Quem exige chave é pingado de propósito sem chave: 401 é a resposta certa, e prova as duas coisas que a página afirma — o endereço vive e a chave é mesmo necessária. Quando o exemplo publicado é pesado demais para pingar toda vez, a entrada declara uma URL leve equivalente, em vez de baixar sete megabytes de catálogo do Ipea a cada verificação. A primeira execução completa mostrou o valor: 8 de 10 responderam, e as duas falhas são exatamente as duas que o catálogo já declarava instáveis. O Querido Diário caiu durante esta própria rodada — respondeu 200 e, vinte minutos depois, 503 com "no available server" —, o que virou texto na armadilha em vez de virar uma linha errada na página. O PNCP esgotou trinta segundos em três caminhos diferentes enquanto o portal web respondia; o exemplo publicado passou a ser o endpoint de contratações, que é o que serve para fiscalizar. O estado das APIs aparece em /saude-dos-canais junto com os 217 endereços verificados. - /fontes-de-dados — as dez APIs públicas, com a armadilha de cada uma ferramenta
O outro lado da decisão de não hospedar dado: se o site não busca, ele precisa dizer onde está e como pegar. Dez APIs públicas consultadas de verdade em 22/09/2026, cada uma com o que cobre, se exige chave, uma chamada que funciona para copiar e rodar, e a armadilha que derruba quem tenta pela primeira vez. A armadilha é a parte útil: endereço de API qualquer um acha sozinho, o que custa tempo é descobrir o detalhe que faz a consulta falhar em silêncio. A verificação achou três desses detalhes. O Distrito Federal responde no SICONFI como esfera E, de estado, e não como D, apesar de a própria tabela de entes do Tesouro classificá-lo como D — consultar com D devolve zero linha em todos os anos testados, sem erro nenhum, o que é a pior forma de falhar. O Querido Diário mudou de endereço e o antigo só responde por redirecionamento, que muitos clientes não seguem. E a API do PNCP não respondeu em 25 segundos enquanto o portal web respondia, o que fica declarado como instabilidade esperada em vez de virar a conclusão errada de que o dado não existe. Sete fontes respondem sem chave, o Portal da Transparência exige cadastro gratuito, e o estado de cada uma passa a ter trava de forma. - Quem é cada ente, e com quem ele pode ser comparado ferramenta
Duas bibliotecas que preparam o terreno das comparações. src/lib/entes.ts deriva UF e região do próprio código do IBGE, em vez de manter colunas que envelhecem — o primeiro dígito é a região e os dois primeiros são a UF, e o SICONFI do Tesouro usa o mesmo código (verificado ao vivo em 22/09/2026), o que dispensa tabela de tradução entre dado fiscal e dado demográfico. Traz também o dígito verificador, que pega código digitado errado sem consultar lista. Conferir o algoritmo contra os 5.571 códigos publicados achou nove municípios cujo código não fecha: não é erro de digitação nem defeito daqui, são exceções do próprio IBGE, e estão nomeadas uma a uma no código, porque recusá-las seria recusar município que existe. src/lib/coorte.ts responde à pergunta que o site precisa fazer antes de todo ranking: com quem este ente se compara? Devolve o que enfraquece a comparação, do mais grave ao menos — períodos diferentes, dez vezes de diferença de população (que transforma ranking de despesa em ranking de tamanho de cidade), faixas de porte distantes, regiões cruzadas. Não recusa comparação nenhuma: quem decide é quem lê. E quando não há aviso, o resumo diz explicitamente que ausência de aviso não é aval. - IPCA desde 1980 e o deflator: comparar reais de anos diferentes sem mentir dado
Comparar reais de anos diferentes sem corrigir é o erro mais comum de leitura de dado público, e o mais fácil de explorar: "a despesa dobrou em dez anos" pode significar que ela caiu, se os preços mais que dobraram no período. Entra a série mensal do IPCA do Banco Central (1980-01 a 2026-08, 560 meses) e src/lib/deflator.ts, que traz um valor de um mês para os preços de outro. Guardamos a variação mensal publicada, não o número-índice, porque é o que dá para conferir linha a linha contra a fonte; o acumulado é montado na hora, sempre multiplicativo — somar percentuais de meses diferentes é errado, e o erro cresce com o tamanho do período, justamente onde a correção mais importa. Mês fora da série não inventa número: devolve o valor intacto e diz por quê. Toda correção vem com o fator e uma frase que declara a base, porque valor corrigido sem declarar a base engana tanto quanto valor não corrigido. Dez testes, um deles contra a fonte: a série reproduz o Plano Real, com junho de 1994 acima de 40% ao mês e dezembro do mesmo ano abaixo de 2%. A trava de forma reprova buraco na série, variação implausível e série parada há mais de três meses. - População dos municípios, versionada com data, fonte e trava de forma (estimativa 2026) dado
O primeiro dado de referência depois da regra escrita na rodada anterior: a população residente estimada dos 5571 municípios, do IBGE, com o ano vindo do próprio retorno da API e nunca chutado. Entra com script de regeneração (npm run ref) e com trava de forma que confere contagem na faixa plausível, códigos válidos e sem repetição, soma dos municípios batendo com o total declarado, os 27 estados, e a ordem de grandeza do país — 214.211.951 pessoas hoje. A trava também reprova o build quando a estimativa fica mais de dois anos atrás: referência envelhece, e número velho passando por atual é pior que número ausente. A geração achou uma defasagem real: o IBGE já conta 5571 municípios e a malha que o /mapa usa tem 5.570 — Boa Esperança do Norte, no Mato Grosso, existe como ente e ainda não tem geometria publicada. A defasagem fica gravada no próprio arquivo em vez de virar uma linha que some do mapa sem explicação. Nenhuma página consulta o IBGE em tempo de execução, aqui como em todo o resto: a política de segurança do site não permitiria. - A fronteira do que entra: dado de referência sim, dado de atuação não governança
O site promete em cinco lugares que não hospeda dado sobre ente nenhum, e ao mesmo tempo versiona a geometria dos 5.570 municípios do IBGE desde a rodada 52. A contradição era aparente, mas não estava escrita — e regra não escrita se desloca sozinha. Agora está: a fronteira não é de tamanho nem de assunto, é de quem o dado descreve. Referência descreve o país e não a conduta de ninguém (geometria, códigos, população, série de inflação, funções orçamentárias) e entra com data, fonte, script de regeneração e trava de forma. Atuação descreve o que um ente fez (quanto gastou, o que contratou, quem nomeou) e continua fora, sem exceção. O teste é: o dado diz o que existe ou o que alguém fez? Caso duvidoso resolve-se para o lado restritivo. A razão de a exceção existir é do lado do cidadão: sem população versionada não há per capita, e sem per capita todo ranking de despesa é um ranking de tamanho de cidade — o dado de referência é o que permite corrigir a leitura enganosa em vez de produzi-la. Escrito em /durabilidade, na governança do ecossistema e no llms.txt, e os quatro textos que faziam a promessa passam a dizer "dado de atuação" e a apontar para a explicação. - /graficos — as ferramentas organizadas pela pergunta, não pelo nome do desenho ferramenta
Um índice das ferramentas de visualização que começa pela pergunta do cidadão ("quanto cada um, lado a lado?", "onde isso está acontecendo?") e só então diz o nome do gráfico, a tabela que ele pede e o erro de leitura mais comum naquele tipo de desenho. Gráfico não descobre nada sozinho: torna visível uma pergunta que a pessoa já tinha. O catálogo é dado (src/data/graficos.json) e a trava [14] passa a conferir as duas direções — ferramenta que desenha e não está no índice reprova o build, e entrada do índice apontando para página inexistente também. Índice que apodrece é pior que índice nenhum, porque o visitante confia nele. A navegação ganha um grupo próprio para ver dados, no lugar dos links soltos que não aguentariam a série de gráficos que vem. - O chassi das ferramentas, extraído do que cinco páginas já faziam igual ferramenta
src/lib/ferramenta.ts reúne o que estava copiado: escrever a configuração nos parâmetros da URL (que /barras, /fluxo-do-orcamento, /checar-portal e /acompanhar faziam cada um do seu jeito), ler um arquivo convertendo o encoding (/barras e /mapa) e ligar os botões de exportar (/barras, /fluxo e /mapa). A abstração foi extraída depois de três ferramentas existirem, não antes: a forma veio da repetição medida, não de um palpite sobre o que ferramentas costumam precisar. A regra de estado do site fica escrita num lugar só — a configuração vai para a URL, para o link ser compartilhável; o dado colado pelo visitante, nunca, porque um CSV de despesas na barra de endereços vaza no histórico e em qualquer link compartilhado. A troca achou dois defeitos reais, nenhum dos dois inventado pela mudança: o /mapa publicava tabela vazia quando o dado era por estado e não por município, e o /acompanhar deixava de gravar o protocolo na URL. O /fluxo-do-orcamento e o /mapa ganham o botão de baixar os números, que só o /barras tinha. - Orçamento de peso: a máquina tem teto, e a exceção tem prazo trava
A trava [15] mede cada página do site comprimida e reprova o build que passar do orçamento. São dois limites, porque são dois problemas. A máquina (JavaScript e CSS, seguindo os imports entre módulos, de forma que o pedaço compartilhado conte para toda página que o usa) tem teto de 12 KB: cresce por decisão de engenharia e é onde o descuido custa caro — o /mapa carrega 131 KB de geometria do IBGE, cem vezes a mediana. A página (o HTML) tem teto de 24 KB: cresce porque o texto cresce, e texto é o produto deste site. Medir os dois juntos punia o registro de mudanças por ser completo, que é exatamente o que ele deve ser. Exceção exige motivo escrito, e a trava reprova a exceção que deixou de ser necessária — teto alto esquecido vira dívida silenciosa. Hoje há uma só, a geometria do mapa. As quatro regras foram testadas negativamente. Peso é acessibilidade: numa conexão lenta cada 100 KB é um segundo a mais, e quem mais precisa deste site é quem tem a pior conexão. - Gráfico sem a tabela dos números não vai mais ao ar trava
O site passa a ter um caminho único para a alternativa textual de qualquer desenho (src/lib/tabela.ts), e a trava [14] reprova o build de uma ferramenta que desenhe sem publicar a tabela — ou que a monte por fora da lib. Não é concessão a quem não enxerga o gráfico: é a única forma de conferir a conta, copiar para uma planilha e citar um número num pedido de informação. A trava achou uma promessa não cumprida: o texto alternativo do canvas do /mapa dizia desde sempre que "a lista dos pontos está nas tabelas abaixo do mapa", e essa lista não existia. Agora existe, com município, UF, data, rótulo e fonte de cada ponto desenhado. O /fluxo-do-orcamento ganha a tabela das quatro etapas e do que ficou pelo caminho. A lista de páginas vigiadas sai do próprio dist, não de um cadastro à mão, para que uma ferramenta nova não escape por esquecimento. O teste negativo achou um furo na primeira versão da trava, que reconhecia só uma das duas formas de pegar o elemento. - /barras — a comparação lado a lado, com a base sempre no zero ferramenta
O primeiro gráfico geral do site: cole uma tabela, escolha a coluna do rótulo e a do valor, e saia com barras horizontais, a tabela dos números e os arquivos. Três decisões não são de estilo. A barra é horizontal porque nome de município brasileiro é longo e, na vertical, viraria texto girado. A base é sempre o zero e isso não é opção do usuário: cortar o eixo é o truque mais comum de gráfico enganoso. E o top-N soma o restante numa barra "outros", com o percentual, em vez de escondê-lo — um top-10 sem denominador deixa o leitor sem noção do que ficou de fora. A leitura das colunas não confunde ano com valor, rótulos repetidos são somados com aviso, e cada linha descartada é contada em voz alta. O exemplo usa dado institucional do próprio site (municípios por recorte territorial), não dado de atuação de ente nenhum. Doze testes novos, dois deles guardando o eixo no zero e o sentido da barra negativa; um erro real apareceu no caminho, porque Number('') devolve zero e a célula vazia virava uma barra. - Uma descrição do desenho, dois renderizadores — agora para qualquer gráfico ferramenta
A lista de operações criada na rodada 54 para consertar o export de PNG estava presa dentro do /fluxo-do-orcamento. Ela sai para src/lib/cena.ts (pura, testada) e src/lib/render.ts (SVG para a tela, canvas para o PNG), que é o que todo gráfico das próximas rodadas vai usar. O motivo continua sendo a CSP: img-src 'self' recusa blob: e data:, então o caminho comum de exportar PNG — serializar o SVG e carregá-lo numa imagem — é impossível aqui, e falhava em silêncio. A cena ganha duas funções que só existem porque o desenho virou dado: textos() extrai a alternativa textual na ordem do desenho, e foraDaTela() acha o que o export cortaria, que é erro de layout que normalmente só aparece no arquivo salvo. Quatro testes novos. Verificado sob wrangler, com os cabeçalhos de verdade: SVG e PNG baixam, o tema escuro redesenha, zero erro de console. - Ler o CSV que o Brasil realmente exporta ferramenta
A leitura de CSV sai de lib/mapa.ts para lib/csv.ts, de uso geral, e passa a lidar com o que os portais realmente produzem: arquivo gravado em windows-1252 (o acento virava caractere de erro se assumíssemos UTF-8), separador por tabulação além de vírgula e ponto e vírgula, BOM, título e data soltos acima do cabeçalho, e a linha de total que vira uma barra gigante no gráfico. A detecção de separador tinha defeito real, achado pelo teste: descartava o separador ausente da primeira linha, que é justamente o caso do título solto em cima da tabela — agora decide pela contagem que mais se repete. O /mapa passa a ler o arquivo como bytes e converter o encoding. Onze testes novos; os oito do mapa continuam valendo sem alteração, porque lib/mapa.ts re-exporta. A leitura passa a pular o título e as linhas de total, avisando o que ignorou. - Escalas, eixos e formatação de número — a conta que todo gráfico repete trava
src/lib/escala.ts: escala linear e de banda, marcas de eixo pela série 1-2-5, arredondamento do domínio para fora, e a decisão de método de que o eixo começa em zero por padrão — eixo truncado é a forma mais comum de mentir com gráfico de barras, e quem truncar precisa passar a opção e dizer isso ao leitor. src/lib/numero.ts recebe a leitura e a formatação em pt-BR que estavam em lib/fluxo.ts, re-exportadas de lá para não tocar nos testes que já existiam. Onze testes novos, inclusive os casos que costumam quebrar desenho: todos os valores iguais, domínio zero, entrada inválida e soma de passo com erro de ponto flutuante. Um deles pegou um defeito real: com os limiares ingênuos da série 1-2-5, o eixo de 112 milhões saía com três marcas em vez de cinco. - As cores de gráfico saem do código e passam a ser medidas — três reprovavam contraste correção
A paleta dos gráficos vivia copiada dentro de dois scripts, fora do alcance do verificador de contraste. Ao movê-la para tokens do CSS, o verificador acusou o que ninguém via: a rampa do /fluxo reprovava 3:1 nos dois temas (cinza e verde claro sobre papel claro; petróleo escuro sobre papel escuro), e o marrom do /mapa dava 2,2:1 no escuro. Agora são cinco séries categóricas, não seis: restritas às famílias do site, a sexta cor distinguível sob daltonismo cairia no azul que a paleta apartidária proíbe — e é mais honesto rotular direto no desenho do que oferecer uma legenda que parte dos leitores não consegue separar. O verificador passa a medir 72 valores: texto em 4,5:1, dez cores de gráfico em 3:1, e a distância entre séries sob deuteranopia e protanopia. Some a duplicação entre os scripts (paleta, baixar, esc, $, el, css) em src/lib/{cores,dom}.ts, o /fluxo passa a se redesenhar ao trocar de tema, e o /mapa respeita 'prefers-reduced-motion': quem pede menos movimento recebe um botão que avança um passo por clique, em vez de animação. - O PNG do fluxo estava quebrado em produção desde a rodada 53 correção
A CSP deste site é `img-src 'self'`, e o navegador recusa blob: e data: como imagem. O export de PNG serializava o SVG, carregava num `new Image()` e pintava no canvas — o onload nunca disparava, e o botão não fazia nada, sem aviso. Passou na rodada 53 porque o teste rodou no `astro preview`, que não aplica os cabeçalhos. Correção estrutural: o desenho passa a ser descrito uma vez, numa lista de operações, e dois renderizadores a consomem — um monta o SVG, o outro pinta no canvas com Path2D. O PNG sai do canvas, sem imagem nenhuma. Trava [13] reprova `new Image()`, `createImageBitmap()` e `createElement('img')` em script de navegador. De quebra, o desenho passa a ser refeito quando o sistema troca entre claro e escuro, que era outra lacuna. README, CLAUDE.md e DEPLOY.md passam a dizer que teste de exportação roda sob wrangler, nunca no preview.
21 de setembro de 2026
- /fluxo-do-orcamento — cinco números do RREO viram o desenho do que passou e do que ficou ferramenta
Dotação inicial e atualizada, empenhado, liquidado e pago: um desenho em SVG, montado no navegador sem biblioteca, com uma coluna por etapa e as saídas nomeadas como a lei as nomeia — não empenhado, empenhado a liquidar (restos a pagar não processados), liquidado a pagar (processados). A página não busca número nenhum: o usuário lê no relatório e digita, e os valores ficam na URL para guardar ou compartilhar. Ordem impossível (liquidado maior que empenhado, pago maior que liquidado) é apontada em vez de desenhada em silêncio. Exporta SVG e PNG. Exemplo hipotético com números redondos, dito como hipotético, só para ver a forma. Motor puro com cinco testes. - /mapa — um CSV vira mapa do Brasil no navegador, com animação e exportação ferramenta
Cole ou carregue uma tabela com município, UF e, se houver, data: o mapa é desenhado no navegador, anima no tempo e exporta PNG ou vídeo (WebM gravado da própria animação). Geometria do IBGE embutida (contorno dos 27 estados e ponto central dos 5.570 municípios, gerados por npm run geo e versionados), nenhuma requisição, nenhum storage. Linha que não casa com município do IBGE fica listada com o motivo, nunca posta no lugar errado. Três exemplos com dado institucional do próprio site: Entorno do DF, MP de Contas por estado, diários estaduais. O playbook de deslocamentos pela agenda oficial entra na agenda pública trancado até 19/12/2026, pela regra do ecossistema sobre conteúdo visual de agente público no período eleitoral — a página existe e diz por quê. (O commit desta mudança diz "rodada 51"; o número já estava tomado por uma rodada feita em 07/09 fora desta série, e o registro é o que vale.)
07 de setembro de 2026
- Por que ferramenta e não opinião, e por que os dois projetos são separados governança
A pergunta que circula sozinha se ninguém a enfrentar — se a ferramenta cívica existe para criar mercado para a atividade profissional de quem a mantém — passa a ser respondida onde o vínculo já é declarado. /etica ganha a seção "por que os dois existem, e por que separados", que rejeita expressamente essa formulação (descreveria um funil, e nenhuma regra protege um arranjo assim) e adota a inversa: fiscalização sob suspeita de ser instrumento comercial não corrige nada, então a separação é a condição para que qualquer das duas atividades valha algo. /principios ganha "por que ferramenta, e não opinião" (mapa, prazo e instrumento em vez de juízo publicado; o custo assumido é nunca dizer quem é bom ou ruim) e "independência que você confere sozinho". Nenhuma regra foi flexibilizada, nenhum dado mudou. A parte econômica do argumento não é publicada aqui: fica no site da atividade profissional. - Busca quebrada em produção por id duplicado, e a trava que faltava correção
Primeiro teste no domínio real: a busca com JavaScript não mostrava resultado nenhum. Causa: na rodada 39, ao corrigir a ordem de títulos da página, entrou um <h2 id="indice"> antes do bloco JSON que já tinha esse id — e getElementById devolve o primeiro, um título de 15 caracteres. Nenhuma trava, teste ou axe pegou, porque o axe 4.10 não reporta id duplicado em elemento passivo. O título ganhou outro id, a trava [6] passa a reprovar id repetido na mesma página, e o smoke test do DEPLOY.md ganha três verificações que só produção revela: beacon do Web Analytics injetado pela Cloudflare (a CSP bloqueou, como devia), robots.txt reescrito pelo AI Crawl Control, e a própria busca com JavaScript. A mesma trava achou LDO e LOA listadas duas vezes em /prazos, com o mesmo id de linha; ficam só na seção do ciclo do orçamento.
06 de setembro de 2026
- Governança 1.1: a marca é declarada em /etica, e só lá governança
Uma revisão externa do ecossistema apontou que proibir qualquer menção à marca comercial reduzia transparência sem proteção proporcional, que a frase-tese ("quem publica método não deveria lucrar com quem é fiscalizado") condenava o modelo antes de regulá-lo, que vetar ao mantenedor todo uso das ferramentas era incoerente com a licença aberta, e que "declarar publicamente antes de qualquer explicação" expõe terceiros sem apuração. As quatro foram acolhidas. /etica passa a nomear a marca — nesta página e em nenhuma outra, como referência para conferir o vínculo — e a trava [2] confere as duas direções, mais o interruptor do link, que só liga quando o site comercial responder. A tensão é reescrita pelos mecanismos concretos que as regras fecham; o uso comercial do que é público fica permitido nas mesmas condições de qualquer pessoa; a resposta a violação passa a ser conter, preservar, apurar, comunicar e publicar na proporção do fato. E uma correção honesta: /etica dizia que há registro de setores atendidos e de pedidos recusados; ele ainda não existe, e a página agora diz isso. - O repositório nasce fechado, e as páginas passam a dizer isso governança
A decisão anterior, de abrir o repositório, era premissa minha e foi revertida pelo mantenedor: ele nasce privado, como o do extrato.digital. Isso tornava falsas duas afirmações do site — /mudancas dizia que o histórico git é o snapshot que o visitante pode conferir, e /etica prometia verificação sem depender de confiança. Em vez de manter a promessa, as duas páginas passam a declarar a limitação com todas as letras: o que está aberto é o registro público e datado, o histórico existe mas não está legível a terceiros, e o diff de qualquer entrada é entregue a quem pedir. A governança registra a decisão e a consequência. - Clone raso não inventa data de alteração correção
Num clone com um único commit — o padrão de vários serviços de build — o git responde a data desse commit para qualquer arquivo, e o sitemap sairia com a mesma data em todas as 34 páginas: pior que data nenhuma, porque parece certo e ensina o buscador a ignorar o campo. O build passa a detectar repositório raso e omitir a data, e o calendário mantém o carimbo fixo em vez de mudar sozinho a cada publicação. Verificado nos três cenários: histórico completo (datas reais e distintas), clone raso e pasta sem git. - Cabeçalho concatenado pelo Cloudflare, licença e a coerência do repositório público correção
Servindo o dist com o runtime da Cloudflare (wrangler pages dev) antes do primeiro deploy, viu-se que o Pages concatena o valor de um cabeçalho definido em duas regras que casam com a mesma rota: Cache-Control em /* e em /_astro/* virava "max-age=600, must-revalidate, max-age=31536000, immutable" — diretivas contraditórias que anulavam o cache imutável dos assets. Cache-Control sai de /*, o HTML fica com o padrão do Pages e cada caminho define a sua política; a trava [4] passa a reprovar cabeçalho repetido entre regras. Mais: LICENSE (MIT, que o package.json já declarava) e o DEPLOY.md corrigido — dizia para criar o repositório privado, enquanto /mudancas e /etica afirmam ao visitante que o histórico git é auditável.
04 de setembro de 2026
- Itens abertos das auditorias: tipos dos dados, travas testadas e verificação de tipos no CI trava
src/lib/tipos.ts descreve a forma dos quinze arquivos de dado, e os 70 usos de `any` nas páginas e componentes saíram — a verificação de tipos passou de 6 erros para zero, e o HTML gerado ficou idêntico (a única diferença é o dedupe da lista de páginas que citam cada norma, em /base-legal). A página /base-legal deixou de ler o disco com node:fs e passou a usar import.meta.glob, como /busca. A trava dos dados ganhou treze testes que quebram um campo de propósito numa cópia temporária e exigem a reprovação. O CI roda astro-check por npx com versão fixa, sem devDependency. - Auditoria de link preview: favicon.ico e metatags do Twitter trava
og-image (1200×630, PNG, 70 KB), apple-touch-icon (180×180) e as metatags Open Graph conferidas por bytes e dimensão reais. Faltavam /favicon.ico — que clientes legados, Slack e alguns previews pedem pelo caminho fixo — e twitter:title/twitter:description. O .ico (16, 32 e 48 px) foi gerado do próprio favicon.svg, sem dependência nova. - Auditoria de UX: alvos de toque na navegação e no rodapé trava
Grade de 10 páginas × 8 larguras (320 a 3840 px) com Playwright: nenhuma rolagem horizontal, coluna de leitura limitada a 46rem mesmo em 4K, foco visível por teclado, modo escuro legível, Lighthouse móvel 100/100/100/100 nas páginas de ferramenta. O único achado real: links da navegação e do rodapé com 16 px de altura, abaixo dos 24 px mínimos de alvo de toque (WCAG 2.5.8) — agora 30 px. Links dentro de texto corrido e de tabela ficam como estão, que é a exceção prevista pela norma. - Auditoria de engenharia: formatação de data numa fonte só trava
Doze páginas redefiniam a mesma função de formatar data; agora src/lib/formato.ts (dataBR, mesAnoBR, dataHoraBR), com teste, e o HTML gerado ficou byte a byte igual. Tipo explícito no aria-current da navegação (o único erro real de tipos que o astro check apontou; os outros quatro são ausência de @types/node, consequência da regra de dependência única). A busca tolera índice corrompido: fica o índice completo, sem busca. - Auditoria de segurança: quatro endurecimentos trava
gitleaks (26 commits), osv-scanner, trivy e npm audit sem achado. Da revisão manual: os blocos JSON embutidos em <script> (JSON-LD, índice da busca, parâmetros de /agora) passam a escapar '<', para que um título contendo "</script>" nunca feche o bloco; as ações do CI ficam fixadas por SHA de commit, o token do CI vira somente leitura e o Dependabot abre PR semanal; o verificador de canais lê no máximo 2 MB por resposta, para que um host hostil não estoure a memória do runner. - Cabeçalhos endurecidos e a CSP como prova de zero requisição externa trava
A CSP perde o data: (não havia imagem embutida) e fica só com 'self'; entram HSTS com preload, COOP, CORP, X-Frame-Options e cache curto no HTML. A trava [4] passa a exigir esses cabeçalhos, a reprovar qualquer origem além de 'self' na CSP e qualquer script, estilo, imagem ou iframe externo no HTML — a promessa de zero requisição a terceiro vira verificação. npm audit limpo; lockfile com integridade e npm ci no CI. Texto de /cidadao deixa de dizer que o caminho para ineficiência é "eleitoral". Fecha a série de vinte rodadas (21–40). - Auditoria de acessibilidade em 33 páginas × 2 larguras, componentes de tabela e /imprimir trava
axe (WCAG 2.1 AA + boas práticas) em todas as páginas a 1280 e 320 px: uma única violação — ordem de títulos na busca, corrigida; nenhuma página com rolagem horizontal a 320 px; um h1 por página; impressão sem menu e rodapé. As tabelas dos mapas (LAI, tribunais, MP, diários estaduais) viram componentes, uma fonte de markup, e /imprimir junta todos os mapas — inclusive DF e Entorno — com a data de verificação de cada um, para levar ao balcão. - Lacunas declaradas: o que fechou e o que continua aberto dado
MP de Contas: de 7 para 22 confirmados por conteúdo (Amazonas, Bahia, Espírito Santo, Mato Grosso, Mato Grosso do Sul, Pará, Paraíba, Piauí, Rio Grande do Norte, Rondônia, Roraima, Santa Catarina, Sergipe, Pernambuco, Tocantins); o MPC-GO muda para a página do TCM-GO, porque o host anterior não resolve; faltam AC, AL, AP, CE, MA e RJ. Diário de MS: o host anterior morreu; o vivo é a Imprensa Oficial, confirmado pelo título. FAMEM continua não confirmada — agora por verificação de conteúdo, não por suspeita. Capitais: quatro fechadas com a confiança que a fonte permitiu (Rio Branco verificado; Porto Velho e São Luís parciais; Maceió provável); treze seguem não levantadas, e a página passa a contar em vez de dizer "dez". - /entorno — os 33 municípios da RIDE-DF dado
A lista vem da LC 94/1998 na redação da LC 163/2018, lida na fonte. O site de cada prefeitura foi localizado por padrão de endereço e confirmado pelo nome do município na página: 32 de 33 (Arinos responde com redirecionamento sem conteúdo). Tabela do caminho por estado — em Goiás é o TCM-GO que julga prefeitura, não o TCE — e o aviso do que não foi levantado (diário, e-SIC, portal). As plataformas de diários da AGM e da AMM-MG entram no mapa de diários; o verificador ganha o grupo Entorno. - /checar-portal — o checklist do cidadão para o portal de transparência ferramenta
Vinte e dois itens que a norma federal exige de um portal (LAI art. 8º §§1º e 3º, LRF arts. 48 e 48-A, Decreto 7.185/2010 art. 7º), para percorrer o portal do próprio ente e marcar o que encontrou. Gera o relatório para copiar — dito como checklist, nunca como nota — e o estado vai na URL como bits, para guardar o link. Funciona sem JavaScript (imprime com as caixas marcadas). É o lado cidadão do "mapa de transparência" que a agenda mantém travado por infraestrutura. - Verificador cobre tudo o que os mapas publicam trava
Antes: 95 endereços de três mapas. Agora também as plataformas municipais e o DOU (por conteúdo — a plataforma devolve 200 para caminho inexistente, e só o nome da associação na página distingue), as fontes de dado citadas em /onde-esta-o-dado, os canais de pedido do mapa recursal (hosts extraídos do próprio dado, para que linha nova entre sozinha) e cada link para o site irmão. A trava exige que a lista de links do ecossistema bata com o que as páginas linkam. - /df — o Distrito Federal órgão a órgão, e o verificador passa a conferir conteúdo ferramenta
Dezessete órgãos e canais do DF (GDF, CLDF e seu diário, TCDF, MP de Contas, MPDFT, CGDF, Ouvidoria-Geral, Participa DF, Portal da Transparência, DODF, SINJ, SEI, dados abertos, Compras DF), cada um verificado ao vivo pelo título da página, com a tabela assunto → destino num ente que é estado e município. Correção de dado: o MP de Contas do DF está em mpc.tc.df.gov.br — o host anterior não responde. O verificador de canais ganha o grupo DF, verificação por conteúdo (texto esperado no dado, só um booleano no snapshot), seis conexões em paralelo e --only; /saude-dos-canais distingue 404 de erro de servidor. - /ler/orcamento e /ler/emendas ferramenta
Orçamento: PPA, LDO e LOA e o que cada um decide, dotação versus execução, créditos adicionais (Lei 4.320/1964, arts. 40 e 41) e contingenciamento (LC 101/2000, art. 9º). Emendas: individual, de bancada e de comissão, execução obrigatória e equitativa (Constituição, art. 166, §§9º, 11, 12 e 19), transferência especial versus com finalidade definida (art. 166-A) e onde o dado oficial está — sobre o instrumento, com guarda-corpo explícito: nada sobre quem apresentou. - /ler/licitacao ferramenta
O guia do que vem antes do contrato: as sete fases (art. 17), as cinco modalidades (art. 28) e os seis critérios de julgamento (art. 33) da Lei 14.133/2021, o preço estimado como documento central (art. 23), dispensa versus inexigibilidade e o conteúdo mínimo do processo de contratação direta (art. 72) — com a tabela de sinal versus aparência. Limites de dispensa não são fixados no texto porque mudam todo 1º de janeiro (art. 182). - /glossario com base legal por termo ferramenta
Vinte e oito termos de relatório fiscal, contrato e diário (empenho, liquidação, restos a pagar, RCL, dispensa, inexigibilidade, ata de registro de preços, inadimplência declaratória…) em linguagem comum, cada um com a norma que o define, lida na fonte — a Lei 4.320/1964 entra na base legal. Cada termo tem âncora própria, entra na busca e é linkado dos guias de leitura. - Busca com vários termos, ranking, destaque e teclado ferramenta
A extração do índice estava duplicada em duas páginas e a busca era uma substring única. Agora src/lib/indice.ts é a fonte (testada): todos os termos precisam aparecer, título pesa mais que seção e descrição, prefixo de palavra vale mais, os termos ficam destacados sem perder acento, o contador é anunciado a leitores de tela e as setas navegam nos resultados. - /agora calculado no navegador e calendário dos prazos para assinar ferramenta
/agora congelava na data do build — e no relógio do servidor, que não é o de Brasília. Agora a conta é refeita no navegador para a data de hoje (sem JavaScript fica a do build, em horário de Brasília, dita como tal), com a mesma função testada da calculadora. Novo /calendario.ics: os vencimentos de RREO, RGF e DCA deste ano e do próximo em iCalendar, arquivo estático gerado do prazos.json — o aplicativo de agenda busca as datas e o site não sabe quem assinou. - Motor de prazos testado, dia útil e a data da ciência ferramenta
A calculadora somava dias e parava: vencimento em sábado ou feriado ficava no sábado. Agora a conta vive em src/lib/prazos.ts (função pura, oito testes com node:test, zero dependências): dia do começo excluído, dias corridos, rolagem ao dia útil seguinte com os feriados nacionais em lei e a Sexta-feira da Paixão — dito como estimativa, porque feriado local não entra. /acompanhar ganha o campo da data da ciência da negativa (o prazo de recurso conta dela) e um link que leva as datas para /recorrer, que mostra o último dia e preenche o modelo. Estado continua só na URL. - Home organizada pela pergunta do cidadão texto
A home tinha 18 linhas e não dizia que o alcance é nacional. Agora lista onze perguntas ("negaram, para quem eu recorro?") e a ferramenta que responde cada uma, explica o "bsb" no nome, como as ferramentas tratam confiança e data, e o que o site não faz. llms.txt ganha a mesma nota de alcance. - Navegação em cinco grupos, rodapé em grade e dados estruturados ferramenta
Treze links soltos no topo viravam seis linhas num celular. Agora cinco grupos (agir, mapas, prazos, ler, sobre): em tela estreita um menu que abre pelo botão e funciona sem JavaScript; em tela larga, aberto. O rodapé vira navegação completa em grade, com a mesma fonte de links. JSON-LD (WebSite, WebPage, BreadcrumbList) e texto alternativo da imagem de compartilhamento. /base-legal passa a contar citações feitas pelo dado que a página renderiza. - Base legal conferida na fonte, /base-legal e correção da correção da DCA correção
Cada norma citada foi lida no Planalto. Erros corrigidos: a exigência de indicar prazo de sigilo e autoridade classificadora está no art. 11, §1º, II e §4º, e no art. 28 da LAI (e no art. 19 do Decreto 7.724/2012), não no art. 24, que só define os graus; o sigilo de identidade em ouvidoria é o art. 10, §7º da Lei 13.460/2017 (art. 31 da LAI é acessório); e a DCA: a rodada 21 dividiu o prazo em 30/04 (municípios) e 31/05 (estados) seguindo a redação original da LRF — a LC 178/2021 unificou em 30/04. Nova página /base-legal com cada dispositivo, o que diz e a URL; trava reprova página que cite norma fora do registro. - CI com as travas e verificador de canais mensal por PR trava
GitHub Actions roda build, as 12 travas e o contraste a cada push, só com ações oficiais. Um segundo job roda o verificador de canais todo mês e abre PR com o snapshot — nunca commita direto, porque runner de nuvem é bloqueado por portal público. CLAUDE.md registra regras, fluxo e lições para quem trabalha no repositório. - Registro de mudanças e trava que o exige governança
Esta página, o CHANGELOG gerado a partir dela e a trava [12]: qualquer commit que toque página ou dado sem entrada aqui reprova a publicação. /etica deixa de apontar para o registro de outro site. - Forma dos dados como trava e confiança como vocabulário fechado trava
O campo de confiança do mapa recursal tinha onze grafias; passa a ser {verificado, parcial, provavel} com a nota do que faltou. scripts/dados.mjs confere os nove arquivos de dado (campos, UFs, datas, duplicatas). A trava do snapshot de canais passa a exigir o total derivado dos mapas. - CSP em atributo, DCA por ente, "dez capitais" correção
/ler/contas tinha estilo inline que a CSP bloquearia (a trava passa a pegar). O prazo da DCA é 30/04 para municípios e 31/05 para estados e DF (LRF art. 51 §1º) — dizíamos 30/04 para todos. "Dez maiores capitais" não era verdade; agora "dez capitais", com o critério. Seções sem âncora entraram no índice de busca.
Os outros meses
- outubro de 2026 — 117 mudanças
- setembro de 2026 (este) — 72 mudanças
- agosto de 2026 — 14 mudanças