{
  "schemaVersion": "2.4.0",
  "ok": true,
  "resumo": "299 de 380 jogos processados, sem divergências.",
  "servedSnapshotValid": true,
  "servedSnapshotId": "2026.R30.231da24f-299.m1.2.0",
  "servedSnapshotAge": 30,
  "candidateRejected": false,
  "candidateRejectionReason": null,
  "candidateTimestamp": null,
  "candidateSnapshotId": null,
  "publicStatus": "atual",
  "publicNotice": null,
  "partidasVencidasEmAberto": [],
  "dataset": {
    "ok": true,
    "integridadeDaEntrada": true,
    "fotografiaAprovada": true,
    "retida": false
  },
  "publicacao": {
    "ok": true,
    "snapshotId": "2026.R30.231da24f-299.m1.2.0",
    "versaoModelo": "1.2.0",
    "versaoProduto": "0447555af.202610161554",
    "schemaVersion": "2.4.0",
    "promovidoEm": "2026-10-16T19:37:59.000Z",
    "origemDaPromocao": "cron",
    "checksum": "4d834c3b",
    "superficiesConferidas": 104,
    "superficiesForaDeSincronia": 0,
    "valoresConferidos": 1542,
    "foraDeSincronia": [],
    "conferidasEm": "2026-10-16T19:38:00.040Z",
    "manifesto": "https://valorfinal.com.br/brasileirao/manifesto.json",
    "estado": "https://valorfinal.com.br/brasileirao/estado.json"
  },
  "integridade": {
    "jogosNoAcervo": 380,
    "jogosDecididos": 299,
    "jogosEmAberto": 81,
    "jogosEsperados": 380,
    "clubes": 20,
    "divergencias": []
  },
  "frescor": {
    "minutosDesdeAtualizacao": 30,
    "fonteDeDados": "ao-vivo"
  },
  "promocao": {
    "regrasConferidas": 26,
    "aprovada": true,
    "falhas": [],
    "mutacoesHistoricas": 0,
    "retida": null
  },
  "proveniencia": {
    "fontes": [
      {
        "papel": "primaria",
        "nome": "football-data.org (competição BSA)",
        "fornece": "calendário completo da Série A, mando de campo, rodada, data e horário, placar das partidas encerradas e remarcações.",
        "frequencia": "lido por um Worker nosso a cada 30 minutos; o navegador de quem visita nunca fala com a API.",
        "observacao": "A base bruta pertence à fonte e não é redistribuída por nós. Os arquivos de dado aberto deste cluster trazem o que calculamos, mais o placar necessário para reproduzir a conta."
      },
      {
        "papel": "validacao",
        "nome": "Tabela agregada da mesma fonte",
        "fornece": "a classificação que a própria fonte publica, usada só para conferência cruzada: quando ela e a nossa discordam, a diferença aponta um problema de dado a investigar.",
        "frequencia": "a cada atualização.",
        "observacao": "É também o que permite fechar o placar de uma partida encerrada quando a fonte atrasa a atualização individual, e só quando quatro conferências independentes batem."
      },
      {
        "papel": "primaria",
        "nome": "CBF, Regulamento Específico da Competição",
        "fornece": "as regras da temporada: vagas continentais por posição, número de rebaixados e a ordem dos critérios de desempate.",
        "frequencia": "por temporada, quando a CBF publica."
      },
      {
        "papel": "derivada",
        "nome": "Modelo ValorFinal",
        "fornece": "classificação montada jogo a jogo, rating de força no estilo Elo, simulação de Monte Carlo, probabilidades por faixa, projeções, pontos esperados, dificuldade de calendário e o Índice de Impacto.",
        "frequencia": "recalculado a cada atualização de resultado."
      }
    ],
    "licenca": {
      "nome": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/deed.pt-br",
      "cobre": "tudo que o ValorFinal calcula: probabilidades, projeções, ratings, pontos esperados, dificuldade de calendário, Índice de Impacto e as fotografias arquivadas.",
      "naoCobre": "a base bruta de calendário e placares, que pertence à fonte primária e tem os termos de uso dela."
    },
    "conferencia": [
      "A classificação não é copiada pronta: ela é montada aqui, partida a partida, com os critérios de desempate do regulamento. Quando a nossa tabela e a da fonte discordam, isso aponta um problema de dado.",
      "O acervo passa por uma bateria de invariantes a cada requisição: partida duplicada, jogo encerrado sem placar, placar impossível, clube fora do elenco, rodada fora do intervalo e soma de gols que não fecha.",
      "O resultado dessa conferência é publicado em /brasileirao/status.json, inclusive quando encontra divergência.",
      "Pontos esperados são calculados por conta fechada e comparados com a média da simulação. Se as duas divergirem por mais de 0,6 ponto, uma das duas está errada, e um teste automático reprova a publicação."
    ],
    "limitacoes": [
      "O modelo simula apenas o Campeonato Brasileiro. Ele não simula a Copa do Brasil nem os torneios da Conmebol, e por isso publica faixa de posição final em vez de probabilidade de vaga continental.",
      "Os critérios de desempate por cartões não são aplicados: a fonte publica o placar das partidas e não a súmula.",
      "O modelo não usa elenco, valor de mercado, escalação, lesão nem desfalque. A força de cada clube é estimada a partir dos resultados da própria temporada.",
      "As probabilidades vêm de uma amostra pseudoaleatória. Com o número de simulações publicado, o erro padrão de uma probabilidade perto de 50% fica em 0,35 ponto percentual."
    ]
  },
  "snapshot": "2026.R30.231da24f-299.m1.2.0",
  "urlPermanente": "https://valorfinal.com.br/brasileirao/fotografia/2026.R30.231da24f-299.m1.2.0",
  "versaoModelo": "1.2.0",
  "versaoProduto": "0447555af.202610161554",
  "temporada": "2026",
  "rodadaDeReferencia": 30,
  "rodadasConcluidas": 29,
  "rodadaDaProximaJanela": 31,
  "jogosDecididos": 299,
  "jogosRestantes": 81,
  "fonteDeDados": "ao-vivo",
  "dadosAtualizadoEm": "2026-10-16T19:32:59.000Z",
  "calculadoEm": "2026-10-16T19:38:00.040Z",
  "simulacoes": 20000,
  "arquivos": [
    {
      "nome": "dados.json",
      "url": "https://valorfinal.com.br/brasileirao/dados.json",
      "tipo": "application/json",
      "bytes": 65567,
      "checksumFnv1a": "7d34b840",
      "etag": "W/\"2026.R30.231da24f-299.m1.2.0-7d34b840\""
    },
    {
      "nome": "clubes.csv",
      "url": "https://valorfinal.com.br/brasileirao/clubes.csv",
      "tipo": "text/csv",
      "bytes": 4320,
      "checksumFnv1a": "26349e4b",
      "etag": "W/\"2026.R30.231da24f-299.m1.2.0-26349e4b\""
    },
    {
      "nome": "confrontos.csv",
      "url": "https://valorfinal.com.br/brasileirao/confrontos.csv",
      "tipo": "text/csv",
      "bytes": 9749,
      "checksumFnv1a": "214ceb02",
      "etag": "W/\"2026.R30.231da24f-299.m1.2.0-214ceb02\""
    },
    {
      "nome": "historico.csv",
      "url": "https://valorfinal.com.br/brasileirao/historico.csv",
      "tipo": "text/csv",
      "bytes": 73520,
      "checksumFnv1a": "abe3efba",
      "etag": "W/\"2026.R30.231da24f-299.m1.2.0-abe3efba\""
    }
  ],
  "modelo": {
    "nome": "Modelo ValorFinal",
    "versao": "1.2.0",
    "esquema": "https://valorfinal.com.br/brasileirao/schema.json",
    "versoesEquivalentes": {
      "1.3.0": "1.2.0"
    },
    "changelog": [
      {
        "versao": "1.2.0",
        "data": "2026-08-31",
        "resumo": "O regulamento da temporada virou código, e o desempate passou a incluir o confronto direto.",
        "mudancas": [
          "O Regulamento Específico da Competição de 2026 passou a ser a fonte das faixas publicadas. O Brasileirão 2026 dá cinco vagas de Libertadores, não seis: do 1º ao 4º na fase de grupos e o 5º na fase preliminar, porque a sexta vaga passou para a Copa do Brasil. Até esta versão o site tratava o Top 6 como zona de Libertadores, o que valia até 2025 e deixou de valer.",
          "As probabilidades passaram a ser publicadas por faixa de posição (Top 4, Top 5, Top 6 e zona continental) em vez de por nome de competição. O modelo simula apenas o Campeonato Brasileiro, então ele sabe dizer onde o clube termina, e não quantas vagas terão sobrado da Copa do Brasil.",
          "O confronto direto entrou no desempate, como manda o quarto critério do Art. 15. Ele é aplicado somente quando exatamente dois clubes empatam em pontos, vitórias, saldo e gols pró, porque o § 2º proíbe o critério em empates de três ou mais. Antes desta versão a ordem nesse caso saía do nome do clube.",
          "As faixas deixaram de ser contadas dentro da simulação e passaram a ser derivadas da distribuição de posição final. É uma mudança de arquitetura sem efeito no número, e é o que permite trocar de regulamento sem tocar no motor.",
          "O índice de impacto passou a ser medido também sobre Top 4, Top 5 e zona continental. O impacto geral agora soma título, Top 5 e rebaixamento, as três disputas que a posição final decide sozinha.",
          "Nota de governança: em 01/09/2026, por algumas horas, as fotografias saíram carimbadas como modelo 1.3.0 por uma rodada de engenharia que não mudou nenhuma probabilidade. O rótulo foi corrigido no mesmo dia: a matemática em uso continua sendo a desta versão, e um identificador terminado em m1.3.0 resolve para o identificador m1.2.0 de mesma assinatura, com os mesmos números. O que aquela rodada mudou está registrado nas notas de produto, que é onde esse tipo de mudança pertence."
        ]
      },
      {
        "versao": "1.1.0",
        "data": "2026-08-31",
        "resumo": "Uma única fotografia para o site inteiro, com identificador citável, e três medidas novas derivadas da mesma amostra.",
        "mudancas": [
          "A força dos clubes passou a ser recalculada dos resultados a cada atualização em todas as telas. Antes, o simulador e os widgets usavam um rating congelado no último build, e por isso mostravam probabilidade diferente da central para o mesmo clube.",
          "Toda página do site passou a ler a mesma fotografia identificada (temporada, rodada, assinatura dos resultados e versão do modelo). Duas páginas só podem divergir se estiverem em fotografias diferentes, e a fotografia aparece escrita em cada uma.",
          "O simulador passou a usar o mesmo motor da central. Antes eram duas implementações do mesmo método, com contagens de simulação diferentes.",
          "Passaram a ser publicados os pontos esperados de cada clube até o fim, o índice de incerteza da posição final e o índice de impacto de cada jogo da próxima rodada.",
          "A probabilidade de cada confronto passou a ser calculada para todos os jogos em aberto, e não só para o próximo jogo de cada clube."
        ]
      },
      {
        "versao": "1.0.0",
        "data": "2026-08-30",
        "resumo": "Primeira versão publicada do cluster: simulação de Monte Carlo do campeonato inteiro, renderizada no servidor.",
        "mudancas": [
          "Rating no estilo Elo calculado a partir dos resultados da própria temporada, com todos os clubes começando iguais.",
          "Gols de cada partida sorteados por distribuição de Poisson, com vantagem de mando embutida no rating.",
          "Vinte mil campeonatos simulados por fotografia, com critérios de desempate do regulamento aplicados em cada um.",
          "Probabilidade condicional ao resultado do próximo jogo lida da mesma amostra, e não de simulações separadas."
        ]
      }
    ]
  },
  "produto": {
    "versao": "0447555af.202610161554",
    "notas": [
      {
        "data": "2026-09-01",
        "resumo": "Todo número publicado passou a declarar de que campo do dado aberto ele saiu, e o portão confere um a um antes de publicar.",
        "mudancas": [
          "Cada probabilidade, linha de corte, projeção e índice de impacto que aparece numa página do cluster carrega, no próprio elemento, o campo do dado aberto, o clube ou jogo a que se refere e o valor. Antes a conferência externa procurava a porcentagem como texto em qualquer lugar do documento, o que numa página com vinte porcentagens não prova nada.",
          "O portão de promoção ganhou uma etapa: além de exigir que toda superfície saia com o identificador da candidata, ele compara cada número publicado com o dados.json da mesma fotografia. Uma página que mostre valor diferente do dado aberto não pode mais ser publicada.",
          "Fotografia já arquivada não pode ter valor reescrito. O portão compara o arquivo da candidata com o da publicação no ar, campo a campo, e uma reescrita segura a publicação inteira. O arquivo continua podendo ser completado com rodada nova e com campo novo.",
          "O acervo não anda para trás. Uma fonte que devolva menos partidas, menos clubes, menos jogos decididos ou uma partida decidida que volte a ficar em aberto passa a segurar a publicação. As invariantes anteriores conferiam se a fotografia fechava em si mesma, e uma fotografia calculada sobre metade do campeonato fecha perfeitamente.",
          "A citação recomendada virou uma só, com a versão do modelo, a rodada, a fotografia, a data e hora do cálculo e o endereço permanente que resolve aquela fotografia. Havia quatro redações diferentes do mesmo crédito, e a mais usada, a do botão de copiar da sala de imprensa, não trazia data nem link permanente.",
          "A faixa da Sul-Americana passou a ser publicada como faixa própria (probSulAmericana): do 6º ao 11º em 2026, lida do regulamento da temporada. A página de chances e a linha de abertura das páginas de clube publicavam a zona continental inteira sob esse nome, e o número incluía quem vai à Libertadores."
        ]
      },
      {
        "data": "2026-09-01",
        "resumo": "A publicação virou um objeto só, com um único escritor, conferida superfície por superfície antes de entrar no ar.",
        "mudancas": [
          "A fotografia, o acervo de resultados de que ela foi calculada, o arquivo por rodada e a linha do tempo passaram a ser gravados juntos, num único registro. Antes eram quatro chaves lidas separadamente a cada requisição, e a propagação gradual de cada uma permitia que duas páginas, por até um minuto, respondessem com fotografias diferentes.",
          "Só a atualização agendada move o acervo para a frente. O caminho da requisição deixou de ler a tabela ao vivo e de recalcular a partir dela: ele lê o registro publicado e, quando o código mudou de versão, recalcula a partir do MESMO acervo guardado, o que produz o mesmo resultado em qualquer servidor.",
          "Antes de uma publicação nova entrar, o worker renderiza todas as superfícies correntes a partir dela e confere que cada uma carrega o mesmo identificador. Uma superfície que falhe segura a publicação inteira, e a anterior continua no ar completa.",
          "O status.json passou a separar a integridade do DADO da integridade da PUBLICAÇÃO, e o seu ok só é verdadeiro quando as duas fecham. Entrou também o manifesto, um arquivo pequeno com o identificador da fotografia corrente, as versões e o checksum, para qualquer conferência começar por ele.",
          "As páginas estáticas do portal (tabela, simulador, jogos de hoje, probabilidade de jogo, hub esportivo e os dois widgets) deixaram de renderizar no HTML o calendário congelado no build. Elas passaram a ler o estado publicado de um único arquivo, que traz a fotografia e o acervo de que ela foi calculada, e o HTML servido não carrega mais número de campeonato.",
          "O esquema do dado aberto passou a ter uma definição só: o cabeçalho X-Schema-Version, o status.json e o dados.json diziam versões diferentes porque havia duas constantes.",
          "As linhas de corte e o índice de impacto ganharam nomes posicionais nos dados abertos (corteTop5, corteTop6, impactoTop4, impactoTop5, impactoTop6, impactoContinental), e a contagem da limitação dos cartões passou a ser publicada em cada fotografia. Os campos antigos continuam publicados com o mesmo valor.",
          "A página de um jogo já disputado deixou de recalcular a probabilidade com a força atual dos clubes: ela publica a previsão como foi feita antes da partida, com os ratings e as médias de gols da época."
        ]
      }
    ]
  }
}