Dados B3 › Transparência
Transparência
Transparência — como você confere os números você mesmo
Versão do dado 2026-11-03-ponte-b3-codigo-de-fundo · página gerada em 2026-11-07 01:02 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.
O que é conferido, antes de cada publicação — 1230 testes automáticos, coletados ao vivo
1099 são invariantes de DADO (o número fecha?) e 131 são de produto — gate de acesso, navegação, idioma, conector de IA. Chamar os 1230 de 'invariantes' seria inflar: a divisão é conferível na própria lista. Não é uma seleção à mão dos melhores exemplos: cada teste abaixo foi achado agora, introspectando os arquivos de teste de verdade, do mesmo jeito que pytest --collect-only acharia. Agrupados pelo que protegem, não pelo arquivo onde moram.
Nível 1 — Integridade: o dado fecha? (988)
I-X05— Toda cotação é positiva e dentro de faixa possível.I-X06— Nenhum salto diário acima de 15%.I-X07— O retorno em US$ tem de ser o retorno em R$ menos a variação do câmbio — a identidade que o próprio cálculo afirma.I-X10— O `n` de cada defasagem é EXATAMENTE o tamanho da sobreposição entre o fluxo e o retorno deslocado — nem um par a mais.I-X11— Nenhum `n` pode passar do comprimento da série mais curta.I-X12— A permutação preserva o tamanho de cada grupo E embaralha blocos que são contíguos NO TEMPO.I-X13— Ataca o I-X12 com três implementações defeituosas e exige que ele reprove duas e aprove uma.I-X14— Uma janela do SGS que falha é tentada de novo antes de virar buraco, e cada falha deixa o MOTIVO no log.I-B34— `situacao` só pode ser um dos quatro valores declarados.I-B35— Empresa marcada `com_proventos` tem proventos de verdade, e empresa marcada `sem_proventos` não tem nenhum.I-P16— Toda composição gravada respeita o erro máximo e a amostra mínima que a própria função declara exigir.I-P17— CONTRAPROVA a partir do ARQUIVO CRU da B3: recomputa `a×ON + b×PN` contra o preço da unit, sem passar pela função que inferiu nem pela tabela `preco`.I-P18— Empresa cujo principal é unit COM composição conhecida não pode mais carregar a flag de não-ajustado, e o P/VP tem de cair na mesma faixa plausível das outras empresas.I-B57— ordem 'U' é a publicação ORIGINAL e 'P' é a republicação.I-B58— Em /reapresentacoes, "antes" é `valor_ultimo` (o original).I-E06— O ticker que sai no /dump é o mesmo que `ticker WHERE principal=1` diria — nunca `empresa.I-E07— O conjunto `datas_suspeitas` do /dump é EXATAMENTE o que `eventos.I-E08— A CONTRAPROVA do achado inteiro: BBDC3, ITSA3, FLRY3 e ALUP11 não têm NENHUMA data suspeita — e portanto um consumidor que excluir empresa por empresa (em vez de data por data) as excluiria SEM MOTIVO.I-B01— Ativo total == Passivo total (conta 2 já inclui o PL).I-B02— Resultado bruto == Receita + Custo (custo vem negativo).I-B02b— LAIR + IR == Resultado das operações continuadas (3.09).I-B03— NOPAT = EBIT × (1 − aliq) com aliq em [0, 45%], e ROIC só é publicado com capital médio positivo.I-B04— O universo do banco é EXATAMENTE o que a regra declarada produz agora — recomputado por caminho independente do que o ingest gravou.I-B04b— As 20 empresas resolvidas à mão mantêm o ticker no banco — enriquecimento não pode se perder numa reingestão em escala.I-B27— ROA = lucro líquido / ativo médio, e o ativo total é sempre positivo (I-B05 já garante 0 <= ativo < 1e14).I-B06— Furo no MEIO da série de uma empresa é defeito de carga — dado que devia estar lá sumiu.I-B09— Margem bruta recalculada direto do CRU (sem passar pelo fato) bate com o indicador publicado.I-B26— F-Score de Piotroski é soma de 9 binários: só pode ser inteiro de 0 a 9. Fora disso, algum critério vazou um valor não-booleano.I-B28— Liquidez corrente recalculada direto do CRU (conta 1.01 do BPA / 2.01 do BPP, sem passar pelo fato) bate com o indicador publicado.I-B30— Toda empresa com fato tem macro-setor, e o setor está no domínio dos 10. Se um SETOR_ATIV novo do cadastro não casar nenhuma regra, a empresa fica sem setor e este teste reprova — em vez de cair num balde errado em silêncio.I-B21— Provento é entrada de caixa: valor > 0 sempre.I-B22— tipo no domínio fechado e data_com em ISO AAAA-MM-DD — é o que os endpoints e o cálculo de dividend yield assumem.I-E01— `mult_qtd` é recomputável do campo CRU da B3 pela regra declarada, e `mult_grupo` é o produto dos eventos do mesmo dia/ISIN.I-E02— Todo evento marcado `conferido=1` realmente passa no teste contra o preço do COTAHIST — o carimbo não pode ser mais generoso que a regra que ele diz aplicar.I-E03— Evento conferido não carrega flag de reprovação, e evento reprovado não é conferido.I-F01— INVARIANTE do produto: o VP por cota reportado no informe (Valor_Patrimonial_Cotas) é igual a PL ÷ cotas do MESMO informe.I-F03— Contraprova: P/VP recomputado aqui (preço ÷ vp_cota), fora do código de fiis.I-F04— O cruzamento ISIN (COTAHIST↔informe) resolveu ticker para uma massa razoável de fundos, e a maioria tem P/VP.I-X01— `líquido = ingresso − saída` em TODOS os meses.I-X04— Competência é sempre 'AAAA-MM'.I-L01— Quando a origem de um fato é composta ("DFC_MI:6.02.01+ 6.02.02"), a soma das linhas apontadas é o valor do fato.I-L02— Toda conta citada em `fato.I-L05— Contraprova de ponta a ponta: para uma amostra de empresas conhecidas, a linhagem entrega indicador → insumo → linha da conta → documento com data de publicação → arquivo da CVM, e o valor da linha bate com o do fato.I-B19— O lucro TTM gravado bate com o TTM recomputado AQUI, direto das tabelas fato/fato_trimestral, sem passar pelo código de precos.I-B20— Todo ano de 2010 até o ano corrente tem preços no banco.I-B29— FCF yield = (CFO + capex) / market_cap, recomputado direto do fato (CFO 6.01 + capex 6.02, sem passar por precos.I-P01— Nenhum código de negociação está ligado a mais de uma empresa.I-P03— Na janela em que o código velho e o novo coexistem, a empresa tem UM preço por dia — o do principal.I-B13— Mesmo invariante do I-B01 (ativo = passivo), na granularidade trimestral.I-B10— Números conferidos à mão, um a um, contra o calculado.I-P21— Preço 2+ anos após o exercício sempre carrega flag.I-P22— Reintroduzido o defeito, a marca TEM de aparecer.I-P06— mínima ≤ abertura, fechamento ≤ máxima, em TODA linha.I-P08— Numa data em que a empresa negociou sob DOIS códigos, os cinco preços vêm todos do código vencedor — não um de cada.I-P09— Preços de referência, conferidos em valor ABSOLUTO.I-P10— VOLTOT ≈ QUATOT × PREMED — a âncora que CRUZA fatias.I-P11— Volume, quantidade e negócios conferidos em valor ABSOLUTO.I-P13— Nenhum principal tem MUITO menos volume que um irmão de OUTRA classe que ainda negocia.I-B55— Nenhuma companhia não-ativa da CVM está no nosso universo.I-B56— A contagem de canceladas desde 2010 é maior que zero.I-B102— Companhia que o cadastro da CVM marca como não-ativa sai de `empresa` e de toda tabela por companhia, deixa o retrato (anos de DFP) e o motivo em `companhia_fora_do_universo` e a conta do que foi retirado em `saida_do_universo`; quem está fora da regra SEM a CVM marcar como não-ativa NÃO é apagada; cadastro sem universo não apaga ninguém.I-B103— A trava de encolhimento (`conferir_nao_encolheu`) perdoa a queda de contagem que é EXATAMENTE a saída de uma companhia cancelada, e só ela.I-B104— `construir_local.I-B36— O rastro publicado aponta para conta que EXISTE naquela empresa.I-B59— O último pregão do banco tem de ser recente.I-B60— O /saude diz até quando vai a série, não só quantos preços tem.I-B61— Patrimônio que despenca ~1000x e volta é MARCADO, e o ROE junto.I-B62— Patrimônio a caminho do negativo NÃO é marcado como escala.I-B63— A série trimestral publica só o que a ITR publica: 1T, 2T e 3T.I-B63b— `roe_ttm` é lucro de 12 meses sobre o PL MÉDIO dos controladores da MESMA janela — o mesmo trimestre do ano anterior, nunca o trimestre imediatamente anterior.I-B64— A decisão de reconstruir o banco sai do DISCO, não da memória do processo: uma semana já reconstruída com sucesso não é reconstruída de novo, e fora da janela de madrugada só se retoma o que ficou pela metade naquela mesma semana.I-B64b— `_estado_persistido_do_build` lê a tabela `meta` de verdade e devolve semana ISO — e um banco sem os registros não faz o laço quebrar, devolve o lado seguro (reconstruir).I-B65— Indicador que uma classe de companhia NUNCA tem é declarado como "não se aplica" — não sai como traço, que se lê como "não temos".I-B66— A atualização noturna procura EXATAMENTE os dias úteis que faltam: depois do último pregão do banco, até hoje — e hoje só depois da hora em que a B3 publica o arquivo.I-B66b— A rodada noturna ingere o arquivo diário numa CÓPIA, confere, e só então troca o banco no ar.I-B66c— A chave de cache do buscador, do /hoje e da página de ticker muda quando o ARQUIVO do banco muda — não só quando a versão da pipeline muda.I-B66d— Trocar o banco em produção exige o WAL do alvo consolidado e vazio.I-B66e— Banco com rodada `sem_novidade` e nenhum `ok`: o /saude diz `estado: "sem_novidade"` e preenche `ultima_rodada`; a rodada sem novidade não apaga o `ok` anterior; o bloco explica o estado, aponta `cobertura_de_preco.I-B66f— Banco sem nenhuma chave `diario_*`: `estado: "nunca_rodou"`, `ultima_rodada` vazia (nem inventa data nem resultado) e a explicação diz que não há registro.I-B67— A ficha da companhia (descrição, segmento, sede, escriturador, auditor, controle) sai do Formulário Cadastral MAIS RECENTE de cada companhia; o segmento de listagem é o do ticker PRINCIPAL; o endereço é o da sede; o escriturador é o em atuação.I-B68— A atualização noturna, além do preço, pergunta à B3 pelos proventos de ação e pelos rendimentos de FII, e à CVM pelos avisos de proventos (a data-com futura), na mesma cópia e antes do DY ser recalculado — e registra quantos entraram.I-B69— O boot aplica a migração de COLUNA, não só o CREATE TABLE.I-B70— Com a tabela de ETF já preenchida, o boot ACRESCENTA as linhas que faltam no derivado e não toca nas que existem.I-B71— `dados_b3.leitura` é a interface interna estável (Bloco 0): só lê, recebe a conexão de fora, não importa página nem estilo — e o que devolve BATE com o que a página de empresa mostra.I-B72— Reconstruir a base do zero PRESERVA o retrato das companhias que saíram da bolsa — na tabela e no derivado reexportado.I-B73— A meta Selic (SGS 432) entra como vigências contínuas: um dia que falte quebra a vigência em vez de esticar a meta anterior por cima; a média do exercício só sai com o ano inteiro coberto; uma janela da fonte que falha não grava nada; o derivado versionado nunca é reescrito com menos dias do que já cobre; o boot o carrega numa base vazia; e a base cobre todo exercício fechado com indicador.I-B74— A página de empresa lê a série de indicadores, os múltiplos, a série trimestral, as reapresentações e os proventos pela camada de leitura (1ª fatia da migração, 26/09/2026) — e o que ela recebe é IGUAL à leitura direta do banco, valor e flag, para 20 companhias de tipos diferentes (banco, seguradora, exercício fora de dezembro, múltiplo suprimido).I-B75— A reapresentação registrada é a da agregação que o fato publica naquele exercício (con, ou ind quando a companhia não consolida), com a agregação NA CHAVE — nunca mais o individual por cima do consolidado.I-F09— Quando a ingestão recebe um informe com versão MAIOR que a gravada, cada campo publicado que mudou fica registrado com antes, depois, as duas versões e as duas entregas — antes de o upsert sobrescrever.I-F10— Num build do zero o banco novo nasce vazio: o "antes" está no banco ANTERIOR.I-F11— O registro vai para `derivado/fii_reapresentacao.I-H09— Os brutos NÃO caem dentro de `_build/`, que é apagado a cada build.I-H10— O build declara TMPDIR e SQLITE_TMPDIR fora do /tmp.I-H11— Banco sem as tabelas derivadas as ganha no BOOT, não no rebuild.I-H12— Falha ao carregar derivado vira aviso, nunca exceção no boot.I-P19— O código da B3 é 4 posições + classe, não 4 LETRAS + classe.I-P20— O código que representa a empresa sai de ARQUIVO, não de endpoint.I-P24— Quando o arquivo da CVM traz o bloco consolidado inteiro com zero (TIM S.I-P25— Para toda empresa cujo principal é unit com cesta conhecida, o valor de mercado publicado é (preço ÷ cesta) × ações — recomputado aqui das tabelas, sem passar pela função que o gravou — nos múltiplos anuais E nos trimestrais, com ou sem a correção de escala de milhares.I-P26— Nenhum múltiplo PUBLICADO tem contagem de ações 3x maior ou menor que a do ano imediatamente anterior com preço sem um evento societário que explique — e a regra tem os casos: salto sem evento (pega), 2x (passa), já ajustado por evento (passa), evento registrado (passa), ano seguinte à abertura de capital (passa), escala em milhares (passa, é da outra trava).I-P46— No banco real, o conjunto `multiplos_trimestrais` do /dump é do Pro (sem chave 401, chave grátis 403), tem as 14 colunas pedidas na ordem e uma linha por múltiplo trimestral; em TODA linha com ações e LPA, lpa_ttm × acoes = lucro_ttm; onde há P/L TTM, ele é o preço por ação (preço ÷ cesta da unit, lida da flag) ÷ lpa_ttm; sem lucro TTM ou sem market cap o LPA é nulo; e, para WEGE3, PETR4 e BPAC11 (unit de 3 ações), a linha do CSV é IGUAL à do JSON de /multiplos nos trimestres e o LPA anual fecha com o lucro do exercício e com o P/L anual.I-P48— Consolidado todo zero NÃO é a mesma coisa quando a empresa não tem controladas (TIM S.I-P49— Quando a linha dos controladores (3.11.01) falta ou veio zerada e NÃO há minoritário, o lucro total É o dos controladores: o fato `lucro_controladores` recebe o valor de 3.11 com a origem `.I-Q01— Ágio/deságio = fechamento ÷ cota − 1 SÓ no dia em que os dois existem.I-Q02— O documento do dia D traz o mês até D.I-Q03— As contas de resultado do COFI acumulam no exercício.I-Q04— Um ETF existe para o site quando (a) a CVM o registra como classe FIIM, (b) a B3 o lista com sigla e devolve o CNPJ no detalhe e (c) o ticker negociou no COTAHIST.I-Q05— A página do ETF de degustação (BOVA11) e o hub /etfs abrem em HTML sem chave e sem script, com a moldura do site, âncoras só para seção que existe, o ágio do MESMO dia e a taxa dita como EFETIVA; o JSON pela mesma URL só com chave ou Accept explícito; ticker inexistente é 404. O hub diz o número de ETFs e ele bate com a tabela.I-Q06— Duas fontes, um número: as COTAS EM CIRCULAÇÃO do balancete (FNET, plano COFI) vezes a cota do último dia do mês (informe diário) têm de bater com o PL daquele dia no informe, dentro de 1%.I-Q17— Quando um ranking de ETF não tem ninguém, a página DIZ por que, com a data em que a série começa — não some da tela.I-Q22— Cada rodada do backfill pula os documentos do FNET cujo id já está no banco.I-B37— O denominador do crescimento é o comparativo REAPRESENTADO.I-B38— Exercício com escala divergente não publica valor ABSOLUTO.I-B39— Nenhuma flag de exceção vale para 100% de uma classe de empresa.I-B40— PL_final = PL_inicial + sócios + abrangente + internas.I-B41— Conta com valores contraditórios no arquivo não é publicada.I-B42— O aviso de escala viaja no FATO, não só no indicador.I-B43— O indicador publicado bate com os fatos que o geraram.I-B44— Flag que a REGRA exige tem de estar lá — some, o teste grita.I-B45— Preço e market cap fora do possível não são publicados.I-B46— ROE e ROA batem com os fatos — não só as razões simples.I-B47— A versão gravada no banco é a versão do código que o gerou.I-B48— Linha de reapresentação que não diverge não é reapresentação.I-B49— Não existe caminho alternativo para dentro do lote de fatos.I-B50— O P/L trimestral é market cap dividido por lucro TTM.I-B51— JCP continua sendo metade do provento brasileiro.I-B52— A soma dos trimestres não pode contradizer o exercício.I-B53— DRE sem a linha de custo não publica margem limpa.I-B54— Quando as duas publicações da empresa discordam, o dado avisa.I-N100— Quando há reenvio capturado, a página mostra competência, campo (com o nosso rótulo), antes, depois, diferença e as versões; quando não há, diz com todas as letras que a CVM publica só a versão vigente e que não há número de antes — nunca tabela vazia calada.I-N101— Em /comparar/A/B cada indicador sai do dado da comparação no formato da casa (percentual ×100 com uma casa, múltiplo com duas e "x", F-Score "/9"), FCF yield em %, o ano do múltiplo é um só quando coincide e "A × B" quando não; a ficha traz nome e setor; conta que não existe para banco diz de quem é; o JSON-LD lista as duas nas posições 1 e 2. ★ POR QUE (27/09/2026): 23 de 38 pontos da comparação sobreviveram à mutação — a página renderizava qualquer número.I-N102— /vigia/{T}: para companhia ou fundo, os eventos do papel — os MESMOS do vigia, filtrados pelo ticker —, com filtro por tipo, o formulário de acompanhar (só companhia) e links para a página do papel, o vigia geral e o JSON; papel sem evento é noindex,follow; desconhecido é 404; fora do sitemap.I-N103— No banco real, a companhia que só publica o individual e tem reapresentação com um lado zerado no arquivo da CVM: a página de reapresentações diz "individual — companhia não consolida" em cada linha e "sem valor no arquivo" onde o lado veio zerado, nunca "R$ 0"; o JSON da mesma URL (Accept) e o de /empresas/{T}/reapresentacoes trazem a agregação e o lado sem valor, linha a linha igual à tabela; a página da companhia também não escreve 0,0 no lugar do lado zerado.I-N104— No banco real: as comparações curadas por setor (as três mais líquidas de cada setor) nunca passam do teto da configuração nem de 60; cada uma abre em PT e EN com o título "X × Y × Z: margem, ROIC, dívida, P/L (ano)", a tabela com as três lado a lado e o link do veredito de cada uma; ficam no sitemap com lastmod (o índice também), SEM noindex, e o índice lista todas; slug desconhecido é 404; /comparar/A/B continua noindex; a página de cada companhia da trinca liga para "comparar com o setor".I-N105— Para 30 companhias, 10 FIIs, 5 ETFs e todas as páginas de fato, o HTML inglês tem os MESMOS números de dado do português (extraídos por regex e normalizados: 1.234,5 = 1,234.5; datas em ISO), as mesmas âncoras, os mesmos links internos e o mesmo número de linhas em cada tabela; a diferença é só de texto.I-N106— Em toda página HTML do sitemap sem parâmetro e numa amostra das com parâmetro (companhias, FIIs, ETFs, guias, metodologias), em PT e EN: meta viewport; todo <img> com alt; todo campo de formulário com rótulo (label, label for ou aria-label); toda tabela dentro de .I-N107— Toda página HTML pública do sitemap (as de papel por amostra) declara exatamente três `<link rel="alternate" hreflang>`: pt-BR = a própria URL, en = a URL com `?lang=en`, x-default = pt-BR — e a versão `?lang=en` existe (`<html lang="en">`) e declara os MESMOS três.I-N108— Um só bloco JSON-LD, JSON de verdade, no `<head>`.I-N109— Cada `<url>` do sitemap de rota com versão EN traz os três `xhtml:link` (pt-BR, en, x-default) iguais aos do `<head>` da página; rota sem versão EN (/docs) não traz nenhum; o namespace xhtml está declarado; o XML é válido.I-N110— Toda resposta traz HSTS, nosniff, Referrer-Policy, Permissions-Policy e CSP (de `seguranca_config.I-N111— Rastreador da lista (configuração) recebe 403 em qualquer rota, antes de qualquer consulta; navegador, Googlebot, Bingbot e agentes de IA a pedido passam; o robots.I-N114— /cobertura, pedida como página (Accept text/html), mostra por companhia os exercícios (da primeira à última DFP entregue) e os campos centrais que existem, existem com ressalva ou faltam; o total por exercício; e cada falta com o motivo — da fonte ou nosso —, nunca "não temos" sem dizer por quê.I-N115— As três gravações do analytics (visita, uso de chave, degustação) rodam num fio do pool, nunca no laço de eventos da aplicação.I-N116— O erro do build mostra a primeira linha "E " de CADA teste reprovado, na ordem em que aparecem.I-N117— O título de busca das páginas de FII e de ETF traz o código, o nome como se busca (sem "FUNDO DE INVESTIMENTO IMOBILIÁRIO", "CLASSE DE ÍNDICE…", "RESPONSABILIDADE LIMITADA") e, no FII, o DY 12m e o P/VP quando o número não tem ressalva; e cabe no que o Google mostra.I-N118— Cada companhia tem três respostas (/acoes/X/dividendos, /lucro, /divida; banco e seguradora sem dívida): a frase começa pelo código e pelo nome (sem artigo de gênero), traz número e ano, nunca chama prejuízo de "lucro -R$", nunca transforma provento desconhecido em zero, conta o ano corrente só nos 12 meses; a página tem "confira você mesmo", o FAQPage, a versão .I-N119— O arquivo-chave do IndexNow responde 200 em texto simples com a chave e só com ela (e só a rota exata: outro nome .I-N120— A página de resposta (/acoes/X/dividendos, /lucro, /divida) traz UM bloco JSON-LD válido com o FAQPage cuja resposta é a MESMA frase do primeiro parágrafo visível (mesmos números), `dateModified` = data do dado mais recente usado (nunca futura), `isBasedOn` com a fonte (B3 ou CVM) e a URL canônica da língua pedida; um Dataset só quando há tabela.I-N121— /privacidade e /termos (PT), com ?lang=en e os endereços curtos /privacy e /terms (EN), respondem 200 sem cookie, nomeiam o operador com o CNPJ, o contato e a data; estão no sitemap; o rodapé de toda página liga as duas.I-N121b— A limpeza da /privacidade existe de verdade, em bancos sintéticos: no analytics, a linha de 366 dias sai e a de 364 fica, nas quatro tabelas e em lotes; o pedido de aviso cancelado há 366 dias sai com o e-mail (e os envios dele), o de 364 e o ativo ficam; a linha de campanha com mais de 365 dias perde o e-mail e guarda o resumo, e quem a recebeu continua sem receber de novo (campanha e lembrete).I-N122— O site tem ícone: /favicon.I-N123— `pl_max`/`pl_min` (anual) e `pl_ttm_max`/`pl_ttm_min` (12 meses) no screener, com `as_of`: o P/L é o do documento MAIS RECENTE já recebido na data, com preço de um pregão que já existia nela.I-N124— A página /buscar, com filtro de P/L, diz em frase curta quantas empresas ficaram de fora e por quê (agrupado), e quais entraram com ressalva.I-N150— `/indices/{codigo}` é uma PÁGINA para cada índice que o hub lista: o último fechamento com a data, a variação no dia, no mês, no ano e em 12 meses (cada uma sobre a base que a página diz), o gráfico em SVG, o desempenho (os MESMOS números de `/indices/{codigo}/desempenho`), os links para os JSON, o "Como citar" e um bloco JSON-LD (Dataset, FAQPage com a MESMA frase da página, trilha).I-N151— O portal de apps do ChatGPT confere o domínio do conector lendo /.I-N160— O guia das IAs (llms.I-N170— (1) A página de ATIVO individual (/acoes/X, /fiis/X, /etfs/X, /bdrs/X e subpáginas como /reapresentacoes e /dividendos) na versão `?lang=en` abre normalmente mas traz exatamente um uma só meta robots com noindex,follow (a regra mora em sinais_busca.I-N180— A primeira frase da página da AÇÃO responde "quanto pagou?" com número e data, gerada do banco: (1) o valor do ano é a soma das linhas daquele ano na TABELA DE PROVENTOS da própria página (?ano=); (2) a classe não se soma; (3) vale para a lista que as IAs mais abrem; (4) EN tem a mesma frase com os mesmos números; (5) a /dividendos abre com a mesma frase.I-N181— A primeira frase da página do FII traz o rendimento dos 12 meses e o DY 12m com as datas, da MESMA linha do cartão "DY 12m"; histórico parcial vira soma parcial SEM DY anualizado; DY extremo fica de fora com a ressalva dita.I-N182— Sem dado a frase CALA ("" — nada de R$ 0,00 que pareça medida); só a parte que existe sai; o gerador e a página de respostas não têm SQL (a camada de leitura é a única porta).I-N183— Gerador, não lista: percorre ações e FIIs da base — a página abre 200, e quando a frase existe ela não tem NaN/None/R$ 0,00.I-N184— Na página da AÇÃO a frase de resposta direta e o cartão "DY 12m" do bloco de valuation mostram o MESMO percentual e o MESMO R$/ação (a frase usa a conta do cartão, não outra); quando há data-com já anunciada, a soma a inclui e a frase diz quanto é e até quando.I-N190— Nas três listas com data (/listas/maiores-pagadoras-de-dividendos-AAAA, /listas/acoes-pl-abaixo-de-10, /listas/fiis-maior-dy-12-meses), em PT e EN, a PRIMEIRA frase traz o ticker e o número da PRIMEIRA linha da tabela (DY ou P/L, formatado igual), a tabela vem em ordem (DY do maior para o menor; P/L do menor para o maior), e todo número da página sai do mesmo cálculo da fonte: DY dos FIIs = fii_yield no ranking do hub /fiis, P/L = o do /buscar.I-N191— Em /listas/maiores-pagadoras-de-dividendos-AAAA cada linha é UMA classe (a do código principal: ON, PN, PNA, PNB, UNT) e o provento de 12 meses é a soma dos proventos SÓ dessa classe com data-com na janela, conferida direto na tabela `dividendo`; o DY é essa soma sobre o fechamento do último pregão; o mesmo ticker não aparece duas vezes; só entra ação com volume médio de 63 pregões >= o mínimo da home.I-N192— Cada lista mostra a DATA do dado (a do último pregão da base, ou a do preço do FII) na primeira frase e em "Dados de", explica o critério numa linha ("Critério:"), traz o bloco "Como citar" com a URL canônica e a data, termina com "não é recomendação", e declara UM bloco JSON-LD (lista de objetos, I-N35) com ItemList (nº de itens = linhas da tabela, primeiro item = primeira linha) e Dataset (`dateModified` = a data da página).I-N193— As três listas estão no /sitemap.I-N194— As três listas respondem 200 em PT e EN (`<html lang>` certo), com um <h1>, o seletor de idioma, o trio hreflang (EN indexável: é página de lista, não de ativo), sem problemas de acessibilidade e com cada ticker da tabela ligando para a página dele (/acoes/X ou /fiis/X), que também responde 200. ATAQUE: EN em 404; tabela sem link; h1 duplicado; EN com noindex.I-N200— UM mapa ticker -> classe exata (3 ON, 4 PN, 5 PNA, 6 PNB, 7 PNC, 8 PND, 11 UNT), o vocabulário de `dividendo.I-N201— Ação PNA/PNB/PNC (final 5-8) com provento nos 12 meses mostra o DY 12m e a frase, e o valor é a soma da tabela `dividendo` da CLASSE EXATA do ticker (nunca PN, nunca outra classe).I-N202— O ranking de maiores DY da home e o das maiores pagadoras (`_ranking_dy`) enxergam as ações de final 5-8 pela classe exata: uma PNB principal com provento na janela entra, e o provento de outra classe não conta.I-N20— Página que usa a moldura de FATO está em PAGINAS_DE_FATO.I-N210— O cartão /cartao/{ticker}/{tipo}.I-N211— O cartão sai com ETag e Last-Modified ligados à versão do dado e cache longo; `If-None-Match` devolve 304; ticker ou tipo inválido (e fundo, que não tem cartão) dá 404 limpo, sem cartão vazio.I-N212— A página /cartao/{ticker} (PT e EN) mostra a prévia de cada cartão e o código em <textarea readonly> (HTML com utm de embed, Markdown, BBCode; só lucro e ROE), sem JavaScript, `noindex,follow` e fora do sitemap; a página da ação leva o link "Embutir este quadro".I-N213— Cada pedido de /cartao/*.I-N21— Todo caminho de PAGINAS_DE_FATO responde 200. O par do I-N20. Sem ele a lista pode acumular caminho de página removida, e o painel passaria a publicar uma linha eternamente zerada — um zero que não significa "ninguém acessou", significa "isso não existe mais".I-N220— /empresas abre a página de vendas do Plano Empresarial em PT e EN para quem pede HTML, traz a frase do CNPJ, a primeira frase com o número de companhias do banco e o formulário POST sem JavaScript; quem pede `*/*` (o pacote Python, curl) continua recebendo a lista de companhias em JSON; a página está no sitemap, no rodapé e no llms.I-N221— Os preços da página são os aprovados em 18/10/2026 (R$ 490/mês ou R$ 4.900/ano; R$ 1.290/mês ou R$ 12.900/ano; 25% de desconto no 1º ano para plataformas de análise; sob medida; pagamento adiantado), nas duas línguas, e cada um dos exemplos de código (Python, Excel/Power Query, curl) chama uma rota que o app tem.I-N222— O POST /empresas grava o pedido de teste numa tabela própria do arquivo persistente (não no b3.sqlite), responde "Recebemos; respondemos em até 1 dia útil" sem repetir o e-mail, e NÃO grava: campo-isca preenchido, User-Agent de rastreador, e-mail de provedor pessoal, CNPJ que não fecha, falta de aceite, uso fora da lista.I-N223— O /admin/stats traz o bloco `pedidos_teste_empresa` (contagem e os últimos 10) e NUNCA o e-mail inteiro nem o nome: só `m***@dominio`.I-N224— A política de privacidade (PT e EN) cita o formulário de /empresas, o que ele guarda e o prazo em dias que o código aplica (`DIAS_GUARDA`), e as colunas da tabela do pedido são exatamente as que o texto descreve.I-N225— /privacidade/apagar (PT e EN) diz o que guardamos, por quê, por quanto tempo, como apagar, o que sai e o que fica (cobranças no Stripe, resumo do e-mail), traz o encarregado ("Encarregado pelo tratamento de dados pessoais", Valth Guimarães, contato@dadosb3.com) e o formulário; os prazos são os que o código aplica; a política de privacidade aponta para a página e traz o mesmo encarregado; a página não manda cookie.I-N226— docs/LGPD_INVENTARIO.I-N22— `/acoes/TICKER` responde 200 SEM chave, e está no sitemap.I-N23— O índice de `/acoes` e o sitemap cobrem as mesmas companhias.I-N240— Quem pede ao host antigo dados-b3.onrender.I-N241— No host antigo ficam SEM redirect: /mcp, /mcp/, /mcp/<qualquer>, /saude, /webhook/stripe, /.I-N242— O host normal (dadosb3.com) e o host de teste (testserver) nunca ganham 301; um POST ao host antigo fora da lista passa como está; REDIRECT_HOST_ANTIGO=0 desliga o redirect.I-N243— O middleware do redirect é registrado DEPOIS do `_registrar_visita`, ou seja, fica mais de fora e o 301 nunca chega ao registro de visita (no Starlette, o último registrado é o mais externo).I-N24— Número suprimido aparece com o motivo, não em branco.I-N250— Nenhuma página renderizada (/termos, /metodologia, /info, /conector, em PT e EN) diz que o COTAHIST é de "distribuição livre" nem cita o item 7.9 da política da B3; /termos declara que os dados da B3 dependem de licença para uso comercial e que guardar ou redistribuir a base exige o Plano Empresarial.I-N25— `/fiis/TICKER` responde 200 em HTML SEM chave, e está no sitemap.I-N260— O logger `uvicorn.I-N261— Se o provedor recusa (ou não existe) o envio de uma mensagem `sigiloso=True`, a linha de `correio_pendente.I-N262— A guarda diária (`retencao.I-N263— A guarda diária apaga de `envio_semanal` (semana, e-mail, estado) a linha de mais de 365 dias: ela só serve para não mandar o aviso duas vezes na mesma semana.I-N26— O índice do hub `/fiis` e o sitemap cobrem os mesmos fundos.I-N27— P/VP com ressalva aparece com a ressalva, não limpo.I-N28— Sem chave, `/fiis/TICKER` devolve a PÁGINA com qualquer Accept.I-N290— `analytics.I-N291— O middleware de visitas grava todo 5xx, também de caminho FORA da lista de medição e de visitante que não é IA (antes só a IA tinha rastro), e a exceção sem tratador conta como 500 e segue para o tratador padrão.I-N292— Depois da troca da base (atualização diária ou base estacionada) o servidor monta o sitemap uma vez, na thread da troca, em vez de deixar o primeiro visitante (o Googlebot) pagar a montagem fria.I-N29— A página e o JSON da amostra trazem os mesmos casos.I-N300— Cada provento da rota REST e da ferramenta `dividendos` traz `parcela` e `data_pagamento` (campos ACRESCENTADOS; nenhum campo antigo sai).I-N301— `dividend_yield_12m` ganha `ano_corrente_ate_hoje` e `ano_anterior_fechado` (R$ por ação, pela data-com, classe do ticker, o mesmo critério do total de 12 meses), conferidos aqui contra a soma da lista `proventos`.I-N302— O veredito da WEGE3 (JSON e página) diz de que dia é o preço do P/L e do P/VP: a `frase_topo` cita a data do preço do balanço (`itens.I-N30— Sitemap e `noindex` são ordens opostas; nada pode ter as duas.I-N31— A tabela do buscador sai montada do servidor, sem JavaScript.I-N32— Cada filtro corta mais, e dá para tirar UM sem perder os outros.I-N33— Quem não tem o número vai para o FIM, nas duas direções.I-N34— Cada empresa aponta para as outras do setor; cada fundo, para os outros do segmento.I-N35— O JSON-LD (schema.I-N360— /agenda-de-balancos e /data-com-da-semana, em PT e EN: a PRIMEIRA frase traz número e data (no formato do idioma), a página tem a data do dado, o critério, o bloco "Como citar" com a URL canônica, um JSON-LD (ItemList e Dataset) e NENHUM <script> que não seja JSON-LD (sem JavaScript); a frase da agenda de balanços diz que a data futura é ESTIMADA e que não é calendário oficial.I-N361— Com `Accept: application/json` a MESMA URL devolve o JSON (`Vary: Accept`); sem Accept explícito (e com `*/*`) devolve a página.I-N362— Cada tabela de /agenda-de-balancos está em ordem DECRESCENTE de valor de mercado (o do bloco "Tamanho e valuation" da página da companhia: `pagina_empresa.I-N363— Em /agenda-de-balancos (PT e EN) e no JSON, TODA linha com data depois de 'hoje' é 'Estimada' (Estimated), traz a data de entrega do ano passado de que sai (364 dias antes, mesmo dia da semana) e nunca 'Entregue'; toda linha 'Entregue' tem data até hoje e até o último dia que a base viu; as datas estimadas só existem para companhia que NÃO entregou este ano.I-N364— /agenda-de-balancos e /data-com-da-semana têm os MESMOS tickers, na mesma ordem, e os mesmos números (valores de mercado, valores por ação) em PT e EN; só o texto e o formato da data mudam; a primeira frase inglesa não tem palavra portuguesa e a portuguesa não tem a inglesa; cada página aponta para a outra (alternância de idioma).I-N365— Toda linha de /data-com-da-semana (data-com, código, valor por ação ou cota) e toda data de pagamento dela estão na agenda da /hoje (`agenda.I-N366— /agenda-de-balancos e /data-com-da-semana estão no sitemap (com lastmod), na seção de listas com data do llms.I-N367— Numa base mínima montada à mão: quem entregou na semana vai para 'entregue' (data real da primeira versão, mesmo com reenvio depois); quem entregou o documento do ano passado nesta semana e não entregou o deste ano vai para 'estimada' com a data +364 dias; quem já entregou este ano ANTES da semana não é estimado; a semana passada nunca estima; o período é o último fim de trimestre antes da semana (DFP em dezembro, ITR nos outros); semana sem nada devolve zeros e uma frase com número e data.I-N368— A home v3 (PT e EN) não tem JavaScript além do JSON-LD, e cada bloco de mercado traz a DATA do dado (o pulso em cada cartão; altas e quedas, as três abas e a agenda no cabeçalho do bloco).I-N369— O que a home mostra é o que a base guarda: o último valor e a variação do dia de Ibovespa, IFIX e dólar saem de `indice_preco`/`cambio` (último e penúltimo pregão), a meta Selic de `selic_meta`, e as 5 altas e 5 quedas são as ações líquidas (≥ R$ 5 mi) do último pregão, sem evento societário, com o fechamento como negociado.I-N36— O /sobre nomeia quem faz o site, em PT e em EN.I-N370— A TRAVA: o dado de um bloco com mais de 3 pregões de atraso (contra o último pregão da base) ou faltando NÃO aparece; no lugar vem "Dado em atualização".I-N371— Todo link interno da home (PT e EN) responde 200 (ou o redirecionamento que ele promete; só /dump, a porta com chave, responde 401 com a página que explica), o campo de e-mail envia para a rota que existe, e as seis ferramentas da grade abrem.I-N372— Paridade PT/EN da home: os mesmos ids, os mesmos links (só muda o ?lang=en), o mesmo número de cartões, linhas e datas; o inglês declara lang="en", traz o preço em dólar e não vaza as frases de interface em português.I-N373— Cada par texto/fundo desenhado pela home v3 (V3_PARES, em dados_b3/estilo.I-N374— O HTML da home (PT e EN) pesa menos que o teto medido.I-N375— O /saude traz o bloco `home`: o último pregão da base, o limite (3 pregões) e, para cada bloco da home (cobertura, altas e quedas, ações, FIIs, ETFs, agenda, CVM, índice e os quatro do pulso), a data, o atraso em pregões e o estado ok/atrasado; `atrasados` lista os que passaram da trava.I-N376— LICENÇA B3: preço, índice e provento só aparecem como tabela/gráfico informativo.I-N377— "A semana na bolsa" mostra o fechamento do último pregão da semana FECHADA contra o da semana anterior; o termômetro (IBOV, IDIV, IFIX, SMLL) é a variação de `indice_preco` entre as duas datas; o placar conta as ações líquidas (média de 63 pregões ≥ R$ 5 mi, código principal, sem evento societário na semana) que subiram, caíram e ficaram iguais; as 5 altas e 5 quedas são as do mesmo universo.I-N378— Cada frase do "Você sabia?" é uma REGRA sobre a base (índice que virou de direção; maior sequência de pregões seguidos de uma ação líquida; quantas ações líquidas com P/L entre 0 e 10; maior DY 12m de FII com 5.000 cotistas ou mais; maior volume da semana), tem número, data e fonte, e o número confere por SQL independente.I-N379— A TRAVA dos blocos novos, numa base montada à mão.I-N37— `/hoje` abre com qualquer Accept, está no sitemap e na lista do painel, e diz a janela e até onde cada dado vai.I-N380— A linha do tempo da CVM só lê o que a base já guarda: `comunicado` (Fato Relevante, Comunicado ao Mercado, Aviso aos Acionistas, do IPE da CVM) e `documento` (DFP/ITR; versão > 1 = reapresentação).I-N381— Todo link da semana na bolsa e da linha do tempo (PT e EN) responde 200: índices (/indices/IBOV.I-N382— Paridade PT/EN da semana e da linha do tempo: o mesmo número de índices, quadrados, altas e quedas, frases do "Você sabia?", dias e itens da linha do tempo; as frases de interface novas não vazam em português na página inglesa; a âncora "A semana" existe nos dois.I-N383— Os pares de texto/fundo que a semana e a linha do tempo desenham (texto e cinza sobre âmbar claro, título sobre cartão, etiquetas por tipo de documento) estão em V3_PARES e passam de 4,5 nos dois modos (I-N373 calcula); o CSS novo só usa cor por token (nenhum #hex, rgb() ou nome de cor solto); a cor nunca é o único sinal: toda variação leva seta e sinal, e o placar tem legenda com número.I-N384— O peso dos blocos novos: a semana inteira (placar com um <i> vazio por ação) abaixo de 12 KB e a linha do tempo abaixo de 5 KB, em PT e EN; nenhum <svg> novo (barras e quadrados são CSS); a home toda segue no teto de I-N374 (130 KB desde a fase 3).I-N385— O bloco `home` do /saude traz `semana`, `semana_indices` e `cvm_linha` com data, atraso em pregões e estado, e `limites_por_bloco` (semana 5, índices da semana 5, CVM 10) — o MESMO estado que decide o que a home mostra: 'ok' no /saude aparece com número na home, 'atrasado' aparece como aviso.I-N386— O mapa de calor mostra as ações líquidas (média de 63 pregões ≥ R$ 5 mi, código principal) do último pregão, no máximo 60 (as de maior volume médio), agrupadas pela ATIVIDADE do cadastro da CVM (a mesma do /comparar/setor; a holding entra na atividade-fim, atividade com menos de 2 ações ou sem atividade vai para "Outros", sempre o último grupo), sem papel com evento societário entre os dois pregões; cada célula é link para a ficha, escreve a variação do fechamento contra o pregão anterior e tem a cor da faixa do MESMO número arredondado; o title traz a variação (a fase 5 trocou o fechamento pelos três números); cada setor diz quantas e a mediana.I-N387— A TRAVA dos blocos da fase 3, numa base montada à mão.I-N388— O exemplo da home (12 meses; o papel do dia vem do rodízio, ver I-N397) é a linha de 1 ano da página /quanto-rendeu/{papel do dia}: os mesmos R$ só com o preço e com os proventos reinvestidos, as mesmas datas; sem evento societário na janela, o "só preço" confere com fechamento ÷ fechamento por SQL.I-N389— A grade de ferramentas (PT e EN): oito cartões (as calculadoras de DI e de juros compostos entraram em 30/10/2026); cada descrição começa pelo que a pessoa FAZ (verbo: Veja, Filtre, Digite, Abra / See, Filter, Type, Open), sem adjetivo de venda nem recomendação; pelo menos três usam PETR4 como exemplo; cada link responde 200; e o que o cartão promete está na página: os horizontes 1, 3, 5 e 10 anos no quanto rendeu, PETR4 na comparação de petróleo e gás, P/L e ROE no buscador, valor, peso e proventos a receber na carteira, os seis números do veredito nas small caps, Piotroski e dividendos nos rankings.I-N38— O total de cada seção da `/hoje` é o total do banco na mesma janela; seção vazia diz que está vazia.I-N390— Os links dos blocos de mercado e de ferramentas levam `?h=<bloco>` com o nome do PRÓPRIO bloco (lista fechada `analytics.I-N391— Cada clique de gente num bloco da home conta em `home_cliques` do /admin/stats, por bloco, em 7 e 30 dias: pela marca `?h=<bloco>` ou, sem marca, pelo Referer da home ('outros').I-N392— Paridade PT/EN do mapa, do quanto rendeu e das ferramentas: as mesmas células na mesma ordem e com a mesma cor, os mesmos setores (traduzidos no inglês), os mesmos links (só muda o idioma), o mesmo número de cartões; o número no inglês usa ponto decimal; nenhuma frase de interface em português vaza no inglês; as âncoras #mapa e #rendeu existem nos dois.I-N393— As sete faixas do mapa (texto sobre cada cor) e a faixa do quanto rendeu estão em V3_PARES e passam de 4,5 para 1 nos dois modos (calculado aqui também); o CSS novo só usa cor por token; a cor nunca é o único sinal: toda célula escreve o número com sinal (ou 0,0%) e a legenda dá o intervalo de cada cor em texto; no celular o mapa não alarga a página (grade com min(100%,…), célula de 68 px que quebra linha, nada de largura fixa acima de 340 px).I-N394— O bloco `home` do /saude traz `mapa` e `rendeu` com data, atraso em pregões e estado (régua diária de 3 pregões) — o MESMO estado que decide a home: 'ok' aparece com células/números, 'atrasado' com o aviso.I-N395— O peso dos blocos da fase 3: o mapa inteiro abaixo de 21,5 KB (10 KB nas fases 3 e 4; a fase 5 pôs três números, o title e o aria-label em cada uma das até 60 células: ~20,3 KB; no máximo 60 células, o estilo no CSS e não em cada célula), o quanto rendeu abaixo de 3,5 KB (2,5 KB na fase 3; a fase 4 acrescentou a frase da regra do rodízio), sem <svg> e sem style inline, em PT e EN; a home toda segue no teto de I-N374 (130 KB).I-N396— Numa base montada à mão com a ficha da CVM: a holding de setor-fim ("Emp.I-N397— O papel do exemplo sai de uma REGRA: as 6 ações de maior volume médio (63 pregões até o último pregão, código principal; empate pela ordem do código), em ordem, e a posição é o dia do ano do último pregão módulo 6. Refeito aqui por SQL próprio na base real.I-N398— O bloco "Fluxo estrangeiro" da home mostra os últimos 24 meses da tabela `fluxo_estrangeiro` (SQL independente), o último mês (líquido, o que entrou e o que saiu) e o acumulado de 12 meses com sinal, iguais ao JSON /fluxo-estrangeiro e ao cartão da página /fluxo-estrangeiro/grafico (a MESMA conta e o MESMO desenho).I-N399— A corrida da home sai de `indice_setorial` (SQL independente): janela das 261 últimas semanas (a de 5 anos do /setores), os 5 setores de maior retorno acumulado, os 3 de menor e o índice de mercado — 9 linhas, no máximo 10 —, cada um com o retorno escrito e com sinal, igual à coluna "5 anos" do /setores.I-N39— `/hoje` devolve JSON só a quem pede `application/json` EXPLICITAMENTE, e continua devolvendo a PÁGINA para todo o resto — e os números do JSON são os mesmos do banco.I-N400— A TRAVA dos dois gráficos, numa base montada à mão (último pregão 28/10/2026).I-N401— Paridade PT/EN dos dois gráficos: as mesmas barras, as mesmas linhas, os mesmos itens na mesma ordem (nomes dos setores traduzidos), os mesmos links (só muda o idioma), os mesmos ids; o número do inglês usa vírgula de milhar e ponto decimal; nenhuma frase de interface em português vaza no inglês; a barra de âncoras tem #corrida e #fluxo nos dois, na ordem pulso → altas e quedas → mapa → semana → corrida → fluxo → o resto; cada link dos blocos responde 200 (e o que leva ?h= devolve a mesma página sem ele).I-N402— As oito cores das linhas da corrida estão em V3_PARES (sobre o cartão e sobre o fundo) e passam de 4,5 para 1 nos dois modos (calculado aqui também), assim como as barras do fluxo (--pos e --coral sobre o cartão); o CSS novo só usa cor por token (nada de hexadecimal, rgb ou nome de cor) e nenhuma largura fixa acima de 340 px; o desenho não leva cor inline (`stroke=`/`fill=` só por classe); a cor NUNCA é o único sinal: o gráfico tem role="img" com aria-label que escreve os números-chave, a corrida tem a lista com o retorno com sinal e linhas tracejadas por classe, o fluxo tem o líquido e o acumulado escritos com sinal, e a barra de saída fica abaixo da linha do zero (ver I-N398).I-N403— O peso da fase 4: a corrida inteira abaixo de 10 KB (no máximo 9 caminhos de 70 pontos com coordenadas inteiras, a cor por classe de CSS), o fluxo abaixo de 5 KB (24 barras por classe), em PT e EN; a home toda abaixo do teto de I-N374 (150 KB e 34 KB comprimidos, o alvo do dono para a fase 4); os dois gráficos não ganham JavaScript.I-N404— O bloco `home` do /saude traz `corrida` (data, atraso em pregões, estado) e `fluxo` (competência, atraso em MESES, estado) — o MESMO estado que decide a home — e `limites_em_meses`; os blocos `corrida` e `fluxo` estão na lista fechada de cliques (`analytics.I-N405— Só as `/quanto-rendeu/{T}` de papéis LÍQUIDOS ficam no sitemap (ação: média de 63 pregões >= R$ 5 mi/dia; FII: >= 5.000 cotistas; ETF: média de 60 pregões >= R$ 1 mi/dia, as réguas que o site já usa); um papel líquido entra, um ilíquido sai.I-N406— A régua do sitemap do quanto rendeu é a das constantes do site (nenhum número novo): 63 pregões e `LIQUIDEZ_MIN_HOME` para ação, `COTISTAS_MIN` para FII, `LIQUIDEZ_MIN` para ETF; `_enxugar_quanto_rendeu` tira só o que é `/quanto-rendeu/X` fora do conjunto, mantém o resto na ordem e, se a conta falhar, devolve a lista como veio.I-N407— TODA `/acoes/X/reapresentacoes` e `/fiis/X/reapresentacoes` leva `<meta name=robots noindex,follow>` (com e sem reapresentação, como /comparar e /vigia), continua 200, mantém os links internos (a página do ativo liga para ela e ela liga de volta), nenhuma está no sitemap, e o JSON pedido por `Accept` segue igual.I-N408— `X-Robots-Tag: noindex` em toda resposta JSON/CSV (/saude, /fiis/X/desempenho, /empresas/X/veredito, o JSON de uma página pedido por Accept, o CSV do /buscar) e em NENHUMA destas: página HTML, robots.I-N409— `XRobotsNoindexNosDados` (ASGI puro) soma `X-Robots-Tag: noindex` só quando o `Content-Type` é JSON (inclui `+json`), NDJSON ou CSV e o caminho não é `/mcp` nem `/.I-N40— `/metodologia` devolve JSON a quem pede, com o título de cada página, e continua servindo a página para todo o resto.I-N410— A seção "LISTAS COM DATA (aberto, SEM CHAVE)" do /llms.I-N414— O quadro "Fluxo diário dos ETFs" da home bate com um SQL próprio, refeito aqui sem importar o módulo: o dia é o último com informe de MAIS DA METADE dos ETFs líquidos (média de 60 pregões de etf_preco >= R$ 1 mi, a régua de pagina_etf.I-N415— Numa base montada à mão (5 ETFs líquidos e 1 ilíquido): (1) o dia é o último com informe de MAIS DA METADE dos líquidos (2 de 5 = 40% não vale; num fundo de 4 ETFs, 2 de 4 = exatamente a metade também não vale e 3 de 4 vale); (2) ETF sem captação e resgate no dia fica de fora e é CONTADO, nunca vira zero ("1 ETF líquido não informou"); (3) a linha com resgate maior que o patrimônio do próprio fundo é descartada, contada e nomeada; (4) o ilíquido nunca entra; (5) total do dia = soma dos líquidos válidos (+R$ 55,0 mi) e a soma dos 5 últimos dias com cobertura (+R$ 79,0 mi); (6) a TRAVA: informe até 25 pregões atrás do último pregão da base mostra (25 = ok), com 26 vira "Dado em atualização" sem nenhum número, e o /saude diz o mesmo; (7) sem nenhum informe: aviso.I-N416— Paridade PT/EN do quadro dos ETFs (os mesmos ETFs, na mesma ordem, com as mesmas barras e os mesmos links; só muda o idioma; número com ponto decimal no inglês; nenhuma frase de interface em português vaza no inglês); cada ETF do quadro é link para a página DELE e a página responde 200; a âncora #etfs-fluxo existe e está na barra de âncoras; sem JavaScript; o texto diz o que é e o que não é ("Captação líquida = aplicações menos resgates informados no dia .I-N417— O termômetro de amplitude, numa base de 14 papéis montada à mão (260 pregões), bate com um cálculo refeito aqui com funções de janela do SQLite e um IFR escrito de novo: % de ações acima da média de 200 pregões hoje e há 5 pregões, a série dos últimos 20 pregões, quantas fecham na máxima e na mínima dos 252 pregões e o IFR médio com as contagens acima de 70 e abaixo de 30. O universo é o das líquidas com histórico e sem salto: a que desdobrou 3:1 entra pelo preço AJUSTADO (sem o ajuste ela seria uma "queda de 67%" e sairia como salto), a de salto sem evento, a de histórico curto e a ilíquida ficam de fora, e a página escreve o N.I-N418— Numa base REAL, a amplitude é conferida ação a ação por SQL próprio (função de janela AVG sobre 200 fechamentos, MAX/MIN sobre 252): para TODAS as ações do universo sem evento societário na janela, o `acima200`, a máxima e a mínima de 52 semanas do módulo são os do SQL; para cinco ações (as de maior volume, sem evento) o IFR de Wilder refeito aqui bate; o agregado (quantas acima da média, máximas, mínimas, IFR > 70 e < 30) é a soma do detalhe; a % escrita na home é essa contagem sobre o N.I-N419— A TRAVA da amplitude, numa base montada à mão em que as ações líquidas PARAM e só um papel ilíquido segue negociando (o último pregão da base anda; o das líquidas não): com as líquidas até 3 pregões atrás do último pregão da base o termômetro mostra (com a data do último pregão que mede escrita), com 4 vira "Dado em atualização" sem número nenhum; o /saude lista `amplitude` nos dois casos com o MESMO estado da tela e `atencao` acesa no atrasado; o universo pequeno demais (menos de 10 ações) também vira aviso.I-N41— A página de uma companhia traz a série trimestral, cada número igual ao do banco, sem 4º trimestre, nas duas línguas.I-N420— O termômetro (PT e EN): os mesmos cartões, na mesma ordem, com os mesmos números (ponto decimal no inglês); cada indicador tem a frase de uma linha que o explica ("Acima da média de 200 pregões: quantas ações fecham acima do preço médio dos últimos 200 pregões.I-N421— O mapa de calor tem TRÊS critérios (variação do dia, volume do dia e valor de mercado), trocados só com CSS (três rádios `name="mc"`, o primeiro marcado, e rótulos `for=`; nenhum JavaScript).I-N422— Numa base montada à mão (sem balanços, logo sem valor de mercado calculável): as células escrevem o volume do pregão (R$ 50 mi → "50 mi", faixa v1), o valor de mercado vira "—" sem faixa (m0), o title e o aria-label dizem "indisponível" em vez de inventar um número, e a legenda do valor de mercado ganha "— sem valor calculável".I-N423— Contraste e cor da fase 5: as cinco faixas da escala sequencial do mapa (texto escuro nas três claras, a tinta forte `--mc-t3` nas duas escuras) estão em V3_PARES e passam de 4,5 para 1 nos DOIS modos (calculado aqui também); a escala é de UMA cor (matiz azul, a mesma nas cinco, nos dois modos) e vai do claro ao escuro no modo claro e do escuro ao claro no modo escuro (a faixa mais forte é sempre a mais destacada contra o fundo); o seletor de critério usa só pares que já existem; o CSS novo só usa cor por token (nenhuma cor crua) e nenhuma largura fixa acima de 340 px; o estado marcado do seletor aparece sem depender só da cor (o rótulo marcado muda de fundo E o texto da legenda diz o critério); o foco do teclado tem contorno; o resto da fase (amplitude e ETFs) usa só tokens que existem.I-N424— O bloco `home` do /saude traz `amplitude` (régua diária de 3 pregões) e `etfs_fluxo` (régua de 25 pregões, em `limites_por_bloco`), cada um com data, atraso em pregões e estado — o MESMO estado que decide a tela (ok mostra os números, atrasado mostra "Dado em atualização"); `atrasados` lista os que passaram da trava; os dois blocos estão na lista fechada de cliques (`analytics.I-N425— O peso da fase 5: o termômetro de amplitude abaixo de 7 KB (4 cartões e um <svg> de 20 pontos amostrados, o estilo no CSS e não em cada elemento), o fluxo dos ETFs abaixo de 6 KB (no máximo 5 aportes e 5 resgates, uma barra por classe de CSS e `--w` como único estilo inline), em PT e EN; nenhum dos dois tem JavaScript nem imagem; a home toda abaixo do teto de I-N374 (165 KB e 38 KB comprimidos, o alvo que o dono deu para a fase 5).I-N426— A ingestão de ETF e de FII lê do COTAHIST abertura, máxima, mínima, fechamento, volume, negócios e quantidade.I-N427— A rodada noturna (`atualizacao_diaria.I-N428— Com a base que estava no ar (etf_preco/fii_preco sem as colunas novas, sem etf_provento nem etf_evento), as rotas que já existiam (`/etfs/{T}/desempenho`, `/fiis/{T}/desempenho`, `/etfs/{T}/diario`) respondem 200 como antes e a rota nova responde 200 com as colunas novas NULL, `ajustada` falso e sem erro de coluna ou tabela inexistente.I-N429— `gravar_suplemento` (a ficha da B3 pela sigla do ETF): rendimento com ISIN de cota (BR + 4 letras da sigla + CTF) e valor positivo entra em `etf_provento` (a AMORTIZAÇÃO entra com o tipo dela, para a conta de retorno ignorar); valor zero e ISIN de ação de outro código ficam de fora; no bloco de eventos entram só DESDOBRAMENTO, GRUPAMENTO e BONIFICAÇÃO de cota (a bonificação de 1987 com ISIN de ação e o "RESG TOTAL RV" ficam de fora).I-N42— `/o-que-erramos` sai dos docstrings dos invariantes, não de uma lista à mão — e todo defeito datado do código aparece nela.I-N430— Numa base montada à mão (ETF com desdobramento 4:1 e um rendimento de R$ 0,50): `/etfs/{T}/precos` devolve o `fechamento_ajustado` igual a fechamento ÷ 4 até a data-com e igual ao fechamento depois (conta refeita aqui), sem ajustar abertura/máxima/mínima/volume, com o evento listado como conferido e nenhum salto sem explicação; o retorno de 1 mês COM rendimentos reinvestidos é o de `retornos.I-N431— (a) ETF com queda de 4x e NENHUM evento: a série NÃO é ajustada (`ajustada` falso, sem `fechamento_ajustado`), o salto está em `saltos_sem_explicacao` com a data e a razão, e o retorno da janela que o atravessa fica SEM número, com o motivo `evento_societario_no_periodo`; (b) ETF com evento declarado mas não confirmado pelo preço (declarou 2:1, o preço caiu 4x): não ajusta, e o salto continua sinalizado; (c) o mesmo salto num FII é sinalizado do mesmo jeito (FII não tem tabela de eventos).I-N432— `/etfs/{T}/precos` e `/fiis/{T}/precos` seguem o acesso da série de BDR e de ação: BOVA11 e MXRF11 abertos e inteiros; os demais, SEM chave, devolvem 200 com os últimos 30 pregões, `amostra` verdadeiro e o aviso de como ter a série (CSV vira JSON); COM chave, a série inteira e o CSV.I-N433— Na base de verdade: o número de pregões, o primeiro e o último dia e cada fechamento de BOVA11 (ETF) e de MXRF11 (FII) que a rota entrega são os de um SELECT próprio em `etf_preco`/`fii_preco`; a série vem em ordem de data sem dia repetido; se a base já foi reconstruída com o pregão inteiro, a mínima é maior que zero e menor ou igual à abertura e ao fechamento, e esses são menores ou iguais à máxima em TODOS os pregões.I-N434— O dump (CSV do plano Pro) ganhou `etf_precos`, `fii_precos`, `etf_proventos` e `etf_eventos`: o CSV de `etf_precos` e de `fii_precos` tem o cabeçalho (ticker, cnpj, data, abertura, maxima, minima, fechamento, volume, negocios, quantidade) e todas as linhas do banco, iguais a um SELECT próprio; os eventos e rendimentos saem com a conferência.I-N435— A página de metodologia de ETFs (`/metodologia/etfs`, PT e EN) tem a seção da série diária, da série ajustada e dos rendimentos, e diz o que a conta faz e o que NÃO faz: só evento confirmado pelo preço ajusta, salto sem explicação é sinalizado e não ajustado, o retorno com rendimentos usa a conta das ações e dos FIIs, a B3 informa cerca de 12 meses de rendimento, BOVA11 não distribui (nada é estimado) e a renda fixa não responde na fonte.I-N436— Uma resposta 4xx no `/mcp` é gravada no painel com o método e a versão do protocolo MCP pedida, entre colchetes depois do caminho, para o pulso dizer POR QUE a IA recebeu 400. Fora esses dois campos, nada vai junto (nem outro cabeçalho, nem o corpo).I-N43— A moldura de toda página bilíngue está em inglês, e onde o CONTEÚDO fica em português a página declara isso — não deixa o leitor de inglês bater num muro de texto sem explicação.I-N445— Pela mesma régua de liquidez do quanto rendeu, `/acoes/X/dividendos`, `/lucro` e `/divida` de papel ilíquido saem do sitemap (as do líquido ficam); `/acoes/X`, a página da companhia, fica sempre; outra rota com três partes não é tocada.I-N446— A página principal da ação e a do FII trazem "Como citar" (PT) / "How to cite" (EN) logo abaixo da resposta direta, com o nome do site, o código e a URL canônica da própria página (com ?lang=en no inglês).I-N447— A /saiu-da-bolsa abre com a resposta de "quem saiu da bolsa em {ano}?": o último ano FECHADO, quantas e quais companhias deixaram de ser negociadas na B3 (ano do último pregão), o ano corrente até hoje, a tabela por ano com a situação na CVM (cancelada com motivo, ou registro ainda ativo) e a linha "Como citar"; sem dado, cala.I-N448— Quem saiu da bolsa é contado pelo ÚLTIMO PREGÃO: entra a companhia cancelada na CVM com pregão registrado (no ano do último pregão, não do cancelamento) e a companhia ainda registrada que negociava com regularidade e parou há mais de 60 dias.I-N44— A busca acha por código, por nome (com ou sem acento) e por CNPJ; código exato leva DIRETO ao ativo; termo vazio não devolve a base.I-N45— `/comparar/A/B` compara o ano em que AS DUAS têm o número, declara o que não existe para aquele tipo de companhia, e não diz qual é a melhor.I-N46— A página da empresa traz gráficos em SVG gerados no servidor — sem script — um por indicador que se aplica; ano sem valor é buraco na linha, ponto com ressalva é vazado, e o último valor do cartão é o do banco.I-N471— A home (a página mais aberta a pedido de IA: 1.576 em 30 dias) traz "Como citar" (PT) / "How to cite" (EN) logo abaixo dos cartões de cobertura, com as MESMAS contagens dos cartões, o fechamento datado e a URL da própria home (com ?lang=en no inglês).I-N472— A página do ETF (/etfs/BOVA11 240 e /etfs/DIVO11 165 aberturas a pedido de IA em 30 dias) abre, logo abaixo do título, com uma frase gerada do banco: fechamento, retorno de 12 meses pela cota e patrimônio, CADA UM com a sua data; e a linha "Como citar" com o código, a data e a URL canônica.I-N473— O /hoje abre com uma frase que diz os totais da janela (balanços, reenvios, proventos e rendimentos de FII) com as duas datas e o último pregão, os MESMOS números dos títulos das seções; e a linha "Como citar" com a janela e o último pregão, porque a página muda todo dia.I-N47— A página da empresa e a do FII mostram o fechamento NOSSO (data e preço do COTAHIST, o que a API serve) ao lado do widget do TradingView — com o crédito obrigatório, dizendo que aquele número não entra na API.I-N48— A home abre com a conta aberta de uma companhia real — o ROIC refeito a partir das linhas cruas, cada linha com a conta da CVM de origem — e o resultado mostrado é o MESMO que a base publica.I-N490— Seguindo só `<a href>` sem parâmetro a partir de `/`, TODA URL do sitemap é alcançada, a no máximo 3 cliques, e nenhuma página do caminho responde erro.I-N491— Cada `/quanto-rendeu/{T}` e cada `/acoes/{T}/dividendos` do sitemap recebe link de pelo menos 2 páginas do sitemap (antes: 1 e 3, só as do próprio papel), cada índice da B3 de pelo menos 3, e a mediana do quanto rendeu sobe a 4 ou mais.I-N492— A ficha /acoes/{T} traz o bloco "Proventos e retorno no setor": as `K` (6) maiores do MESMO setor por valor de mercado (as mesmas do "Comparar"), cada uma com link para a ficha, os proventos e o quanto rendeu, todos 200; a migalha passa pela página do setor (200).I-N493— `/acoes/{T}/dividendos` liga os proventos das maiores do setor, o quanto rendeu do papel, a lista das pagadoras e o setor; `/quanto-rendeu/{T}` liga os proventos (ação) e o quanto rendeu das pares de PORTE PARECIDO do setor (ação, valor de mercado), do segmento (FII, cotistas) ou dos ETFs (volume); a página do FII liga o quanto rendeu dos maiores do segmento, o IFIX e, se o fundo está nela, a lista com data com a posição.I-N494— O hub /acoes tem cartão (link simples) para /indices, /small-caps, /carteira e /saiu-da-bolsa; o /macro para /indices; o /fiis para a lista dos FIIs de maior rendimento e para o IFIX — todos 200. O sitemap não anuncia o `/quanto-rendeu` de ETF com menos de um ano de cota (a página só diria "ainda não há histórico"), que segue no ar, ligado de volta ao ETF.I-N49— A página da empresa abre com o que a companhia faz e onde está (ficha do FCA, com a fonte declarada), traz uma barra de âncoras em que TODA entrada aponta para uma seção que existe, e um gráfico de preço em SVG do servidor cujo último ponto é o último fechamento do banco.I-N50— A página do FII tem o que a página da empresa tem: ficha em cartões com a fonte declarada, barra de âncoras em que toda entrada aponta para seção existente, três gráficos SVG do servidor (preço, P/VP ponto-no-tempo, rendimento por cota) cujo último ponto bate com o banco, e a série de P/VP enxuta (24 informes) com a completa por link.I-N51— A página da empresa abre um bloco "Tamanho e valuation": valor de mercado (fechamento de hoje × ações do último balanço público), EV, LPA, VPA, DY 12m, payout e nº de ações — cada cartão com o ano — e os múltiplos ponto-no-tempo ganham o ano no rótulo.I-N52— Ao lado do fechamento, a página (empresa e FII) mostra o retorno de 1 mês, 12 meses e no ano e a faixa de 52 semanas — calculados da série de fechamento do banco.I-N530— A /procurar vazia (e a busca sem resultado, como "dados b3") abre, antes da caixa de busca, com UMA frase que diz o que é o Dados B3: as contagens de companhias, FIIs, ETFs e BDRs IGUAIS às dos cartões da home, o fechamento datado (B3, COTAHIST), balanços da CVM desde 2010, a versão do dado do rodapé e que o site não é afiliado à B3 nem à CVM; logo abaixo, "Como citar" com a URL da /procurar.I-N531— A busca por nome com UM resultado à frente na ordem da busca abre com a frase dos fatos dele, gerada do banco: ação ("petrobras" -> PETR4) com o último fechamento e a data, os proventos por ação dos 12 meses e o DY (os do bloco de valuation da ficha), o P/L 12 m com o trimestre e o link para a página completa; FII ("maxi renda" -> MXRF11) e ETF com a frase das suas páginas; e "Como citar" apontando para a página do ativo.I-N532— O primeiro parágrafo da home (logo abaixo do título) começa com as contagens de companhias, FIIs, ETFs e BDRs IGUAIS às dos cartões de cobertura e o fechamento datado; o resto do texto de sempre vem depois.I-N533— A primeira frase do /etfs ("etfs listados b3", 2ª consulta que mais trouxe o Copilot) diz quantos fundos, quantos negociam mais de R$ 1 milhão por dia e de quando são os preços (a mesma data da linha "Preços até" da página), em PT e EN com os mesmos números.I-N53— Ao lado de cada indicador e múltiplo da empresa, a página mostra a mediana das OUTRAS companhias do mesmo setor CVM (cada uma no seu último ano), com quantas são.I-N54— Abaixo das razões, a página da empresa mostra o histórico em REAIS — receita, lucro dos controladores, EBITDA, dívida líquida, caixa e aplicações, patrimônio — ano a ano, com a unidade (R$ bi ou R$ mi) no rótulo.I-N55— A agenda de proventos (em /hoje, na home e nas páginas de ativo) mostra só o que tem data marcada daqui para a frente — pagamentos e datas-com de FII, datas-com de ação —, nunca uma data impossível (9999-12-31, "a definir" na B3), e DIZ até quando a base enxerga (data do anúncio mais novo que ela tem).I-N56— A data-com de ação ANTES de acontecer vem do "Relatório Proventos" que a companhia entrega à CVM (IPE): o formulário é lido (aprovação, último dia com direito, ISIN, valor, pagamento), entra sem tipo — o formulário não separa dividendo de JCP, e a página diz isso —, não repete o que a B3 já publicou (mesma companhia, classe, data-com e valor), só a classe do ticker principal, e cada item carrega o link do documento na CVM.I-N57— As últimas páginas que ainda rodavam JavaScript saem prontas do servidor: a corrida dos setores é SVG desenhado em Python, com janela e escala por LINK; o gráfico do fluxo estrangeiro é SVG desenhado em Python; a transparência filtra por família por um link que o servidor responde; o título da metodologia é escrito na página, não reescrito no navegador.I-N582— A ficha /acoes/{T} monta pela fila própria (`_limitador_da_ficha`, duas de cada vez), e a espera não ocupa vaga do pool das rotas síncronas.I-N583— `avisar_novas_do_sitemap` manda ao IndexNow só as URLs do sitemap que ainda não foram avisadas, no máximo uma vez a cada 20 h: na primeira vez (sem arquivo de estado) só o que o sitemap marca como mudado nos últimos 7 dias; nas seguintes, qualquer URL que não esteja no estado.I-N58— A página da companhia lista cada provento da classe principal numa tabela: tipo, data-com, data-ex, pagamento e valor por ação.I-N596— Depois da troca da base o aquecimento espera (`_AQUECER_ESPERA_S`), pede ao Linux que solte o cache do banco e PULA o sitemap e a carteira dos fundos se o processo está acima de ~1200 MB.I-N59— O gráfico de cotação (empresa e FII) escolhe a janela por LINK (1m, 3m, 6m, ano, 1a, 5a, max) e desenha o fechamento do banco na granularidade que cabe: diária até um ano, semanal em cinco, mensal no máximo.I-N60— A tabela "Em reais, ano a ano" ganha duas colunas da ITR: o último trimestre sozinho e os últimos 12 meses (TTM), montados pela MESMA identidade do P/L TTM — anual do ano anterior menos os trimestres dele até aqui, mais os deste ano; faltou um pedaço, fica vazio, nunca interpolado.I-N61— Depois da passada de coerência (cotação com o gráfico, valuation com os dois tempos, indicadores com as sparklines, nove âncoras), a página da companhia ganha três coisas vistas na AUVP Analítica, todas do que o banco já tinha: (1) indicadores por tema — valuation, endividamento, eficiência, rentabilidade, crescimento — cada um com a definição de uma linha e a marca "hoje" quando divide o valor de mercado de hoje por conta do exercício; múltiplo sobre denominador não positivo não existe; banco e seguradora ficam sem o que não se aplica; (2) as três demonstrações numa tabela só (resultado, balanço, caixa), com as derivadas ditas no nome da linha — dívida bruta = curto + longo, caixa livre = FCO + capex; (3) os eventos societários, com o multiplicador e se bateram com o salto do preço.I-N62— Do Investidor 10, só com o que o banco já tinha: (1) tabela de rentabilidade por janela (1 mês a 10 anos) com o preço sozinho e com proventos reinvestidos no fechamento da data-ex; o preço inicial é ajustado pelos eventos societários CONFERIDOS com o preço, e salto que eles não explicam deixa a janela vazia; (2) DY por ano (soma do ano ÷ fechamento do último pregão do ano) e a média de 5 anos; (3) meses com data-com nos últimos 5 anos, contados, não projetados; (4) liquidez média diária dos últimos 63 pregões na ficha; (5) checklist de nove fatos com o limiar escrito em cada linha, banco e seguradora fora do que não se aplica, dito como fato e não como recomendação.I-N63— Uma auditoria externa (ChatGPT cruzando com Fundamentus e Status Invest, 13/09/2026) deu nota 8,5 em "dados atuais": os outros mostram o último balanço trimestral e indicadores de 12 meses, nós abríamos com o exercício fechado.I-N64— Decisão do dono (13/09/2026): a ficha mostra o logotipo da companhia.I-N65— A tabela de rentabilidade ganha a linha real: o retorno com proventos reinvestidos dividido pela inflação acumulada na janela, do IPCA mensal do Banco Central (série 433), capitalizado mês a mês, com os meses de ponta pro rata pelos dias.I-N66— A página da companhia ganha "Acionistas e free float": do Formulário de Referência (FRE) da CVM, na versão mais recente que a companhia entregou, só as participações DIRETAS (a cadeia de controle, quem é dono da holding, fica fora), com a linha "Outros" do próprio formulário como mercado e a distribuição do capital como free float; a página diz a data de entrega e a versão.I-N67— Roadmap 7. O gráfico de preço e a linha 1m/12m/ano passam a ajustar a série pelos eventos societários CONFERIDOS contra a queda de preço observada (evento_societario.I-N68— Roadmap 12. Quem chega por um código de negociação ANTIGO (EMBR3, VVAR3, ELET3) é redirecionado com 301 para o atual, e a página de destino DIZ de onde ele veio — não finge que a pergunta era outra.I-N69— A agenda passa a mostrar o PAGAMENTO futuro de ação, que a ficha da B3 traz (`dividendo.I-N70— Roadmap 10 e 11. Duas regras de coerência, uma por vez: (1) MOLDURA.I-N71— Os três restos que ficaram para trás quando o item principal foi feito: (1) ao lado da mediana do setor, a POSIÇÃO no setor — "3º de 40" —, calculada dos mesmos valores da mediana, com a direção declarada (ROE alto é bom, P/L baixo é bom) e nenhuma posição inventada para indicador sem direção óbvia; (2) na página de FII, a mediana dos pares do segmento sai do parágrafo solto e entra no cartão do P/VP e do DY, como na companhia; (3) cada linha da tabela em reais ganha a forma da série numa linha minúscula, com buraco onde falta ano e a linha do zero quando a série troca de sinal.I-N72— Roadmap 8. A home ganha o mercado na primeira tela, do que já está no banco: maiores altas e baixas do último pregão, maiores dividend yields de 12 meses e os setores pelo retorno de 12 meses do nosso índice.I-N73— O que a companhia entregou à CVM fora das demonstrações — fato relevante, aviso aos acionistas, ata, comunicado ao mercado — vira uma lista na ficha, da entrega mais recente para a mais antiga, com o link para o documento na CVM.I-N74— Roadmap 14, a passada de texto.I-N75— A página /para-quem é o resumo que um assistente de IA consegue citar: a quem serve, a quem NÃO serve, quanto custa, como começar — em PT e EN, com o FAQ em JSON-LD (schema.I-N76— /fiis e /etfs devolvem JSON pela MESMA URL.I-N82— LPA, VPA e nº de ações saem na API, e são o MESMO número da página da companhia.I-N83— Depoimento obedece às mesmas exigências que um número, adaptadas ao que ele é: palavra de outra pessoa.I-N84— A página das companhias que saíram da bolsa mede o buraco sem fingir que o conserta, e não publica ticker inferido.I-N85— `as_of` filtra pelo que ESTAVA PÚBLICO na data, não pelo exercício.I-N86— /carteira?WEGE3=30&.I-N87— `screener?.I-N88— Toda resposta de dado de companhia (API e conector) traz o campo `citacao`, pronto para copiar: fonte, versão do dado e a data do último documento recebido pela CVM.I-N89— /empresas/{ticker}/veredito responde sem chave, com os seis itens, a bandeira com motivo, a frase de topo (≤ 35 palavras), a citação e nenhum termo da lista proibida — e a mesma coisa sai pelo conector.I-N90— A página da empresa traz o veredito no topo — a mesma frase, a mesma bandeira e os mesmos seis textos do JSON — com âncora, link "como calculamos" em cada número, e nenhum termo da lista proibida.I-N91— /small-caps lista SÓ as companhias dentro da janela de liquidez da configuração (piso ≤ média < teto), entre 30 e 120 delas; ordena por cada um dos seis números via link; filtra por setor; e diz na página que o veredito existe para todas as companhias, com o caminho.I-N92— /acoes/{T}/reapresentacoes responde no H1 "A {nome} já reapresentou balanço? Em que anos?", com uma linha por conta reapresentada (a mesma contagem da camada de leitura), o arquivo da CVM do ano que revelou cada uma, PT e EN; papel desconhecido é 404; a página está no sitemap e é linkada da página da companhia que tem reapresentação.I-N93— Toda página de companhia traz um FAQPage com as cinco perguntas do roteiro de citações, e cada NÚMERO de cada resposta aparece no HTML visível da própria página (a pergunta de reapresentação: os anos aparecem na página /reapresentacoes dela).I-N94— Cada cartão de múltiplo da página da companhia e a nota ponto-no-tempo dizem "preço de DD/MM/AAAA", e o JSON de múltiplos traz o mesmo texto em `preco_de`, casado com `data_preco`.I-N95— O <title> da página da companhia é gerado do dado — "WEGE3: ROE 32,2%, P/L 33,1 (2025) — Dados B3" — com o ROE do último ano sem ressalva e o P/L do último balanço, cada número no formato da própria página; a meta description traz os números do ano, não o objeto social.I-N96— As comparações geradas respondem `noindex,follow` (fora do índice, links seguidos) e não estão no sitemap; a página de reapresentação entra no sitemap SÓ para companhia que reapresentou — a de quem nunca reapresentou é `noindex,follow`.I-N97— Cada página de companhia no sitemap leva `<lastmod>` = o recebimento do documento mais recente dela na CVM; a de reapresentação, o da DFP que revelou a última; FII e ETF, o último informe.I-N98— /acoes lista todas as companhias com página, por setor, cada uma com código, nome e o ROE do último ano sem ressalva (o mesmo número da página dela; traço quando não há); o rodapé de toda página liga /acoes, /fiis e /etfs.I-N99— /fiis/{T}/reapresentacoes: o H1 é a pergunta, a primeira linha responde, e a tabela traz cada competência com versão acima de 1 — as MESMAS do banco — com a entrega e o arquivo da CVM do ano; link para o FNET e para a página do fundo, que liga para cá.LM01— LM01 · Na base real, TODA `<url>` do sitemap leva `<lastmod>` AAAA-MM-DD válido e nunca depois de hoje: dividendos = o provento mais recente da classe do código até hoje (aprovação, data-com ou pagamento); lucro e dívida = a DFP mais recente; quanto rendeu = o último pregão da companhia; BDR = o último pregão do BDR; guia, metodologia e página fixa = a data do texto — e, enquanto o texto é o da semente, exatamente a data dela.LM02— LM02 · Banco sintético: /acoes/REND3/dividendos leva a data mais recente, até hoje, entre aprovação, data-com e pagamento dos proventos da classe ON — o provento aprovado há 3 dias, com data-com e pagamento no futuro, vale pela aprovação; o provento da PN de ontem não conta.LM03— LM03 · O livro do texto (dados_b3/lastmod_texto.DL14— DL14 · No MCP, `eventos` de BIDI4 (sem chave) responde sem `erro`, com `saiu_da_bolsa` igual ao da REST, e o painel conta como uso.I-N443— No conector, o código passa pelo MESMO ponto de normalização das rotas: `precos` com "PETR4.SA" e com "petr4f" devolve a mesma série de "PETR4"; `indicadores_anuais` com "BVMF:VALE3" responde VALE3; `fii` com "HGLG11.SA" responde HGLG11; `indice` com "^BVSP" responde IBOV.I-N444— Nas ferramentas que exigem chave (eventos, scores, trimestres.MCP10— MCP10 · A lista de ferramentas no `llms.MCP11— MCP11 · A ferramenta `screener` do conector aceita `as_of`, igual à API.MCP12— MCP12 · A série diária e os eventos societários existem como ferramenta do conector: WEGE3 abre sem chave, papel fechado devolve `erro` + `como_resolver` (que diz que a chave vai NO ARGUMENTO, não em cabeçalho, e que o REST usa X-API-Key), com chave abre, e data torta volta como `erro` em vez de estourar.MCP13— MCP13 · `?chave=` nas rotas de leitura abre o papel fechado (a IA que só navega por URL não envia cabeçalho); o parâmetro some da query antes da rota (rotas com parâmetro estrito não dão 400); a resposta sai `private, no-store` + `no-referrer` + `noindex`; chave errada continua 401 COM a dica do `?chave=`; o cabeçalho tem precedência; /portal, /dump e /admin NÃO aceitam a chave na URL.MCP14— MCP14 · A ferramenta `desempenho` devolve os números prontos para QUALQUER ticker, com ou sem chave (degustação aberta), `erro` (não exceção) para ticker inexistente e parâmetro inválido, e as premissas na resposta.MCP15— MCP15 · `/precos` de papel fechado SEM chave devolve 200 com os últimos 30 pregões (em ordem, o último igual ao último da série completa), `amostra: true` e um `aviso` NO CORPO que diz como ter a série inteira e onde está a resposta pronta (`/desempenho`); `formato=csv` sem chave também vem em JSON (para o aviso aparecer); com chave válida vem a série inteira sem aviso; a WEGE3 (aberta) segue completa; ticker inexistente segue 404. ★ POR QUE (04/10/2026).MCP16— MCP16 · A ferramenta `indice` devolve o desempenho do IBOV sem chave, a série DIÁRIA em colunas (amostra de 30 pregões sem chave, inteira com chave), a lista quando `codigo` vem vazio e `erro` (não exceção) para índice que não existe.MCP17— MCP17 · A ferramenta `bdr` lista os BDRs sem chave (com filtro de tipo), devolve o AAPL34 sem chave e diz o que NÃO tem, cobra chave dos demais (erro, não exceção), traz a série diária em colunas (amostra de 30 pregões sem chave, inteira com chave) e responde `erro` para BDR que não existe ou tipo inválido.MCP18— MCP18 · A ferramenta `dividendos` responde para QUALQUER ticker sem chave (decisão do dono, 17/10/2026: no teste cego, o Claude com o conector ligado recebeu "chave ausente", desistiu e citou outro site — o mesmo dado é público em /acoes/TICKER/dividendos), a rota REST abriu igual (23/10/2026), e ticker inexistente vira `erro`, não exceção.MCP19— MCP19 · Toda ferramenta do conector declara `title` não vazio e as anotações `readOnlyHint` true e `destructiveHint` false: o diretório de conectores da Anthropic recusa ferramenta sem isso, e o Dados B3 só LÊ dados públicos.MCP20— MCP20 · O servidor MCP do diretório do ChatGPT (`/mcp/chatgpt/`) só expõe dado já aberto: nenhuma ferramenta tem argumento de credencial, nenhuma descrição e nenhuma resposta (cada ferramenta chamada com argumento válido, em modo comercial, sem chave) fala em chave, plano, Pro, assinatura, upgrade ou preço; toda resposta de sucesso traz `source_url` em https://dadosb3.com/ e a fonte; ticker inexistente e parâmetro inválido voltam como erro de ferramenta (`isError: true`); toda ferramenta tem `title` e as anotações de somente leitura; e o `/mcp/` do Claude segue com as mesmas 32 ferramentas, intocado.MCP21— MCP21 · O conector do ChatGPT diz ao modelo, nas instruções do servidor e no aviso de CADA resposta, que o dado é medida do passado e nunca vira recomendação de comprar, vender ou manter — a decisão é do usuário.MCP22— MCP22 · No conector do ChatGPT, `get_dividends` devolve só os proventos da CLASSE do ticker pedido e o total por ano por ação já pronto, igual à soma da lista.MCP23— MCP23 · As respostas JSON-RPC do /mcp/ e do /mcp/chatgpt/ NÃO levam `X-Robots-Tag` (o MCP é caminho de máquina e fica fora da regra central de noindex dos dados), enquanto um JSON de dado qualquer (/saude) leva.MCP24— MCP24 · O conector do Claude tem a ferramenta `listas`, com `title` e `readOnlyHint`, ABERTA (nenhum argumento obrigatório, `chave_api` opcional).MCP25— MCP25 · `etf` e `fii` ganharam `serie=True`: devolvem a série DIÁRIA em colunas (data, abertura, maxima, minima, fechamento, volume, negocios, quantidade; no ETF com evento confirmado, também `fechamento_ajustado`), a MESMA da rota `/etfs/{T}/precos` e `/fiis/{T}/precos`: mesmas linhas, mesmo número de pregões e fechamentos iguais a um SELECT próprio (BOVA11 e MXRF11 abertos, inteiros, sem chave); `de`/`ate` recortam; ticker desconhecido volta `erro`, não exceção.MCP26— MCP26 · Os dois servidores MCP (`/mcp/` do Claude e `/mcp/chatgpt/` do ChatGPT) respondem 200 ao cliente do protocolo NOVO (cabeçalho `MCP-Protocol-Version: 2026-07-28`) e continuam respondendo aos ANTIGOS (2025-06-18, 2025-11-25 e sem cabeçalho).MCP27— MCP27 · Achados do teste cego de 02/11/2026: (1) a IA calculou "R$ 1.000 em ITUB4 há 12 meses" com outra janela e deu número diferente da página; `quanto_rendeu` devolve EXATAMENTE o texto da página (/quanto-rendeu/{T}.MCP28— MCP28 · Achados do teste cego de 02/11/2026 (P7 e P9): o conector não tinha bancos nem quem saiu da bolsa.MCP29— MCP29 · `/mcp` e `/mcp/` (e `/mcp/chatgpt` e `/mcp/chatgpt/`) respondem 200 DIRETO ao POST JSON-RPC e ao GET de navegador, sem 307/301 e sem `Location`, e o endereço divulgado (llms.MCP30— MCP30 · No `/mcp/`, o 400 fica reservado ao pedido realmente inválido e vem SEMPRE com um erro JSON-RPC estruturado (`error.MCP31— MCP31 · As 15 ferramentas que entraram no `/mcp/chatgpt/` em 03/11/2026 (app 1.0.3) e as 13 de antes declaram as cinco anotações (title igual ao do topo, readOnlyHint true, destructiveHint false, idempotentHint true, openWorldHint false); as novas respondem em modo comercial SEM chave, para um ticker que não é o da degustação, com o MESMO dado da ferramenta equivalente do `/mcp/` (nenhuma conta paralela).MCP32— MCP32 · Cada 4xx dos dois servidores MCP (`/mcp/` e `/mcp/chatgpt/`) chega ao painel com o MOTIVO, uma palavra de lista fechada lida do corpo que o SDK escreveu (`accept`, `content_type`, `json_invalido`, `jsonrpc_invalido`, `versao_nao_suportada`, `cabecalho_divergente`.MCP33— MCP33 · As ferramentas do conector aceitam a data como o assistente costuma escrever: "2024" (de = 01/01, ate = 31/12), "2024-06", "06/2024", "01/06/2024", "2024/06/01", "20240601" e "2024-06-01T00:00:00Z", e respondem IGUAL à mesma chamada com AAAA-MM-DD.MCP34— MCP34 · Em `tools/list` do `/mcp/` (Claude) e do `/mcp/chatgpt/`, TODA propriedade de TODO `inputSchema` tem `description` não vazia e com mais de uma palavra; os nomes das ferramentas e dos argumentos não mudaram de número (36 e 28 ferramentas) e o servidor do ChatGPT segue com as cinco anotações (`title`, `readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`).MCP35— MCP35 · A página /conector (PT e EN) mostra o endereço de Claude e clientes MCP (`/mcp/`, com barra) e o dedicado ao ChatGPT (`/mcp/chatgpt/`), cada um com o número de ferramentas que o `tools/list` devolve de verdade (não uma constante na página); traz a linha do plugin do Claude Code, o link do repositório no GitHub (sem `?de=`) e a lista com TODOS os nomes de ferramenta do `/mcp/`, não só as da tabela.MCP36— MCP36 · Pelo HTTP de verdade, nos dois servidores: o rótulo do cliente sai do clientInfo do envelope 2026 (Cursor), do User-Agent no protocolo antigo sem clientInfo (Claude-User, openai-mcp) ou vira 'outro'; a classe e o ticker saem da base (PETR4.SA -> acao/PETR4, MXRF11 -> fii); código inexistente vira 'outro'.MCP37— MCP37 · Resposta de sucesso do `/mcp/` ganha SÓ a chave `metadados` (versao_dos_dados = DATA_VERSION, fonte_url, metodologia_url, observacoes quando o código foi normalizado) e o dado é o mesmo da rota REST.MCP38— MCP38 · O texto pronto para a próxima versão do app do ChatGPT (dados_b3/mcp_chatgpt_proxima_versao.MCP39— MCP36 · No `tools/list` do `/mcp/`, TODA ferramenta tem a descrição em seis blocos, na ordem (frase, "Use quando:" com 2 ou 3 perguntas entre aspas, "NÃO use para:" com a ferramenta irmã, "Fonte e fórmula:", "Retorna:", "Vazio ou erro:") mais "Acesso:"; cada par de PARES_IRMAOS se cita nas DUAS direções no bloco "NÃO use para"; toda ferramenta citada ali existe; nenhuma descrição passa de 1.800 caracteres e as instruções do servidor de 2.048, com a regra "em vez de busca na web", as palavras do catálogo (B3, FII, dividendos, CVM, ações brasileiras, ETF, deslistadas) e só nomes de ferramenta que existem; o código do ativo se chama `ticker` em toda ferramenta (exceção declarada: `indice.I-N330— Sem chave, as seis ferramentas da vitrine (fatos_contabeis, indicadores_anuais, multiplos, dividendos, fii, fiis_ranking) respondem para um ticker que não é a degustação, com `citacao`, e o dado é o MESMO da rota REST (fatos, indicadores, múltiplos, dividendos).I-N331— A descrição que a IA lê, em `tools/list`, marca as seis ferramentas da vitrine como ABERTAS, sem chave, qualquer ticker, um por vez, com o limite VIGENTE (o número de limites_config.RD06— RD06 · O POST JSON-RPC em /mcp (sem a barra, o endereço que muita gente digita) responde 200 no MESMO pedido, com a mesma lista de ferramentas do /mcp/; antes cada mensagem recebia 307 para /mcp/, e era a maior parte dos 3xx de IA da semana.MED13— MED13 · O registro de uso não permite reconstruir quem pediu o quê.MED14— MED14 · O painel diz DESDE QUANDO mede o uso de chave.MED15— MED15 · O uso de chave é contado num ponto só, e ele existe.MED16— MED16 · A degustação — o denominador da conversão em chave — é contada no middleware só quando é rota de DADO de papel aberto, sem chave, que deu certo e foi pedida por gente; guarda família do caminho e dia, nunca o ticker.MED17— MED17 · A retenção sai por coorte da semana do primeiro uso da chave: quantas estrearam e quantas voltaram N dias ou mais depois.MED18— MED18 · /admin/metricas não existe sem ADMIN_TOKEN (404) e, com ele, traz as quatro métricas do Bloco 5 — conversão da degustação, retenção, chegadas por via e eventos do vigia por mês (o mesmo contador da página /vigia) — sem e-mail, IP ou hash de chave.MED19— MED19 · Dois cenários sintéticos no mesmo dia-tipo: pessoas lendo 10 páginas muitas vezes NÃO é suspeito; o mesmo volume espalhado uma vez por página em 1.000 páginas É suspeito de rastreador.MED20— MED20 · derivado/search_console.MED21— MED21 · O pulso lê o relatório "estado do produto" da semana pelo /admin/metricas e imprime o resumo, a semana e o arquivo em que o servidor o gravou (DADOS_DIR/relatorios/AAAA-WW.MED22— MED22 · OAI-SearchBot e Claude-SearchBot (montando o índice da busca de IA) são `ia_indexador`, não `ia_a_pedido`; ChatGPT-User, Claude-User e Perplexity-User continuam `ia_a_pedido`.MED23— MED23 · O painel lê `dia` pelo MESMO relógio (UTC) com que a linha foi gravada.MED31— MED31 · O painel enxerga erro de IA: o acesso de IA grava status e tempo, o MCP é contado DEPOIS de rodar, com resultado ('ok' ou 'erro:<classe>'), e o bloco `ia_erros` separa 200 de 404, lista os caminhos que falham e dá mediana e p90. Nem ticker nem texto do usuário ficam gravados, e banco antigo sem as colunas migra sem perder linha.MED40— MED40 · Cada acesso de robô grava só a FAMÍLIA (ex.MED41— MED41 · ★ 01/11/2026: a medida do Google ficou parada de 26/09 a 01/11 porque a única linha do Search Console era a lançada à mão no repositório.MED42— MED42 · Cada pedido de IA a pedido grava a FAMÍLIA da rota (ticker vira *) e o tempo em ms, em histograma por hora; navegador, robô de busca e pedido sem tempo não gravam; query string, IP e user-agent não vão para o banco.MED43— MED43 · /admin/stats > ia_erros.MED44— MED44 · O armazenamento é limitado: no máximo 60 famílias por hora (o resto vira '(outros)'), só 10 caminhos lentos por hora, horas com mais de 48 h viram linhas por dia e o que passa de 35 dias some; o middleware grava o pedido de IA (e só o de IA) sem mudar a resposta.MED45— MED45 · `sinais_mcp.MED46— MED46 · O ticker só é gravado se existe na base pública (ação, FII, ETF, BDR); código desconhecido, frase ou e-mail vira 'outro' (classe 'outro'), e chamada sem código fica 'nenhum'.MED47— MED47 · A LOTE_LIMIAR-ésima chamada idêntica (mesma ferramenta, cliente e argumentos) em LOTE_JANELA_S segundos, e as seguintes, saem com lote=1; as anteriores, argumento diferente, cliente diferente ou a mesma chamada depois da janela ficam lote=0. A chave do argumento NÃO separa rajada (é a mesma chamada).MED48— MED48 · /admin/stats ganha `mcp_sinais` (por cliente da lista fechada chatgpt/claude/cursor/outro, por classe, tickers, parâmetros, rajada, primeiro uso de cada ferramenta) e `robos_por_familia_30d` (janela de 30 dias, 10 rotas e soma por seção por família), e mantém TODAS as chaves e formatos de antes: `mcp`, `robos_por_familia` de 7 dias com 5 rotas e sem `secoes`.MED49— MED49 · A /privacidade (PT e EN) descreve os sinais do conector com os números do código (marca de rajada com LOTE_LIMIAR, códigos não encontrados com a guarda de `_DIAS_CODIGO_GUARDADOS`), diz que não grava texto livre, chave, IP nem cabeçalho, e a tabela `mcp_uso` tem exatamente as colunas que a política cobre (coluna nova reprova até a política ser revista), nasce de forma idempotente e entra na limpeza de 365 dias (`retencao.TR34— TR25 · Rota COM PARÂMETRO que serve HTML abre com qualquer Accept e é medida.TR35— TR35 · O índice do /dump diz o tamanho do que sai sem código negociado.TR36— TR36 · `/empresas/{ticker}` responde, em vez de 404. Subir um nível numa URL é o gesto mais natural de quem explora uma API, e ele devolvia "não existe" para companhia que existe — um agente conclui que a cobertura acabou.TR37— TR37 · Os alarmes do /saude sobre banco sintético, um de cada vez: build que começou 3x (o limite) sem concluir acende, 2x não, e concluído não; 'rodando' há mais de 6h acende, 'falhou' há 7h não diz "rodando", 'rodando' há 1h não; o último pregão a 7 dias acende o alarme diário, a 6 não; 3 falhas seguidas da atualização diária acendem, 2 não; e banco sem preço nenhum dá cobertura nula em vez de derrubar a rota.TR38— TR38 · `_com_idioma` põe o seletor de idioma exatamente UMA vez e é idempotente (aplicar de novo não duplica), apontando para a outra língua da mesma rota; páginas públicas de cada família saem com um seletor só.TR39— TR39 · `_idioma`: só o ?lang= decide (en em qualquer caixa = inglês); o Accept-Language é ignorado desde 06/11/2026 (I-N700); sem ?lang= ou com valor que não é pt nem en, PT.TR40— TR40 · O middleware de visita conta, só em GET: a página de cada companhia, a de reapresentação dela, os hubs, as comparações e a página de FUNDO quando a resposta é HTML; não conta subcaminho arbitrário de /acoes, POST, nem o JSON de fundo pela mesma URL.TR41— TR41 · Pela mesma URL da página, com chave: fundo ou ETF desconhecido é 404; banco de outra versão responde 503 "construindo" (página e JSON); código antigo de fundo redireciona com 301 para o atual, e o código atual igual ao pedido NÃO redireciona.TR42— TR42 · /vigia/eventos: `desde` inclui o próprio dia; `limite` fica entre 1 e 5.000; `tipos` traz o nome de cada tipo.TR43— TR43 · Banco sem nenhuma chave de build ou de atualização diária: falhas e inícios são 0 e não há `atencao`; o disco sai em GB com duas casas e o percentual usado com uma, da mesma pasta de dados; a cobertura de preço traz o PRIMEIRO e o último pregão.TR44— TR44 · Degustação: /empresas/WEGE3 é rota de dado aberta; POST e resposta de erro não contam.TR45— TR45 · O cliente `dadosb3` (cliente/) roda contra o app pelo transporte do TestClient, sem rede: veredito, vigia (companhia e fundos), reapresentações de FII, screener com as_of e recibo, e a leitura do recibo.TR46— TR46 · A /api tem uma seção por rota pública e com chave (companhia, indicadores, múltiplos, dividendos, screener com as_of e recibo, recibo, veredito, vigia, reapresentações da companhia e do FII, FII, ETF).TR47— TR47 · O código só importa módulos PÚBLICOS do FastAPI e do Starlette (nenhum `fastapi.TR48— TR48 · Os exemplos da /api são gerados numa thread logo depois da subida (`_aquecer_exemplos_api`, disparada pelo ciclo de vida fora da bateria): depois dela, a primeira visita à /api não gera nada.TR49— TR49 · /metodologia/vigia e /metodologia/veredito existem em PT e EN, estão no índice, no sitemap e no llms.TR50— TR50 · O roteiro de fumaça de produção (`testes/fumaca_producao.I-N131— /demo/chatgpt (PT) e /demo/chatgpt?lang=en (EN) respondem 200 sem chave, mostram a gravação (img com alt e dimensões), o endereço https://dadosb3.com/mcp/chatgpt/ e o link da página do conector do Claude (/conector); declaram os três hreflang coerentes; cache público de 5 minutos; o GIF é servido como image/gif; a rota está no sitemap; e a página não fala de preço, plano nem recomenda.I-N495— /claude-code (PT) e /claude-code?lang=en (EN) respondem 200 sem chave e mostram os comandos de instalação do plugin (`/plugin install dados-b3 --marketplace Val7h/dados-b3-mcp`, o par `/plugin marketplace add` + `/plugin install dados-b3@dados-b3`) e o `claude mcp add --transport http dados-b3 https://dadosb3.com/mcp`; três perguntas de exemplo; link para /conector; os três hreflang coerentes; a página não fala de preço, plano, licença da B3 nem recomenda.I-B66g— Ao ATIVAR uma base nova (a função real `ativar_se_compativel`), as chaves `diario_*` da tabela `meta` do banco que estava no ar passam para o banco novo antes de ele entrar no ar, e o fato fica registrado (`diario_herdado_em` e `herdou_diario` no resultado).I-B66h— Se o banco NOVO já traz histórico `diario_*` mais recente que o do banco que sai, o novo vale: nada dele é sobrescrito e só entra o que lhe falta (ex.I-H01— O caso do fluxo em 21/08: a fonte externa devolveu ZERO e o banco em construção ficou sem nenhuma linha.I-H02— O caso do CÂMBIO em 21/08, que é o que um `if vier vazio: copiar` deixaria passar — veio pela metade, não vazio.I-H03— A regra em uma frase: depois da herança, nenhuma das tabelas pode ter MENOS linhas que o banco anterior.I-H04— Primeiro build da vida (ou disco limpo): não há de onde herdar.I-H05— Os números REAIS de 21/08/2026 têm de ser recusados.I-H06— A trava NÃO pode ser zero, e este é o teste que impede isso.I-H07— O caso normal: banco novo maior.I-H08— Primeiro build da vida: não há com o que comparar.I-H13— Uma regra nova pode tirar linhas de propósito — mas só declarando quanto, e só na troca de versão.I-H14— O backup diário copia as três bases pequenas do disco persistente (acompanhamento, analytics, recibos) pela API de backup do SQLite para DADOS_DIR/backup/AAAA-MM-DD/, com o conteúdo inteiro e abrível; não copia de novo no mesmo dia; base ausente fica de fora; guarda só os 7 dias mais recentes; /saude diz a data do último e quantos arquivos, sem caminho nem conteúdo.I-H15— O banco pronto sobe em pedaços pelas rotas /admin/base/*, só com o cabeçalho X-Admin-Token (a query e a ausência dão 404), e fica estacionado com a versão que ele traz, sem tocar no banco em produção.I-H16— Pedaço com offset diferente do que o servidor tem dá 409 com o tamanho atual (é assim que o script retoma depois de uma queda); pedaço acima do teto, vazio ou com outra base já pronta é recusado; sha256 errado, gzip inválido e arquivo que não é banco íntegro com data_version falham COM motivo e apagam o parcial, para recomeçar limpo.I-H17— A troca só acontece quando a base estacionada traz a versão que o CÓDIGO no ar promete, o banco em produção ainda não está nela e nenhuma contagem vigiada encolheu além do limite.I-H18— Com RECONSTRUIR_NO_SERVIDOR=0 o servidor não reconstrói o banco (versão nova ou domingo); sem banco nenhum ele ainda reconstrói, que é o socorro de um disco vazio.I-H19— `construir_local.I-H20— `_memoria_do_processo` lê o /proc e o cgroup (v2 e v1) e devolve MB do processo, do pico, do contêiner e do limite; "max" (sem teto) e arquivos ausentes ficam de fora; sem /proc (Windows) devolve None.I-H21— `construir_local.I-H22— Ao conferir uma base (sha256, descompressão, quick_check) o servidor pede `posix_fadvise(DONTNEED)` sobre o parcial e sobre o banco descomprimido; onde a chamada não existe (Windows) é um nada, sem erro.I-H23— Enquanto a base é descomprimida, conferida e recebida, uma thread pede ao Linux que descarte o cache a cada segundo (e a cada pedaço recebido); ao sair do bloco a thread termina.I-H24— `descomprimir` produz o arquivo idêntico e, a cada `a_cada` bytes escritos, força a gravação (fsync) e pede ao Linux que solte o cache.I-H25— Se uma consulta de rede dá tempo esgotado — no aviso de fim (cuja resposta se perde, mas o servidor já começou a conferir) ou na espera pela conferência — `enviar` tenta de novo e termina com a base PRONTA, em vez de morrer; um 409 "em andamento" no aviso repetido conta como "chegou".I-H26— `/admin/base/estado` diz se o servidor ainda reconstrói o banco (`reconstroi_no_servidor`), lendo RECONSTRUIR_NO_SERVIDOR: sem a variável ou com 1, verdadeiro; com 0, falso.I-H27— `python construir_local.I-H28— Ao ativar, a base estacionada recebe do banco em produção as linhas de fluxo estrangeiro, câmbio, IPCA e Selic que ela não tem (INSERT OR IGNORE: o que a base nova trouxe fica), e só então a trava de encolhimento decide.I-H29— Ao ativar, `etf_diario` e `etf_balancete` recebem do banco em produção as linhas que a base estacionada não tem; em conflito de chave fica a de `id_doc` MAIOR (a regra do schema); `etf_balancete_reenvio` só ganha o que não existe; tabela ausente num dos lados é ignorada sem derrubar.I-H30— Ao trocar, o banco que estava no ar fica ao lado como `<banco>.I-H31— `GET /admin/base/ar` entrega o banco em gzip que, descomprimido, é IDÊNTICO ao arquivo, com o tamanho original e a versão nos cabeçalhos; só com o cabeçalho do dono (404 sem ele ou com o token na URL); recusa com 503 se há WAL não consolidado e com 409 se já há um download em andamento; o lock é solto.I-H32— `construir_local.I-H33— `arquivar_no_redundante`: sem `DADOSB3_NAS_REDUNDANTE` não faz nada (e não levanta); configurado, copia os arquivos da casa e espelha as cópias `bases/ar/*` do NAS principal, sem recopiar o que já está lá e sem copiar nada fora da lista (banco de assinante); com o redundante fora do ar só AVISA.I-H34— `construir_local.I-H35— Entre o arquivo da base estacionada aparecer e a ficha com a versão ser gravada, `estado()` responde "processando" — nunca "pronta" com a versão vazia.I-H36— No Linux, o import do api limita o alocador a 2 arenas (`mallopt(M_ARENA_MAX=-8, 2)`) e o laço de hora em hora devolve a memória liberada (`malloc_trim(0)`); fora do Linux nada é chamado e o estado diz que não limitou.I-H37— `construir_local.I-H38— Se o servidor reinicia no meio da conferência (um deploy), a ficha que ficou dizendo "processando" passa a ler "falhou" com o motivo, e o mesmo envio pode ser finalizado de novo até virar "pronta".I-H39— O servidor tem o parcial COMPLETO de uma base velha e a ficha "falhou" (conferência interrompida por reinício, I-H38).I-H40— O isolamento de `testes/conftest.I-H46— `guardar_o_ar` NÃO baixa o banco do ar quando o NAS já tem a MESMA versão (base construída em `bases/.PR05— PR05 · O botão da chave grátis leva a um formulário, não ao Stripe.PR06— PR06 · O /assinar declara que a cobrança sai em nome da Lemon Tech.PR07— PR07 · E-mail malformado não cria cliente, e robô também não.PR08— PR08 · A chave criada grava DE ONDE a pessoa veio — a marca do link que saiu de nós e a resposta opcional "como chegou" — e nada disso fica junto do e-mail.PR09— PR09 · O checkout do Pro (cartão) e do Pix pedem ao Stripe a recuperação do carrinho abandonado (link de recuperação e consentimento de comunicação na própria tela); o grátis não.PR10— PR10 · O e-mail aprovado pelo dono vai só ao plano GRÁTIS (sem Pro, sem o dono, sem repetição de e-mail), com a resposta no e-mail do dono; o ensaio só conta; um segundo disparo pula quem já recebeu; falha de envio fica anotada como falha e volta no próximo; a rota não existe sem o token.PR11— PR11 · O site manda o lembrete do checkout PAGO que expirou só para quem marcou o consentimento na tela do Stripe, com o link de recuperação e a resposta no e-mail do dono; checkout de R$ 0 (grátis), sem e-mail, sem link ou de quem concluiu outro checkout na janela fica de fora; ninguém recebe duas vezes; falha do Stripe não levanta.PR12— PR12 · O buscador (ações e FIIs) oferece "baixar esta lista em planilha" com os MESMOS filtros; a planilha é só do Pro (grátis 403, sem chave 401) e traz exatamente as linhas da tela, na mesma ordem, com % em % e a ressalva numa coluna própria; a chave pode vir na URL (o formulário manda assim).PR13— PR13 · A página de planos (PT e EN) mostra o que o Pro faz por quem usa todo dia: a lista do buscador em planilha, a base em CSV, a resposta direta em até 1 dia útil e a garantia de 7 dias em destaque; e segue dizendo que nada foi tirado do grátis.PR14— PR14 · Todo e-mail de campanha e de lembrete leva um link de parar de um clique (e o List-Unsubscribe do Gmail): o link é assinado (não dá para descadastrar o e-mail de outra pessoa) e não carrega o endereço; abrir (GET) só pergunta, o POST grava; quem parou não recebe a campanha nem o lembrete; o "parar" respondido por e-mail entra pelo painel com token; sem a lista legível, a campanha não sai.PR15— PR15 · Página HTML pedida com `utm_source=x&utm_medium=resposta&utm_campaign=radar` sai com a MESMA marca nos links internos (os `a href` que começam com barra), então o clique seguinte (por exemplo, /assinar) chega marcado e o painel conta "veio do X → olhou o Pro" — sem cookie e sem identificar ninguém.PR16— PR16 · A página da chave distingue a PRIMEIRA entrega (`chave_entregue_` mais o plano, que é a conversão) de um assinante antigo reabrindo a própria chave (`chave_reaberta_` mais o plano, que não é).PR17— PR17 · Pedido com User-Agent de Chrome mas sem `Accept-Language` ou sem `sec-ch-ua` é programa, não pessoa: entra como classe 'robo_disfarcado' (bot=1) e fica fora da contagem de visitantes; navegador de verdade (com os dois cabeçalhos) continua 'humano'; Firefox não precisa de sec-ch-ua; nenhum cabeçalho é gravado.PR18— PR18 · O GET de /assinar mostra a confirmação e NÃO cobra: nenhuma sessão no Stripe, nenhum evento de funil.PR19— PR19 · O POST de /assinar cria a sessão, grava o evento de funil e redireciona 303 para o Stripe.PR20— PR20 · Rastreador declarado que faz POST em /assinar não abre sessão nem evento (cartão e Pix).PR21— PR21 · Quem desiste no formulário do cartão volta à página de planos, não à home.PR22— PR22 · Na página de planos o Pix e o cartão são botões de MESMO peso (mesma classe), Pix primeiro.PR23— PR23 · No /chave-gratis, o e-mail de um assinante Pro (ou de quem já tem chave grátis) NÃO devolve a chave no HTML nem no JSON: a resposta diz "se este e-mail já tem chave, enviamos para ele", e a chave vai só ao próprio e-mail (normalizado).PR24— PR24 · Sem enumeração: no /chave-gratis, a resposta de quem já tem chave é a MESMA para Pro e para grátis (não revela o plano); no /portal, a mesma para e-mail de cliente e e-mail que não existe.PR25— PR25 · A chave de API sozinha não abre o Portal do Stripe: GET /portal com X-API-Key mostra o formulário; POST com a chave (formulário antigo) não redireciona, não cria sessão no Stripe e só manda um link ao e-mail CADASTRADO do cliente; só o cabeçalho, sem e-mail, é 400. A página do portal pede o e-mail, não a chave.PR26— PR26 · O link do portal é de uso único e vence em 30 minutos: o GET só mostra o botão (não gasta o link — o leitor de e-mail que pré-abre endereços não o queima); o POST abre o portal do cliente certo (303); o segundo POST é 410 sem nova sessão; link vencido ou inventado é 410; no disco fica só o resumo, nem o link nem o e-mail.PR27— PR27 · Falha fechada: em produção (RENDER=true) sem STRIPE_SECRET_KEY/STRIPE_PRICE_ID, o dump Pro, as rotas de chave e o resumo Pro NÃO liberam — 503; só a degustação (WEGE3) continua aberta.PR28— PR28 · Sem STRIPE_WEBHOOK_SECRET o webhook responde 503 e não lê nem processa o corpo (antes, era lido como JSON cru: qualquer um mandava "evento"); o método também recusa sozinho.PR29— PR29 · Reenvio de chave e link do portal: no máximo 3 por hora e 10 por dia para o mesmo e-mail (somados), no disco (vale entre reinícios e réplicas); depois do limite a tela é a mesma e nada sai.PR30— PR30 · Pedir a exclusão responde IGUAL (status e texto) para quem tem dados e para quem não tem; o link de confirmação vai só ao próprio e-mail, e só se existe algo para apagar; pedir não apaga nada; e-mail que não parece e-mail é recusado sem consultar nada.PR31— PR31 · O GET do link só mostra o botão (leitor de e-mail que pré-abre endereços não apaga nada); o POST apaga uma vez só; link inventado, vencido ou do PORTAL não apaga; e o link de apagar não abre o portal do Stripe.PR32— PR32 · Confirmado o link: o cadastro do Stripe é esvaziado e apagado e a chave sai do cache; os avisos, a carteira, o boletim, o histórico semanal, o pedido de teste, a fila de e-mail e as contagens da chave do titular somem; a campanha troca o e-mail pelo resumo; os recibos perdem só o dono; os dados de OUTRA pessoa ficam intactos; o resumo do e-mail entra na lista de não enviar; o evento fica com o resumo, nunca o e-mail; e o e-mail não sobra em byte nenhum dos arquivos do disco.PR33— PR33 · Sem provedor de e-mail, as rotas de pedido e de confirmação respondem 503 com o contato, nada é enviado e nada é gravado (nem a fila de e-mail pendente, que guardaria o endereço); em produção sem Stripe, o mesmo.PR34— PR34 · foto_diaria.PR35— PR35 · O mesmo limite do portal vale para o apagar: no máximo 3 e-mails por hora e 10 por dia para o mesmo endereço (somados com chave e portal), e a tela continua a mesma.PR36— PR36 · O pagamento Pix antigo continua no Stripe depois que o cliente é apagado.PR37— PR37 · /admin/chave/{prefixo} responde 404 sem o cabeçalho, com token errado e com o token na query; e com o token certo mas sem Stripe configurado, 503. Nada do Stripe é consultado antes da porta.PR38— PR38 · Só vale hexadecimal minúsculo de 8 a 32 caracteres.PR39— PR39 · O prefixo de 12 caracteres acha o Pro: e-mail, plano, assinatura ativa, data de criação e o uso (total ok, dias ativos, primeiro e último dia, famílias mais usadas, 429).PR40— PR40 · Nem a chave inteira nem pedaço dela sai na resposta, e o e-mail não entra no log, nem quando o Stripe falha.PR41— PR41 · Com mais de 5 cadastros no prefixo, a rota devolve só quantos são e pede prefixo maior: nenhum e-mail.PR42— PR42 · Perguntas seguidas varrem o Stripe uma vez só (índice em memória), e a rota nunca chama modify, delete ou create.PR43— PR43 · POST /admin/chave/trocar com {"email"} troca a chave do cadastro: a antiga deixa de valer na hora, a nova vale com o mesmo plano, vai SÓ ao e-mail do cadastro e não aparece na resposta nem no log.PR44— PR44 · Sem token (ou com ele na query): 404 e nada muda.PR45— PR45 · O e-mail de agradecimento aprovado pelo dono em 01/11/2026 vai só a quem tem chave GRÁTIS usada em 3 dias distintos ou mais nos últimos 30; Pro, o dono, chave de uso esporádico e quem já recebeu ficam de fora; o ensaio só conta; a resposta vai ao e-mail do dono; a rota não existe sem o token.I-Q09— O Informe Diário do FNET (HTML latin-1) sai com competência, CNPJ e um dia por linha — cota, captação, resgate, PL, total da carteira, cotistas — conferido contra o documento real do BOVA11.I-Q10— O Balancete do FNET (plano COFI) sai como {conta: (descrição, saldo)} para TODAS as contas, conferido contra o documento real (118 contas).I-Q11— Do registro RCVM 175 da CVM saem SÓ as classes de fundo de índice (FIIM), com CNPJ de 14 dígitos; os outros tipos ficam de fora.I-Q12— A carteira (CDA cda_fie) sai por posição com competência no 1º dia do mês, números com ponto decimal, filtrável por CNPJ.I-Q21— As três contas de cotas do balancete vão para o banco COMO O DOCUMENTO AS DECLARA — sem escolher convenção.V01— V01 · O texto é número + faixa numérica + comparação; nenhum adjetivo de julgamento entra, e o modo 'adjetivo' da configuração está DESLIGADO.V02— V02 · Uma frase, ≤ 35 palavras, sempre igual para a mesma entrada.V03— V03 · Lucro negativo, EBITDA negativo, caixa líquido, banco, empresa nova sem histórico, dado defasado — cada um com o texto certo, nunca um número inventado.V04— V04 · Verde sem nada; amarelo com ressalva em número central, reapresentação relevante recente ou balanço velho; vermelho quando o retrato pode enganar (reapresentação grande do próprio ano; a CVM já tem balanço mais novo).V05— V05 · Os nomes do arquivo de configuração existem de fato: cada marca listada nasce em precos.V06— V06 · Rodando para TODAS as companhias que negociam: nenhum termo proibido em texto algum; toda frase ≤ 35 palavras; a bandeira não é uniforme (se 90%+ fossem da mesma cor, não informaria nada); e o mesmo papel dá o mesmo veredito duas vezes.V07— V07 · O corte "abaixo da Selic" do ROIC liga e desliga pelo arquivo de configuração: desligado, vale a faixa fixa; ligado e com a Selic média do exercício, a faixa diz abaixo/acima com o ano e a taxa; ligado e sem a Selic do ano, volta à faixa fixa (nunca inventa a taxa).V08— V08 · Cada corte do arquivo de configuração tem o lado declarado: o limite inferior da faixa pertence a ela (5% é "entre 5% e 15%"); ROIC zero com a Selic ligada é "abaixo", não "negativo"; a própria história entra com 3 anos e não com 2; reapresentação conta dentro dos últimos 3 exercícios, a partir de 5% exatos, e só com diferença conhecida; vermelho exige MAIS de 10% no próprio ano (10% exatos não) e amarelo por idade exige MAIS de 15 meses; sem data de hoje, a idade não entra.V09— V09 · A frase de topo só é encurtada quando PASSA do limite de palavras, e o corte tira exatamente o trecho "; setor X" (depois, o motivo do vermelho) — nada além; dívida líquida zero é "dívida 0,0x", não caixa líquido; margem zero com ressalva não vira "prejuízo"; número com RESSALVA não é narrado como "não se aplica" (nem "EBITDA negativo").V10— V10 · O texto da bandeira diz a data do recebimento e quantos dos números centrais saíram publicados com o valor exato — e o motivo da reapresentação cita o corte como está no arquivo ("5%", não "5,0%").V11— V11 · O veredito sai nas duas línguas: frase do topo, as seis linhas, as perguntas, a bandeira (texto e motivos) e a nota têm versão inglesa com os MESMOS números em formato inglês (ponto decimal), sem palavra portuguesa; toda faixa, marca "não se aplica", nota e faixa da Selic da configuração tem tradução; "não se aplica" de banco e ressalva também; nenhum termo proibido em inglês.V12— V12 · A frase de topo diz de que dia é o preço do P/L ("com o preço de 25/02/2026, quando o balanço saiu"), traz o P/L com o último fechamento ("com o fechamento de 22/10/2026") e a mediana do setor, em português e inglês, com até 35 palavras.V13— V13 · O P/L com o último fechamento é o múltiplo guardado × fechamento atual ÷ preço do balanço × o fator de ações dos eventos conferidos entre as duas datas (desdobramento 2 para 1 dobra as ações, o preço cai à metade, o P/L fica igual).I-P47— `/empresas/{t}/multiplos?as_of=` refaz lucro TTM, LPA TTM e P/L TTM com a versão de CADA documento da identidade (DFP do ano anterior e ITR dos dois anos) que valia em as_of: (a) versão antiga COM valor arquivado usa o arquivado (05/2024: DFP v1 1000 e ITR v1 300 → TTM 1100, preço do 1º pregão após a ITR v1, valor de mercado na mesma proporção); (b) versão vigente = a da base usa a base (10/2024: igual ao resultado sem as_of); (c) versão antiga SEM valor guardado (ITR 2023-2 v1) NÃO ganha o número da v2: lucro, LPA e P/L nulos, `versao_original_indisponivel` e a flag; (d) trimestre cuja ITR chega depois de as_of sai da lista e é contado (o dia do recebimento já vale); (e) cada linha diz as versões usadas (categ_doc, dt_refer, versao, dt_receb, origem); (f) sem as_of nada muda, e as_of inválido é 422. ATAQUE: usar sempre a base; cair para a base quando a versão antiga não tem valor; manter o preço da última versão; `<=` virar `<`; trocar a regra do TTM por uma segunda cópia.I-V01— `fatos_as_of` devolve, para cada período, a MAIOR versão cujo dt_receb é <= as_of, com `versao` e `dt_receb` em cada linha: 01/04 devolve a v1 (lucro 100), 01/05 devolve a v2 (lucro 80), e o dia exato do recebimento já vale a versão que chegou nele (<=, não <).I-V02— Se a versão vigente em `as_of` existiu mas seus valores não foram guardados (a CVM só publica a mais recente), o período vem em `periodos` com `valores: "nao_arquivados"` e SEM linhas — nunca com os números da versão seguinte, que é o vazamento do futuro que o as_of existe para evitar.I-V03— `trimestral=True` aplica a mesma regra por (ano, trimestre): a ITR do 1T/2023 com v1 em 10/05 e v2 em 20/06; as_of antes da v2 devolve a v1 arquivada, depois dela a v2, e a linha leva `trimestre`.I-V05— Num CSV mínimo no formato da CVM com duas versões do mesmo documento: a v2 vence em `conta` e em `documento`; a v1 vai para `conta_versao` SÓ nas contas-chave (a conta que não alimenta item nenhum não é guardada); `documento_versao` guarda as duas versões com o ID_DOC e a data de cada uma; reingerir a v2 não arquiva de novo, e uma v1 que chega depois da v2 não sobrescreve nem arquiva.I-V07— `conta_chave` aceita toda conta que `padronizar` lê (as fixas das duas tabelas de itens, o caixa das operações pelo método direto, as filhas da 3.02, D&A e capex da DFC, o PL e o lucro de banco pelo rótulo) e recusa o que nenhum item usa — é o que decide o que vai ao banco, e conta esquecida aqui some do passado em silêncio.I-V08— O build que nasce do zero não perde as versões: (1) o que o banco ANTERIOR ainda guarda numa versão menor que a daqui vai para `conta_versao` (`capturar_do_banco_anterior`, só ordem U e só conta-chave, DFP e ITR); (2) o que o anterior já tinha em `conta_versao` vem junto na herança (`herdar_series_externas`); (3) sem banco anterior, ou com um que não tem as tabelas, devolve 0 sem levantar; (4) `conta_versao` está entre as contagens vigiadas do encolhimento.I-V10— A versão antiga lida do XML do RAD entra em `conta_versao` na MESMA convenção das linhas da versão atual: só o exercício corrente (ordem U), consolidado/individual, escala aplicada, os dois formatos de número ("19.245.764" e "1552654" / "5741398,00"), DFC pelo método, DMPL só no PL total do exercício corrente, ITR só no trimestre isolado, conta-modelo (zero sem descrição) fora, `INSERT OR IGNORE` sem sobrescrever, e o que não bate vai para uma contagem por motivo em vez de quebrar.I-V11— A versão antiga lida do `InfoFinaDFin.I-V12— O caixa operacional de 2017 da WEGE3 (conta 6.01): 1,290 bi publicado na DFP 2017 (28/02/2018) e 1,107 bi republicado como comparativo na DFP 2018 v2 (10/04/2019).I-V13— O comparativo NÃO substitui o original quando: o rótulo da conta mudou (quebra de série), o lado republicado veio zerado ("sem valor no arquivo"), a razão é de ~mil (escala), só existe em outra agregação, ou o próprio exercício foi REENTREGUE depois do comparativo (a versão mais nova do documento próprio vence).I-V14— GET /empresas/{t}/fatos?as_of=: expõe `valor_origem`/`publico_em`/`documento_fonte` e o total `itens_republicados`; sem `as_of` o fato é o ORIGINAL (o que sustenta indicadores, múltiplos e a página), sem campo novo.I-V15— Três republicações reais da tabela `reapresentacao` (PETR4, BBDC4 — plano de banco — e VALE3): o dia anterior ao recebimento da DFP seguinte devolve o original, o dia do recebimento devolve o republicado, nos dois tipos de plano de contas.VG01— VG01 · Cada tipo de evento da instrução de 22/09 é detectado: lucro que virou prejuízo, margem e dívida/EBITDA que mudaram de faixa, balanço reapresentado, bandeira que mudou de cor — cada um com período anterior e novo, número antes e depois, a data em que o documento que o revela ficou público, a fonte e a versão do dado.VG02— VG02 · Nada de número no código: as faixas são as do veredito, o corte da reapresentação é o mesmo da bandeira e o trimestre de comparação é escolhido no arquivo — mudar o arquivo muda o evento.VG03— VG03 · Só número que o veredito publicaria vira evento: valor com ressalva, valor que não se aplica (EBITDA negativo, receita zero), indicador que não existe para banco e conta com um lado zero na reapresentação (linha ausente, não número republicado) ficam de fora.VG04— VG04 · Nenhum texto do vigia — PT, EN e o e-mail — carrega termo proibido, mesmo quando a companhia descreveu a conta como "Receita de Venda": o texto usa o nosso rótulo; a descrição dela viaja só no JSON.VG05— VG05 · O vigia lê só por `leitura` e `veredito` — nenhum SQL no módulo nem na página — e não importa `api` nem a página de empresa; a página só monta HTML.VG06— VG06 · Rodando para TODAS as companhias que negociam: todo evento tem tipo conhecido, os dois períodos, os dois números, data, fonte e versão; nenhum texto carrega termo proibido; os cinco tipos aparecem; nenhum evento de indicador usa valor que o veredito não publicaria; e o mesmo papel dá os mesmos eventos duas vezes.VG07— VG07 · /vigia e /vigia/eventos abrem sem chave; o contador mensal da página e do JSON é o da lista, não número digitado; cada evento da página aponta para a página da companhia; o filtro por papel e por tipo funciona; tipo desconhecido é 400; a página está no sitemap e no llms.VG08— VG08 · Vigia dos FIIs, função pura: P/VP, DY 12m e vacância mudando de faixa e cotistas variando além do corte saem com os dois números, as duas competências, as duas faixas e a data de quem revelou.VG09— VG09 · Informe com versão acima de 1 é evento, datado pela entrega da versão vigente; se o build capturou o reenvio, o evento traz o campo que mais mudou (antes e depois) e quantos outros mudaram; sem captura, diz só o que se sabe.VG10— VG10 · /vigia?classe=fiis e /vigia/eventos?classe=fiis mostram o que o vigia dos fundos devolve, com filtro por tipo e fundo, e o contador mensal SEPARADO (soma = eventos datados de fundos); /vigia sem classe continua a página das companhias; classe ou tipo desconhecido é 400; nenhum termo proibido em evento de fundo; o e-mail é só esqueleto.VG11— VG11 · O DY 12m não tem série na fonte: cada build fotografa o `fii_yield` em `fii_yield_historico` (uma linha por fundo e data-base), com o derivado versionado no passo simétrico (carrega antes, fotografa depois do cálculo, reexporta sem encolher).VG12— VG12 · Os formatos do texto (reais em mil/mi/bi nas duas línguas, data, trimestre), as bordas da detecção (margem zero não é lucro nem prejuízo; reapresentação exatamente no corte entra; número ausente num dos lados não gera faixa), o sentido do evento nas duas direções e em EN, a fonte da reapresentação, os períodos da bandeira, o contador por tipo e sem data, e o e-mail vazio e ordenado.VG13— VG13 · Vigia dos FIIs: o rótulo de cada faixa nas duas línguas; valor exatamente no corte está na faixa de cima; cotistas exatamente no mínimo entram; queda sai com "caiu" e "−", em EN com "fell"; número de cotistas com separador de milhar e sem casa decimal; no reenvio, o campo que mais mudou em termos RELATIVOS e quantos outros; o contador por tipo e mês; o filtro por papel e tipo; o e-mail vazio, com `desde` inclusivo e ordem.VG14— VG14 · O texto da reapresentação: uma conta ("uma conta mudou .VG15— VG15 · Vigia dos ETFs, função pura: taxa efetiva e ágio/deságio mudando de faixa e patrimônio variando além do corte saem com os dois números, os dois meses, as duas faixas e a data de quem revelou (a entrega do balancete; o último pregão do mês; a entrega do informe diário).VG16— VG16 · Quando o FNET traz OUTRO documento para uma competência de ETF já gravada, `_gravar_balancete` registra antes do REPLACE o antes e depois de cada campo (ou uma linha "nenhum campo publicado mudou"); o mesmo documento de novo não é reenvio.VG17— VG17 · /vigia?classe=etfs, /vigia/eventos?classe=etfs e /vigia/{ETF} mostram o que o vigia dos ETFs devolve, com filtro por tipo e ETF, e o contador mensal SEPARADO (soma = eventos datados de ETF); as abas ligam as três classes; /vigia e ?classe=fiis continuam iguais; tipo desconhecido é 400; a ficha do ETF liga para /vigia/{ETF}; nenhum termo proibido.VG18— VG18 · /vigia/semana/AAAA-WW lista os eventos de companhias, FIIs e ETFs conhecidos de segunda a domingo daquela semana ISO (a janela do e-mail semanal), agrupados por tipo na ordem do vigia, com a contagem total mesmo quando a lista é cortada.VG19— VG19 · Os eventos do vigia são calculados UMA vez por (classe, versão), fora do pedido: vinte pedidos simultâneos com o cache frio disparam uma conta só e todos recebem a mesma lista; o pedido espera no máximo a espera configurada e, sem a conta pronta, recebe 503 com Retry-After — a conta segue e o pedido seguinte já é servido.VG20— VG20 · O processo filho da conta dos eventos não herda nada do servidor: entrada vazia, saída descartada, erro num arquivo próprio, `close_fds=True` e, no Windows, a lista explícita de handles herdáveis (só esses três) e sem console.VG21— VG21 · Uma foto do DY 12m com `n_meses` acima de 12 (a regra de 365 dias, até 03/11/2026) sai da leitura com a ressalva `janela_13_meses`, e o vigia não compara: 13 meses (9,51%) seguido da foto certa (8,84%) não vira "DY mudou de faixa".AC01— AC01 · ★ 30/10/2026 (decisão do dono): pedido na página → uma linha JÁ ATIVA e UM e-mail de boas-vindas na fila (sem provedor, fica pendente), com o link de sair e o de "não fui eu", e SEM link de confirmar → o aviso semanal é montado dos eventos do vigia daquela companhia, com o link de saída → sair cancela, e depois disso não há aviso.AC02— AC02 · Nenhuma resposta — a página do pedido, a de confirmação, a de saída, o erro de e-mail inválido, o /admin/metricas — contém o endereço, e nenhuma linha de log o escreve.AC03— AC03 · A limpeza apaga o pedido nunca confirmado com mais dias que o prazo da configuração, e só ele: o confirmado fica, o recente fica.AC04— AC04 · O bloco "acompanhar" aparece logo depois do veredito na página de TODA companhia — as três mais vistas (ITUB4, PETR4, BBAS3) e as demais, em PT e EN — com o formulário para /acompanhar e o papel certo, e nenhum texto do bloco, das páginas de resposta ou dos e-mails carrega termo proibido.AC05— AC05 · Robô que segue formulário não cria pedido nem manda e-mail, e acima do teto de pedidos por hora (configuração) a resposta é 429 — sem guardar IP, como na chave grátis.AC06— AC06 · Sem RESEND_API_KEY o provedor é "arquivo": grava na fila pendente e devolve False.AC07— AC07 · O job semanal, com o provedor "arquivo": cada e-mail CONFIRMADO recebe UM e-mail com os eventos dos últimos 7 dias (antes da segunda do envio) dos papéis que acompanha, com o link de sair de cada papel; quem não tem evento não recebe nada; o teto diário da configuração segura o resto na fila, que sai no dia seguinte da mesma semana; rodar de novo não manda duas vezes; pedido não confirmado não recebe.AC08— AC08 · A semana devida é a segunda mais recente em que já passou das 08:00 NO FUSO da configuração (America/Sao_Paulo): segunda 07:59 de São Paulo ainda é a semana anterior; 08:00 já é a nova; domingo à noite é a segunda anterior.AC09— AC09 · O relatório "estado do produto" sai do dado, uma linha por número, na ordem do funil: Google real, concentração, chaves ativas e fiéis, acompanhamentos confirmados, e-mails da semana, eventos do vigia por classe (só os de segunda até hoje) e backup.AC10— AC10 · A carteira de segunda (Pro): pedido não confirmado não recebe; confirmado e Pro recebe UM e-mail com o valor, só os proventos com pagamento a partir de hoje, os eventos da semana dos papéis da carteira e o link de parar; chave que deixou de ser Pro não recebe (e não gasta teto); o teto do dia é o MESMO do envio do vigia, somado; rodar de novo não repete; pedir de novo troca a carteira; sair para.AC11— AC11 · O pedido pela /carteira: chave que não é Pro recebe 403 e a página dos planos, sem gravar nada; chave Pro grava UM pedido não confirmado e põe a confirmação na fila, e a resposta não repete o e-mail; o link confirma e o de sair para; carteira vazia é 400. A /carteira com posições mostra o pedido.AC12— AC12 · O boletim grátis: não confirmado não recebe; confirmado recebe UM e-mail com a semana ISO fechada (a de antes da segunda), as contagens, no máximo 5 linhas por tipo e "e mais N", o link da semana e o de sair; semana sem fato não manda nada; o teto do dia é UM só para vigia + carteira + boletim; rodar de novo não repete; sair para; pedir de novo antes de confirmar reenvia o MESMO link.AC13— AC13 · POST /boletim LIGA na hora UMA inscrição (30/10/2026, decisão do dono) e põe as boas-vindas na fila, com sair e "não fui eu", sem repetir o e-mail na resposta; robô não grava; e-mail inválido é 400; o link antigo de confirmar ainda liga um pedido pendente de antes da mudança; sair funciona e o desconhecido é 404 com noindex; as páginas de resposta oferecem o "acompanhar" desta companhia e a /hoje o convite.AC14— AC14 · O e-mail semanal de quem acompanha companhias passa a trazer os PROVENTOS A RECEBER desses papéis (valor, data-com, pagamento), e sai mesmo sem evento do vigia quando há provento; vai em HTML (molde da casa) com o texto puro junto; provento de outro papel não entra; o assunto diz o que há; sem evento e sem provento, nada sai.AC15— AC15 · Uma inscrição, duas listas: escolher "os dois" LIGA na hora (30/10/2026, decisão do dono) UMA linha em cada tabela com o MESMO token e manda UMA mensagem de boas-vindas com o sair de cada lista e o "não fui eu"; sair da revista tira SÓ da revista (o boletim continua); sair do boletim tira só do boletim.AC16— AC16 · No /chave-gratis a caixinha "Quero receber a revista semanal Super Dados B3" vem DESMARCADA; criar a chave sem marcá-la não põe ninguém em lista nenhuma nem manda e-mail da revista; marcada (ela é o consentimento), liga a revista na hora (30/10/2026) e manda as boas-vindas com sair e "não fui eu"; o boletim não entra.AC17— AC17 · Só a edição com `aprovada` = data do OK do dono aparece: em /revista (lista), em /revista/{n} (200, indexável, canônico, sem <script>, com volta para a home) e no sitemap; o rascunho (aprovada nula, texto qualquer, data inválida, arquivo faltando ou fora da pasta) é 404 e não aparece em lugar nenhum; número inválido é 404. ATAQUE: rascunho público; aprovar com "sim"; caminho de arquivo fora da pasta.AC18— AC18 · O envio da edição: sem X-Admin-Token é 404 (com token errado também); sem o OK do dono é 400 e nada sai; rascunho é 400; "simular" só conta; com tudo certo cada inscrito CONFIRMADO da revista (nunca o pendente, o que saiu ou quem só assina o boletim) recebe UM e-mail no molde da casa com as chamadas, o link da edição e o de sair; repetir não reenvia; o teto do dia é o mesmo do boletim e o que não cabe fica pendente; a ordem fica registrada com o OK, sem e-mail.AC19— AC19 · O convite da revista a quem já assina o boletim: só pela rota de admin (404 sem token, 400 sem o OK do dono); vai UMA vez a cada assinante confirmado do boletim que não está na revista, fora quem pediu para não receber nada; o convite sozinho não inscreve; o clique no link do convite inscreve na revista já confirmado (é o opt-in), e o token de quem não recebeu convite não inscreve.AC20— AC20 · O formulário das duas listas está no /revista (PT e EN), a home chama para ele, e o rodapé de toda página liga a revista; nenhuma opção vem marcada; o /admin/stats conta inscritos por lista (boletim, revista, os dois) e confirmados, sem e-mail; a exclusão a pedido e a guarda de 12 meses alcançam a tabela da revista.AC21— AC21 · `seguir` grava a linha JÁ ATIVA (confirmado_em = hora do pedido) e devolve 'novo'; pedir de novo é 'ja_acompanha' sem token; o endereço para no teto de papéis (configuração, 20) com 'teto_email'; sair libera uma vaga.AC22— AC22 · As boas-vindas (acompanhar em PT e EN; boletim; revista; os dois) dizem o que chega e quando, igual ao que o envio faz de fato (segunda às 8h de Brasília pela configuração do envio; fatos do vigia e proventos a receber; semana sem novidade não manda nada), trazem o link de sair num clique e a frase "Se não foi você que pediu, clique aqui e não enviamos mais nada" com o link do "não fui eu", em texto e em HTML, e nenhum link de confirmar.AC23— AC23 · Da mesma conexão, no máximo `teto_novos_por_ip_por_dia` (5) acompanhamentos novos por dia: o 6º é 429 com "Muitos pedidos hoje", não grava e não manda e-mail; outra conexão segue livre.AC24— AC24 · O link "não fui eu" abre uma página noindex com UM botão e, sozinho, não muda nada (o antivírus do e-mail que abre links não cancela ninguém); o botão (POST) cancela TUDO o que o endereço recebe (companhias, boletim, revista) e bloqueia inscrição nova por 30 dias nas três rotas, que respondem 429 sem mandar e-mail e sem repetir o endereço; o bloqueio guarda só o resumo do e-mail e vence no prazo; token desconhecido é 404 noindex.AC25— AC25 · Os pedidos de ANTES de 30/10/2026 continuam pendentes até o clique: o link antigo de confirmar (acompanhar, revista) liga o pedido ainda pendente e responde 200; nenhum pedido antigo é ligado por pedido novo de outra lista ou de outra companhia; link de pedido cancelado ou desconhecido é 404. ATAQUE: e-mails já enviados com link quebrado; ligar em massa os pedidos que nunca foram confirmados.AC26— AC26 · Nas páginas de resposta da companhia (/acoes/T/dividendos, /lucro, /divida, PT e EN) o bloco "acompanhar" vem LOGO ABAIXO da resposta (a lede do topo), antes da tabela e do "Como citar", não mais no fim; na página da companhia segue logo abaixo do veredito.AC27— AC27 · Cada inscrição manda boas-vindas, então o mesmo endereço não pode ser inscrito sem fim: no máximo `teto_inscricoes_por_email` (3) inscrições novas em cada lista em 30 dias, contando as que saíram; a 4ª é 'teto_email' (429 na rota, sem e-mail); a outra lista não é afetada; passado o período, volta a valer.AC28— AC28 · ★ 30/10/2026 (decisão do dono, para o bloco "Receba os fatos relevantes e os dividendos" ser verdade): o e-mail de segunda de quem acompanha a companhia traz os Fatos Relevantes que ela entregou à CVM e o radar viu na janela da semana (assunto, data de entrega, link do documento ORIGINAL na CVM), ao lado dos eventos do vigia e dos proventos; uma semana só com fato relevante já faz o e-mail sair; o fato entra por companhia (quem acompanha PETR3 recebe o fato da Petrobras), cai em UMA semana só (pela data em que o radar o viu, não pela de entrega, que a CVM publica com atraso), Comunicado ao Mercado não entra, e o link de sair continua.LE01— LE01 · `resolver` acha a companhia por qualquer código dela e devolve o ticker PRINCIPAL (ou o da ficha, sem principal); papel desconhecido é None.LE02— LE02 · `retrato` pega o último exercício com indicador, conta as ressalvas dele, resume as reapresentações (total, anos, a maior por ano) e mede a defasagem: último balanço recebido, último trimestre e quantos exercícios a CVM tem a mais do que o calculado.LE03— LE03 · `faixa_propria` usa só valor limpo e diz a posição exata (0 = o menor, 1 = o maior), com None abaixo de 2 anos; `mediana_setor` exclui a própria companhia, exige 3 pares e devolve None sem setor; `distribuicao` pega cada companhia no último ano LIMPO (ou todas num ano dado, também para múltiplo) e os quantis certos; `fracao_*` são estritas.LE04— LE04 · `liquidez` é a média do volume nos últimos N pregões, com a janela dita; sem preço, None.LE05— LE05 · `recebimentos` separa DFP de ITR e põe cada ITR no trimestre certo (março = 1, junho = 2, setembro = 3); `reapresentacoes` ordena as contas pela maior diferença, dá o nome do item no plano de contas do TIPO da companhia (3.01 é receita na comum e receita de intermediação no banco) e data cada exercício pela DFP SEGUINTE; `reapresentacoes_por_cd` sai na ordem da chave.LE06— LE06 · `retrato_em` monta o retrato do dia em que a DFP daquele ano ficou pública: indicadores e múltiplo do ano, só as reapresentações de exercícios ANTERIORES, a Selic média do ano e `hoje` = o recebimento.LE07— LE07 · A série trimestral é a da companhia com o tipo dela: banco não recebe margem bruta (não existe no plano de contas dele); sem tipo, vale o geral.LE08— LE08 · Proventos do mais recente ao mais antigo com cada coluna no seu lugar; datas de pregão em ordem; pagamento avisado à CVM pela chave (classe, data-com, valor em 6 casas) e vazio sem a tabela; fechamento do último pregão de cada ano; cobertura ou None.LE09— LE09 · Companhia que não consolida (só publica o individual): a reapresentação dela é reapresentação normal.LE10— LE10 · A lista de comparações curadas por setor sai do dado: em cada setor, as três de maior volume médio nos últimos pregões (a conta de `liquidez`), só entre as que negociaram há pouco; muda quando a liquidez muda; atividade "Sem Setor Principal" fica fora; trinca repetida por outro setor não se repete; slug repetido ganha o nível; nunca passa de `max_paginas`.LE11— LE11 · As leituras da 4ª fatia, sobre base sintética: a ficha (com o cadastro do FCA quando existe), as classes com o principal primeiro, os sinais das páginas de fato (troca de ticker = raízes distintas), faixa e último fechamento, o fato do ano na agregação do ano (com e sem vazios), a série de um item cada ano na sua agregação, o TTM por pedaços, o último trimestre, os pares do setor só com número limpo e o último ano de cada, a série mensal e a diária, os volumes recentes (só pregão com volume), e a recusa de tabela de preço desconhecida.LE12— LE12 · A página de empresa lê só pela camada de leitura: nenhuma consulta SQL em `dados_b3/pagina_empresa.LE13— LE13 · As consultas quentes têm índice e o planejador os usa: a mediana do setor parte das companhias do setor (`ix_empresa_setor`) e acha o último ano de cada uma por (nome, companhia) em `ix_indicador_nome_cd_ano`; o último pregão de cada código sai de `ix_preco_cd_ticker` sem ler a tabela.LE14— LE14 · A série diária de UMA companhia (fechamento e volume por pregão) sai do índice `ix_preco_cd_data_cobre` sem ler a tabela `preco` — gravada pregão a pregão, ela espalha os ~4 mil pregões de uma companhia por ~4 mil páginas do arquivo, e com o disco frio a ficha /acoes/{T} levava segundos.LE15— LE15 · `distribuicao` (o universo inteiro, pedida cinco vezes por ficha pelo veredito) é guardada pela assinatura do arquivo: a segunda chamada não lê o banco, devolve o MESMO número, e uma cópia — mexer no que voltou não estraga a próxima.I-P27— Com números redondos, cada campo do múltiplo sai exato: valor de mercado = preço × ações; P/L = valor ÷ lucro dos controladores; P/VP = valor ÷ (PL total − minoritários); EV/EBITDA = (valor + dívida líquida) ÷ EBITDA; FCF yield = (CFO + capex) ÷ valor — e nenhuma flag.I-P28— Cada substituição sai com a sua flag, e o número que não existe fica vazio: sem minoritários, PL total no lugar (e P/VP sobre ele); sem lucro dos controladores, lucro total; lucro negativo dá P/L negativo com `pl_negativo`, lucro zero dá P/L vazio; patrimônio não positivo não tem P/VP; sem EBITDA, `sem_ebitda`; EBITDA negativo ou dívida desconhecida calam o EV/EBITDA sem inventar; sem capex, `sem_capex`.I-P29— As réguas têm o lado declarado: P/L de exatamente 200 não é extremo, acima é; valor de mercado ABAIXO de 1% do patrimônio é contagem em milhares (corrige ×1000 e diz); exatamente 1% não é corrigido — e, a 0,01x do patrimônio, cai fora da banda [0,02; 50] e o ano fica sem múltiplo; 0,02x e 50x estão dentro; acima do teto de valor de mercado, nada é publicado.I-P30— Unit principal divide o preço pela cesta (e diz), e unit sem cesta conhecida sai com o aviso; ano com escala divergente perde os quatro múltiplos; sem ações em circulação, a linha sai vazia com o motivo; a contagem usada é a do último instantâneo PÚBLICO até a data do preço (nunca o futuro), com aviso quando veio do FRE e quando tem mais de 200 dias.I-P31— A contagem de ações de um ano contra a do ano anterior com preço: até 3x para qualquer lado passa; acima, o ano fica sem múltiplos — a menos que o ano anterior seja o PRIMEIRO com preço (abertura de capital), que a razão seja a da escala em milhares (~1000x), que haja evento societário registrado entre o ano anterior e o seguinte, ou que a contagem já venha ajustada.I-P32— Uma linha sintética com valores distintos em cada campo grava fechamento, abertura, máxima, mínima, médio (duas casas), volume (duas casas), quantidade dividida pelo FATCOT, negócios, data e o código de onde veio.I-P33— Na semana em que a companhia negocia sob o código velho E o novo, o registro do dia é o do ticker principal — os oito campos da mesma linha e o código dela —, qualquer que seja a ordem no arquivo; dia em que só o velho negociou fica com o velho.I-P34— `_codigos_por_empresa`: o principal tem prioridade 0 e o histórico da MESMA classe 1; histórico de outra classe não entra; código reivindicado por duas companhias sai do mapa das duas; empresa sem principal não entra; espaço em volta do código e da classe é aparado.I-P35— `_escolher_principal`: só Bolsa, sem data de fim e com código válido; ordinária antes de preferencial; empate pelo código; o código sai normalizado.I-P36— TTM(Qk) = anual(ano−1) − Q1..I-P37— O múltiplo trimestral: o primeiro pregão a partir do recebimento da ITR (o de antes não serve), dentro da janela de 45 dias inclusive; valor de mercado = preço × ações; P/L TTM = valor ÷ lucro TTM; P/VP = valor ÷ (PL − minoritários).I-P38— `_acoes_na_data`: a contagem mais recente JÁ PÚBLICA até a data (inclusive), nunca a de depois; no empate de data, DFP/ITR ganham do FRE; só FRE marca "sem tesouraria"; contagem zero é ignorada; acima de 100 bilhões não vira número; defasagem acima de 200 dias marca, 200 não.I-P39— `calcular_multiplos`: uma linha por exercício com fato.I-P40— Um passo acima de cada régua muda o resultado: P/L 200,5 é extremo; valor de mercado 50,5x o patrimônio sai da banda; patrimônio exatamente zero não tem P/VP e não divide; EBITDA de meio real ainda dá EV/EBITDA; lucro de meio real não é "negativo"; teto de valor de mercado e contagem implausível no número exato e logo acima.I-P41— Desdobramento com data-ex NO DIA da contagem é aplicado; no dia do preço, não (o preço já está na base nova só a partir do dia seguinte ao ex); na véspera do preço, é.I-P42— O 2º e o 3º trimestres acham a ITR de 30/06 e 30/09; P/L TTM de exatamente 200 não é extremo e 200,5 é; P/VP 50 não é extremo e 50,5 é (o trimestral não tem a banda do anual); valor de mercado de exatamente 1% do patrimônio não é corrigido; patrimônio zero não divide; o número devolvido conta cada linha gravada.I-P43— (1) Uma linha do COTAHIST com TODOS os bytes preenchidos — vizinhos de cada campo com algarismo, cada número usando a largura inteira — é lida exatamente: fatia deslocada de um byte lê o vizinho e muda o número.I-P44— Nº de ações do FRE: vale o "Capital Emitido"; o formulário que não o declara cede o "Capital Subscrito" (a mesma ação, pela Lei 6.404) — e só ele: "Integralizado" (subconjunto, a já paga) e "Autorizado" (teto) não viram contagem.I-P45— `lpa_ttm` = lucro TTM ÷ `acoes`, e `acoes` é a contagem que o build usou no market cap daquele trimestre, recuperada como market cap ÷ preço por ação: lpa × acoes = lucro TTM, e P/L TTM = preço por ação ÷ LPA.PCL01— PCL01 · O COTAHIST grava o fechamento diário de TODAS as outras classes da empresa, de qualquer ano (não só os últimos 60 dias): a ON e a PN que não é a principal, a classe que só existe pela sigla (a tabela `ticker` não a traz) e a unit com cesta inferida.PCL02— PCL02 · `/empresas/PETR3/multiplos` devolve o P/L e o P/VP com o fechamento da PETR3 (R$ 30) no mesmo pregão do principal: P/L 10 contra 9 da PETR4 (mesmo LPA); a resposta diz a classe, o preço e o dia, e guarda o valor do principal ao lado.PCL03— PCL03 · O múltiplo da classe sai nulo, com o motivo em `flag`, quando: a unit não tem cesta inferida; o principal é uma unit sem cesta; a classe nunca teve preço no banco.PCL04— PCL04 · O build reaproveita o banco: ano de COTAHIST já ingerido era pulado inteiro e o histórico das outras classes nunca entraria nos anos antigos.I-B100— A empresa que publica a DFC pelo método direto (DFC_MD) tem o caixa das operações (6.01) lido dali, com a origem dizendo `DFC_MD:6.01`; se existe o método indireto, ele manda.I-B101— Linha 3.11.01 (lucro dos controladores) entregue como ZERO com lucro líquido (3.11) diferente de zero vira AUSENTE, com o motivo na origem — anual e trimestral —, e o ROE cai no lucro total com a ressalva `lucro_total_sem_minoritarios` em vez de sair 0,0%.I-B76— O plano de contas sai do texto do 3.01 do exercício mais recente, sem diferenciar maiúsculas: "intermediação" é banco; "seguradora" OU "resseguro" (cada um sozinho basta) é seguradora; outro texto, texto vazio ou nenhum 3.01 é geral.I-B77— receita + custo = resultado bruto, e lair + IR = resultado das continuadas: custo positivo que só fecha negativo vira negativo (e a origem diz); o que já fecha, ou não fecha de jeito nenhum, fica como está; crédito fiscal legítimo fecha sem troca.I-B78— Custo com a conta-mãe 3.02 zerada (ou ausente) vira a soma dos filhos de PRIMEIRO nível — neto não conta duas vezes — e a origem diz; conta-mãe com número fica com o número, mesmo que os filhos somem outra coisa.I-B79— D&A soma as FOLHAS casadas de 6.01 (pai que tem filho casado fica fora), inclui exaustão, exclui amortização de custo de transação de debênture e linha sem rótulo; capex soma só SAÍDAS (valor < 0; zero não é saída) de imobilizado/intangível em 6.02, folhas também, sem venda de ativo nem aplicação financeira.I-B80— Em banco, PL e lucro saem pelo RÓTULO: o PL de nível 1 (menor código) fora das linhas de atribuição; o lucro da ÚLTIMA linha "Lucro … Período" (maior código, não o maior valor) fora de "por ação"; o do controlador fora de "não controladores".I-B81— PL final = inicial + transações com sócios + resultado abrangente + mutações internas, cada termo com o seu sinal.I-B82— Basta UMA parte conflitante numa origem somada (antes do `;`) para o item sair vazio com o motivo; origem vazia ou sem `demo:` não é conflitante.I-B83— Arquivo multiplicado por mil tem a razão das DUAS colunas perto de mil (a(F)) e de um milésimo (a(F−1)): vira correção de fator 0,001 (e dividido por mil, fator 1.000); a mediana de número par de contas é a média das duas centrais; com 20 contas diagnostica, com 19 não.I-B84— A soma dos três trimestres contra a receita anual: acima de 100x (100,5x já é) ou abaixo de 0,01x é dúvida (razão arredondada a 4 casas, 3 trimestres); exatamente 100x e exatamente 0,01x não são; soma zero não se compara; ano sem os três trimestres não entra; no trimestral não se roda.I-B85— Patrimônio que cai ≥100x contra CADA vizinho e volta, com fator implícito (média geométrica) entre 1/3 e 3x de mil ou de um milhão, é marcado (razão a 2 casas) e a origem do fato ganha o aviso; vizinhos de sinais opostos (cruzando o zero) não; queda de 100x exata marca, de menos não; queda contra um vizinho só não; fator de exatamente 3.000 marca, de 3.500 não; 333,5 marca; valor exatamente 1 (não 0) marca.I-B86— Exercício que aparece como ÚLTIMO e PENÚLTIMO com diferença relativa acima de 0,5% (sobre o maior dos dois, mínimo R$ 1) é reapresentação, com a diferença a 6 casas; exatamente 0,5% não é.I-B87— `padronizar` grava um fato por item por exercício a partir do ano mínimo (inclusive), devolve quantos gravou, anota o consolidado zerado — e só ele: companhia que só tem individual não ganha a anotação —, registra a escala divergente das duas fontes (duas colunas e ITR); `padronizar_trimestral` faz o mesmo nos trimestres 1, 2 e 3. ATAQUE: pular o ano mínimo; anotar o individual comum; esquecer um trimestre; devolver contagem errada.I-B88— Com números redondos, cada indicador do plano comum sai exato e sem flag: margens bruta/EBIT/líquida sobre a receita; ROIC = EBIT × (1 − IR/LAIR) sobre o capital investido MÉDIO (dívida + PL − caixa − aplicações); ROE = lucro dos controladores sobre o PL dos controladores médio (PL − minoritários); EBITDA = EBIT + D&A; dívida líquida; DL/EBITDA; crescimento; ROA = lucro TOTAL sobre o ativo médio (6 casas); liquidez corrente como foto; Piotroski 8 de 9 (o giro igual não pontua; a contagem de ações igual pontua).I-B89— Alíquota efetiva = −IR/LAIR.I-B90— Sem o ano anterior, o capital é o do fim (`capital_final_sem_ media`); capital médio zero ou negativo não tem ROIC; |ROIC| acima de 2 é `roic_extremo` (2,5 já é), exatamente 2 não; caixa ausente conta zero e avisa (`caixa_nao_publicado`, também na dívida líquida e no DL/EBITDA); aplicação ausente conta zero sem aviso; sem dívida, sem capital.I-B91— Sem lucro dos controladores, lucro total com `lucro_total_sem_minoritarios`; sem linha de minoritários, o PL total inteiro; PL médio zero ou negativo não tem ROE (`pl_nao_positivo`).I-B92— Receita zero: margens e crescimento vazios com `receita_zero_na_dre`; margem EBIT acima de 100% é `margem_ebit_implausivel`, exatamente 100% não; ativo médio zero, `ativo_medio_zero`; passivo circulante zero, `passivo_circulante_zero`; ativo abaixo de R$ 1 milhão marca TODO indicador do ano com `empresa_sem_operacao`, exatamente R$ 1 milhão não.I-B93— O denominador do crescimento é o comparativo REAPRESENTADO do ano anterior (conta ordem P, mesma agregação do fato) — sem flag; na falta dele, a receita de época com `denominador_sem_comparativo`.I-B94— Escala divergente no exercício: EBITDA e dívida líquida (os ABSOLUTOS) saem vazios, razões ficam, todos com `escala_divergente`.I-B95— Comparação cujas DUAS pontas estão em bases diferentes (con × ind) é `base_contabil_mudou`: crescimento de 1 ano, ROE, ROA e Piotroski na janela de 1 ano; CAGR na de 5. Ano sem vizinho não compara, e a margem (sem comparação) nunca é marcada.I-B96— Banco: margem líquida sobre a receita de intermediação, ROE sobre o PL consolidado médio (sempre com `pl_consolidado_inclui_ minoritarios`; sem lucro dos controladores, lucro total e a flag), ROA, crescimento pelo comparativo reapresentado — e NADA de ROIC, EBITDA, margem bruta, liquidez ou Piotroski.I-B97— A contagem de ações de cada exercício é a do documento MAIS RECENTE daquele ano (dezembro vence setembro, qualquer que seja a ordem de gravação); contagem vazia não entra.I-B98— Cada régua "≤ 0" é sobre zero, não sobre R$ 1: LAIR, capital médio, PL médio, EBITDA, receita e base do CAGR de 50 centavos ainda fazem conta.I-B99— A DRE sem custo (`custo_ausente_na_dre`) marca o que lê a DRE — margens, ROE, ROA, EBITDA, crescimento, Piotroski — e NÃO marca a liquidez corrente nem a dívida líquida, que são foto do balanço e não leem linha nenhuma da DRE.CP01— CP01 · Milhar e decimal no separador do idioma: 1.234.567 e 1.234,57 em PT; 1,234,567 e 1,234.57 em EN; casas pedidas exatas; escape de HTML.CP02— CP02 · A bandeira diz a cor pelo rótulo do idioma, com o ponto na cor do token; o texto e os motivos saem no idioma (sem versão EN, cai no PT); sem motivo, nenhuma lista; tudo escapado.CP03— CP03 · O bloco: a frase do topo, a bandeira, cada pergunta com os seus itens (item indisponível com a classe `nd`), o link de metodologia certo de cada número na língua, a nota, o JSON e o link do veredito.CP04— CP04 · A célula: margem e ROIC em % com 1 casa, os outros com 1 casa, — quando indisponível; liquidez em milhões com 1 casa; nome cortado em 28 caracteres; o ponto da bandeira na cor.CP05— CP05 · Ordenação por qualquer coluna nos dois sentidos, a bandeira na ordem verde < amarela < vermelha, ordem desconhecida vira "ticker", filtro de setor exato; quem não tem o número vai para o fim nos DOIS sentidos.CP06— CP06 · Entram as companhias com liquidez média no intervalo [piso, teto) — o piso entra, o teto não — e com veredito; em ordem de ticker.CP07— CP07 · A página: a janela em milhões na intro e na descrição, o total da base, os setores como filtro (o ativo em negrito, "todos" vira link), a contagem da tabela filtrada, a ordem padrão (ticker ascendente; outra coluna descendente); PT e EN.CP08— CP08 · A página das companhias: a lista é cortada no limite da configuração (a contagem "N de M" é a total), filtra por tipo e por papel (maiúsculo), o contador mostra só os últimos meses da configuração mas conta a base inteira, data em dd/mm/aaaa (EN: AAAA-MM-DD; sem data, —), os links de filtro levam o idioma com `&`, e o papel liga para a página dele na língua.CP09— CP09 · `?classe=fiis` e `?classe=etfs` montam a página da classe: os tipos e o contador do vigia dela, o link do papel para /fiis ou /etfs, o formulário com a classe escondida, o JSON da classe, as faixas da configuração no texto e a aba da classe em negrito; classe desconhecida é a das companhias.CP10— CP10 · /vigia/{T}: a contagem de todos os eventos do papel no lede (ou a frase de nenhum), o filtro por tipo com o idioma, o JSON com a classe (a de companhia sem), o link para a página certa do papel e para "todos os eventos" da classe.CP11— CP11 · Nas páginas de fundo e de ETF: o cabeçalho do contador e a coluna de tipo trazem os rótulos do vigia da classe no idioma; a data sai dd/mm/aaaa em PT; as faixas de P/VP, DY, vacância, taxa e ágio saem INTEIRAS (um rótulo a mais que os cortes), e os percentuais da configuração ×100; tipo desconhecido é ignorado; o papel é cortado em 12 caracteres; "com o filtro" só com filtro; o campo do formulário devolve o papel filtrado.CP12— CP12 · Valores escolhidos em cima da borda do arredondamento: janela de R$ 1.500.000,50 aparece como "2" milhões (não "1"); liquidez de R$ 1.050.000,50 como "1,1 mi"; setor vazio não vira "None".CP13— CP13 · Data com hora ("2026-09-15T10:00") sai 15/09/2026 em todas as páginas do vigia; o papel do filtro é cortado em 12 caracteres também nas páginas de companhia e de ETF; filtro só por papel já é "com o filtro" nas páginas de fundo e de ETF; os rótulos PT de tipo nas companhias; e os cortes da configuração que caem em cima da borda do arredondamento (2,49% → "2", não "3"; R$ 1.500.000,50 → "2" milhões, não "1") saem pela conta exata.CP14— CP14 · A classe sai do dígito final (3 ON; 4–8 PN; 11 UNT; outro ou sem dígito, nada).CP15— CP15 · P/FCO = valor de mercado ÷ caixa das operações; P/FCF = valor ÷ (FCO + capex, que vem negativo); só com caixa positivo (zero não); banco, seguradora e valor de mercado ausente ou zero ficam sem nada.CP16— CP16 · Cada indicador por tema com números redondos: P/Receita, EV/Receita, P/EBITDA e P/EBIT (só com denominador positivo), EV/EBIT, earning yield (lucro dos controladores, ou o total na falta), DL/PL, dívida bruta/PL (curta + longa; só uma delas basta), PL/ativos, passivos/ativos, margem EBITDA, giro, payout e os CAGR de 5 anos (só com as duas pontas positivas).CP17— CP17 · A posição no setor (1 = melhor; o sentido de cada chave; sem regra de direção ou com menos de 3 pares, nada); a mediana só com 3+ pares; DY do ano = soma ÷ fechamento do último pregão do ano; DY médio só dos anos pedidos com DY; o radar de datas-com dos últimos 5 anos a partir do dia 1 do mês; o checklist com cada limiar e o que não se aplica a banco; a foto de 12 meses só com denominador positivo.CP18— CP18 · As réguas a meio real do zero e os limiares como NÚMERO (não como a constante, que um defeito mudaria junto): caixa de 0,50 ainda dá P/FCO; CAGR com ponta de 0,50; EBITDA, EBIT e receita de 0,50–1,00 ainda dividem; ROE 0,5, DY 0,05 e liquidez de R$ 10 milhões exatos passam o checklist; seis anos de lucro com o mais antigo negativo passam os "últimos 5"; lucro zero não é lucro; PL ausente não quebra a razão dívida/PL; pregão sem data final não quebra; empate no P/L não conta como melhor; data-com de novembro e do próprio dia entram; os temas de cada chave são os certos; e `hoje` passado é usado, não o relógio.CP19— CP19 · Uma companhia sintética com números redondos, pelo caminho inteiro da página: valor de mercado = ações × fechamento; LPA, VPA sobre o PL dos controladores; dívida líquida e EV; DY 12m só da classe do principal; payout do exercício; P/FCO e P/FCF.CP20— CP20 · As réguas do valor de mercado nos números exatos: ações em milhares só abaixo de 1% do PL dos controladores (exatamente 1% não é corrigido, e cai fora da banda); a banda [0,02; 50] com as duas pontas DENTRO e 50,5 fora; entre 1% e a banda, nada é corrigido.CP21— CP21 · O que a CP20 não alcançava: CAGR de 1 ano; o ano do bloco de temas é o do valuation, não o último indicador; PL dos controladores de 50 centavos ainda passa pela banda; sem provento no exercício não há proventos do ano; sem lucro e com provento, nada de payout; LPA de 0,50 ainda dá payout.I-N651— Na base real, /acoes/ITUB4 mostra o bloco "Definição exata" com o ROE sobre patrimônio consolidado, data-base e DFP, o cartão do ROE diz "consolidado" e a barra de âncoras leva ao bloco; /acoes/VALE3 (PT e EN) mostra a dívida líquida com as contas 2.01.04 e 1.01.01; /acoes/VALE3/divida e a versão .RC01— RC01 · /fiis/screener: o piso de cotistas inclui quem está NO piso (5.000 entra, 4.999 não; cotistas nulo conta como zero); P/VP e DY com flag não são número filtrável (o fundo aparece sem eles e não passa filtro nenhum daquele campo); cada limite (pvp_min/max, dy_min/max) inclui o valor igual; segmento casa sem caixa; a ordem é por P/VP crescente com quem não tem P/VP limpo no fim; `limite` corta a lista mas não o `n`, com padrão 50 e teto 200; parâmetro desconhecido, ou valor não numérico, é 400; parâmetro vazio é como ausente; banco de outra versão é 503 com Retry-After.RC02— RC02 · /scores: o Piotroski usa o exercício mais recente contra o ANTERIOR (ano − 1), com as ações dos dois anos, e declara `de: 9`; banco não tem Piotroski e o tipo sai como gravado; Graham usa o múltiplo mais recente com P/L e P/VP, só com os dois positivos, e P/L × P/VP = 22,5 ainda é aprovado; os arredondamentos são 2 casas (P/L, P/VP) e 1 (produto).RC03— RC03 · /dividendos: `proventos` traz todas as classes; o resumo anual e o DY de 12 meses só a classe do ticker (ALFA3 → ON), somados com 6 casas; provento sem data-com não entra no resumo; o provento do 1º dia dentro da janela de 12 meses entra no DY (o de exatamente um ano atrás não: somaria o mesmo mês duas vezes — janela_12m, 03/11/2026); DY só existe com preço e com soma positiva; sem linha de cobertura, a situação é "nao_verificado" com zero proventos; a nota diz a classe.RC04— RC04 · /empresas/{T}: pedido por um código secundário responde com o PRINCIPAL; nome, CNPJ, cd_cvm, setor e tipo saem cada um da sua coluna; a cobertura é o primeiro e o último ano de indicador e a contagem de reapresentações; companhia sem código na tabela de tickers lista o principal; cada recurso diz `exige_chave` = falso só para a degustação.RC05— RC05 · /indicadores: banco e seguradora recebem a nota do plano de intermediação e o aviso de plano de contas, e nunca o alerta de minoritários; companhia geral recebe o alerta só quando o lucro dos controladores difere do total em MAIS de 1% no último exercício consolidado, com a diferença relativa de 6 casas.RC06— RC06 · /screener: `_min` e `_max` incluem o valor igual; número com flag não passa; a ordem é pelo PRIMEIRO filtro, decrescente (com um filtro só também); o padrão de `limite` é 100 e corta a lista, não o total; `as_of` de hoje vale (só o futuro é 400); valor não numérico e parâmetro desconhecido são 400; o recibo que estoura o limite diário diz o limite.RC07— RC07 · O feed JSON de reapresentações devolve 100 por padrão, no mínimo 1 e no máximo 500; sem chave e sem pedir JSON, é a página, no idioma pedido.RC08— RC08 · /dump/{conjunto}.RC09— RC09 · /etfs/{T}/diario devolve a série inteira sem `desde` e a partir dele com `desde` (inclusivo), com o fechamento e o ágio do mesmo dia; ETF desconhecido é 404; banco de outra versão é 503 com Retry-After.RC10— RC10 · /etfs/{T}/carteira: sem `competencia`, a mais recente; o PL é o da maior posição e o peso é valor ÷ PL (nulo para posição sem valor); as competências disponíveis saem como AAAA-MM, da mais nova para a mais velha; com `competencia`, aquela; ETF desconhecido 404; banco de outra versão 503. ATAQUE: peso com a conta trocada; PL de outra linha; mês com o dia junto.RC11— RC11 · /empresas/{T}/indicadores/{nome}: para um MÚLTIPLO, a série vem dos múltiplos (com a data do preço); para um indicador, dos indicadores; o valor "atual" que se compara ao universo é o mais recente SEM flag — um ponto mais novo com flag fica fora.RC12— RC12 · /empresas/{T}/linhagem de indicador que a companhia não publicou naquele ano é 404 (não outro código), com o ano na mensagem.RC13— RC13 · `/empresas/{T}/eventos` traz TODOS os eventos (cisões inclusive), do mais recente ao mais antigo, com a FONTE (`b3_declarado` ou `inferido_capital_e_preco`) e a SITUAÇÃO (o que o preço disse) em campos separados, o fator como a B3 o declarou, a data de aprovação, e o efeito líquido do dia: os dois eventos de 02/07/2025 do TIMS3 (0,01× e 100×) valem 1,0 juntos.RC14— RC14 · A tabela de eventos da página da empresa diz DE ONDE vem cada evento só quando NÃO é a B3 ("achado por nós"), mostra o efeito líquido do dia quando há mais de um evento nele e escreve a situação por extenso (não "não conferido" para tudo).RC15— RC15 · O conjunto `eventos` do dump traz uma linha por evento, com ticker, fator declarado, data de aprovação, efeito líquido do dia (`mult_grupo`), situação da conferência e a fonte (`b3_declarado` / `inferido_capital_e_preco`), cisões inclusive; está no índice /dump.RC16— RC16 · `/empresas/{T}/precos` devolve a série DIÁRIA completa (abertura, máxima, mínima, fechamento, médio, volume, quantidade, negócios) do mais antigo ao mais recente; `de`/`ate` recortam (inclusive nas pontas); `limite` corta a partir do mais antigo e avisa; os eventos societários DENTRO do período vêm junto (os de fora, não), com o efeito líquido do dia; e a resposta diz que o preço NÃO é ajustado.RC17— RC17 · `formato=csv` devolve o CSV com cabeçalho e as mesmas linhas do JSON (e avisa por cabeçalho se cortou); data fora de AAAA-MM-DD, `de` depois de `ate` e formato desconhecido dão 400 com a causa; ticker inexistente, 404. ATAQUE: aceitar data torta e devolver tudo; CSV sem cabeçalho; CSV com as linhas em outra ordem que o JSON.RC18— RC18 · `/empresas/{T}/desempenho` devolve retorno, drawdown e volatilidade do comprar-e-manter e do cruzamento de médias, em poucos números, com o preço AJUSTADO pelos eventos (o desdobramento não vira queda de 40%) e as premissas escritas na resposta.RC19— RC19 · O `llms.RC20— RC20 · A página `/acoes/{T}` traz, colada na rentabilidade, a tabela comprar-e-manter × cruzamento 21×100 com os MESMOS números da rota `/empresas/{T}/desempenho` e o link para ela (PT e EN); sem pregões suficientes a tabela some (a página nunca cai); o `llms.RC21— RC21 · `/etfs/{T}/desempenho` e `/fiis/{T}/desempenho` devolvem retorno, drawdown e volatilidade de comprar-e-manter e do cruzamento 21×100, SEM chave, com as premissas DE FUNDO (rendimentos fora da conta; sem ajuste de desdobramento).RC22— RC22 · O bloco de desempenho nas páginas de fundo: tabela comprar-e-manter × cruzamento, link da rota aberta, "SEM os rendimentos" e, com salto diário suspeito, o aviso "não confiável"; sem resultado, o bloco some; o `llms.RC23— RC23 · O desempenho passa a trazer `retorno_total_pct` (e anualizado e drawdown total): o provento compra mais papéis ao fechamento do DATA-EX (primeiro pregão depois da data-com); no cruzamento só recebe quem está comprado no data-ex; os campos de preço não mudam; sem provento registrado, a resposta segue só de preço (premissa "NÃO incluídos"); FII conta RENDIMENTO e deixa a AMORTIZAÇÃO de fora; as premissas e a nota dizem qual é qual.RC24— RC24 · `retorno_total_liquido_pct` (e anualizado e queda máxima líquida) desconta 15% de imposto retido só do JCP; dividendo e rendimento de FII entram inteiros; o retorno total BRUTO e o de preço não mudam; sem JCP, o líquido é igual ao bruto e a página não mostra a coluna extra; com JCP, a coluna aparece com o rótulo do imposto; a premissa e a página dizem que o bruto é bruto.RC25— RC25 · Provento pago em DUAS parcelas de mesmo valor e mesma data-com (PETR4: JCP de R$ 0,35048636 com data-com 01/06/2026, pago em 20/08 e em 21/09) fica em duas linhas: a lista da B3 repete o registro e cada repetição é uma parcela; a ficha casa cada parcela pela ordem da data de pagamento.RC26— RC26 · Banco da semana anterior (a reconstrução REAPROVEITA o banco) com a chave velha de `dividendo`, sem a parcela: ao abrir, a tabela é refeita com a parcela na chave, todas as linhas ficam, o índice volta, e a partir daí duas parcelas iguais convivem.IX01— IX01 · A resposta da B3 (uma linha por DIA DO MÊS, `rateValue1..12` por mês, texto brasileiro) vira [(AAAA-MM-DD, pontos)] em ordem; nulo e dia inexistente (30/02) saem.IX02— IX02 · `ingerir_indices` pula o ano FECHADO que já tem pregões suficientes; o ano que a B3 não devolveu (None) fica como estava, sem apagar nada e sem levantar.IX03— IX03 · O arquivo versionado completa a tabela (sem rede, INSERT OR IGNORE: o fresco vence) e só é reescrito quando a tabela tem pelo menos as linhas que ele já tem.IX04— IX04 · Num build do zero em que a B3 não respondeu, `herdar_series_externas` completa `indice_preco` com o banco anterior; a contagem da tabela entra nas vigiadas da troca.IX05— IX05 · `/indices` lista com cobertura; `/indices/{cod}/precos` devolve a série (de/ate recortam, csv, código em minúscula vale); código inválido 400, índice sem dados 404, data torta 400. ATAQUE: recorte `de`/`ate` ignorado; série fora de ordem; 200 vazio para índice que não existe.IX06— IX06 · No modo comercial, sem chave a rota de preços devolve 200 com os ÚLTIMOS 30 pregões e `aviso` (como a de papel fechado), e o desempenho continua aberto.IX07— IX07 · Caso à mão (médias 1×2): 10,11,12,12,13,14 → comprar e manter +40,0%; sinais nos fechamentos 2,3 (compra), 4 (fora: 12 não passa de 12), 5 (compra) → posição nos pregões 3,4,6 → 1,0909 × 1,0 × 1,0769 = +17,48%.IX08— IX08 · O conjunto `indices` existe no dump com (indice, data, fechamento), ordenado.IX09— IX09 · Na rodada da NOITE (`_proventos_da_noite`), os índices entram pedindo SÓ o ano corrente (a série inteira é do build de domingo); se a B3 levantar exceção, vira `erro_indices` e as etapas seguintes rodam.PX01— PX01 · Renovar ANTES de vencer soma ao fim do período (não perde dia); voltar DEPOIS recomeça no dia do pagamento; 31/01 + 1 mês cai no último dia de fevereiro.PX02— PX02 · O resync lê as sessões PAGAS de pacote Pix: em dia vira Pro com `pro_ate`; vencido segue com a chave no grátis; sessão não paga, de outro modo ou sem pacote não conta; o `pro_ate` vai ao metadata do Customer.PX03— PX03 · Quem tem assinatura Pro por cartão ativa continua Pro mesmo com Pix vencido; Customer de Pix pago sem chave no metadata ganha uma, gravada no Stripe (pagou e não pode ficar sem).PX04— PX04 · Faltando até 5 dias, sai UM e-mail por período (marcado em `pix_aviso`); longe do fim, ou sem e-mail no Customer, nada sai; o texto diz a data e que a chave segue no grátis.PX05— PX05 · O checkout é `mode=payment` só com Pix, no preço do pacote, com o pacote no metadata; com a chave de um cliente conhecido vai para o MESMO Customer; pacote inventado não abre cobrança.PX06— PX06 · `/assinar?plano=pix&pacote=1m` vai ao checkout; o POST de renovação usa a chave do FORMULÁRIO (nunca da URL) e responde 303; pacote ruim é 400; robô vê a página de planos e não cria sessão; a página de planos mostra o Pix com os três pacotes e o formulário de renovação.BK01— BK01 · `/admin/backup` lista as três bases do dia MAIS RECENTE (não a pasta parcial nem a do dia anterior), com bytes e sha256 do arquivo sem compressão.BK02— BK02 · `/admin/backup/{nome}` entrega UMA base, gzip, que descomprime exatamente no arquivo do backup mais recente e bate com o sha256 da lista; diz o dia no cabeçalho.BK03— BK03 · Sem X-Admin-Token, com token errado ou com o token na URL: 404 (a rota nem parece existir).BK04— BK04 · Antes do primeiro backup: lista com `dia: null` e nenhum arquivo; download 404 (não 500).BK05— BK05 · Cifrar e decifrar devolve os MESMOS bytes — arquivo vazio, menor que um bloco, múltiplo exato de bloco e maior que vários blocos — e uma base SQLite real decifrada passa no `PRAGMA integrity_check`.BK06— BK06 · Com outra chave a decifragem falha (não devolve lixo).BK07— BK07 · GCM autentica: um byte mudado no cabeçalho ou no miolo, o fim cortado, blocos trocados de lugar, um arquivo entregue com o nome de outro ou lixo sem cabeçalho fazem a decifragem FALHAR.BK08— BK08 · Sem BACKUP_CHAVE (ou com chave inválida), manifesto e arquivo respondem 503, não entregam byte algum e NADA é criado no disco: a lista de arquivos e as somas do backup ficam iguais.BK09— BK09 · Sem X-Admin-Token, com token errado, com o token na URL: 404 (igual às outras rotas admin), mesmo com chave configurada.BK10— BK10 · O manifesto lista as bases do dia mais recente com bytes, sha256 do arquivo em claro, tamanho cifrado e linhas por tabela (foto_dia = 7).BK11— BK11 · `/admin/backup/arquivo/{nome}` só entrega as bases do backup: `.BK12— BK12 · O arquivo entregue NÃO traz o cabeçalho do SQLite nem o e-mail em claro; decifra exatamente na base do backup, com o sha256 do manifesto; o Content-Length confere; a base original fica byte a byte igual.BK13— BK13 · Mais de 60 pedidos em um minuto às rotas do backup cifrado: 429 com Retry-After, inclusive para token errado (é assim que se barra quem tenta adivinhar o token).BK14— BK14 · `ferramentas/backup_puxar.PQ01— PQ01 · Ibovespa 100 → 150 em 400 pregões diários e meta Selic de 12% a.PQ02— PQ02 · A tabela vem em ordem de volume negociado, cada linha com o MESMO número da rota `/empresas/{T}/desempenho`, e a frase de resposta conta quantas o cruzamento venceu.PQ03— PQ03 · `/perguntas` lista as duas, em PT e EN; slug inventado é 404; o sitemap e o `llms.PQ04— PQ04 · /perguntas/fiis-maior-dividend-yield lista os MESMOS fundos, na mesma ordem, do ranking do hub /fiis (≥ 5.000 cotistas, sem ressalva), com DY e P/VP, a mediana por segmento e a regra escrita.FR01— FR01 · Preço parado em R$ 10 por 200 dias.FR02— FR02 · O banco anterior tem rendimentos de jan a jun; a base nova (o que a B3 mostra hoje) tem de abr em diante, com o de abril CORRIGIDO.FR03— FR03 · O tipo do FII sai do bloco de ativos do informe mensal: tijolo (imóveis e sociedades imobiliárias com 50% ou mais do total investido), papel (CRI, CRA, LCI, LH, LIG), fundo de fundos (outros FIIs) ou híbrido; sem investimento, nenhum tipo.FR04— FR04 · A página do FII mostra o tipo pela carteira com o percentual e o informe, ao lado do segmento declarado; o hub traz a mediana de P/VP e DY por tipo (só fundos líquidos); banco sem a tabela não quebra.FR05— FR05 · Quando o cadastro da CVM dá o MESMO ISIN a dois fundos, o build anual pergunta à B3 quantas cotas o ticker tem e fica com o fundo cujo informe declara o número mais próximo; preços, rendimentos e ticker do perdedor passam para o dono.FR06— FR06 · Os rendimentos do KNRI11 copiados da base local (datas-com de 31/10/2025 a 30/10/2026) e o preço de R$ 150,50, num banco sintético, pelo cálculo do build (`fiis.FR07— FR07 · Fundo sintético que paga R$ 0,10 no último dia útil de cada mês, de set/2024 a out/2026 (31/10/2025 é sexta, 30/10/2026 também): o DY soma exatamente 12 meses (R$ 1,20).FR08— FR08 · Ação (pagamento irregular): a janela é data-com em (âncora − 1 ano, âncora].I-N411— Em cinco papéis líquidos (ITUB4, PETR4, VALE3, KNRI11, BOVA11), em português e em inglês, a página `/quanto-rendeu/{T}` tem o bloco "Leitura dos números" / "Reading the figures" com SEIS parágrafos (janelas, melhor e pior ano, maior queda, comparação com o índice e a Selic, parte dos proventos, método) e de 250 a 400 palavras; os dois idiomas têm os mesmos seis parágrafos; entre quaisquer dois papéis menos de 60% das frases são iguais (o texto muda de verdade, não só o ticker); a página inteira pesa menos de 60 KB, não leva `<script>` além do JSON-LD e o aviso "não é recomendação" segue lá.I-N412— Os números do bloco "Leitura dos números" são os de `pagina_quanto_rendeu.I-N413— O bloco "Leitura dos números" só aparece em papel LÍQUIDO, pela mesma régua do sitemap (`sitemap_quanto_rendeu`: ação com média de 63 pregões >= R$ 5 mi/dia, FII com >= 5.000 cotistas, ETF com média de 60 pregões >= R$ 1 mi/dia): as funções de um papel só (`acao_liquida_uma`, `fii_liquido_um`, `etf_liquido_um`) concordam com os conjuntos do sitemap para todas as ações e para uma amostra de fundos; uma ação ilíquida segue com a página de antes (200, canonical, sem noindex, sem o bloco).QR01— QR01 · Para 1 e 3 anos, "R$ 1.000 viraram" = 1000 × (1 + retorno) da rota `/empresas/REND3/desempenho?de=` no mesmo início (preço e com proventos); o Ibovespa e a Selic do mesmo período aparecem; 5 e 10 anos não (a ação só tem 3,8 anos).QR02— QR02 · REND4 (código não principal) vai para /quanto-rendeu/REND3 com 301; código inexistente é 404; a página da ação liga para a pergunta; o sitemap lista uma por companhia.QR03— QR03 · /quanto-rendeu/KNRI11, HGLG11 e BOVA11 dão 200 com "R$ 1.000 viraram" = 1000 × (1 + retorno) do /fiis|etfs/{T}/desempenho com o mesmo início (preço e, onde há rendimento cobrindo a janela, com rendimentos); onde não há, a página diz que é só preço; FII contra o IFIX, ETF contra o Ibovespa; cache público de 5 minutos, JSON-LD, "Como citar", EN e .QR04— QR04 · Na página `/quanto-rendeu/KNRI11` o link "rendimentos do fundo" aponta para `/fiis/KNRI11#rendimentos` (e com `?lang=en` na versão em inglês), nunca para `/fiis/KNRI11/dividendos`, que responde 301. ★ POR QUE (03/11/2026).TX01— TX01 · `/empresas/{T}/desempenho` traz `comparacao_mesmo_periodo` com o Ibovespa (fim/início − 1) e a meta Selic ((1,12)^(n/252) − 1, n = pregões do Ibovespa depois do início) NA janela da própria resposta, e `pagina_pronta`; o FII traz também o IFIX.TX02— TX02 · `/quanto-rendeu/REND3.md` e `/perguntas/*.BD01— BD01 · Do COTAHIST entram só as linhas de BDR (CODBDI 34, 35, 36) do mercado à vista (010), com os cinco preços, volume e negócios da MESMA linha; o ticker guarda o ISIN e a espécie da linha mais recente.BD02— BD02 · O cadastro lê todas as páginas de `GetCompaniesBDR`; "Não Classificados" não vira setor; se UMA página falha, nada é gravado (lista pela metade não substitui a inteira) e o que estava fica.BD03— BD03 · `cashDividends` vira provento por ISIN (número e data brasileiros; data 9999 é "sem data"); `stockDividends` de desdobramento/grupamento vira evento; rótulo que não muda quantidade e valor zero ficam fora.BD04— BD04 · Desdobramento de 100% (×2) que o preço confirma entra no ajuste: o retorno de 12 meses não mostra −50%.BD05— BD05 · /bdrs lista só quem negociou no último ano, em HTML e JSON, com filtro de tipo (tipo inválido 400); /bdrs/AAPL34 é página e, com Accept JSON, dicionário aberto que diz o que NÃO tem; outro BDR em JSON sem chave é 401; BDR desconhecido 404. ATAQUE: listar BDR parado há 900 dias; exigir chave para o AAPL34; servir JSON de outro BDR sem chave.BD06— BD06 · /bdrs/{T}/precos sem chave devolve os ÚLTIMOS 30 pregões com aviso (AAPL34 inteiro); com chave, a série inteira, também em CSV.BD07— BD07 · O menu do topo tem BDRs; a busca leva "AAPL34" direto à página do BDR e acha "apple" pelo nome; BDR parado há 900 dias (sem página) não aparece; na tabela de resultados o tipo é BDR, não "Ação".RO01— RO01 · A ressalva do indicador sai em frase com o código entre colchetes (o mesmo da API); a desconhecida sai só como código; o Piotroski parcial diz quantos critérios; o gráfico e a tabela usam a frase.RO02— RO02 · A ficha do ETF mostra as cotas em circulação (patrimônio ÷ cota do último informe, com a data), o administrador do cadastro da B3 e o ano de registro da classe; as chaves velhas "gestor", "cotas_emitidas" e "data_inicio" não existem mais no dicionário (página, JSON e MCP); a quantidade aprovada continua, com o nome.RO03— RO03 · A página do FII diz que o segmento é o declarado pelo administrador, e o cartão de P/VP traz, ao lado do ponto-no-tempo do informe, o P/VP com o último fechamento (fechamento ÷ VP por cota), com a data.RO04— RO04 · A lista "Maior valor de mercado" da home sai do MESMO cálculo da página da companhia (fechamento de hoje × ações do último balanço), reordenada por ele; candidata sem valor de hoje fica fora; só as N primeiras.RO05— RO05 · O mesmo evento nas classes ON e PN (mesma data, tipo, multiplicador e situação) é UMA linha que diz as classes; evento de uma classe só não ganha rótulo; multiplicador abaixo de 0,1 sai com as casas que precisa (0,001×, não 0,00×).RO06— RO06 · O DY médio de 5 anos (critério do checklist) vem com a mediana ao lado; o critério continua sendo a média.RO07— RO07 · Toda página em inglês anuncia o Pro pelo MESMO preço (o do idioma), sem "R$ 49.90" escrito à mão.RO08— RO08 · O título e a descrição de busca usam o número mais recente quando a ressalva só declara o método (lucro total sem minoritários, PL do fim do ano.RO09— RO09 · Toda marca que pode calar um múltiplo (P/L, P/VP, EV/EBITDA.RO10— RO10 · Dois proventos no mesmo data-ex reinvestem JUNTOS (1 + (a+b)/P), no bloco de desempenho e na tabela; a janela de 5 anos dos dois parte do mesmo pregão (o último até o mesmo dia de 5 anos antes) e dá o mesmo número; a suspeita do detector por capital que o preço desmentiu não é evento da empresa nem conta nos sinais, e o que o detector acha nunca sai como "declarado pela B3".RO11— RO11 · Empresa com ON e PN: o valor de mercado de hoje é ON × preço da ON + PN × preço da PN (a proporção vem da composição do capital da DFP/ITR; o preço da outra classe, do COTAHIST, até 7 dias antes); o EV usa esse valor; o market_cap por ação (o dos múltiplos) não muda.RO12— RO12 · /en leva à home em inglês e /en/<página> à página em inglês (301); /llms-full.RO13— RO13 · O checklist diz "nenhum prejuízo" (não "nenhum", que se lia como "nenhum lucro") e "anos de pregões na nossa base" (não "anos de bolsa": a Petrobras não tem 16,8 anos de bolsa); a home diz "Novidades na CVM" (o bloco mostra 30 dias, não "ontem") e corta nome em fronteira de palavra; o oferecimento da chave grátis leva ao /chave-gratis; o gráfico de preço avisa que não desconta proventos.I-N230— A foto do pregão traz, por ação, os números das mesmas funções da página (valor de mercado = preço × ações, LPA, VPA, DY 12m, EV/EBITDA ponto-no-tempo com o ano) e DE QUAL balanço saíram (ano e data de entrega à CVM); por FII, P/VP do informe, P/VP de hoje (fechamento ÷ VP da cota), DY 12m e o último rendimento.I-N231— A foto é append-only: rodar duas vezes no mesmo pregão não duplica nem altera nada; o banco recusa UPDATE e DELETE nas tabelas de foto; um pregão novo acrescenta sem mexer no anterior.I-N232— A foto mora num arquivo próprio: trocar o b3.sqlite (a troca noturna e o build de domingo) não apaga nem altera uma linha dela, e o backup diário passa a copiar o arquivo.I-N233— Se a foto falha, `gravar_do_dia` NÃO levanta (a atualização noturna segue), nada fica gravado pela metade, e o /saude mostra o bloco `foto_diaria` com o estado `falhou` e a mensagem.I-N234— O /saude traz o bloco `foto_diaria`: última data gravada, nº de dias, linhas e tamanho do arquivo; sem arquivo, `nunca_rodou`.I-N235— `GET /api/foto/{ticker}?de=&ate=` responde só com X-Admin-Token (sem ele, 404, como as outras rotas de admin), devolve a série do ticker (ação ou FII) no intervalo pedido, e recusa data malformada.I-N236— O laço noturno chama a foto DEPOIS da atualização do preço, em try/except próprio, e só fora da bateria (a bateria sobe o app e não pode gravar no disco real).I-N270— `/foto-diaria` e `/foto-diaria/{ticker}` (pt e en) não mostram preço de fechamento, valor de mercado, P/L, DY, provento, EV nem LPA/VPA/ações (campos da B3 ou misto); mostram a data da foto, a versão da base, o balanço vigente, a data de entrega à CVM, o lucro e o hash de cada linha; têm "Como citar" com o hash da série e um bloco JSON-LD Dataset; e abrir as páginas não muda o arquivo da foto, byte a byte.I-N271— Toda coluna das tabelas de foto está classificada (metadado, CVM, B3, misto ou interno) em `foto_diaria.I-N272— Ticker que o site não conhece dá 404 em HTML com a moldura (e JSON simples para quem pede JSON), sem eco do texto cru; ticker conhecido sem pregão gravado dá a página dizendo que não há pregão gravado, sem tabela e sem data inventada; sem o arquivo da foto, o índice diz que ainda não há pregão gravado, e a rota não cria o arquivo.I-N273— Com 2 pregões gravados a página diz "2 pregões gravados" (e "2 trading days recorded"), nunca mais; o aviso da série começar em 21/10/2026 está nas duas línguas; as duas línguas têm as mesmas âncoras, os mesmos links e o mesmo nº de linhas na tabela.I-N274— `/foto-diaria` está no sitemap (com lastmod igual à data da última foto), na lista de páginas de fato do painel e no hub de fatos; o sitemap NÃO lista as páginas por ativo; `/foto-diaria/{ticker}` é medida pelo painel.I-N237— SECURITY.I-N238— Todo pacote de requirements.I-N112— Num interpretador novo (cache do processo frio), com a base real e sem rede, cada rota de `custo_config.I-N113— O servidor de verdade (uvicorn, um worker, o laço horário e o aquecimento ligados) sobe com a base real, e o /saude responde em menos de 1 s durante os primeiros 60 s de vida do processo — enquanto quatro "robôs" pedem sem parar as rotas que dependem dos eventos do vigia (sitemap, /vigia, /vigia/semana/…, /vigia/WEGE3).I-N437— Com os NÚMEROS DE VERDADE de limites_config.I-N438— A conta das IAs tem teto GLOBAL próprio: com 3 por hora, a 4ª consulta de "IA" (User-Agent de ChatGPT-User, cada uma de um IP diferente) recebe 429 com `Retry-After` e um corpo que diz que é o limite do servidor para assistentes de IA, com o link da chave grátis.I-N439— A regra de quem é "assistente de IA" para o limite sem chave: TODA chamada ao /mcp (e ao /mcp/chatgpt/), qualquer que seja o User-Agent (o cliente MCP chega com o da biblioteca, ex.I-N440— A regra de dados_b3/codigo_ativo.I-N441— Na base real: /empresas/PETR4.SA/indicadores, /empresas/petr4f/indicadores e /empresas/BVMF:PETR4/.I-N442— Código que não existe dá 404 que começa como sempre ("ticker desconhecido: PETR9"), sugere o parecido ("quis dizer PETR4") e manda para a busca por nome (/procurar?q=PETR9).I-N581— Decisão do dono (03/11/2026): o limite por endereço dos assistentes de IA nas ferramentas ABERTAS passa de 1.000/hora e 10.000/dia para 2.000/hora e 20.000/dia, com os números de VERDADE de limites_config.I-N320— Sem chave, com o gate comercial ligado, fatos (anual e trimestral), indicadores, múltiplos e dividendos respondem 200 para tickers que NÃO são a degustação (PETR4, VALE3, ITUB4), a ficha de FII (HGLG11) e o ranking de FII respondem em JSON, e todas trazem `citacao` com a fonte e a versão do dado.I-N321— O cofre continua fechado: `as_of` em fatos e em múltiplos, as versões e as reapresentações por empresa, o /dump (JSON e CSV), o screener de ações e o de FIIs respondem 401 sem chave.I-N322— Sem chave, o IP que passa do teto por hora recebe 429 com `Retry-After` (segundos até a hora virar, entre 1 e 3.600) e um corpo que diz o limite, o link da chave grátis e o de /assinar.I-N323— Além do teto por IP há um teto de TODOS os anônimos juntos (padrão 3.000 por hora e 30.000 por dia): quem troca de endereço a cada pedido bate nele, e a resposta é 429 com `Retry-After`, dizendo que é o limite do servidor.I-N324— A janela por hora zera quando a hora vira e a por dia quando o dia vira (UTC); o hash do mesmo IP muda de um dia para o outro (sal do dia), então o hash de ontem não casa com o de hoje; mesmo IP no mesmo dia dá o mesmo hash, IPs diferentes dão hashes diferentes.I-N325— Depois de consultas sem chave de um IP conhecido, esse IP (nem o endereço do soquete) não aparece em claro: nem nas chaves e valores do dicionário de contagem, nem nos bytes do arquivo de analytics, nem no log capturado.I-N326— Atrás do proxy o soquete é sempre o do proxy: o limite usa `cf-connecting-ip`, depois `true-client-ip`, depois o PRIMEIRO do `x-forwarded-for`, e só então o soquete.I-N327— A vitrine NÃO amplia o que a licença da B3 limita: a série diária de preços de um papel fechado segue sendo AMOSTRA (30 pregões) sem chave, a do índice também, o JSON de um ETF que não é a degustação segue pedindo chave, os trimestres (que trazem preço), os eventos e os scores seguem com chave, e o JSON da ficha de FII não traz preço diário nem série de fechamentos (só os pontos mensais que a página pública já mostra).I-N328— O índice /empresas/{T} marca indicadores, múltiplos, fatos e dividendos como abertos sem chave (com limite por IP) e o resto como `exige_chave`; o bloco `chave` diz o que é aberto, o que exige chave e o limite, com os mesmos números do gate.I-N329— O /llms.DI04— DI04 · Taxa fora de -5% a 100%, texto que não é número, vencimento depois de 2040, no passado ou numa data que não é dia útil, data de referência que não existe, contratos que não são inteiro de 1 a 1.000.000 e posição desconhecida: o JSON responde 400 com o campo e a mensagem; a página responde 400 com a mesma mensagem num aviso, o formulário preenchido e nenhum resultado.DI05— DI05 · A página (PT e EN) é um formulário GET sem nenhum <script> (nem JSON-LD), mostra a fórmula, a base 252, a tabela das letras (F a Z), o exemplo resolvido e o aviso de que os números são os que a pessoa digita e que o site não publica cotação de DI nem CDI; a página com conta é `noindex` e o canonical aponta para a limpa; a calculadora funciona com o banco ausente (não lê nada da base).DI06— DI06 · A calculadora tem porta: cartão nas ferramentas da home (PT e EN), entrada no llms.JC04— JC04 · Sem banco, ou com a tabela macro vazia (antes da primeira coleta noturna): a página limpa responde 200 e diz "Taxa oficial ainda não coletada; digite a taxa.JC05— JC05 · Valor ausente, negativo, acima de R$ 1 trilhão ou que não é número; prazo ausente, zero, fracionário, acima de 60 anos (720 meses) ou com unidade desconhecida; taxa ausente ou fora de 0% a 13.000% ao ano (50% ao mês); modo desconhecido; juro real ou inflação fora da faixa: o JSON responde 400 com o campo e a mensagem em português (e em inglês); a página responde 400 com a mesma mensagem, o formulário preenchido e nenhum resultado.JC06— JC06 · A página (PT e EN): <title> com "Calculadora de juros compostos", meta description, H1 exatamente "Calculadora de juros compostos", canonical limpo, FAQ em JSON-LD (FAQPage, cinco perguntas, as mesmas visíveis na página) como o único <script> da página; formulário GET; a fórmula e a taxa mensal (1 + a)^(1/12) − 1 explicadas com os exemplos resolvidos (R$ 1.120,00 e R$ 1.264,65); com conta, o resultado traz o gráfico SVG feito no servidor (linhas do saldo e do investido com um ponto por ano, grade com valores, coordenadas inteiras, rótulo acessível) e a tabela ano a ano, e a página é noindex com o canonical na limpa.JC07— JC07 · A calculadora tem porta: entrada no llms.JC08— JC08 · ★ 01/11/2026, a calculadora estava confusa (9 campos de saída).I-X15— A resposta GRAVADA do SGS (séries 1, 21619 e 1178, 27 a 29/10/2026) vira [(AAAA-MM-DD, número)] em ordem, com os valores publicados: dólar venda 5,3744 e euro venda 6,0000 em 29/10 (o boletim de fechamento da PTAX daquele dia), Selic efetiva 13,65. Texto que não é número ('.I-X16— A resposta GRAVADA do SIDRA tem o cabeçalho como PRIMEIRA linha; ele não vira dado.I-X17— Falha ISOLADA: com o SGS respondendo só a série 1 (gravada), o IBGE fora do ar e a série 10813 com vírgula trocada (53738 em vez de 5,3738), a coleta grava a série 1, NÃO grava a 10813 (fora da faixa: o lote inteiro é recusado), não apaga o que as outras já tinham, não levanta, e deixa em meta['macro_coleta'] o erro de cada série que falhou.I-X18— Coleta COMPLETA: as séries do SGS são pedidas desde 1999 em janelas de no máximo 9 anos, contíguas e sem sobreposição, até hoje; o SIDRA pede `p/all`.I-X19— Na rodada da NOITE (`_proventos_da_noite`), a coleta macro que levanta exceção vira `erro_macro` e as etapas seguintes rodam (comunicados).I-X20— `/macro/series/{codigo}` devolve as linhas do grupo, uma por período e uma coluna por série, com `fonte` (órgão, códigos, LICENÇA: ODbL para o BCB, citação da fonte para o IBGE), `citacao` (página, versão do dado, último dado) e a cobertura; `de`/`ate` recortam; `formato=csv` devolve o cabeçalho e as mesmas linhas.I-X21— No modo comercial, sem chave: dólar, euro e Selic devolvem 200 com os ÚLTIMOS 30 pontos e `aviso` (a regra de /indices/{codigo}/precos; o CSV também vira amostra em JSON); IPCA, PIB e desemprego saem INTEIROS, abertos (a regra do /fluxo-estrangeiro).I-X22— Entre o deploy e a primeira coleta (base sem `macro_serie`): `/macro/series/{codigo}` responde 503 com Retry-After (I-N06), o catálogo `/macro/series` responde 200 com a cobertura nula, a página responde 200 com o aviso de série em coleta, `noindex`, SEM número e SEM link para o JSON que daria 503, e o /saude não cai.I-X23— Cada página (/macro/dolar, /euro, /selic, /ipca, /pib, /desemprego), em PT e EN, abre 200 com o último número da base e a data no formato do idioma, a fonte com a licença, o link para o JSON e o CSV, a frase de citação no idioma da página, canonical, JSON-LD Dataset com a licença da FONTE, e o desemprego diz o trimestre móvel por extenso.I-X24— O bloco `macro` do /saude traz, por série, o último período, os dias desde o FIM dele e o limite da periodicidade (7 dias nas diárias, 50 no IPCA, 70 no desemprego, 170 no PIB) e o resultado da última coleta.I-X25— O hub /macro (PT e EN) tem um cartão para cada uma das seis páginas e o catálogo; o sitemap anuncia só as páginas cuja série a base TEM (vazia é noindex e fica fora), com o fim do último período como lastmod; o llms.BK51— BK51 · O banco da nossa base casa com o IF.BK52— BK52 · A coleta pede só os trimestres que o BCB já publicou (60 dias depois de mar/jun/set, 90 depois de dez), com pausa e o robô identificado, e grava os bancos NOSSOS.BK53— BK53 · O endereço segue o contrato do serviço (função com @parâmetros, TipoInstituicao=1 de prudencial, Relatorio='1' do Resumo, filtro por CodInst codificado, $format=json).BK54— BK54 · A publicação nasce DESLIGADA (o serviço do BCB não deu dado real na construção): /bancos, /bancos/series e /bancos/TICKER respondem 404 mesmo com a tabela cheia, e a leitura da ficha devolve vazio.BK55— BK55 · Ligada a publicação: /bancos/ITUB4 (e ITUB3, mesma série) traz a série trimestral dos cinco indicadores com a FONTE (Banco Central, IF.BK56— BK56 · Entre o deploy e a primeira coleta a tabela não existe: o JSON responde 503 com Retry-After e a página responde 200, com o aviso neutro, `noindex` e SEM número (a disciplina do 'dado em atualização').BK57— BK57 · Na página da ação de um banco o bloco 'Indicadores do Banco Central' traz a série trimestral (mais recente primeiro), a fonte e a licença AO LADO da tabela, a ressalva de que o perímetro pode diferir do consolidado da CVM, o link para /bancos e para o JSON, e a âncora na barra de seções.BK58— BK58 · O build do zero herda do banco anterior os trimestres que a fonte não trouxe (o serviço do BCB pode estar fora do ar no dia do build): a tabela `banco_if` está na lista de herança e o fresco vence o antigo.BK59— BK59 · A inadimplência vem do relatório 16 (o Resumo não a traz): 'Inadimplência' / 'Total Geral' x 100, e 'Ativos problemáticos' / 'Total Geral' x 100, com saldos em REAIS.BK60— BK60 · A coleta pede o relatório 16 além do Resumo.BK61— BK61 · /bancos mostra a coluna de inadimplência e a de ativos problemáticos, rotula o lucro como 'acumulado no semestre' (conferido contra balanços em 01/11/2026) e traz 'O que significa cada número', que diz a única conta nossa (a divisão) e admite que a definição oficial completa não foi achada.BK62— BK62 · Na /bancos, a primeira frase traz a inadimplência acima de 90 dias das (até) quatro maiores carteiras de crédito do último trimestre, na ordem da tabela, com o MESMO número que a tabela mostra (uma casa decimal), em pt e em en (Aposta 1: no teste cego de 02/11/2026 nenhuma IA nos achou para "inadimplência de Itaú, Bradesco, BB e Santander").PS02— PS02 · petr4, PETR4.SA, BVMF:PETR4, PETR4F e " petr4 " voltam com `atendido: PETR4` e os mesmos números de PETR4; HGLG11.SA vira HGLG11; um código antigo com troca conhecida vira o atual (a regra de dados_b3/codigo_ativo.PS04— PS04 · Sem chave: 401 que diz onde pegar a grátis e onde guardar na planilha (Dados B3 › Minha chave), até para WEGE3, que é aberta nas outras rotas: o pedido vem de IPs do Google que todas as planilhas dividem.PS05— PS05 · Até 300 códigos e 20 campos por chamada (301 e 21 dão 400 que diz o teto); campo desconhecido dá 400 com o endereço da lista; data fora do formato, inexistente ou no futuro dá 400; nenhum desses 400 gasta cota.PS06— PS06 · O pedido gasta 1 consulta a cada 100 células (código não vazio × campo), mínimo 1: 30 ativos × 10 campos = 3 consultas na tabela `uso_api` (a mesma do painel e do teto).PS07— PS07 · O UrlFetch do Apps Script chega com "Google-Apps-Script" no User-Agent: a lista de rastreadores recusados não o pega (403 do middleware) e a rota responde 200; o robots.PS10— PS10 · /planilha (PT e EN): os três passos (modelo, Dados B3 › Minha chave, usar), TODOS os campos de `planilha.PS11— PS11 · Leitura estática de cliente/planilha/Codigo.PS12— PS12 · `logo` (unidade link, as três classes): ação = https://dadosb3.com/logos/{cd_cvm}.PS13— PS13 · A coleta das gestoras: a classe (CVM 175) aponta o fundo e o fundo traz o CNPJ do gestor; o site é o SITE_ADMIN do cadastro de administradores de carteira; o ícone sai só desse site (sem o Google s2 que as companhias usam como último recurso); ícone menor que 32 px ou que some no fundo claro (branco sobre transparente) fica de fora; domínio bloqueado não recebe nem um pedido; gestora retirada perde arquivo e origem; a origem grava a URL e a data; o mapa fundo -> gestora vai para fundos.PS14— PS14 · A página do FII e a do ETF mostram o logo da gestora no mesmo padrão da página da ação: <img class="logo-cia"> antes do <h1>, servido do nosso domínio, com o title dizendo de onde veio e quando (PT e EN); nenhuma imagem de terceiro na hora da visita.RD01— RD01 · A regra pura: barra no fim sai, /en vira a mesma página com lang=en (a query do pedido fica, e um lang já pedido não é trocado), /llms-full.RD02— RD02 · ChatGPT-User e Claude-User pedindo HTML em /acoes/WEGE3/, /en/acoes/WEGE3 e /llms-full.RD03— RD03 · /acoes/WEGE3.SA pedida em HTML: a IA a pedido recebe 200 com a página de WEGE3 (canonical https://dadosb3.com/acoes/WEGE3) e o cabeçalho X-Codigo-Atendido; o navegador e o indexador de busca continuam com 301 para /acoes/WEGE3, que é o que o buscador deve guardar.RD04— RD04 · O bloco ia_erros do /admin/stats traz `caminhos_com_redirecionamento`: só status 300 a 399, por classe, caminho e status, do maior para o menor, juntando a lista de medição e os caminhos fora dela.RD05— RD05 · Nenhum endereço do llms.MT06— MT06 · Formato errado, data que não existe, data futura e data antes da base: 400 com a frase que diz o motivo e como corrigir, um link para voltar para hoje e datas sugeridas; a página de erro também é noindex.MT07— MT07 · Data válida e dentro da base, mas anterior ao primeiro balanço DAQUELA companhia: 400 dizendo que ainda não havia balanço e quando chegou o primeiro.MT08— MT08 · Com data: meta robots noindex,follow, cabeçalho X-Robots-Tag e canonical = a página sem data (sem ?em=), também em inglês.MT09— MT09 · O sitemap lista páginas sem data: nenhuma URL com ?em= (a máquina do tempo não cria milhões de páginas para o Google).MT10— MT10 · Sem chave de API a página com data responde 200 (como a da ação normal); código antigo redireciona 301 para o atual levando o ?em=; ticker que não existe é 404; sem recomendação de compra ou venda.MT11— MT11 · `?em=` vazio é o mesmo que sem data: a página normal, sem aviso de data.MT12— MT12 · validar_em aceita só AAAA-MM-DD real, não futura e não anterior à base (a borda: o primeiro dia da base e hoje valem; o dia seguinte a hoje e o anterior à base não); as datas sugeridas são fins de semestre dentro da base.MT13— MT13 · `_mudou` é verdadeiro com versão mais nova depois da data ou com valor diferente hoje, e falso quando nada mudou; a frase sem preço é exatamente a aprovada.PF01— PF01 · O teto mensal de cada faixa sai de limites_config.PF02— PF02 · /empresas mostra o bloco com as duas faixas; PORTA_FALSA_CONECTOR=0 tira o bloco, as rotas dão 404 e o painel diz ligada=false; quem já estava na lista continua podendo sair.PF03— PF03 · O clique mostra a página honesta (em preparação, nada cobrado, IA comum grátis, e-mail de trabalho) e conta 1 por faixa; robô não conta; o mesmo IP no mesmo dia não conta duas vezes; faixa desconhecida é 404; a página é noindex e sem cache.PF04— PF04 · O e-mail de trabalho liga na hora, conta 1 e-mail na faixa e manda UM e-mail de boas-vindas dizendo que nada foi cobrado, com sair e "não fui eu"; a resposta não repete o e-mail; repetir não manda outro; e-mail pessoal e inválido são 400; robô e campo-isca recebem sucesso sem linha; o teto por IP por dia vale.PF05— PF05 · "Não fui eu" cancela a linha e bloqueia o endereço por 30 dias; sair cancela num clique e o link desconhecido é 404; a lista de espera velha (6 meses) é apagada; o endereço sai com o apagar dados (exclusao).PF06— PF06 · /admin/metricas traz, por faixa, hoje, os últimos 7 dias, os 7 anteriores e a série diária de 14 dias, de cliques e de e-mails; o JSON inteiro não tem arroba nem o e-mail.SD01— SD01 · /sunday-desk (e /sunday-desk/1) mostra a capa, a edição, o aviso de não recomendação e um formulário com só o e-mail, a origem e a caixinha de consentimento obrigatória (texto do dono); noindex; ?lang=en em inglês.SD02— SD02 · Com e-mail e consentimento, a resposta diz "Enviamos o link para o seu e-mail" (sem repetir o e-mail), a linha guarda token, edição, origem e data do consentimento, e sai UM e-mail com o link de baixar, o de sair e o "não fui eu".SD03— SD03 · O link do e-mail serve o PDF (attachment, the-sunday-desk-01.pdf, no-store) e conta: o primeiro download com data e o total do token; robô baixa sem contar.SD04— SD04 · Token que não existe: 404 em HTML com o link de volta ao formulário, sem PDF; o mesmo na opinião e no sair.SD05— SD05 · /admin/stats → listas_email.SD06— SD06 · A rota da pergunta não existe sem X-Admin-Token (404) e não manda nada sem o texto do OK do dono (400).SD07— SD07 · Sair (um clique) cancela: o link de baixar vira 404 e a pergunta não vai.SD08— SD08 · O e-mail do link entra no MESMO teto diário (boletim.TD01— TD01 · O recorte GRAVADO do CSV do Tesouro (separador ponto e vírgula, decimal com vírgula, dd/mm/aaaa) vira linhas com data ISO e número: Tesouro Prefixado 01/01/2027 no dia-base 30/10/2026 tem taxa de compra 13,48 e de venda 13,60; o Selic 01/03/2027 tem 0,02 e 0,03; a linha de 31/12/2004 (o começo do arquivo) entra.TD02— TD02 · A coleta COMPLETA grava o arquivo inteiro (61 linhas do recorte, até 2004); a da NOITE grava só os últimos 45 dias (a linha de 2004 não entra de novo).TD03— TD03 · A tabela do Tesouro entra na herança das séries externas: num build do zero em que a fonte falhou, as linhas do banco anterior voltam (INSERT OR IGNORE: a linha fresca vence a velha), e a trava de encolhimento conta a tabela.TD05— TD05 · Entre o deploy e a primeira coleta (base sem `tesouro_taxa`): o JSON responde 503 com Retry-After, a página responde 200 com o aviso de série em coleta, `noindex`, SEM número e SEM link para o JSON que daria 503 (PT e EN), o /saude responde 200 com `tesouro` nulo, e o sitemap não anuncia a página.TD07— TD07 · `svg_curva` devolve SVG com `role=img` e aria-label que resume a série, um marcador por ponto (círculo para uma família, quadrado para a outra, para não depender só da cor), cada um com <title> 'prazo, taxa', a legenda, eixos com o prazo em anos; série vazia = string vazia; ponto com taxa negativa cabe no eixo.TL01— TL01 · O arquivo GRAVADO da Anatel (uma linha por CNPJ/produto, uma coluna por mês) vira a soma por operadora e mês: a Vivo em agosto de 2026 tem 85.818.766 acessos na telefonia móvel SEM M2M e ponto de serviço (que ficam em `outros`: 20.141.773), e a linha TOTAL de agosto soma 220.921.381, igual ao total oficial da Anatel.TL02— TL02 · A leitura do ZIP da Anatel por faixa de bytes: o diretório central sai do FIM do arquivo e o membro pedido é baixado e descomprimido em fluxo, sem o ZIP inteiro; membro que não existe devolve None; ZIP64 e servidor que não atende faixa de bytes (HTTP 200 no lugar de 206) PARAM com erro, em vez de baixar gigabytes.TL03— TL03 · A coleta grava as linhas dos dois serviços, confere o TOTAL contra o total oficial da Anatel mês a mês (diferença 0,0% nos meses do recorte) e guarda o resultado em meta['telecom_coleta'].TL04— TL04 · Os arquivos lidos: no histórico, desde 2023 (móvel por semestre, banda larga por ano); no recente, o período corrente (móvel: os dois últimos semestres; banda larga: o ano, e o anterior em janeiro e fevereiro).TL05— TL05 · A tabela de acessos entra na herança das séries externas: num build do zero em que a Anatel falhou, as linhas do banco anterior voltam (INSERT OR IGNORE: a linha fresca vence a velha), e a trava de encolhimento conta a tabela.TL09— TL09 · Entre o deploy e a primeira coleta (base sem `telecom_acesso`): o JSON com filtro responde 503 com Retry-After, o sem filtro responde 200 com o aviso, a página responde 200 com o aviso de série em coleta, `noindex`, SEM número e SEM link para o JSON que daria 503 (PT e EN), o /saude responde 200 com `telecom` nulo, e o sitemap não anuncia a página.EL01— EL01 · O recorte GRAVADO do datastore da ANEEL (valores com vírgula decimal, '1077,52') vira linhas com número: a CEMIG-D tem TUSD 593,08 e TE 310,21 na vigência de 28/05/2026; as duplicatas da fonte (56 registros) colapsam em 27 linhas; a EMT em 15/07/2010 traz DUAS revisões com valores diferentes e fica a do ato de número mais alto (1.030: TUSD 219,06, TE 145,77, e não a 0.959).EL02— EL02 · A coleta grava as 27 linhas do recorte e o resultado em meta['energia_coleta'].EL03— EL03 · A tabela de tarifas entra na herança das séries externas: num build do zero em que a fonte falhou, as linhas do banco anterior voltam (INSERT OR IGNORE: a linha fresca vence a velha), e a trava de encolhimento conta a tabela.EL07— EL07 · Entre o deploy e a primeira coleta (base sem `energia_tarifa`): o JSON com filtro responde 503 com Retry-After, o sem filtro responde 200 com o aviso, a página responde 200 com o aviso de série em coleta, `noindex`, SEM número e SEM link para o JSON que daria 503 (PT e EN), o /saude responde 200 com `energia` nulo, e o sitemap não anuncia a página.FD01— FD01 · Do CSV do mês (latin-1, `;`): por CNPJ, a cota, o PL e os cotistas do ÚLTIMO dia informado e a SOMA do mês de captação e resgate.FD02— FD02 · A janela são 13 meses terminando no corrente; os 3 mais novos são baixados a cada build e os outros só sem agregado em disco; mês indisponível não derruba nem apaga; o zip baixado é apagado; o que sai da janela é removido.FD05— FD05 · /fundos/informe sem parâmetro traz os três rankings do mês de referência com a fonte (página do conjunto da CVM), a licença ODbL e a citação; `cnpj` (com ou sem pontuação) traz a série; `busca` procura pelo nome; o CSV tem cabeçalho fixo.FD06— FD06 · /fundos (PT e EN) abre 200 com o mês de referência, os três rankings com link para cada fundo, o aviso de que o PL não é somado, os links JSON/CSV, a fonte com a licença e a citação, sem script; a busca devolve o fundo e é `noindex`; /fundos/{cnpj} mostra o cadastro e a tabela mês a mês (com a nota de subclasses quando cabe); CNPJ sem informe = 404; sem a tabela, /fundos e /fundos/{cnpj} dão 200 `noindex` sem número (nunca 500).FD07— FD07 · O /saude traz o bloco `fundos` (mês de referência, último dia informado, limite de 21 dias); o sitemap anuncia /fundos com o último dia informado (nunca no futuro); o llms.FD08— FD08 · A ferramenta MCP `fundos_investimento` chama a mesma rota: sem argumento traz os rankings com a fonte e a licença; com CNPJ traz a série; com `busca` procura pelo nome; pedido ruim volta como {erro}, nunca exceção.SC01— SC01 · O selo e um SVG com o valor, a data do documento e a frase conferido contra a CVM, com ETag e 304, e o codigo HTML leva a pagina de linhagem daquele numero.SC02— SC02 · Nao ha selo para indicador desconhecido, valor em reais, papel desconhecido nem numero com ressalva ou linhagem incompleta.SC03— SC03 · A pagina /selo explica o uso com codigo para copiar, e cada pedido do selo conta o host do Referer em selos_embutidos, separado dos cartoes.I-CR01— Robô sem nome martelando página cara leva 429 com Retry-After e o corte é contado por família.I-CR02— IA e buscador nomeados nunca levam 429 nem gastam o balde.I-CR03— Navegador comum e quem usa chave nunca levam 429.I-CR04— Só página cara e só leitura entram na conta.I-CR05— Limiares vêm do ambiente, cada IP tem balde próprio e uma variável desliga o corte.I-CR06— Pela aplicação, o anônimo leva 429 e navegador, IA nomeada e chave passam.I-H41— `em_curso` lista os pedidos que estão no app do mais velho ao mais novo, com método, caminho + query SEM os parâmetros de segredo (api_key, chave, token, t.I-H42— `medir` lê VmRSS, RssAnon e RssFile de /proc/self/status, soma os filhos (e os filhos dos filhos, pelo /proc/<pid>/task/<tid>/children) e lê o contêiner (cgroup v2 ou v1).I-H43— `avaliar`: abaixo do aviso não escreve nada; ao cruzar escreve UMA linha com a memória, a fase do laço de fundo, o pedido mais velho e a lista em curso; enquanto segue alto, no máximo uma linha a cada 30 s; ao voltar, uma linha de recuperação.I-H44— Acima de `corte_mb` o corte liga por `corte_s`: pedido NOVO de família pesada (/acoes, /linhagem, /og.I-H45— `iniciar` não sobe a thread na bateria, com VIGIA_MEMORIA_DESLIGADO=1 nem sem /proc, e diz o motivo; limiares vêm das variáveis (valor torto cai no padrão).I-N594— `soltar_cache_de` solta o cache de cada arquivo (e do `-wal`), ignora arquivo ausente e qualquer erro; sem posix_fadvise (Windows) é um nada.I-N595— A cópia de trabalho, o checkpoint e a troca da atualização diária chamam o alívio de cache (`_soltar`), o backup também depois de copiar; falha no alívio não derruba nenhum dos dois.CF01— CF01 · Do bloco 4 entram ação ON/PN e units (certificado de depósito de ações); ficam fora ação emprestada, BDR e debênture; duas linhas do mesmo fundo e ticker somam; o nome com acento sai certo.CF02— CF02 · A janela é de 13 meses-calendário anteriores ao de hoje; os 4 mais recentes são baixados a cada build e os antigos só quando falta o agregado em disco; mês indisponível não derruba nem apaga o que já estava; o zip baixado é apagado depois de lido; o que é mais velho que a janela sai.CF05— CF05 · A ficha /acoes/PETR4 ganha o bloco "Fundos que têm esta ação" (10 maiores, variação no mês, data de referência, o aviso do atraso, o link do conjunto da CVM e a licença ODbL); sem carteira, a ficha segue igual.CF06— CF06 · ★ 03/11/2026: a contagem de fundos por mês (`COUNT(DISTINCT cnpj) GROUP BY competencia`, a tabela inteira) era 91% da ficha /acoes/{T} — quatro varreduras por pedido, 0,55 s no PC e de 1,3 s a 6,8 s em produção, com o p90 das IAs em 5,3 s.FO01— F-O01 · A resposta GRAVADA da API Olinda (IPCA, 23/12/2024 a 03/01/2025, oito pesquisas em três semanas) vira [(indicador, ano de referência, dia, mediana, respondentes)] com UMA foto por semana e por ano de referência: a última da semana.FO02— F-O02 · Na resposta gravada de 12 a 23/10/2026 os quatro indicadores (IPCA, Selic, Câmbio com acento, PIB Total) saem cada um do SEU nome na fonte e nunca de outro: cinco anos de referência (2026 a 2030), a foto mais nova é a de 23/10/2026. Os valores do dia: IPCA 2026 = 5,1891; Selic 2026 = 13,25; câmbio 2026 = 5,0495; PIB 2026 = 1,8. ATAQUE: ler o 'Câmbio' sem acento e perder o indicador; misturar o PIB com outro; ler outro dia que não o último.FO03— F-O03 · Linha sem mediana, com ano de referência que não é AAAA, com data torta, de OUTRO indicador ou da base de cálculo 1 (a curta, de 4 dias úteis) não entra.FO04— F-O04 · Gravar uma pesquisa de sexta troca a de quinta da MESMA semana (a coleta da noite chega de quinta e a de sexta a substitui), mas não toca a semana anterior nem outro ano de referência.FO05— F-O05 · `ingerir_focus` com a resposta gravada: grava os indicadores que vieram, devolve linhas e último dia de cada um, registra o resultado em meta['focus_coleta'], e o indicador cuja janela falhou (None) fica com o erro, SEM apagar o que já havia dele.FO06— F-O06 · Mediana de IPCA de 500 (vírgula trocada, unidade) está fora da faixa plausível: o lote INTEIRO do indicador é recusado, nada é gravado e o histórico que havia fica.FO07— F-O07 · O pedido OData filtra o indicador pelo nome da FONTE, a base 0 e a janela de dias; espaço vira %20 (a API recusa '+') e o 'â' do Câmbio vai em UTF-8 percentual.FO10— F-O10 · `/focus/series` traz a última pesquisa, a tabela de acerto (a regra escrita, os anos e o resumo), a cobertura, a fonte com a licença ODbL e a `citacao`.FO12— F-O12 · Entre o deploy e a primeira coleta (base sem `focus_expectativa`): `/focus/series` e a série respondem 503 com Retry-After, a página responde 200 com o aviso de série em coleta, `noindex`, SEM número e SEM link para o JSON que daria 503, o /saude não cai (bloco `focus` nulo) e o sitemap não anuncia a página.FO13— F-O13 · O hub /macro (PT e EN) liga a /focus; o sitemap anuncia a página só quando a base tem a pesquisa, com o dia da última pesquisa como lastmod (nunca depois de hoje); o llms.PV01— PV01 · ★ 01/11/2026, link colado no X ou no WhatsApp aparecia sem imagem.DL01— DL01 · `ler_linha` aceita só ação (CODBDI 02), à vista (010), de classe 3-8 ou 11, e lê as MESMAS fatias de `precos.DL02— DL02 · O emissor sai do ISIN (BR + 4 caracteres) e só quando o ISIN é de ação (ACN) ou unit (CDA); ETF, fundo e BDR não têm emissor — não entram na ligação nem na lista de lacunas.DL06— DL06 · Rodar de novo dá o mesmo resultado (apaga e refaz): sem pregão duplicado, sem papel que sobrou de uma ligação que deixou de existir.DL07— DL07 · `empresas.DL09— DL09 · Caso GOL (02/11/2026): a ação preferencial negociou como GOLL54, ISIN fora do padrão "ACN", até 2026. Código que a PRÓPRIA companhia declarou no FCA entra mesmo fora do formato, se a especificação da linha do COTAHIST for de ação (PN); o retrato passa a ter o último pregão dele.DL10— DL10 · /empresas/AESB3/dividendos (e ENBR3, que pagou provento por anos; e CCXC3) NUNCA responde 200 com lista vazia.DL11— DL11 · Código que a base não tem continua 404, com `detail` no texto de sempre ("ticker desconhecido: X", de que o painel depende) e, AO LADO, campos que a IA lê sem interpretar frase: `codigo_pedido`, `sugestoes` (lista de {codigo, nome}: mesma raiz ou grafia parecida, só códigos que a base conhece) e `como_tentar_de_novo`.DL12— DL12 · Preço e indicadores de quem saiu NÃO passam a responder (a série das delistadas é do /dump, e nada de ranking/múltiplo muda): /empresas/AESB3/precos e /indicadores seguem 404. Mas o erro diz o que é: o texto traz "saiu da bolsa" e a data do último pregão, e o campo `saiu_da_bolsa` vem preenchido, com o caminho para as rotas que respondem.DL13— DL13 · /empresas/BIDI4/eventos responde 200 com o bloco `saiu_da_bolsa` mesmo SEM chave (é o dado público da /saiu-da-bolsa), `eventos` e `total` NULOS (o catálogo da B3 não é consultado para quem saiu; lista vazia e zero leriam "não houve evento") e os eventos declarados ao FRE: sem chave, a lista fica fechada (None) mas o total aparece com o motivo; com chave Pro, a lista vem, todos com a flag sem_data_ex, e bate com `evento_delistada`.DL15— DL15 · `_so_delistada` só liga código que NÃO é de nenhuma ativa (ação, FII, ETF, BDR, índice): PETR4 e WEGE3 dão None; AESB3 dá a companhia que saiu; e se um código de `delistada_papel` passar a existir entre as ativas (uma reabertura, um código reaproveitado), a ativa ganha e a rota volta ao caminho normal.DL20— DL20 · O item 3.5 do FRE entra em `provento_delistada` só da companhia que saiu (ALFA), ligada pelo CNPJ ao mesmo cd_cvm de `delistada_papel`: exercício, classe (ON, PNA), tipo (DIVIDENDO, JCP), MONTANTE em R$ e data de pagamento como declarados; valor por ação e data-com ficam NULOS (o FRE não os tem).DL21— DL21 · /empresas/{T}/dividendos (a função que a REST e o MCP chamam) de quem saiu E tem provento declarado à CVM responde com o bloco `saiu_da_bolsa`, os proventos (fonte, montante, data de pagamento), `resumo_anual` só da classe do ticker (ON) e `cobertura` com a fonte e o período (exercícios 2014 a 2015 do FRE); o DY é nulo.DL22— DL22 · O "Relatório Proventos" do IPE (desde 2024) da companhia que saiu entra com valor POR AÇÃO, data-com e data de pagamento — só a linha cujo ISIN é de um emissor ligado a ela em `delistada_papel` (ALFA); a de outro emissor (ZZZZ) não entra.DL30— DL30 · /saiu-da-bolsa/{ENBR3, BIDI4, AESB3} responde 200 em PT e EN com: a frase do topo (nome, código, data do último pregão igual à de `delistada_papel`, o total declarado à CVM e o número de pagamentos, dito como MONTANTE TOTAL e não valor por ação), a tabela por exercício da classe do ticker IGUAL ao `resumo_anual` do JSON /empresas/{T}/dividendos (mesmos anos, mesmo total, mesma contagem), o código CVM, o "Como citar" com a versão do dado e a URL da própria página, os links para o JSON e para a /saiu-da-bolsa, um bloco JSON-LD com a trilha, e a citação do JSON apontando a página.DL31— DL31 · Na /saiu-da-bolsa (PT e EN) cada código de quem saiu é link para /saiu-da-bolsa/{T} (ENBR3, BIDI4 e AESB3 entre eles) e todo link desses responde 200; código de quem continua no universo vai para /acoes/{T}, também 200. O sitemap traz UMA URL por papel do mapa de quem saiu (nenhuma a mais, nenhuma a menos) e o llms.DL32— DL32 · A página de ENBR3, BIDI4 e AESB3 em inglês tem os MESMOS números, âncoras, links internos e linhas de tabela do português (a régua do I-N105, `_paridade`); o texto da CVM (nome, motivo) vai marcado `lang="pt"`.DL33— DL33 · No banco sintético: a página da ALFA3 (provento no FRE) traz a tabela com os totais do `resumo_anual` do JSON (2014: 1.250.000,00 em 2 pagamentos; 2015: 700.000,00 em 1) e o outro código da companhia (OLDA3) com link para a página dele; a da BETA3 (nenhum provento declarado) responde 200 SEM tabela de proventos e diz que a ausência é DESCONHECIDA, com link para /eventos e não para /dividendos (que é 404 para ela); a GAMA3 (ativa) é 404. ★ POR QUE (03/11/2026): sem provento na fonte a página não pode ler como "não pagou".AN01— AN01 · O recorte GRAVADO de dezembro de 2023 (CSV latin-1, vírgula decimal) vira 18 linhas por (ambiente, bacia, campo, operador, contrato): o Tupi soma 804.443,7557 bbl/dia e 40.009,19 Mm³/dia, TODO do pré-sal (e o pré-sal fica numa COLUNA, não numa linha a mais: somar o arquivo do pré-sal de novo dobraria o Tupi); o Tupi tem 2 contratos (cessão onerosa e partilha) em linhas separadas.AN02— AN02 · `descobrir` lê os links da página da ANP (recorte GRAVADO) e acha os meses pelos quatro padrões de nome que a ANP já usou (2023/producao-12.zip, 2022/producao-2022-01.zip, 2022/2022_05_producao.AN03— AN03 · A lista de concessionários (recorte GRAVADO) dá 13 contratos com operador.AN04— AN04 · A coleta baixa a página, os meses que a página linka e a lista de concessionários, grava o mês e o resultado em meta['anp_coleta'].AN05— AN05 · A tabela entra na herança das séries externas: num build do zero em que a ANP falhou, os meses do banco anterior voltam; um mês que o build novo JÁ trouxe NÃO é herdado (a ANP renomeia operador de mês antigo, e a chave inclui o operador: herdar o mesmo mês duas vezes somaria em dobro).AN08— AN08 · Entre o deploy e a primeira coleta (base sem `anp_producao`): o JSON com filtro responde 503 com Retry-After, o sem filtro responde 200 com o aviso, a página responde 200 com o aviso de série em coleta, `noindex`, SEM número e SEM link para o JSON que daria 503 (PT e EN), o /saude responde 200 com `anp` nulo, e o sitemap não anuncia a página.AN12— AN12 · O Boletim mensal da ANP (PDF, recortes GRAVADOS da página da tabela por operador) dá TODOS os operadores de 2024 em diante: agosto de 2026 traz 50 operadores, a Petrobras com 4.019.651,38 bbl/dia e 196.391,44 Mm³/dia, e o nome SHELL BRASIL que a ANP lista duas vezes (35.032,19 e 81,02) vira UM operador de 35.113,21 (soma); o símbolo decorativo que o PDF cola ao nome é tirado.I-N480— `orientar` devolve, para cada tipo de código que a base não acha como companhia, a frase, o caminho e o que a base NÃO tem: cota de FII/ETF/BDR/índice pedida em /empresas aponta a rota certa e não sugere nada; "TICKER" e "SEARCH" são texto do modelo da URL; "3557" é só número; "SANEPAR" é nome de empresa e traz o código; "MXRF12" é direito/série de MXRF11 e diz que os números são do MXRF11; "AEFI11" (final 11, fora da base) diz que é falta de cobertura e que as sugestões são de OUTROS fundos; AZUL97 é unit e aponta AZUL3 como OUTRA classe; CTIP3 sai com o bloco de quem saiu, vindo do cadastro da CVM; código comum (PETR9) não ganha orientação nenhuma.I-N481— Cada linha da `CURADOS` precisa ser verdade no banco: o `codigo_na_base` existe (ticker, fii ou delistada), o `saiu_de` está em `delistada_papel`, o `cd_cvm` está em `companhia_fora_do_universo`, e as trocas de código têm continuidade medida no próprio banco: COGN3 abre em 11/10/2019 (o KROT3 fechou em 10/10), RAIL3 em 13/03/2017 (RUMO3 em 10/03), MEGA3 em 27/12/2021 (OMGE3 em 23/12), SMLS3 em 23/10/2017 (SMLE3 em 20/10).I-N482— Nas rotas, o `detail` segue começando por "ticker desconhecido: X" (o painel depende) e o status segue 404; ao lado vêm `tipo_do_codigo`, `onde_esta`, `relacionado`.I-N483— No MCP, o erro de código desconhecido leva `sugestoes`, `saiu_da_bolsa`, `tipo_do_codigo` e `onde_esta` em TODAS as ferramentas, não só em `dividendos` e `eventos` (16 das 18 ferramentas com `except HTTPException` devolviam só o texto).I-N540— `gravar_cotas_b3` liga o código de cota do COTAHIST ao CNPJ que declarou o MESMO ISIN no informe mensal de FII, lendo os DOIS layouts da CVM (`CNPJ_Fundo` de 2016 a 2020 e `CNPJ_Fundo_Classe` de 2021 em diante).I-N541— `mapa_trocas_fii` dá RBFF11 -> RBFM11 (mesmo CNPJ pelo ISIN, e o RBFF11 parou antes do último pregão do RBFM11) e NÃO dá AVUR11 -> AVUR15 (os dois negociam juntos) nem o código atual para ele mesmo.I-N542— No banco real, os códigos que deram 404 no painel de 7 dias e são código antigo de um FII da base resolvem para o código atual (RBFF11 -> RBFM11, SHOP11 -> GRAV11, EVBI11 -> CPUR11, TRXL11 -> BTLG11..I-N543— /fiis/RBFF11 (página) responde 301 para /fiis/RBFM11?de=RBFF11, e a página diz "Você veio de RBFF11, código antigo deste fundo"; /fiis/RBFF11/dividendos vai para a seção de rendimentos do RBFM11 com o `de`; um `de` que NÃO é código antigo do fundo não ganha a frase.I-N544— O informe mensal de FII de 2016 a 2020 (colunas `CNPJ_Fundo` e `Nome_Fundo`) entra na base como o de 2021 em diante: o fundo que saiu antes de 2021 ganha cadastro (`fii`) e fato (`fii_informe`, com PL, cotas e VP por cota do `complemento`), e o layout novo continua igual.I-N545— Um mês do informe de Fiagro da CVM (dados.I-N546— `gravar_cotas_b3` liga a cota do COTAHIST ao fundo que entrega o informe de Fiagro quando o ISIN declarado é OUTRA série do mesmo emissor (KNCA: declara BRKNCACTF014, negocia BRKNCACTF006), gravando `ligacao` = emissor_isin; o ISIN idêntico continua `isin_exato`.I-N547— `ligar_codigo_sem_ticker`: fundo do informe sem `fii.I-N548— No banco real, códigos do painel que davam 404 por falta de ligação agora têm página de fundo: KNCA11 e CPTR11 (Fiagro, com a nota do informe de Fiagro), FATN11, MGFF11 e SCPF11 (o informe mais recente declarava outro ISIN) e GRLV11 e XPGA11 (só no informe de 2016-2020).I-N590— `gravar_ponte` grava código, ISIN, CNPJ, nome, tipo, URL da ficha e data só quando o código é IGUAL ao `tradingCode` da ficha pública do fundo na B3 e negocia no COTAHIST (o ISIN é o do pregão mais recente).I-N591— `aplicar_ponte`: FII sem código ganha o da ficha; FII com código que parou ANTES do da ficha troca (o TVRI11 no lugar do BBPO11, que vira código antigo); FI-Infra fora do informe de FII entra em `fii` com segmento "FI-Infra", o nome do cadastro da CVM e o patrimônio do Informe Diário (`fundo_informe_mes`) em `fii_informe`; ISIN disputado na CVM é decidido pela ficha; o preço do ISIN negociado entra em `fii_preco`.I-N592— No banco real: IFRA11 (FI-Infra, fora do informe de FII) tem página de fundo com o CNPJ que a ficha da B3 dá (34.633.510/0001-18), diz que é FI-Infra e não FII, que cota e patrimônio vêm do Informe Diário da CVM, e cita a ficha da B3; tem informe mensal e P/VP.I-N593— Invariante no banco real: todo `fii.I-N700— O mesmo URL pedido com `Accept-Language: en-US` e com `pt-BR` devolve o MESMO HTML, em português (`lang="pt-BR"`), com o canonical no próprio URL, sem `noindex` e sem `Vary: Accept-Language`, nas fichas, nas listas, em /saiu-da-bolsa, na linhagem, nos guias e na home.I-N701— `?lang=en` devolve inglês.I-N702— Página marcada como só-português (`sinais_busca.I-N703— Os robôs de busca e de IA, com `Accept-Language: en-US`, recebem no URL português a página em português, indexável, com canonical no próprio URL (ficha de ação, ficha de FII, lista, /saiu-da-bolsa).I-N704— `/sitemap_index.I-N705— `/acoes/PETR4/` (e `/fiis/HGLG11/`, `/saiu-da-bolsa/`) responde 301 para o endereço sem barra, em GET e HEAD.I-N706— Página pública em HTML (e o sitemap) sai com `ETag` forte e `Last-Modified` em formato HTTP; `If-None-Match` com o mesmo ETag devolve 304 sem corpo; ETag muda com a língua (`?lang=en` é outra página).I-N707— `python -m dados_b3.indexnow --tudo` lê o índice do sitemap (segue os filhos), junta as URLs sem repetir e, sem `--enviar`, só conta e mostra os lotes (nenhum POST).
Nível 2 — Semântica: a conta significa o que o cálculo supõe? (97)
I-B07— Toda divergência ÚLTIMO × PENÚLTIMO acima de 0,5% nas contas- chave tem que estar em `reapresentacao`.I-E05— O pregão usado em cada múltiplo está DENTRO da janela após a publicação da demonstração.I-F02— O mesmo invariante central dos múltiplos de ação, no FII: o preço do P/VP nunca é anterior à Data_Entrega do informe.I-F07— Vacância é fração em [0,1] (INVARIANTE) e a semântica ambígua da fonte é sempre flagada (HEURÍSTICA no mesmo teste).I-F08— Nenhum P/VP LIMPO (flag NULL) casa um VP de competência com um preço de pregão muito posterior à publicação do informe.I-B24— Todo banco/seguradora que tem fato tem lucro E PL extraídos no ano mais recente.I-X02— Ingresso e saída são fluxos BRUTOS: não existem negativos.I-X03— A série não pula mês entre o primeiro e o último.I-L03— Indicador publicado COM VALOR e SEM FLAG não pode ter insumo obrigatório sem lastro no banco.I-L04— Todo indicador que o banco publica está declarado em `INSUMOS`.I-B15— O preço usado em `multiplo` nunca é anterior a `dt_receb` — é o INVARIANTE central de todo o bloco de múltiplos: sem ele, o P/L "conhece" um balanço que o mercado ainda não tinha visto.I-B16— Contraprova: market_cap recomputado fora do código de cálculo (preço × snapshot de ações mais recente ATÉ a data do preço) bate com o gravado.I-B18— Mesmo invariante central do I-B15, no bloco trimestral: o preço do múltiplo nunca é anterior ao dt_receb da ITR.I-P05— `codigos_negociados` funciona com ZERO .I-P02— Todos os códigos que alimentam o preço de uma empresa são da MESMA classe do principal de hoje.I-P04— Todo valor de mercado usa um snapshot de nº de ações que JÁ ERA PÚBLICO na data do preço — nunca um posterior.I-P12— O FATCOT corrige a QUANTIDADE; o preço atravessa intacto.I-P14— A troca só ocorre entre CLASSES diferentes — nunca entre um código e o nome antigo da MESMA classe.I-P15— A troca por liquidez elege uma unit SÓ quando a composição dela está gravada em `unit_composicao`, e nunca destrona uma unit.I-P23— Companhia que trocou de sigla (Marfrig → MBRF3, jan/2026) ganha o código novo mesmo com o FCA ainda listando o velho, e o código velho, com volume recente ZERO, cede o lugar sem exigir o fator de 3x sobre os 16 anos de histórico que ele acumulou.I-B32— Todo indicador emitido no banco tem entrada de proveniência no DICIONARIO — a fórmula, as contas CVM e a BASE do lucro que /indicadores agora embute AO LADO do número.I-Q18— Pedir um mês ANTIGO ao FNET não encolhe a janela de entrega.I-Q19— Pedir só balancete não baixa informe diário.I-Q20— O orçamento de tempo do backfill vale DENTRO da listagem, não só entre os meses.GC23— GC23 · ★ 01/11/2026, pedido do dono: a IA que usa uma chave grátis tem de saber, na hora em que importa, quanto resta e o que o Pro dá.I-N77— As três páginas que ficaram sem JSON-LD no teste "como uma IA" (10/09/2026) agora têm UM bloco válido no <head>: /buscar e /buscar/fiis dizem que existe uma busca com parâmetro (SearchAction → /procurar?q=); /hoje é datada pela VERSÃO DO DADO (não por hoje — a página diz quando aquilo era verdade); /comparar/A/B lista as duas companhias com ticker e a URL da página de cada uma.I-N78— Cache-Control público em toda resposta de leitura sem chave, e em NENHUMA resposta com chave ou de rota de sessão/cobrança/protocolo.I-N79— `pip install dadosb3` é o primeiro gesto de quem programa, e por isso está nas três portas por onde essa pessoa chega: o hub /api, o llms.I-N81— Quando o aviso à CVM declara pagamento PARCELADO, a agenda do ativo diz isso e leva ao documento — em vez de calar o pagamento.I-Q07— Número brasileiro ('13.919.737.980,15') vira float; vazio ou inválido vira None, nunca exceção.I-Q08— Data brasileira ('11/09/2026 20:27') vira ISO; inválida vira None.I-Q13— A lista de ETFs da B3 é lida mesmo quando o JSON vem duplamente codificado.I-Q14— O detalhe da B3 devolve ticker, CNPJ, gestor, escriturador e nº de cotas; corpo vazio devolve None.I-Q15— A busca do FNET sai com id, tipo, data de referência (mês do balancete vira 1º dia) e data de entrega.I-Q16— O índice é inferido do NOME do fundo por regras declaradas, da mais específica para a mais genérica; nome sem pista devolve None, não um chute.I-V04— Os itens montados a partir de `conta_versao` são os MESMOS que `padronizar` grava quando recebe as mesmas contas: empresa comum (conta exata, custo pela soma das filhas, sinal do custo, D&A e capex só de folhas e sem custo de dívida, ponte do PL) e banco (PL e lucro pelo rótulo).I-V06— `listar_versoes`: cada documento com todas as versões, a data, o link do original e o que há de valores por versão (na_base / arquivados / nao_arquivados); entre duas versões com valores guardados, só as contas que MUDARAM (antes → depois), o lucro de 100 para 80 e a conta que não mudou fora; `so_reenviados` esconde o documento de uma versão só.I-V09— GET /empresas/{t}/fatos: sem `as_of` devolve a última versão, exatamente como antes (sem `versao` nas linhas); com `as_of` devolve a vigente com `versao`/`dt_receb`; `as_of` inválido (formato errado, 30 de fevereiro, vazio) é 422 e não consulta o banco; ticker desconhecido é 404. GET /empresas/{t}/versoes lista o documento com as duas versões e `reenviados=true` filtra.I-N650— A memória de cálculo do ROE e da dívida (dados_b3/definicoes.DI01— DI01 · PU conferido à mão: 10% com 252 dias úteis = 100.000/1,1 = 90.909,09; 10% com 126 = 100.000/√1,1 = 95.346,26; DI1F28 a 13,50% na referência 30/10/2026 = 293 dias úteis e PU 86.309,06, ponto-base R$ 8,84 (o PU a 13,51% é 8,84 menor).DI02— DI02 · Os dias úteis contam a referência e não o vencimento e pulam os feriados: de 05/02/2027 a 12/02/2027 são 3 (Carnaval em 08 e 09/02); de 24/05/2027 a 31/05/2027 são 4 (Corpus Christi em 27/05).DI03— DI03 · Comprado em taxa ganha quando a taxa sobe (o PU cai) e perde quando cai; vendido em taxa, o contrário, com o mesmo tamanho.JC01— JC01 · Conferido à mão: R$ 1.000 a 12% a.JC02— JC02 · A tabela regressiva (22,5% até 180 dias, 20% até 360, 17,5% até 720, 15% acima) com cada parcela no próprio prazo: R$ 1.000 a 12% por 1 ano (365 dias) pagam 17,5% de R$ 120,00 = R$ 21,00, líquido R$ 1.099,00; só aportes de R$ 100/mês por 12 meses pagam R$ 13,29 (aportes de 7 a 11 meses a 20%, de até 5 meses a 22,5%, o último sem rendimento); 3 anos a 15%.JC03— JC03 · Com a tabela macro cheia: "Selic de hoje" usa a meta MAIS RECENTE (15%, de 29/10/2026, não 14,75% nem a efetiva) — R$ 1.000 por 10 anos = R$ 4.045,56; "IPCA + 6%" usa o IPCA de 12 meses mais recente (4,5%, set/2026): (1,045 × 1,06) − 1 = 10,77% a.I-X26— Invariantes na base real (pula se a base ainda não tem `macro_serie`): na PTAX do dólar e do euro a venda nunca é menor que a compra no mesmo dia; todo valor está na faixa plausível da série; o IPCA de 12 meses é o produto dos 12 meses publicados com tolerância de 0,02 p.PS01— PS01 · Um pedido com códigos de ação, FII e ETF e vários campos devolve uma linha por código, na MESMA ordem, com a célula vazia no lugar da vazia; e cada número é o que o site já publica: ROE e margem = o último ano de /empresas/{t}/indicadores; P/L e P/VP = o cartão de hoje (foto_diaria.PS03— PS03 · Nenhum valor nulo sem motivo (salvo a célula vazia): FII sem P/L diz "FII não tem P/L", ETF sem ROE "ETF não tem ROE", banco sem ROIC "não se aplica a banco", código inexistente "código não encontrado" (e o painel grava o código), índice "BDR e índice ficam fora da planilha", data antes da 1ª DFP "balanço ainda não saiu nesta data", DY com data "só o valor de hoje", campo de ativo pedido para SELIC e o contrário dizem qual campo usar.PS08— PS08 · Com data, o ano do balanço é o último exercício cuja DFP a CVM já tinha recebido naquele dia (a regra do /screener com as_of), o ROE é o desse ano na tabela `indicador`, e o P/L é o `pl_ttm` de `_pl_do_screener` (o trimestre entregue e já precificado até a data).PS09— PS09 · SELIC, IPCA, DOLAR e PIB, num banco montado no teste: sem data, o último período; com data, o último período até ela (diária pela data, mensal pelo mês, trimestral pelo trimestre); porcentagem vira fração (15 → 0,15), dólar fica em R$; o campo `data` devolve o período; tabela que ainda não existe ou série vazia dizem "série ainda não coletada"; data antes do primeiro ponto diz "sem valor até esta data".MT01— MT01 · PETR4 em 2022-06-30: aviso 'Você está vendo 30/06/2022' com 'voltar para hoje' (link para a página sem data), o balanço vigente ITR 1T22 versão 1 recebido em 05/05/2022 com a conta CVM de origem e o link do documento, e ROE, margem e dívida/EBITDA do DFP 2021.MT02— MT02 · O documento mostrado é o de maior dt_receb <= a data: um dia antes do recebimento do ITR 1T22 vale o anterior (DFP 2021), no dia exato vale o ITR; e os valores são os de /fatos?as_of= (a mesma função).MT03— MT03 · CMIG4 em 27/03/2021 (a DFP 2020 v1 valia; a v2 chegou em 30/03) mostra o bloco com as duas versões e o aviso de que o indicador usa a versão de hoje; PETR4 em 30/06/2022 (ITR 1T22 sem nova versão) não mostra bloco.MT04— MT04 · A borda do reenvio: CMIG4 em 29/03/2021 (véspera da v2) mostra v1; em 30/03/2021 mostra v2, sem o bloco 'então x hoje' (a versão da data já é a de hoje).MT05— MT05 · Com data, a página não traz P/L, P/VP, EV/EBITDA, valor de mercado, cotação, dividend yield nem gráfico de preço; traz a frase 'o preço do dia entra quando a licença de cotação estiver resolvida'.TD04— TD04 · /tesouro/taxas sem parâmetro devolve todos os títulos do dia-base mais recente (30/10/2026) com fonte, licença ODbL e citação; `titulo=prefixado` devolve só os 5 vencimentos; `titulo` + `vencimento` devolve a SÉRIE daquele título (28, 29 e 30/10/2026, em ordem); `data=` antes do começo pega o último dia até ela e avisa; `formato=csv` tem o cabeçalho.TD06— TD06 · /tesouro (PT e EN) abre 200 com a frase do dia-base 30/10/2026 (Selic 0,02 a 0,10; Prefixado 13,48 a 15,38 de compra; IPCA+ 7,27 a 7,89), a meta Selic da nossa seção Macro, DUAS curvas em SVG do servidor (a prefixada e a IPCA+) com um ponto por vencimento e o <title> de cada um, NENHUM <script>, a tabela de cada título com o vencimento, a explicação de taxa nominal × real, a licença ODbL, a citação, o canonical, o JSON-LD Dataset com a licença da FONTE e o aviso de que não é recomendação.TD08— TD08 · O /saude traz o bloco `tesouro` (último dia-base, idade, limite de 7 dias e a última coleta; `atencao` só passa do limite, e na borda não acende); o hub /macro (PT e EN) e o /api têm o cartão da página e da rota; o sitemap anuncia /tesouro com o dia-base como lastmod (nunca no futuro); o llms.TD09— TD09 · A ferramenta MCP `tesouro_direto` chama a mesma rota: sem argumento traz o dia-base com a fonte e a licença; com título e vencimento traz a série; pedido ruim volta como {erro}, nunca como exceção.TL06— TL06 · `ranking` classifica no mês CONSOLIDADO (o anterior ao mais novo): TOTAL primeiro, depois Vivo 85.818.766 (38,85% do total de 220.921.381; +1,60% contra os 84.463.402 de agosto de 2025), Claro, TIM (-2,60%), Surf; o mês preliminar (setembro) vem à parte e não entra na conta.TL07— TL07 · `ticker_do_cnpj` devolve o ticker só quando o CNPJ COMPLETO da operadora é o de uma empresa com ticker: a Telefônica Brasil (02.558.157/0001-62) liga a VIVT3 pelo cadastro; a TIM S.TL08— TL08 · /telecom/acessos sem parâmetro devolve o ranking dos dois serviços com a fonte (CC BY-ND 3.0, e NÃO CC BY), o uso acertado com a Anatel, a atribuição exigida e a citação; `servico` + `cnpj` (com ou sem pontuação, ou TOTAL) devolve a série mensal, recortada por `de`/`ate`; `formato=csv` tem o cabeçalho fixo.TL10— TL10 · /telecom (PT e EN) abre 200 com a frase (total e líder de cada serviço), a atribuição à Anatel no topo, os cartões (total móvel, total banda larga e as operadoras ligadas a ação), as duas tabelas com a Vivo (85.818.766, 38,85%, +1,60%), o mês preliminar à parte, a explicação de que M2M e ponto de serviço ficam de fora, de que soma por operadora, TOTAL, participação e variação são contas nossas e de que operadora não é a ação, a fonte com os dois arquivos, a licença CC BY-ND 3.0 (sem afirmar CC BY), o uso acertado com a Anatel, a citação, o canonical e o JSON-LD Dataset.TL11— TL11 · Sem empresa com ticker de CNPJ idêntico no cadastro, a página não liga NENHUMA ação (nem pelo nome Vivo ou TIM, nem pelo grupo): a coluna fica vazia.TL12— TL12 · O /saude traz o bloco `telecom` (mês mais novo, idade em dias por serviço, limite de 75 dias e a última coleta; `atencao` só passa do limite, e na borda não acende); o hub /macro (PT e EN) e o /api têm o cartão da página e da rota; o sitemap anuncia /telecom com o primeiro dia do mês mais novo como lastmod (nunca no futuro); o llms.TL13— TL13 · A ferramenta MCP `acessos_telecom` chama a mesma rota: sem argumento traz o ranking dos dois serviços com a fonte, a licença e a atribuição; com serviço e CNPJ traz a série mensal; pedido ruim volta como {erro}, nunca como exceção.EL04— EL04 · `vigentes` devolve, por distribuidora, a tarifa mais recente: CEMIG-D 28/05/2026 a 27/05/2027, TUSD 593,08 + TE 310,21 = 903,29, +5,21% contra 858,58 (28/05/2025); a vigência de 01/01/2026 a 27/05/2026 (mesmo valor de 2025, a ANEEL parte em 31/12) NÃO vira "variação zero"; a LIGHT junta dois pedaços; a distribuidora cuja última tarifa venceu em 2016 sai com `em_vigor` falso e fora do resumo (mínimo, mediana e máximo só das em vigor, com as 4 do recorte: 768,02 a 954,39, mediana 891,92); `ticker` é nulo (nenhum CNPJ bate com papel).EL05— EL05 · `ticker_do_cnpj` devolve o ticker só quando o CNPJ COMPLETO da distribuidora é o de uma empresa com ticker.EL06— EL06 · /energia/tarifas sem parâmetro devolve a tarifa mais recente das 6 distribuidoras com o resumo, a fonte, a licença ODbL e a citação; `cnpj` (com ou sem pontuação) devolve todas as vigências daquela, recortadas por `de`/`ate`; `formato=csv` tem o cabeçalho fixo.EL08— EL08 · /energia (PT e EN) abre 200 com a frase da faixa (768,02 a 954,39 por MWh, mediana 891,92), os quatro cartões, a tabela com a CEMIG-D (TUSD 593,08, TE 310,21, total 903,29, +5,21%) e a vigência em data legível, a distribuidora vencida em seção À PARTE e fora do ranking, a explicação de que NÃO tem tributos e de que total e variação são contas nossas, a explicação de que distribuidora não é a ação, a licença ODbL, a citação, o canonical, o JSON-LD Dataset com a licença da FONTE e o aviso de que não é recomendação.EL09— EL09 · O /saude traz o bloco `energia` (início de vigência mais novo, idade, limite de 75 dias e a última coleta; `atencao` só passa do limite, e na borda não acende); o hub /macro (PT e EN) e o /api têm o cartão da página e da rota; o sitemap anuncia /energia com o início de vigência mais novo como lastmod (nunca no futuro); o llms.EL10— EL10 · A ferramenta MCP `tarifas_energia` chama a mesma rota: sem argumento traz as tarifas mais recentes com a fonte e a licença; com CNPJ traz as vigências; pedido ruim volta como {erro}, nunca como exceção.FD03— FD03 · Em 02/11/2026 o mês de referência é out/2026 (novembro é parcial, com 1 fundo); um mês fechado com menos de 85% dos fundos do mês mais cheio também não serve.FD04— FD04 · A série de A tem set, out e nov/2026, do mais antigo ao mais novo; a variação da cota no mês só existe entre meses seguidos com cota (out: 11 contra 5,5 = +100%); fundo sem cota (C, duas subclasses) não tem variação.I-NA01— Do arquivo de movimentações da CVM entram na conta só compra e venda (à vista) de ações e units da PRÓPRIA companhia, somadas por (companhia, mês, tipo de pessoa); saldo inicial, subscrição, termo, opção, papel de controlada ou de controladora e companhia fora do universo ficam de fora; de cada informe reapresentado vale só a maior versão; negócio sem valor informado entra na quantidade e é contado em sem_valor, mas não soma R$.I-NA02— O banco guarda só somas por (companhia, mês, tipo de pessoa): nenhuma coluna de nome, de descrição da movimentação, de corretora ou de data do negócio, e o texto livre da linha (que cita nome de cônjuge) não aparece em parte nenhuma do arquivo gravado nem na saída JSON.I-NA03— A coleta pede o zip do ano anterior e o do corrente (com pausa entre os dois e o robô identificado), grava, e uma segunda rodada dentro do intervalo não pede nada; depois dele, o ETag volta ao servidor e o 304 não muda nada; reapresentação substitui o ano inteiro; fonte calada (erro, zip ilegível) mantém o que estava gravado.I-NA04— A série da companhia traz os 12 meses terminando no último mês informado por qualquer companhia, com os quatro tipos de pessoa por mês (compras, vendas e líquido em R$ e em ações, nº de negócios) e a marca de mês informado; o líquido é compras menos vendas.I-NA05— /administradores (pt/en) não tem JavaScript, mostra as duas listas do último mês com link para a ficha, cita o conjunto da CVM e a licença ODbL, diz que o dado é por tipo de pessoa e que não é recomendação, e sem arquivo mostra o vazio honesto.I-NA06— /acoes/{T} ganha o bloco "Negociação dos administradores" (tabela mês × tipo de pessoa dos últimos 12 meses, só com os meses informados, com a fonte, a licença e o link para a página e para o JSON) quando a companhia entregou informe na janela; sem o arquivo ou sem informe da companhia a ficha segue igual, sem o bloco.CF03— CF03 · PETR4 em 30/09/2026: Beta 2.000 (era 2.500), Alfa 1.500 (era 1.000), Gama 300 (igual); Delta saiu.CF04— CF04 · Medido em 31/10/2026: abril/2026 tinha 3.189 fundos com ação, julho 2.359, agosto 958 e setembro 975. O mês de referência é o mais novo com pelo menos 85% dos fundos do mês mais cheio (aqui, abril), e a cobertura diz o mês mais novo da CVM e a fração dele; com um mês só no banco, a variação é None e não zero.FO08— F-O08 · A última pesquisa traz, por indicador e ano de referência, a mediana do dia mais novo e a da pesquisa de ATÉ sete dias antes, com a diferença: IPCA 2026 de 5,219 (16/10) para 5,1891 (23/10) = -0,0299; Selic 2027 de 11,5 para 11,75 = +0,25. Ano sem semana anterior fica sem diferença (não vira zero).FO09— F-O09 · Para 2025: a expectativa é a ÚLTIMA pesquisa de dezembro de 2024 (31/12: IPCA 4,9932; Selic 14,75, e não a de janeiro nem a de 27/12) e o realizado vem das séries macro (IPCA de dez/2025 = 4,26; meta Selic em 31/12 = 15,0).FO11— F-O11 · `/focus` (PT e EN) abre 200 com: a frase do topo com a data da pesquisa e as medianas de IPCA e Selic; a tabela das quatro medianas (duas casas, como no boletim) por ano de referência com a diferença para a semana anterior; os gráficos de evolução e de acerto em SVG GERADO NO SERVIDOR (há <svg> com <title> nos pontos e NENHUM <script>); a tabela de acerto com o erro e a nota de que é conta nossa; a fonte com a licença ODbL; os links JSON e CSV; a frase de citação; canonical; JSON-LD Dataset com a licença da FONTE; a nota de que não é recomendação.PV02— PV02 · Nas páginas de ação o quadro leva o fechamento, a variação em 1 mês (com a cor: "sobe" verde, "desce" vermelho), o ROE e o lucro do último ano, e o logotipo da companhia.PV03— PV03 · ★ 01/11/2026, no ar: o robô pediu /og.DL03— DL03 · Código declarado liga o emissor à companhia; se o MESMO emissor é reivindicado por duas companhias (os códigos declarados de uma e de outra têm o mesmo emissor), nenhuma fica com ele — preço da companhia errada é pior que preço ausente.DL04— DL04 · Do começo ao fim, em arquivos sintéticos: a delistada recebe o código que declarou (ALFA3) E o antigo de mesmo emissor (OLDA3, que o FCA nunca listou); os preços vão até o último pregão de cada papel; a ativa (GAMA) e as outras classes dela ficam de fora; o ETF e o papel sem dono não viram preço — o sem-dono vira LACUNA.DL05— DL05 · Os desdobramentos/grupamentos do FRE entram só das delistadas, UMA vez por evento (o reenvio do mesmo evento em outra versão não duplica), com a razão declarada e a flag `sem_data_ex`: o FRE traz a data de APROVAÇÃO, não a data-ex — então o evento não serve para ajustar preço.DL08— DL08 · A leitura das páginas conta das tabelas: companhias e papéis ligados, pregões, eventos, provento ZERO (sem fonte para quem saiu) e a lacuna por volume.AN06— AN06 · No recorte de dezembro de 2023: o total do recorte é 1.162.693,67 bbl/dia, a Petrobras soma 804.443,76 bbl/dia e 40.009,19 Mm³/dia com 100% do pré-sal; a Eneva soma 7 campos de gás (292,2 bbl/dia); a participação e a variação em 12 meses são contas nossas (março de 2022 NÃO é o mesmo mês do ano anterior, então a variação é nula; com um dezembro de 2022 ela existe).AN07— AN07 · /petroleo/producao sem parâmetro devolve os operadores do último mês com a fonte, a licença CC BY-ND 3.0 (que NÃO é CC BY), o acordo de uso, a atribuição e a citação; `nivel=campo` devolve os campos; `cnpj`, `operador` ou `campo` devolvem a série mensal (com `de`/`ate`); `formato=csv` tem o cabeçalho fixo de cada nível.AN09— AN09 · /petroleo (PT e EN) abre 200 com a frase do último mês (dez/2023: 991.210 bbl/dia no recorte), o AVISO de que a ANP não publica arquivo depois dele (CAPTCHA em 2024 em diante, que o site não automatiza), os quatro cartões, a tabela dos operadores (Petrobras, com o CNPJ da ANP) e a dos campos (Tupi), o que cada coluna quer dizer, a licença CC BY-ND 3.0 dita como SemDerivações e NÃO como CC BY, o acordo de uso (informado pelo dono em 01/11/2026), a atribuição, a citação, o canonical, o JSON-LD Dataset com a licença da FONTE e o aviso de que não é recomendação.AN10— AN10 · O /saude traz o bloco `anp` (último mês na base e na fonte, meses desde o último, a última coleta): com a fonte parada no mesmo mês da base é `fonte_parada` e INFORMAÇÃO (sem `atencao`: alarme que pisca não é alarme); só acende `atencao` se a fonte tiver mês mais novo que a base; o hub /macro (PT e EN) e o /api têm o cartão da página e da rota; o sitemap anuncia /petroleo com o último dia do mês como lastmod (nunca no futuro); o llms.AN11— AN11 · A ferramenta MCP `producao_petroleo_gas` chama a mesma rota: sem argumento traz os operadores do último mês com a fonte, a licença e o acordo; com `campo` traz a série; pedido ruim volta como {erro}, nunca como exceção.AN13— AN13 · A pasta das exportações manuais da consulta pública (um CSV por mês e ambiente, AAAA_MM_producao_AMBIENTE.
Nível 3 — Econômico: o resultado é possível no mundo real? (14)
I-X08— Toda correlação publicada carrega o próprio n, e n nunca é pequeno o bastante para ser ruído.I-X09— A correlação do MESMO mês é a maior de todas.H-B05— Ativo total nunca negativo; nunca acima de R$ 100 tri (denuncia ESCALA_MOEDA=MIL aplicada em dobro).H-B08— |ROIC| > 200% sem flag `roic_extremo` é defeito até prova em contrário.H-B23— Mesmo padrão do H-B08/H-B17: provento > 5x o preço na data-com é preço histórico não ajustado por desdobramento (comum na B3 em dado antigo), não erro de parsing do valor.I-E04— Nenhum valor de mercado maior que o PIB do Brasil.H-F05— Mesmo padrão do H-B17: P/VP fora de [0,2 ; 5,0] sem flag é defeito até prova em contrário (vp_cota minúsculo/negativo, evento societário).H-F06— DY 12m acima de 30%/ano quase sempre é distribuição extraordinária (venda de imóvel, amortização de capital contada como rendimento na fonte), não yield recorrente.H-B25— ROE de banco fora de [-100%, 150%] é quase sempre erro de extração (PL ou lucro trocado).H-B17— Mesmo padrão do H-B08 (ROIC): |P/L|>200 ou |P/VP|>50 sem flag é defeito até prova em contrário.I-B31— O índice setorial tem os 10 macro-setores + 'Mercado (B3)', cada um com a série cheia (mesmo nº de semanas), níveis positivos e base 100 no início.I-B33— Nenhuma semana de nenhum setor anda mais do que uma bolsa consegue andar numa semana.H-B14— Q1+Q2+Q3 isolados de receita <= receita anual da DFP (tolerância 2%) para a GRANDE maioria das empresas — o resíduo (Q4 implícito) tem que ser não-negativo.I-P07— O PREMED fica FORA de [mínima, máxima] em ~0,1% das linhas — e o teste existe para registrar isso, não para reprovar.
Outros testes do produto (131)
Gate comercial, navegação e o conector MCP — testam se o produto funciona, não se um número está certo, então não entram nos 3 níveis acima por natureza. Contados e listados do mesmo jeito:
MED01— MED01 · Toda ferramenta do conector MCP passa pelo ponto de contagem.MED02— MED02 · Chamar uma ferramenta MCP grava mesmo a chamada.MED03— MED03 · Clique do próprio funil não é contado como visita.PR01— PR01 · O cabeçalho deste arquivo não pode perder o aviso de que passar na bateria não é prova de verdade.PR02— PR02 · Nenhum indicador vai ao ar sem página de metodologia.GC01— GC01 · Sem Stripe configurado o produto serve tudo, sem chave — é o modo do desenvolvimento e da UVI, e ele não pode fechar por acidente.GC02— GC02 · Com o gate ligado, a WEGE3 continua aberta: é a degustação que deixa qualquer um conferir o dado antes de decidir.GC03— GC03 · Fora da degustação, o que fica no cofre exige chave — e a recusa é 401 em todas as rotas, não só na primeira: versões do balanço, eventos, e o ponto no tempo (`as_of`) de fatos e múltiplos.GC04— GC04 · Chave inexistente é recusada.GC05— GC05 · A contraprova do GC04: chave válida abre o papel fechado.GC06— GC06 · O limite diário corta de verdade: a chamada além da cota devolve 429, e não um 200 silencioso com o contador ignorado.GC07— GC07 · Landing, metodologia e /saude nunca ficam atrás do gate — o argumento do produto tem de ser verificável por quem ainda não é cliente.GC08— Plano grátis: acesso a tudo, mas o limite diário é o do grátis (menor).GC09— /assinar?moeda=usd repassa moeda='usd' ao checkout (público internacional); o padrão continua BRL.GC10— ?lang=en serve a landing inglesa.GC11— O dicionário JSON diz a base do lucro de cada indicador — o achado da auditoria: margem_liquida (total) != roe (controladores).GC12— Screener filtra por faixas e recusa entrada inválida (não ignora).GC13— Dividendos: WEGE3 (degustação) abre sem chave; desde 23/10/2026 PETR4 também (vitrine aberta, com limite por IP: I-N320 e seguintes); chave válida passa.GC14— Scores e reapresentações seguem o gate: WEGE3 aberta; PETR4 exige chave.GC15— GC15 · O 401 responde HTML para navegador e JSON para agente.GC16— GC16 · A página de 401 sai em inglês para quem pede inglês.GC17— GC17 · O dump é o que separa o plano grátis do pago.GC18— GC18 · O 403 do Pro responde no formato de quem perguntou.GC19— GC19 · Sem chave, o /dump não pode oferecer a chave grátis.GC20— GC20 · Ticker que não existe responde 404 ANTES de o gate pedir chave; HEAD responde como o GET, sem corpo; o preflight CORS do /mcp/ aceita POST.GC21— GC21 · O teto diário é por CHAVE e por plano, de `limites_config.GC22— GC22 · O CSV do dump sai inteiro mesmo quando cada bloco é produzido por um fio diferente: cabeçalho mais todas as linhas da consulta.I-N01— Rastreia todas as páginas a partir da home: nenhum link interno pode responder erro, e toda página tem de ter caminho de volta para a home.I-N02— Os apelidos de metodologia (URLs que as pessoas ADIVINHAM, como /metodologia/pl) redirecionam para a página canônica — e um nome inexistente continua 404, para o alias não virar um buraco que engole tudo.I-N03— Toda página HTML tem link visível de troca de idioma.I-N04— A metodologia — o argumento central do produto — existe em inglês.I-N07— Cada vertical configurada tem porta, e a porta fala os dois idiomas.I-N05— Toda página pública declara viewport e tem regra responsiva.I-N08— O menu principal, nos dois idiomas, tem porta para cada vertical.I-N06— Rota que depende de tabela NOVA responde 503, nunca 500, quando a tabela ainda não existe.I-N09— Tabela que mistura duas temporalidades tem de rotular cada uma.I-N10— Todo exemplo que o cardápio do /screener oferece precisa ser aceito pelo /screener.I-N11— O cardápio do /screener responde a quem NÃO tem chave.I-N12— O /saude publica a versão do dado, e ela é a do banco servido.I-N13— A página de reapresentações abre sem chave; o feed por empresa não.I-N14— A página de qualidade lista o que NÃO publicamos, e por quê.I-N15— A página do plano de contas prova que código não define conta.I-N16— A página do ISSB diz que a obrigação foi REVOGADA, com data.I-N17— A página de armadilhas conta do banco, não afirma de memória.I-N18— A página do look-ahead mede, e distingue atraso de republicação.I-N19— Quem chega sem chave recebe a PÁGINA, qualquer que seja o Accept.MCP01— MCP01 · O conector anuncia EXATAMENTE as 24 ferramentas esperadas — nem uma a menos (quebra cliente) nem uma a mais (some do catálogo).MCP02— MCP02 · Pelo conector, a degustação vale igual: WEGE3 responde com ROIC sem chave nenhuma.MCP03— MCP03 · Papel fechado não devolve erro cru para a IA: devolve erro COM o caminho de resolver, porque quem lê a resposta é um agente que precisa saber o que dizer ao usuário.MCP04— MCP04 · A chave passada como argumento da ferramenta abre o papel fechado — é assim que um cliente de IA autentica, sem cabeçalho HTTP.MCP05— MCP05 · A metodologia é gratuita também pelo conector: a IA consegue explicar COMO a conta é feita sem que ninguém pague por isso.MCP06— MXRF11 é a degustação da vertical de FIIs: abre sem chave, como a WEGE3 nas ações.MCP07— MCP07 · O conector responde a cliente que manda Origin de terceiro.MCP08— MCP08 · Abrir /mcp/ no navegador devolve página útil, não 406. TRÊS revisores externos seguidos não conseguiram testar o conector, e a causa era esta.MCP09— MCP09 · A ferramenta de auditoria manda conferir na FONTE, não em nós.I-TR01— Todo teste cujo ID é da família de invariante de dado (`_RE_ID_FAMILIA_DADO`: qualquer "I-"/"H-" que não seja navegação) tem de estar em `_NIVEL_DO_TESTE`.I-TR02— O total coletado por `_coletar_bateria_de_testes` é EXATAMENTE o número de testes que `pytest --collect-only` enxerga nos mesmos módulos — não um a mais (introspecção pegando algo que não é teste) nem um a menos (teste que a introspecção pulou e a página esconderia).I-TR03— Nenhum teste desaparece da coleta por falta de docstring/ID — o requisito explícito é 'nunca sumir em silêncio'.I-TR04— `_CASOS_REAIS` e `_ORDEM_CASOS` só podem citar IDs que a bateria real ainda tem — um caso "pendurado" (teste renomeado/removido) é história morta que não deveria continuar como se fosse viva.I-TR05— Todo teste da bateria tem descrição em português E em inglês.MED04— MED04 · O alarme do build acende pelo fato, não pelo instante.MED05— MED05 · Se a base no ar não é a que o código promete, o /saude avisa.MED06— MED06 · 'Rodando' tem prazo — build travado não passa por saudável.MED07— MED07 · Página que publica número vivo diz de quando ele é.PG01— PG01 · Nenhum módulo que testa DADO fica fora do portão.TR05— TR05 · Todo arquivo `testes/test_*.TR06— TR06 · Nenhuma página pública anuncia contagem de empresas ou de testes com número digitado no HTML.TR07— TR07 · As métricas globais são IDÊNTICAS em português e inglês.TR08— TR08 · Número em página EN sai no formato de quem lê, com vírgula.TR09— TR09 · Dois testes não podem carregar o mesmo identificador.TR10— TR10 · A lista de 100+ testes é filtrável, e o filtro nunca esconde nada de quem não roda JavaScript.TR11— TR11 · Nenhuma página analítica leva mais de 2s para montar.TR12— TR12 · Varre TODAS as páginas públicas atrás de qualquer número que coincida com uma contagem do banco sem estar em dia.TR13— TR13 · Nenhuma página pode reivindicar exclusividade além do universo que o /comparativo declara ter comparado.TR14— TR14 · Afirmação de SUPERIORIDADE, não só de exclusividade, tem de dizer contra quem foi comparada.TR15— TR15 · O painel de tráfego tem uma contagem que NÃO sobe quando somos nós navegando ou quando a bateria roda.TR16— TR16 · Toda página HTML pública é medida — em especial as do funil.TR17— TR17 · Um clique pago é identificável, e nada além da campanha é gravado.TR18— TR18 · A recusa por plano ou por cota é contada, e o banco de analytics NUNCA guarda a chave em claro.TR19— TR19 · Todo valor esperado no desafio é o que a API serve AGORA.TR20— TR20 · Cada verificador do desafio reprova o defeito que ele vigia.TR21— TR21 · A /transparencia carimba a versão do dado e o instante da geração.TR22— TR22 · O desafio publica quantos TIPOS de armadilha cobre, não só casos.TR23— TR23 · A mesma semente devolve os mesmos casos, e sem semente não sorteia.TR24— TR24 · /auditoria/random/{seed}/{n} == /auditoria/random?seed&n.TR25— TR25 · Toda página que exibe contagem viva carimba versão + geração.TR26— TR26 · A amostra do auditor não se desfaz quando a base atualiza.TR27— TR27 · audit_id, sample_key e score: a auditoria é demonstrável depois.TR28— TR28 · O histórico separa auditor externo de interno e mantém os erros.TR29— TR29 · Onde aparece taxa, aparece a ressalva — no mesmo bloco.TR30— TR30 · O prompt publicado aponta para a fonte primária, não para nós.TR31— TR31 · Todas as sementes da faixa estão publicadas — nenhuma falta.TR32— TR32 · Build que falha vira estado VISÍVEL, não só linha de log.TR33— TR33 · O comparativo diz a data da conferência e admite onde perdemos.TR51— TR51 · O registro de testes (nível, descrição em inglês, módulos do portão) mora em `testes/registro_*` com UM ID por linha e `merge=union`: o arquivo real é válido, e cada defeito reprova (ID duplicado, ID sem descrição em inglês, linha malformada, marcador de conflito do git, nível fora de 1-3, módulo duplicado).MED08— MED08 · Passo de funil dado por robô não conta como intenção humana.MED09— MED09 · Crawler que segue o link "Assinar" não cria sessão de pagamento.MED10— MED10 · O plano grátis aparece no HTML servido, sem executar script.MED11— MED11 · A landing servida traz o grátis quando o plano está ligado.MED12— MED12 · Nenhuma página escreve à mão um número que o banco já sabe.PR03— PR03 · Quem não escolheu plano vê os planos, não um formulário de cartão.PR04— PR04 · O grátis aparece na página, e não escondido atrás de script.AUD01— AUD01 · O `csv_no_zip` e o `filtro` levam à linha, e a escala fecha.AUD02— AUD02 · O texto não promete uma verificação que a CVM torna impossível.AUD03— AUD03 · A rota declara o próprio limite em vez de deixar implícito.AUD04— AUD04 · O `onde_procurar` do caso sorteado leva à linha, de verdade.AUD05— AUD05 · A metodologia diz o que acontece QUANDO a base muda.AUD06— AUD06 · Comparação que atravessa mudança de base sai marcada.AUD07— AUD07 · Navegador recebe página; agente que pede JSON recebe JSON.AUD08— AUD08 · A rota da amostra existe no llms.AUD09— AUD09 · D&A do EBITDA não engole amortização de custo de dívida.AUD10— AUD10 · O protocolo declara o vínculo em vez de fingir neutralidade.AUD11— AUD11 · Cache acelera a repetição e NUNCA serve amostra de base velha.AUD12— AUD12 · Para banco, a lista genérica não é apresentada como se valesse.AUD13— AUD13 · O auditor consegue refazer a ORDENAÇÃO, não só os scores.AUD14— AUD14 · O universo declara uma conta que tem de fechar com o /saude.AUD15— AUD15 · Publicamos as linhas EXCLUÍDAS do D&A, não só as somadas.CV01— CV01 · Toda definição de EBITDA que o olho leu na escritura, a lente acha.CV02— CV02 · Discricionário ou objetivo é o que o OLHO leu, não o que a lente diz.CV03— CV03 · Reintroduzido o defeito, a flag de discricionariedade TEM de mudar.CV04— CV04 · "40% do EBITDA consolidado" não é definição de EBITDA.CV05— CV05 · Documento que não cita EBITDA não vira linha com definição.CV06— CV06 · O limiar em texto corrido é lido; o de TABELA não é, e a página diz.CV07— CV07 · Conferência de 09–10/10/2026: (a) "incluindo o EBITDA dos últimos 12 meses das sociedades incorporadas e/ou adquiridas" tira o número da DRE, em categoria própria (não discricionária); (b) "não permitindo-se ajustes de efeito não recorrente" NÃO é ajuste não recorrente; (c) "não monetários, na medida em que não sejam recorrentes" é discricionário.CV08— CV08 · O porteiro (JEV) apontou 9 escrituras com definição que a lente não leu (glossário em duas colunas); o texto conferido a mão entra pela MESMA regra: CVM 156 sai igual à DRE, "antes das despesas não recorrentes" sai a critério.I-N340— O coletor lê a resposta da CVM (fixture com linhas reais do IPE) e grava só as categorias do radar (Fato Relevante e Comunicado ao Mercado) de companhias do universo, com companhia, ticker, categoria, assunto, data de entrega, link do documento ORIGINAL na CVM e protocolo; "Aviso aos Acionistas" e companhia de fora ficam de fora.I-N341— A CVM é consultada no máximo uma vez a cada `intervalo_minimo_s` (10 min), contado em disco: a segunda chamada dentro do intervalo NÃO chama a rede.I-N342— O pedido à CVM leva um User-Agent que identifica o robô (nome, versão e página) e o ETag condicional; erro de rede vira status 0, nunca exceção.I-N343— A frase é "A PETR4 entregou à CVM um Fato Relevante em 16/10/2026: <assunto>.I-N344— O mesmo endereço /fatos-relevantes devolve JSON com `Accept: application/json` (e HTML para navegador, com `Vary: Accept`); a ferramenta MCP `fatos_relevantes` é aberta (sem chave), filtra por ticker e por categoria, e as duas respostas trazem `citacao`, `fonte` (licença ODbL, atualização semanal) e `aviso` de que a data vem sem hora.I-N345— /acoes/{T} ganha o bloco "Último fato relevante" (frase descritiva, link do original e a ressalva da fonte semanal) só quando a companhia tem um Fato Relevante dos últimos 30 dias; com um de 40 dias, com só Comunicado ao Mercado ou sem arquivo do radar, a ficha segue igual e sem o bloco.
Reconstrua você mesmo — margem líquida de 5 empresas, 4 setores
Não pedimos que você confie nos números. Eis a margem líquida de cinco empresas de quatro setores diferentes, cada uma reconstruída direto do balanço anual (DFP) na CVM — lucro líquido ÷ receita, batendo exatamente com o valor publicado. Para QUALQUER indicador, de qualquer empresa, a cadeia inteira até a linha do arquivo da CVM está em /linhagem:
| Empresa · setor | Lucro líq. (conta CVM) | Receita (conta CVM) | Margem =÷ |
|---|---|---|---|
| WEGE3 · indústria | R$ 6,78 bi DRE:3.11 | R$ 40,80 bi DRE:3.01 | 16,6% |
| VALE3 · mineração | R$ 11,81 bi DRE:3.11 | R$ 213,59 bi DRE:3.01 | 5,5% |
| PETR4 · petróleo | R$ 110,61 bi DRE:3.11 | R$ 497,55 bi DRE:3.01 | 22,2% |
| ITUB4 · banco | R$ 45,85 bi DRE:3.09 | R$ 387,12 bi DRE:3.01 | 11,8% |
| BBAS3 · banco | R$ 16,78 bi DRE:3.11 | R$ 319,46 bi DRE:3.01 | 5,3% |
Baixe a DFP de qualquer uma delas na CVM, pegue as contas de lucro e receita, divida — você chega no mesmo número. Bancos usam a receita de intermediação (o que faz sentido pra um banco), então a reconciliação é ciente do setor; os demais usam a receita de vendas. Valores do último exercício.
Por que às vezes divergimos de outro site (e não é erro)
Uma diferença entre dois sites geralmente não é um estar errado — é uma escolha de método. A nossa está aberta:
- Capital médio vs final: ROE e ROIC usam patrimônio/capital médio (ano atual + anterior ÷ 2), não o saldo final — então não são uma divisão ingênua de um ano só.
- Controladora vs consolidado: dizemos qual cada item usa.
- TTM vs anual: múltiplos trimestrais usam lucro dos últimos 12 meses.
- IFRS 16, goodwill, caixa, imposto excepcional: cada um tratado explicitamente e sinalizado quando distorce.
Os testes mordem? Sim — casos reais que a bateria já pegou
Um teste que nunca falha pode significar dado perfeito — ou teste fraco. Estes nasceram de erros reais que passaram, e hoje reprovam — só aparece o que existe de verdade na bateria coletada acima:
- I-B16 · o P/L = 0 dos bancos: a CVM reporta o nº de ações ora em unidades, ora em milhares (varia por empresa e por ano); o market cap saía 1000× menor e o P/L dava zero. O I-B16 (preço × ações recomputado) pegou — corrigimos 661 múltiplos anuais e 2.027 trimestrais.
- I-B24 · o lucro que sumia: a conta de lucro/PL varia por banco (Itaú 3.09, BB 3.11); se a busca por rótulo falha, o número some em silêncio e o ROE nasce errado. I-B24 faz esse buraco reprovar.
- H-B23 · o dividend yield de 800%: provento antigo na B3 vem com preço não ajustado por desdobramento; sem o H-B23 o yield sairia absurdo como se fosse real. A flag mantém o registro e avisa.
- I-B20 · o furo do COTAHIST 2023: no 1º deploy, o download de um ano de preços falhou em silêncio; a API subiu com ~50 mil preços a menos e a bateria passou, porque nenhum teste olhava cobertura. Criamos o I-B20 — ano sem preço agora reprova o build alto.
- I-B33 · Petróleo e Gás em −89,6% numa semana: o COTAHIST não é ajustado por desdobramento; um split 10:1 lia como −90% de retorno semanal e ficava no acumulado para sempre, sem nada reprovar (um filtro cego de amplitude nem resolveu — só trocou o erro de sinal). I-B33 (nenhuma semana de setor além de ±35%, a régua é a própria bolsa) faz o build parar.
- I-B31 · 364 de 865 semanas do índice setorial congeladas: ao estender a série até 2010, setor sem nenhuma empresa com market cap naquela semana virava fator 1,0 — uma linha reta que o retorno acumulado lia como 'mercado parado', e o retorno 'desde 2010' saía ficcional (+527%). I-B31 reprova qualquer semana repetida ao centavo.
- I-E05 · o P/L de 2010 da EMBRAER com preço de 2025: a busca de preço ponto-no-tempo caía para a frente sem teto quando o ticker atual não tinha preço na época do balanço (troca de código, mudança de classe); o múltiplo saía calculado com um preço 15 anos no futuro, em 22% das linhas anuais e trimestrais, em silêncio. A janela de 45 dias (e o I-E05) barra isso: sem pregão dentro do prazo, o múltiplo não é calculado.
- I-E04 · a AZUL com R$ 1,67 quadrilhão de valor de mercado: o balanço trazia 54,7 trilhões de ações da recuperação judicial, mas o preço usado já estava na base pós-grupamento de 1:150.000 — duas pontas em bases diferentes, market cap errado por ordens de grandeza. I-E04 (valor de mercado nunca maior que o PIB do Brasil) faz esse absurdo reprovar o build.
Até onde vai cada bloco de dado
Aqui não tem asterisco: esta é a cobertura ano a ano, contada agora. Indicadores (ROE, ROIC, margens, crescimento) saem só das demonstrações e cobrem a série inteira. Múltiplos (P/L, P/VP, EV/EBITDA) exigem preço e número de ações — e o nº de ações vem do Formulário de Referência, que quanto mais antigo menos companhia entregou em formato aproveitável. A diferença entre as duas colunas é limite da fonte, não buraco de ingestão. Se você procurar um P/L antigo e não achar, é porque ninguém tem — não porque escondemos. Os mesmos números em JSON: /cobertura.
| Ano | Empresas com indicadores | Empresas com múltiplos |
|---|---|---|
| 2025 | 440 | 290 |
| 2024 | 444 | 296 |
| 2023 | 442 | 298 |
| 2022 | 429 | 295 |
| 2021 | 423 | 296 |
| 2020 | 411 | 274 |
| 2019 | 372 | 166 |
| 2018 | 327 | 167 |
| 2017 | 318 | 165 |
| 2016 | 312 | 154 |
| 2015 | 304 | 144 |
| 2014 | 302 | 140 |
| 2013 | 293 | 131 |
| 2012 | 291 | 112 |
| 2011 | 284 | 98 |
| 2010 | 277 | 34 |
Cobertura ao vivo
456 empresas · 883,569 pontos de preço · 8,670 reapresentações registradas · última atualização 2026-11-06 01:27:27. Contagens completas ao vivo em /saude.
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-11-03-ponte-b3-codigo-de-fundo · página gerada em 2026-11-07 01:02 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.