FISCALIZA.bsb

O que mudou, e quando

A regra de que nenhum cliente influencia o método só é verificável se toda mudança deixar rastro público e datado. Este é o rastro: 44 mudanças, cada uma com data, motivo e commit.

Como ler este registro

07 de setembro de 2026

  • Busca quebrada em produção por id duplicado, e a trava que faltava correção · rodada 50
    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 · rodada 49
    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 · rodada 48
    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 · rodada 47
    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 · rodada 46
    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 · rodada 45
    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 · rodada 44
    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 · rodada 43
    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 · rodada 42
    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 · rodada 41
    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 · rodada 40
    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 · rodada 39
    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 · rodada 38
    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 · rodada 37
    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 · rodada 36
    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 · rodada 35
    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 · rodada 34
    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 · rodada 33
    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 · rodada 32
    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 · rodada 31
    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 · rodada 30
    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 · rodada 29
    /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 · rodada 28
    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 · rodada 27
    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 · rodada 26
    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 · rodada 25
    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 · rodada 24
    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 · rodada 23
    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 · rodada 22 · 46c422d
    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 · rodada 21 · bb2733b
    /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.

31 de agosto de 2026

  • /busca e índice do site ferramenta · rodada 19 · 11af804
    Sem JavaScript é o índice completo (páginas e seções); com JavaScript, busca instantânea com o índice embutido — o termo nunca sai do navegador. Mais /busca-indice.json e o llms.txt reescrito por pergunta.
  • Verificador de canais e /saude-dos-canais trava · rodada 18 · 11af804
    npm run validate pinga os ~95 endereços dos mapas e grava só metadados. Classifica o motivo da falha (certificado, DNS, timeout, conexão) em vez de chamar tudo de "morto". Trava [10]: snapshot obrigatório, recente e publicado.
  • As 27 capitais — o que foi e o que não foi levantado dado · rodada 7 · 11af804
    /lai passa a dizer que dez capitais tiveram a escada recursal pesquisada e dezessete não, em vez de deixar supor cobertura que não existe.
  • /durabilidade texto · rodada 20 · 54e52fb
    Por que o hub não hospeda dado, e a lição de que status 200 não prova projeto vivo — domínio expirado e reocupado responde igual.
  • Guias de leitura: /ler/contrato, /ler/contas, /ler/diario ferramenta · rodada 17 · 54e52fb
    Cada um com a tabela do que é sinal e do que apenas parece; empenhado ≠ liquidado ≠ pago.
  • Instrumentos de ação: /pedir, /acompanhar, /recorrer, /representar ferramenta · rodada 14 · 54e52fb
    Sete variantes de pedido por tipo de dado; calculadora de prazos no navegador com estado na URL; recurso com os cinco fundamentos; modelo de representação a órgão de controle.
  • /prazos e /agora ferramenta · rodada 10 · 54e52fb
    Matriz do que cada ente deve publicar e até quando, com base legal; /agora aplica as regras à data do build.
  • /onde-esta-o-dado ferramenta · rodada 8 · 54e52fb
    Catálogo de fontes pela pergunta do cidadão, com o que exige cadastro e onde o Brasil não tem dado.
  • Mapas institucionais: /diarios, /tribunais-de-contas, /ministerio-publico, /ouvidorias dado · rodada 6 · 54e52fb
    DOU e 27 diários estaduais (associações confirmadas por conteúdo — a FAMEM não passou e vai publicada como não confirmada); os 33 tribunais com a regra de competência; os 35 MPs incluindo o de Contas; ouvidoria × corregedoria × controladoria.
  • CSP com script-src e trava de coerência build↔CSP trava · rodada 2 · 54e52fb
    A CSP não tinha script-src: qualquer script iria ao ar bloqueado com o build verde. Corrigido, com cache imutável, componentes de ferramenta e estilo de impressão.
  • Ordem de lançamento do ecossistema governança · f36da53
    DEPLOY.md: este hub é o passo 1; a ponte no extrato.digital só liga depois que o domínio responde; a face comercial entra por último.
  • Muralha ética, verificador de 9 travas, /lai e /cidadao governança · rodada 9 · 054aab9
    /etica declara o fato da consultoria e as regras; a trava reprova marca comercial em página publicada e comentário interno vazando no HTML. Mapa recursal da LAI e a página "por onde começar". Modo escuro com contraste medido, llms.txt, sitemap com data do git.

30 de agosto de 2026

  • Sitemap gerado em build e reflow a 320px trava · a4c15cb
    sitemap.xml com redirect e validação de reflow em telas estreitas.
  • v0.1 — o hub ferramenta · 56ba531
    Home, ferramentas, princípios, sobre e 404; CSP estrita; zero requisições externas; identidade própria, distinta do extrato.digital.

Esta página e o CHANGELOG.md do repositório saem do mesmo arquivo de dado, então não podem divergir. Encontrou uma mudança sem registro? É exatamente o tipo de coisa que o contato existe para receber.