Dados B3 › O que erramos
O que erramos e consertamos
São 114 defeitos que encontramos no nosso próprio banco. Cada um está aqui com a data em que foi achado e com o invariante que hoje impede que volte — clique no código para ver o teste na página de transparência.
A frase “confia, a base é boa” não vale nada vinda de quem vende a base. Esta lista vale, porque quem esconde erro não publica tabela de erros.
Ela não é curada. O critério de entrada é mecânico: o invariante conta uma história datada. Eu não escolho o que aparece — para um defeito sair daqui, o teste dele teria que ser apagado, e isso reprova a bateria antes de qualquer publicação.
2026
- 2026-09-28
TR47
POR QUE : a /api importava `fastapi.middleware.asyncexitstack`, que não existe no FastAPI 0.115 — oito testes caíram na bateria do Banco B3, e o requirements (`fastapi>=0.110`) deixava o Render instalar qualquer versão. ATAQUE: import de módulo interno; requirements sem teto; o exemplo interno contado como visita. - 2026-09-27
VG14
POR QUE : sobreviventes da segunda rodada da mutação. ATAQUE: "DFP de 2023" onde é 2025; a conta menor no texto; ordenação que quebra com data ausente. - 2026-09-27
VG13
POR QUE : 42 de 138 sobreviventes da mutação de vigia_fii.py. ATAQUE: rótulo de faixa trocado; queda escrita como subida; o campo "que mais mudou" escolhido pela soma. - 2026-09-27
VG12
POR QUE : a mutação de vigia.py deixou 53 de 157 sobreviventes — formato e borda que nenhum teste olhava. ATAQUE: R$ 1,2 mil virar R$ 1.200; prejuízo virar lucro no inglês; conta no corte exato sumir; contador somar dois por evento. - 2026-09-27
V11
POR QUE : a página inglesa da companhia mostrava o veredito em português, com vírgula decimal (achado pelo teste de paridade I-N105). ATAQUE: faixa nova sem tradução; número com vírgula no inglês; motivo da bandeira só em português. - 2026-09-27
TR44
POR QUE : sobreviventes da mutação nas rotas públicas. ATAQUE: contar erro como degustação; cortar uma consulta antes do limite; cache entregar inglês a quem pediu português. - 2026-09-27
TR43
POR QUE : na mutação, o padrão `or 0` virar `or 1` punha "falhou 1x" num build que nunca falhou, sem teste nenhum reprovar. ATAQUE: alarme falso num banco saudável; disco em bytes. - 2026-09-27
TR42
POR QUE : sobreviventes da mutação. ATAQUE: filtro que perde o dia pedido; limite que devolve a base inteira. - 2026-09-27
TR41
POR QUE : sobreviventes da mutação nas rotas de FII e ETF. ATAQUE: 404 virar 500 ou 200 vazio; redirecionar para si mesmo em laço. - 2026-09-27
TR40
POR QUE : na mutação, 20 dos 26 pontos do middleware podiam mudar sem teste nenhum reprovar. ATAQUE: agente puxando o JSON de 400 fundos virar "400 leitores"; erro contar como uso de chave. - 2026-09-27
TR39
POR QUE : sobreviventes da mutação das rotas públicas. ATAQUE: inglês para quem pediu português; seletor duplicado; data com hora no texto. - 2026-09-27
TR38
POR QUE. Na mutação das rotas públicas, inverter o teste de idempotência (sem seletor nenhum em página alguma) só era pego pelo rastreio completo do NAV03, de 6 minutos; e o limite padrão não tinha teste. ATAQUE: página sem seletor; seletor duplicado; limite trocado. - 2026-09-27
TR37
POR QUE. A mutação nas rotas públicas mostrou que o /saude podia trocar `and` por `or` e `>=` por `>` em qualquer alarme sem teste nenhum reprovar: só o alarme de falha tinha teste (TR32). ATAQUE: alarme que pisca, que acende sempre ou que nunca acende. - 2026-09-27
MED19
POR QUE. O Search Console mostrou 3 cliques em 28 dias e o painel contava 25 mil "humanos" em 4.293 comparações — varredura com User-Agent de navegador. O User-Agent se falsifica; a concentração não. ATAQUE: chamar a varredura de gente; corte escrito no código; guardar IP para "resolver"; voltar a chamar de humano o que o User-Agent só diz. - 2026-09-27
I-N95
POR QUE. 356 títulos iguais com o código trocado, 34 páginas indexadas de 1.073; e a meta description saía do objeto social (`desc` era reaproveitada mais abaixo na função). ATAQUE: título-molde; número com ressalva no título; description sobrescrita pelo texto do cadastro. - 2026-09-27
I-N106
POR QUE : o campo de máximo do /buscar não tinha rótulo (o leitor de tela dizia "campo de edição"), e a tabela solta só rolava sozinha nas páginas de ranking. ATAQUE: token de cor clareado; imagem sem alt; tabela larga que empurra a página para o lado no celular. - 2026-09-27
I-N105
POR QUE : o veredito da página inglesa saía em português, com vírgula decimal — e nenhum teste olhava as duas línguas juntas. ATAQUE: número traduzido errado; tabela com uma linha a menos em inglês; âncora que só existe numa língua; vírgula decimal na página inglesa. - 2026-09-27
I-N101
POR QUE : 23 de 38 pontos da comparação sobreviveram à mutação — a página renderizava qualquer número. ATAQUE: ROE sem ×100; P/L em %; o ano de uma no lugar do da outra. - 2026-09-27
I-H14
POR QUE : essas três bases não se refazem das fontes — o b3.sqlite sim. Perdê-las é perder quem pediu aviso, a medição e os recibos citados por aí. ATAQUE: cópia pela metade (arquivo copiado com escrita em curso); backup que acumula para sempre; cópia fora do disco. - 2026-09-26
MED16
POR QUE. A instrução de 22/09 pede a conversão degustação → chave antes de qualquer cobrança, e uma chamada sem chave a WEGE3 não deixava rastro: a conversão não tinha denominador. ATAQUE: contar robô ou a nossa bateria; contar a página /acoes/WEGE3 (aberta para todos); guardar o ticker; ler razão agregada como taxa por pessoa. - 2026-09-26
I-H13
POR QUE. A chave de `reapresentacao` ganhou `agreg` e o individual parou de sobrescrever o consolidado: 9.467 -> 8.654 linhas (8,6% a menos). A trava I-H05 recusou o build em produção — certa pela regra dela — e FII/ETF ficaram em 503 até alguém intervir. A saída não é afrouxar a trava: é DECLARAR o encolhimento em versao.ENCOLHIMENTO_ESPERADO, preso à versão. ATAQUE: a declaração valer para sempre (build seguinte da mesma versão encolhendo de novo teria de ser recusado); a declaração de uma contagem liberar outra; a folga passar do declarado. - 2026-09-26
I-B72
POR QUE. O build cria `companhia_fora_do_universo` a partir do cadastro (cinco colunas) e reexporta o derivado versionado com o que a tabela tem. O retrato (anos de DFP, tickers, pregões) vem da sondagem, que grava só no arquivo; e quase um terço das companhias com retrato nem está no cadastro de não-ativas. A primeira reconstrução completa depois da sondagem reescreveu o arquivo sem nenhum retrato; o portão do build carregou esse arquivo e I-H11/I-B69 reprovaram em toda tentativa — a produção ficou presa na versão anterior por dois dias. - 2026-09-13
I-N67
A WEG DESDE 2010 SAÍA +186% porque a série começava depois do desdobramento de 2021. Com os quatro eventos conferidos, é +1.836%. - 2026-09-12
I-N62
O DESDOBRAMENTO 2:1 PASSAVA PELO DETECTOR DE SALTO : a WEG em 10 anos saía +215% quando o certo, ajustado pelos eventos conferidos, é +720% (+874% com proventos) — o número do concorrente. - 2026-09-11
I-N60
DEPOIS DE OLHAR O CONCORRENTE LOGADO : tabela com TTM e cartão com a definição embaixo do número. O dado trimestral já estava no banco; a definição estava só na metodologia. - 2026-09-11
I-N59
SÓ HAVIA A MENSAL DESDE 2010. Quem queria ver o mês ou o ano não tinha como; o concorrente resolve isso com JavaScript, nós com link. - 2026-09-11
I-N58
O QUE FALTAVA : a página só tinha "por ano" (soma e contagem). Quem queria saber QUANDO recebe não tinha resposta — e a ficha da B3 já trazia a data de pagamento (264 futuras em 84 companhias). - 2026-09-11
I-N55
A BASE VÊ ATÉ ONDE A FONTE FOI LIDA. Rendimento de FII vem com data de pagamento e a base tinha 138 pagamentos futuros; provento de ação vem só com data-com, e como a fonte da B3 é lida no domingo, o anúncio mais novo tinha 18 dias e não havia data-com futura. Prometer "próximos 30 dias" com dado de domingo seria vender atraso como frescor — a página carrega a data-limite junto. Roadmap #6; ingerir proventos toda noite é o item seguinte. - 2026-09-11
I-N54
SÓ RAZÃO EM % ESCONDE O TAMANHO : R$ 40 bilhões de receita e R$ 40 milhões têm a mesma margem. Roadmap #5. O caixa soma caixa e aplicações porque é assim que o ROIC desconta; e "aplicações sem caixa" não vira "caixa e aplicações" — a soma parcial pareceria um número inteiro. - 2026-09-11
I-N53
"32% DE ROE É MUITO?" — a página respondia o número e não a pergunta; a de FII já dizia "P/VP mediano 0,82 dos pares" e a de empresa não. Roadmap #4. Mediana em vez de média porque um ROE de −200% de uma companhia em recuperação arrasta a média e não a mediana; só número limpo porque uma ressalva (escala, capital sem média) não pode virar referência para os outros. - 2026-09-11
I-B68
A AGENDA NASCIA SEM FUTURO. Provento de ação só entrava na reconstrução de domingo: o anúncio mais novo na base tinha 18 dias e não havia UMA data-com futura de ação, enquanto os FIIs tinham 138 pagamentos marcados. Roadmap 6b. A regra do build vale aqui: fonte externa é melhor esforço — falhou, fica o que tinha, com o motivo registrado. - 2026-09-10
I-N52
A SÉRIE NÃO É AJUSTADA POR DESDOBRAMENTO — o COTAHIST não ajusta, e é o que a API serve. Um retorno de 12 meses atravessando um 10:1 sairia como −90% e pareceria uma tragédia que não aconteceu. Por isso cada janela é conferida antes de virar número: salto diário de razão ≥ 2,5 (ou ≤ 0,4) dentro dela e o retorno cala, com o motivo à mostra. Roadmap #3. - 2026-09-10
I-N51
"P/L 33,1" NÃO DIZIA DE QUANDO, E FALTAVA O QUE TODO CONCORRENTE MOSTRA NO TOPO : valor de mercado, LPA, VPA, DY, payout, número de ações. Tudo já estava no banco. O risco era refazer o valor de mercado sem as três regras que o múltiplo aprendeu a duras penas: o Itaú saía com R$ 458 MILHÕES (contagem em milhares), uma unit sairia N vezes inflada, e uma contagem lixo do FRE viraria trilhões. O teste prende as três com casos reais e sintéticos. - 2026-09-10
I-N50
"A PÁGINA DE FII FICOU PARA TRÁS". Depois da ficha, das âncoras e do gráfico entrarem na página de empresa, a de FII parecia uma versão anterior do produto: sem âncoras, sem gráfico, e uma tabela de P/VP com um informe por linha desde 2010 na tela principal. Primeiro item do roadmap pós-revisão. O que mudou é a apresentação; os números são os mesmos (o teste confere o último P/VP e o último rendimento do gráfico contra o banco). - 2026-09-10
I-N49
"O NOSSO ESTÁ MUITO SIMPLES" — o dono comparou com um concorrente e tinha razão na página de empresa, que é onde as pessoas caem. O que eles fazem com 81 scripts e 747 KB dá para fazer com HTML e SVG: a ficha em cartões, a barra fixa de seções e a série de preço. O gráfico é o fechamento do BANCO, mensal, sem ajuste por desdobramento e dizendo isso — não uma cotação de terceiro; o mesmo número que a API serve. - 2026-09-10
I-N48
A HOME ANTIGA FALAVA COM PROGRAMADOR E 95% SAÍAM SEM CLICAR. Era um template de 49 KB com playground em script, "chega de scraping" na manchete, e o tráfego é investidor: 2.100 pessoas por mês caíam DIRETO numa página de empresa vindas do ChatGPT sem ver a home. A nova é gerada do banco. A manchete é a coisa mais característica do produto: em vez de DIZER que todo número volta à conta da CVM, ela MOSTRA — o ROIC da WEG somado linha a linha. Uma conta que não fechasse ali seria o oposto do que o site vende, então ela é conferida contra o indicador publicado antes de ir para a página. - 2026-09-10
I-N47
DOIS NÚMEROS, DOIS DONOS. Pesquisado antes de decidir: cotação atrasada licenciada custa R$ 320/mês de B3 mais o feed, com Termo de Adesão e relatório periódico, e o contrato só permite EXIBIR — nunca API. O dono escolheu o widget do TradingView (distribuidor autorizado, grátis com atribuição; quem tira o crédito é banido). O número deles chega pelo script deles e nós não o recebemos, não o guardamos e não o servimos. O nosso é o fechamento que entra toda noite (I-B66) e que a auditoria consegue refazer. A página tem de dizer qual é qual, porque um leitor que confunde os dois cita na API um preço que não está lá. - 2026-09-10
I-B67
A PRIMEIRA TELA DIZIA CNPJ E CÓDIGO CVM, E SÓ. Comparando com um concorrente ficou claro o que faltava: o que a companhia faz, onde fica, desde quando, em que segmento está listada, quem escritura, quem audita, quem controla. Tudo já estava nos arquivos baixados toda semana (FCA e cadastro) e não era lido. A descrição é o texto que a PRÓPRIA companhia protocola — a página diz de onde veio — e a regra que escolhe a versão importa: o FCA vem com todas as versões do ano, e uma reordenação de linhas não pode trocar a ficha por uma antiga. - 2026-09-10
I-B66d
O `os.replace` PURO DEIXAVA O `-wal` ANTIGO AO LADO DO BANCO NOVO. O banco roda em modo WAL; se o arquivo `-wal` ainda tiver quadros não consolidados (basta um leitor aberto quando o último escritor fechou), o SQLite os aplica sobre o banco NOVO na abertura seguinte — página antiga por cima de tabela nova. É corrupção silenciosa, que nenhum invariante de conteúdo veria, e a rotina que grava o estado do build no banco vivo é exatamente um escritor desses. A troca agora consolida e trunca o WAL primeiro, e recusa se não conseguiu — vale para a noturna e para o domingo. - 2026-09-10
I-B66c
ERA SÓ `DATA_VERSION`, E ISSO NÃO MUDA NO DOMINGO. A reconstrução semanal troca o arquivo e mantém a versão, então o buscador e o /hoje seguiam servindo a lista da semana anterior até o próximo deploy. Com preço entrando toda noite, viraria número velho todo dia — servido de cache, com cara de fresco. A página de empresa já usava (versão, mtime) e por isso não sofria; a regra agora mora num lugar só. - 2026-09-10
I-B66b
NUNCA SUBSTITUI DADO BOM é a regra do build semanal desde o início, e uma rotina que roda toda noite tem mais chances de dar errado do que uma que roda todo domingo. As funções de ingestão fazem `commit` no meio do caminho, então gravar no banco vivo não seria atômico — a cópia é o que devolve a atomicidade, e a conferência é o portão diário: `mínima ≤ fechamento ≤ máxima` em toda linha nova (fatia deslocada do layout produz número plausível, não erro), último pregão avançou, nada encolheu, versão carimbada intacta. - 2026-09-10
I-B66
O PREÇO TINHA DE ZERO A SEIS DIAS DE IDADE E NADA DIZIA QUAL. Só entrava preço na reconstrução de domingo, pelo arquivo ANUAL da B3 — que por sua vez chega atrasado: no banco construído em 09/09 o último pregão era 03/09. A B3 publica um arquivo DIÁRIO por volta das 21h de Brasília; é ele que passa a entrar toda noite, e o preço que a API, o MCP e o dump servem vira o fechamento de ontem ou de hoje. - 2026-09-10
GC20
TESTE "COMO UMA IA". Três achados de um agente batendo em produção: `/fiis/XXXX11` e as ferramentas MCP respondiam "chave ausente — assine" para um ticker digitado errado, e a IA repassava a assinatura como solução; `HEAD` dava 405 em `/`, `/robots.txt` e `/sitemap.xml`, o que verificador de link lê como site fora do ar; e o preflight do `/mcp/` recusava POST (`allow_methods=["GET"]`), então cliente MCP no navegador não conseguia falar com o servidor. - 2026-09-09
I-N46
POR QUE SVG E NÃO GRÁFICO INTERATIVO. A decisão está na conversa daquele dia: a IA lê a página como texto e receberia um buraco onde o gráfico interativo estaria; o celular abre em meio segundo sem programa para executar; e erro no navegador ninguém do nosso lado vê. - 2026-09-08
I-N44
824 PÁGINAS DE ATIVO E NENHUMA CAIXA DE BUSCA. Quem chegasse querendo a WEGE3 tinha de abrir a lista de 356 companhias e caçar com o olho, ou adivinhar a URL. Esse custo não quebra teste nenhum e não aparece em log nenhum: ele aparece na primeira visita, que é a única que a maioria das pessoas faz. - 2026-09-08
I-B65
DEZESSEIS ANOS DE ROIC EM BRANCO NA PÁGINA DO ITAÚ. A lista de exclusões declarava margem bruta, margem EBIT, DL/EBITDA e liquidez, e esquecia o ROIC — então a linha aparecia com dezesseis traços, que qualquer leitor entende como "eles não conseguiram calcular". A rota JSON já dizia a frase certa; a PÁGINA é que não dizia, e a página é o que quase todo mundo lê. - 2026-09-07
I-N43
ACHADO VARRENDO O SITE INTEIRO. Procurei palavras que só existem em português nas 75 páginas `?lang=en`. Oito acusaram, e sete eram FALSO POSITIVO do jeito mais instrutivo possível: `COMPANHIA ENERGÉTICA DE BRASÍLIA` é o nome legal da empresa e `Patrimônio líquido` é o nome da conta na CVM. Nome próprio e rótulo de fonte primária não se traduzem — traduzi-los seria inventar um dado que a fonte não tem. - 2026-09-06
MCP10
ELA JÁ ESTAVA ERRADA. O llms.txt anunciava 10 ferramentas quando o conector expunha 15: `scores`, `fii`, `fiis_ranking`, `screener_fiis` e `auditar_amostra` ficaram invisíveis para toda IA que lê o llms.txt — que é exatamente a porta de entrada delas. Um terço do produto existia e não era anunciado, e nada avisava, porque as duas listas envelhecem em silêncio uma longe da outra. - 2026-09-06
I-N42
O CONTEÚDO QUE UM CONCORRENTE NÃO COPIA. Cada invariante desta casa nasceu de um defeito real e guarda a história com data no docstring. Eram 65 histórias, escritas ao longo de meses, e nenhuma tinha saído do código. "Confia, a base é boa" não vale nada vindo de quem vende a base; a lista dos próprios erros vale. - 2026-09-06
I-N41
A PÁGINA FICAVA UM ANO PARADA. A série anual só existe depois que o exercício fecha, então uma companhia que entregou o 2T em julho continuava exibindo o último ano cheio, e as 455 páginas ficavam IDÊNTICAS por doze meses. O dado trimestral estava no banco desde sempre — faltava chegar em quem lê. Página que muda a cada trimestre é o que um buscador e uma IA têm motivo para revisitar; a que muda uma vez por ano, não. - 2026-09-06
I-N40
UMA FERRAMENTA PUBLICADA E MORTA. O servidor MCP expõe `metodologia()`, que chamava este índice e fazia `.json()` no retorno — e o retorno era HTML, sempre. Qualquer IA que chamasse a ferramenta recebia erro de parsing, não resposta. O defeito sobreviveu porque LER uma página (`/metodologia/{nome}.md`) sempre funcionou: só o índice quebrava, e nada no site exercitava esse caminho. - 2026-09-06
I-N37
O MOTIVO RECORRENTE DE VOLTAR. Depois de 820 páginas abertas e um buscador, o site era um dicionário: consulta-se e vai-se embora. Esta página é o que muda isso, e é o que uma IA cita quando alguém pergunta "o que aconteceu com a empresa X esta semana". - 2026-09-06
I-B64
TODO DEPLOY DE DOMINGO RECONSTRUÍA O BANCO INTEIRO. A memória de "esta semana já foi feita" era uma variável local do laço, e ela zera junto com o processo. Publiquei quatro vezes num domingo e o build começou quatro vezes, cada um matando o anterior. Numa instância de 1 CPU o efeito é direto no visitante: medi p50 de 1,9 s, p90 de 7,6 s e picos de 13 s — inclusive no `/robots.txt`, que é uma constante e não toca no banco. Site lento também gasta orçamento de rastreamento, e havia 40 páginas "detectadas, mas não indexadas" esperando. - 2026-09-06
I-B63
A TENTAÇÃO TEM NOME E TEM CONCORRENTE. A ITR não traz o 4º trimestre isolado; ele sai de `DFP − acumulado até o 3T`. A conta fecha por construção e é o que um concorrente direto faz. Nós não fazemos: o número derivado entraria na MESMA lista dos que a companhia reportou, carregando o erro de dois arquivos e apagando a fronteira entre "a empresa publicou" e "nós calculamos" — que é a fronteira que este banco inteiro existe para manter. Quem quer o ano fechado tem a série anual, que é o dado reportado. - 2026-09-05
TR35
A PROMESSA ESTAVA ACIMA DO DADO. A nota dizia "cada linha carrega o ticker e o código CVM, então os conjuntos se cruzam entre si e com a sua própria base". Era falso para 1 linha em cada 6 — 11.739 de 71.085 em `indicadores`, espalhadas por 96 companhias. - 2026-09-05
I-N36
REFERÊNCIA TEM NOME. O /sobre explicava a empresa operadora e não dizia quem faz o site. Site sem dono visível é a primeira coisa que buscador e IA descontam, e a última pendência do raio-x de 03/09. A ordem das credenciais é de propósito — a CPA-20 fala com o mercado, a perícia fala com "auditável" — e a profissão de origem fica de fora, porque não é credencial deste produto. - 2026-09-05
I-N34
AS 820 PÁGINAS NASCERAM ILHAS. Cada uma só era alcançada pelo hub ou pelo sitemap. Para o buscador, página que nenhuma outra página cita é a última da fila — e era o que o Search Console mostrava: 40 "detectadas, mas não indexadas". Para a pessoa, quem olha a WEG quer ver a Randon ao lado. O agrupamento sai da classificação da própria CVM. - 2026-09-05
I-B61
O BURACO QUE O DETECTOR ANTIGO DEIXAVA. O `escala_divergente` acha o exercício com DEZENAS de contas fora de escala, e o desenho a jusante se apoia numa premissa: se TUDO está mil vezes errado, o fator se cancela na divisão, então ROE e margem seguem válidos e são publicados. - 2026-09-04
TR34
O PONTO CEGO DO TR16. O TR16 é o teste que exige "toda página HTML pública medida", e ele descarta, por construção, TODA rota com parâmetro no caminho: - 2026-09-04
I-N32
É O PEDIDO LITERAL : "tem que aceitar várias camadas de filtros até sobrar os que a pessoa tem interesse". Um buscador em que o segundo filtro SUBSTITUI o primeiro parece funcionar — devolve resultado, não dá erro — e não faz o serviço. É o tipo de defeito que só aparece quando alguém confere a contagem. - 2026-09-04
I-N31
A RESTRIÇÃO QUE DEFINIU O DESENHO. A escolha natural para um buscador é montar a tabela no navegador: mais fácil de escrever e mais fluido de usar. Só que aí a IA e o buscador recebem uma página vazia — e a superfície pública aberta em 03 e 04/09, com 820 páginas, vale justamente porque o conteúdo está no HTML. - 2026-09-04
I-N30
A CONTRADIÇÃO QUE ISTO ENCERRA. As 500 amostras de auditoria estavam no sitemap com um raciocínio correto — "ferramenta que só abre URL indexada para na porta se a URL não estiver no sitemap", que travou dois dos três auditores externos. Só que a página da amostra é `noindex`, e página `noindex` NUNCA é indexada, esteja no sitemap ou não. As duas intenções se anulavam: a ferramenta continuava parando na porta e as 500 URLs ocupavam 36% do sitemap, numa casa onde o Google já reportava 40 páginas "detectada, mas não indexada". - 2026-09-04
I-N29
POR QUE ESTE, E NÃO O QUE EU IA ESCREVER. Eu tinha escrito um invariante exigindo que esta rota abrisse a PÁGINA para `Accept: */*`, por analogia com o /fiis. A bateria me parou, e estava certa: as duas situações são diferentes. No /fiis, `*/*` recebia 401 — porta fechada. Aqui recebe os 63 KB inteiros, e o JSON não é consolo, é O ARTEFATO: `audit_id`, `sample_key` e `sample_score` são a prova que o auditor cita depois, e o protocolo publicado manda pedir `application/json`. - 2026-09-04
I-N28
A QUARTA VEZ NESTA FAMÍLIA, e desta vez o erro foi meu, horas depois de escrever a página. A rota nasceu negociando por `_quer_html`, que exige `text/html` EXPLÍCITO. Medido em produção: - 2026-09-04
I-N25
MESMA JOGADA DA PÁGINA DE EMPRESA , com uma diferença: a URL é a mesma do JSON, e o formato sai do `Accept`. Navegador lê; agente consome. Se alguém trocar a ordem (JSON para navegador, ou gate no HTML), os 101 links do hub voltam a dar num 401 explicado — explicado, mas fechado, que é o que deixava os fundos invisíveis para buscador e IA. - 2026-09-04
I-B59
O INVARIANTE QUE FALTAVA, e a falta dele custou 25 dias. A bateria tinha 266 verificações sobre o CONTEÚDO dos números — se o balanço fecha, se a identidade do imposto bate, se a flag aparece — e NENHUMA sobre a IDADE deles. Nenhuma perguntava "esse dado é de quando?". - 2026-09-03
PR06
46 CHECKOUTS ABERTOS, ZERO PAGOS. No último passo o cliente via um nome que o site nunca havia mencionado. O nome público no Stripe virou "Dados B3", mas a razão social continua sendo outra e é ela que aparece na nota — então a página diz isso ANTES, em vez de deixar a descoberta para o instante do cartão. - 2026-09-03
PR05
O FUNIL MEDIU O CUSTO DO ATRITO. O plano grátis é uma assinatura de R$ 0, e o caminho para ela era o mesmo checkout do Pro — sem pedir cartão, mas com a cara de um formulário de pagamento. Resultado: 47 pessoas abriram, 16 concluíram. Um terço. Pedir que alguém atravesse uma tela de cobrança para pegar algo grátis é atrito sem contrapartida nenhuma. - 2026-09-03
MED15
POR QUE. A estratégia virou "tornar quem já usa dependente do produto e monetizar depois". Isso exige saber se alguém VOLTA — e essa era exatamente a pergunta sem instrumento: o contador vivia num dicionário em memória (`api._uso_diario`), zerado a cada restart. Sabíamos que 16 chaves foram criadas e NADA sobre o que aconteceu depois. - 2026-09-03
I-N22
É O PONTO INTEIRO DA PÁGINA. Ela existe porque o site era invisível de três jeitos ao mesmo tempo: o sitemap tinha 568 URLs e 503 eram amostras de auditoria (zero de empresa), quem buscava "ROIC da WEG" achava sete concorrentes e não nos achava, e a IA perguntada pelo ROE do Itaú batia num 401 e respondia com outro site. - 2026-09-03
I-N20
POR QUE. O painel devolve as 30 páginas mais vistas, e a última tinha 28 visitas. Página de fato nasce com cinco: some da lista, e "não apareceu" vira "ninguém acessou" na cabeça de quem lê — eu quase reportei zero para onze páginas por causa disso. A correção foi listar cada uma explicitamente, o que só funciona enquanto a lista estiver completa. - 2026-09-02
I-H11
POR QUE. `covenant` e `companhia_fora_do_universo` não dependem de nada que o rebuild refaz — saem de arquivos versionados em `derivado/`. O caminho oficial (subir DATA_VERSION) custaria ~26 minutos de reconstrução num build que já morreu de OOM e que, numa das vezes, derrubou uma auditoria externa em andamento. O boot carrega o que faltar. - 2026-09-01
TR33
ELE ESTAVA ERRADO A NOSSO FAVOR POR TRÊS SEMANAS. A tabela dizia que a bolsai não tinha conector MCP, tinha metodologia só "parcial" e custava ~R$ 43 trimestral. Hoje: conector MCP nativo instalável em uma linha, metodologia publicada citando conta CVM, e R$ 49/mês com plano grátis de 200/dia — praticamente o nosso preço. - 2026-09-01
I-N19
DEFEITO DE DESCOBERTA ACHADO EM PRODUÇÃO. A primeira versão negociava por `_quer_html`, que exige `text/html` EXPLÍCITO: - 2026-09-01
I-N16
A IDEIA VEIO COM A PREMISSA DESATUALIZADA, E ISSO A MELHOROU. Chegou como "a partir de 2026 as empresas têm que reportar, aparecendo em 2027". Era verdade até 29/05/2026, quando a Resolução CVM 244 REVOGOU a obrigatoriedade — não adiou. - 2026-09-01
I-N15
O FATO QUE A PÁGINA CARREGA : o Banco do Brasil publicou o lucro em 3.09.01 até 2019 e em 3.11.01 de 2020 em diante; o Itaú ficou em 3.09.01 a série inteira. Quem raspa a CVM com código fixo acerta o Itaú, erra o BB de 2020 em diante, e NÃO RECEBE ERRO — recebe vazio ou o número de outra linha. - 2026-08-31
I-N14
ESCREVÊ-LA CONSERTOU UM DEFEITO ANTES DE PUBLICAR NADA. Ao montar a decomposição dos 8.012 indicadores suprimidos, 1.062 apareceram com flag NULA — suprimidos sem motivo declarado. Numa página cujo assunto é "por que falta", 13% de "não sei" é a página se contradizendo. - 2026-08-31
I-N13
PRIMEIRA PÁGINA DE FATO, e a régua vem de medição. Em 30 dias as IAs buscaram a home 209 vezes, o /comparativo 15, a /metodologia/multiplos 14 — e os VINTE guias conceituais somaram 7. A IA já sabe o que é P/L; ela busca quem responde o que ela NÃO sabe. - 2026-08-30
PG01
O PORTÃO FOI ENXUGADO POR UM MOTIVO REAL, E ENXUGAR É PERIGOSO. Quatro reconstruções seguidas morreram sem registrar falha, com o serviço caindo por inteiro aos ~57 min. `test_navegacao` respondia por 185s dos ~220s da bateria — 84% —, varrendo o site inteiro pelo TestClient com o banco novo de 1,8 GB aberto ao lado. Ele saiu do portão. - 2026-08-30
AUD15
SEM ISTO A REGRA NOVA NÃO ERA ATACÁVEL POR TERCEIROS. Publicávamos as contas que ENTRARAM (`onde_procurar`) e nada sobre as que ficaram de fora. Um auditor querendo derrubar a exclusão de custo de dívida — que mudou 232 EBITDAs — não via o que foi excluído nem por quê. - 2026-08-30
AUD14
O QUE O AUDITOR AINDA NÃO PODIA CONFERIR. Ele provou, de forma independente, que a amostra é o topo da ordenação do universo. Mas o TAMANHO do universo continuava sendo afirmação solta: o /saude publicava 71.293 indicadores e o /auditoria/universo entregava 63.281 chaves, com uma diferença de 8.012 que não aparecia em lugar nenhum. - 2026-08-30
AUD13
A OBJEÇÃO MAIS FINA QUE RECEBEMOS. O sexto auditor conferiu os 10 `sample_score` — todos batiam — e escreveu: - 2026-08-30
AUD12
ACHADO DO SEXTO AUDITOR EXTERNO. No BPAC11 2024, `contas_cvm_declaradas` dizia 3.11.01 e 2.03−2.03.09 enquanto `contas_realmente_usadas` dizia 3.09.01 e 2.08. Declarado ≠ usado. - 2026-08-30
AUD11
O MODO DE FALHA QUE FECHOU SEIS TENTATIVAS EXTERNAS ERA TRANSPORTE, NÃO ARITMÉTICA. Medido em produção: a mesma rota variou de 1,9 s a 48,7 s em seis chamadas, com uma estourando 60 s. Localmente ela leva 136 ms — não é o algoritmo, é contenção numa instância de 0,5 CPU servindo 1,8 GB de SQLite em disco de rede. - 2026-08-30
AUD10
O PROMPT COLOCAVA UMA MENTIRA NA BOCA DE QUEM COLA. Ele abria com "Eu não sou o dono dela e não tenho interesse no resultado" — e quem mais cola este prompt somos NÓS. O quinto auditor externo apontou: a auditoria abriu com "não sou o dono" e o desfecho chegou em primeira pessoa, "culpa nossa, corrigido". - 2026-08-29
MED12
A BRECHA DO MED07, ACHADA AO CONFERIR O /conector. O MED07 cobra o selo de quem USA marcador — e a página que ensina a IA a se conectar escapava por não usar nenhum: tinha "400+ empresas" e "16 anos" digitados. Os valores reais eram 456 e 17. - 2026-08-29
MED07
A REGRA JÁ ESTAVA ESCRITA E APLICADA PELA METADE. O docstring de `_selo_de_versao` diz "para QUALQUER página que carregue contagem ao vivo" — e o selo estava em duas das quatro. `/metodologia` anunciava "{{N_TESTES}} testes" e `/chave` "{{N_EMPRESAS}} companhias" sem nenhuma data: quem caísse numa cópia indexada via um número e não tinha como saber que estava velho. - 2026-08-29
MED04
ELE FICOU MUDO COM 7 FALHAS EM PRODUÇÃO. Acendia com `estado == "falhou"`, mas o laço regrava "rodando" ao começar cada nova tentativa — então o alarme apagava durante todo build em curso. Com o pytest estourando o teto de hora em hora, `/saude` chegou a responder `falhas: 7`, o erro de timeout e `atencao: null` na mesma linha, e a produção passou dois dias servindo base antiga. - 2026-08-29
AUD09
PRIMEIRO ACHADO DE DADO VINDO DE AUDITOR EXTERNO DESDE O GROK. Claude Chat, semente própria 582917, partindo de UM caso: a Suzano 2023 somava "Amortização do custo de transação, ágio e deságio" ao D&A e inflava o EBITDA em 0,34%. Ele não declarou divergência porque não tinha o CSV para mostrar a conta — e registrou a ressalva. Estava certo. - 2026-08-29
AUD08
QUINTA TENTATIVA EXTERNA, E O DIAGNÓSTICO MAIS PRECISO ATÉ AGORA. O revisor (Claude) escolheu a própria semente, montou a URL e a ferramenta dele RECUSOU: ela só abre URL que já apareceu na conversa ou num resultado de busca. Como o buscador não indexou o domínio, não havia caminho por link. - 2026-08-29
AUD07
QUARTA TENTATIVA EXTERNA TRAVADA NO MESMO TIPO DE PORTA. O revisor (GPT, semente 731947) leu a home de 47 KB e NÃO conseguiu ler `/auditoria/amostra/731947/25`. A rota respondia 200 em 1,4s — o problema era ser 142 KB de JSON cru, formato que ferramenta de navegação trunca. - 2026-08-29
AUD05
EU AFIRMEI QUE A REGRA NÃO ESTAVA DOCUMENTADA, E ESTAVA ERRADO. Procurei em `web/metodologia.html` — que é só o molde — e num diretório `conteudo/metodologia*.md` que não existe. O texto vive em `metodologia/fontes_e_padronizacao.md`, item 2, e está no ar desde sempre: "Consolidado primeiro; se a empresa não consolida em um ano, caímos para as individuais". - 2026-08-29
AUD04
ACHOU UM DEFEITO NA PRIMEIRA EXECUÇÃO : a DMPL tem uma dimensão a mais. CD_CVM + ORDEM_EXERC + CD_CONTA isola UMA linha em BPA, BPP, DRE e DFC — e devolveu SEIS na ELETROPAULO 2022, uma por coluna do patrimônio. Eu teria publicado uma coordenada ambígua para todo item vindo da DMPL, o auditor escolheria uma das seis no escuro, acharia um número que EXISTE, e reportaria divergência contra uma base correta. - 2026-08-29
AUD02
ISTO QUASE FOI PUBLICADO COMO "compare o SHA-256 e ele tem de bater". A CVM republica os zips — Last-Modified do de 2024 é 23/08/2026, dois dias DEPOIS da nossa ingestão. Um auditor que baixasse hoje teria hash diferente e concluiria adulteração. - 2026-08-28
I-B53
ACHADO ATACANDO A ITR , e a investigação começou no lugar errado. A auditoria de mutação apontou 11 empresa-anos com a soma dos trimestres valendo 2 a 3 vezes o exercício, e eu registrei como "série trimestral inflada, causa desconhecida". Era o contrário: a ITR estava certa, e a DFP anual é que estava malformada. - 2026-08-27
I-B52
SOBREVIVENTE DA RODADA 4, e o mais produtivo de todos : tripliquei as receitas trimestrais de uma empresa e nada reclamou. - 2026-08-27
I-B51
SOBREVIVENTE DA RODADA 4 : apaguei os 9.870 lançamentos de JCP e nenhum invariante reclamou. O dividend yield de quem paga JCP cairia quase pela metade, silenciosamente. - 2026-08-27
I-B50
SOBREVIVENTE DA RODADA 4 DA AUDITORIA DE MUTAÇÃO : desviei o `pl_ttm` em 40% e nada reclamou. O I-B43 recalcula indicadores ANUAIS a partir dos fatos; a série trimestral não tinha equivalente. - 2026-08-27
I-B48
SOBREVIVENTE DA RODADA 3 : editei uma reapresentação para dizer que os dois valores eram IGUAIS, e nada reclamou. - 2026-08-27
I-B47
SOBREVIVENTE DA RODADA 3 : troquei o `data_version` do banco por um rótulo inventado e nenhum teste reclamou. - 2026-08-27
I-B46
SOBREVIVENTE DA RODADA 3 DA AUDITORIA DE MUTAÇÃO. A rodada 1 encontrou que nenhum indicador era recalculado e nasceu o I-B43. Aí a taxa foi a 100%, e 100% quase sempre significa que o conjunto de ataques é fácil demais — não que o sistema esteja seguro. - 2026-08-27
I-B45
SOBREVIVENTE DA AUDITORIA DE MUTAÇÃO : inverti o sinal do preço de um múltiplo e nenhum invariante reclamou. Preço negativo não é número errado, é número IMPOSSÍVEL — e impossível passando é sinal de que ninguém olha essa camada. - 2026-08-27
I-B44
DOIS SOBREVIVENTES DA AUDITORIA DE MUTAÇÃO : apaguei a flag de um ROE e o aviso de empresa-casca de outro indicador. Nada reclamou. - 2026-08-27
I-B43
ACHADO POR AUDITORIA ADVERSARIAL DE MUTAÇÃO. Injetei defeitos no dado e medi quantos a bateria pegava: 11 de 15. Um dos sobreviventes foi DOBRAR uma margem líquida sem tocar nos fatos — e nada reclamou. - 2026-08-26
I-B42
GAP ACHADO POR AUDITORIA EXTERNA. A regra de escala divergente suprimia indicador absoluto e múltiplo, mas os FATOS continuavam saindo limpos: a CEPE5 de 2019 publicava pl_total = 1.629.052 quando o comparativo do ano seguinte diz 1.629.000.000. Quem lê /fatos ou o /dump recebia o número mil vezes errado sem nenhuma marca — e uma auditoria tropeçou exatamente nisso, listando a queda como anomalia da base. - 2026-08-26
I-B41
COMO APARECEU, E O MODO IMPORTA. O arquivo da CVM repete a mesma conta, no mesmo exercício e mesma ordem, com VALORES DIFERENTES e nada que as distinga — mesmo GRUPO_DFP, mesmas datas, mesma descrição. A REVEE de 2023 publica lucro 1,00 e 0,00 na mesma linha do plano. - 2026-08-26
I-B40
NASCEU DE UMA AUDITORIA QUE NÃO CONSEGUIU CONCLUIR. Uma sessão montou esta ponte para a WEGE3 e parou no meio: o `/fatos` não expunha OCI nem dividendos, então dava para chegar à suspeita e não à conclusão. O achado dela era falso alarme — a queda de R$ 4,6 bi no patrimônio era transação de capital com os sócios, declarada na DFP — mas o BURACO que a impediu de confirmar era real, e a ponte é justamente a checagem que pega erro de patrimônio. - 2026-08-25
TR32
INCIDENTE REAL. Uma mudança quebrou o caminho trimestral do build. O `except` registrava no log, tentava de novo a cada hora, o banco antigo seguia servindo — e o site parecia perfeitamente normal por DEZESSEIS HORAS. O desenho protegeu o usuário, porque nada meio construído foi publicado, mas protegeu bem demais: escondeu o problema de nós junto. - 2026-08-25
TR29
RISCO APONTADO PELO REVISOR EXTERNO , e ele está certo: a página de histórico pode produzir exatamente a impressão de certeza que existe para combater. Publicar "80/80" lê como "a base não tem erro". O que 80/80 significa é apenas "não foi encontrada divergência nestes 80 casos" — não sustenta afirmação sobre a população, ainda mais quando a maior parte das conferências foi feita por nós. - 2026-08-25
TR27
SUGESTÃO DO REVISOR EXTERNO, aceita inteira. O sorteio por hash consertou a reprodutibilidade, mas sobrava um buraco que ele nomeou: daqui a três anos o universo terá outro tamanho, e alguém que tenha publicado uma auditoria não consegue PROVAR que determinado caso pertencia àquela amostra. Sem prova, o resultado publicado vira palavra contra palavra — que é exatamente o que este endpoint existe para eliminar. - 2026-08-25
TR26
ACHADO CONTRA O NOSSO PRÓPRIO INTERESSE. Rodei as três sementes do revisor externo na versão nova da base para mandar a ele o diff caso a caso. Não havia diff: dos 75 casos, ZERO se repetiam. O universo tinha saído de 63.406 para 63.375 linhas e o sorteio era POSICIONAL — remover 31 linhas desloca todas as outras. - 2026-08-25
I-B39
NASCEU DE UM ERRO MEU, no mesmo dia em que escrevi a regra. O crescimento passou a usar o comparativo reapresentado, com fallback carimbado `denominador_sem_comparativo` para quem não tem comparativo. Só que a busca do comparativo casava `fato.item='receita'`, e financeira grava `receita_interm`: as 277 séries de banco caíram TODAS no fallback e nenhuma usou a regra nova. O commit afirmava "banco recebe a mesma regra" — falso. - 2026-08-25
I-B37
NASCEU DE UMA RECONSTRUÇÃO CONTRA O ZIP BRUTO DA CVM , feita depois que um revisor externo conseguiu auditar só 5 dos 75 casos porque a ferramenta dele recusa `application/zip`. Dos 64 reconstruíveis, 63 bateram ao sexto decimal. O 64º não era erro de conta: era ambiguidade de DEFINIÇÃO. - 2026-08-22
I-TR05
Nasceu de dois defeitos achados no mesmo dia , e o primeiro era pior que o segundo.
Os números desta página são ao vivo. Versão do dado 2026-09-27-reapresentacao-agreg · página gerada em 2026-09-27 10:02 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.
Fontes: CVM (dados abertos, ODbL) e B3 (COTAHIST). Não afiliado à B3 nem à CVM. Não é recomendação de investimento.
Os números desta página são ao vivo. Versão do dado 2026-09-27-reapresentacao-agreg · página gerada em 2026-09-27 10:02 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.