{
 "dominio": "energia",
 "gold": "metricas.json",
 "gerado_em": "2026-10-06T20:02:52Z",
 "versao_pipeline": "energia-0.1.0",
 "versao_codigo": "1f075868ed56+alterado",
 "disponivel": true,
 "metricas": [
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/chuva-e-temperatura"
   ],
   "versao_formula": "1.0",
   "id": "agua_associacao_chuva_ena",
   "titulo": "Associação entre chuva e ENA por bacia",
   "pergunta": "Meses de chuva acima do normal coincidem com ENA acima da MLT?",
   "definicao": "Correlação de Pearson entre a anomalia mensal de chuva da bacia e a ENA mensal em % da MLT (razão de somas no mês), no mesmo mês e com a ENA do mês seguinte.",
   "unidade": "coeficiente (−1 a 1)",
   "grao_geografico": "bacia",
   "grao_temporal": "mês (2001 a 2025)",
   "fontes": [
    "clima_precipitacao_bacia",
    "ons_ena_bacia_di"
   ],
   "formula": "r = cov(anomalia, ENA%) ÷ (σ_anomalia σ_ENA%)",
   "regra_agregacao": "pares bacia-mês com os dois valores",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "bacia",
    "defasagem"
   ],
   "regras_comparabilidade": [
    "n de pares publicado; bacias com série de ENA mais curta têm menos pares."
   ],
   "regra_cobertura": "Ao menos 10 pares.",
   "politica_ausencia": "Menos de 10 pares: sem coeficiente.",
   "validacoes": [
    "n de pares"
   ],
   "limitacoes": [
    "Associação estatística: não identifica causa.",
    "A ENA depende também de chuvas de meses anteriores, solo e regulação a montante."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/reservatorios"
   ],
   "versao_formula": "1.0",
   "id": "agua_balanco_reservatorio",
   "titulo": "Balanço hídrico de 30 dias por reservatório",
   "pergunta": "As entradas e saídas de água explicam a variação do volume do reservatório?",
   "definicao": "Variação do volume útil (hm³) comparada com a afluência menos a defluência acumuladas na janela; turbinamento, vertimento, outras estruturas e transferência publicados como componentes; resíduo explícito.",
   "unidade": "hm³",
   "grao_geografico": "reservatório",
   "grao_temporal": "janela de 30 dias (e dia no CSV)",
   "fontes": [
    "ons_dados_hidrologicos_di",
    "ons_reservatorio_cadastro"
   ],
   "formula": "resíduo = (V%_fim − V%_início) ÷ 100 × V_útil − Σ (Q_afl − Q_defl) × 0,0864",
   "regra_agregacao": "soma diária de vazões × 86.400 s ÷ 10⁶; volume útil total do cadastro",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "reservatório"
   ],
   "regras_comparabilidade": [
    "Tolerância diária: 0,01% do volume útil (arredondamento do percentual) + 0,002 hm³.",
    "Fração de dias dentro da tolerância publicada na janela de 30 dias e, à parte, em toda a série diária disponível (com o período)."
   ],
   "regra_cobertura": "Janela com os 30 dias de afluência e defluência e volume no início e no fim.",
   "politica_ausencia": "Sem volume útil no cadastro ou dia sem dado: sem balanço (nunca completado).",
   "validacoes": [
    "fração de dias com resíduo dentro da tolerância (janela e série)",
    "convenção da defluência detectada por reservatório nos dias com outras estruturas acima de 1 m³/s: defluência não discriminada = defluência − turbinada − vertida (− outras, quando a defluência as inclui); convenção indeterminada = nulo"
   ],
   "limitacoes": [
    "A afluência do ONS é calculada pelo balanço na maioria dos reservatórios: fechar não prova a medição.",
    "Convenção de sinal da transferência não documentada: resíduo com e sem transferência."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/reservatorios"
   ],
   "versao_formula": "1.0",
   "id": "agua_decomposicao_delta_ear",
   "titulo": "Variação da EAR por reservatório",
   "pergunta": "Quais reservatórios explicam a variação do armazenamento do subsistema?",
   "definicao": "Variação de 30 dias da EAR de cada reservatório na parte própria (no subsistema da usina) e a jusante (no subsistema a jusante); a soma reproduz a variação do subsistema.",
   "unidade": "MWmês",
   "grao_geografico": "subsistema e reservatório",
   "grao_temporal": "janela de 30 dias",
   "fontes": [
    "ons_ear_reservatorio_di",
    "ear_subsistema_di",
    "ena_subsistema_di",
    "balanco_energia_subsistema_ho"
   ],
   "formula": "ΔEAR(s) = Σ ΔEAR_própria(r ∈ s) + Σ ΔEAR_jusante(r com jusante em s); resíduo explícito",
   "regra_agregacao": "soma (identidade conferida contra o subsistema da mesma captura)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "reservatório"
   ],
   "regras_comparabilidade": [
    "ENA, geração hidráulica e chuva aparecem como contexto: não fecham balanço com a EAR (produtividades e perímetros diferentes)."
   ],
   "regra_cobertura": "Reservatórios com EAR no início e no fim da janela.",
   "politica_ausencia": "Reservatório sem um dos dias fica fora e o resíduo mostra a falta.",
   "validacoes": [
    "resíduo da decomposição por subsistema"
   ],
   "limitacoes": [
    "Não explica a variação pela ENA isoladamente."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima"
   ],
   "versao_formula": "1.0",
   "id": "agua_ear_faixa_sazonal",
   "titulo": "Faixa sazonal da EAR",
   "pergunta": "O armazenamento está dentro do usual para a data?",
   "definicao": "10º, 50º e 90º percentis do valor do mesmo dia do calendário nos anos completos anteriores, por subsistema, SIN, REE e bacia, em % e em MWmês.",
   "unidade": "% da EAR máxima e MWmês",
   "grao_geografico": "subsistema, SIN, REE, bacia",
   "grao_temporal": "dia do calendário",
   "fontes": [
    "ear_subsistema_di",
    "ons_ear_ree_di",
    "ons_ear_bacia_di"
   ],
   "formula": "quantis tipo 7 de {EAR(ano, dd-mm) : ano = início..ano_ref − 1}",
   "regra_agregacao": "um valor por ano; 29/02 fora da distribuição (como referência usa 28/02)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "recorte",
    "dia"
   ],
   "regras_comparabilidade": [
    "Base desde 2001 (subsistemas, SIN e bacias) e desde 2016 (REE); periodo_base traz o primeiro e o último ano realmente usados e anos_na_base o tamanho amostral.",
    "REE com perímetro mudado na reconfiguração de 29 e 30/12/2017 (SUL, PARANA, NORTE e os novos IGUACU, PARANAPANEMA, MANAUS-AMAPA) só têm base desde 2018 (detecção nos próprios arquivos).",
    "capacidade_mudou_na_base sinaliza, em todos os recortes (subsistemas e SIN inclusive), EAR máxima que variou mais de 5% dentro da base ou cuja mediana difere da atual em mais de 5%."
   ],
   "regra_cobertura": "Anos com valor e EAR máxima positiva no dia do calendário; com menos de 5 anos não há faixa nem percentil.",
   "politica_ausencia": "Ano sem valor fica fora da distribuição. EAR máxima zero (recorte sem armazenamento) = não se aplica: percentual, faixa e percentil nulos.",
   "validacoes": [
    "n por data publicado",
    "faixa = abaixo, dentro ou acima pelos percentis 10 e 90",
    "quebra de perímetro dos REE detectada pela conservação da soma das EAR máximas na repartição"
   ],
   "limitacoes": [
    "Anos com capacidades diferentes têm o mesmo peso.",
    "Faixa não é previsão."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima"
   ],
   "versao_formula": "1.0",
   "id": "agua_ear_max_eventos",
   "titulo": "Mudanças da capacidade de armazenamento",
   "pergunta": "Quando e por que a EAR máxima de cada subsistema mudou?",
   "definicao": "Dias em que a EAR máxima do subsistema variou mais de 0,01 MWmês, com a variação atribuída aos reservatórios cuja EAR máxima (parte própria ou a jusante) entrou, saiu ou mudou no mesmo dia.",
   "unidade": "MWmês",
   "grao_geografico": "subsistema e reservatório",
   "grao_temporal": "evento (dia)",
   "fontes": [
    "ear_subsistema_di",
    "ons_ear_reservatorio_di"
   ],
   "formula": "evento = EARmax(s, d) − EARmax(s, d−1); resíduo = evento − Σ variações dos reservatórios",
   "regra_agregacao": "soma das variações por reservatório no subsistema afetado (parte própria no subsistema da usina; parte a jusante no subsistema a jusante)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "reservatório",
    "data"
   ],
   "regras_comparabilidade": [
    "Até 2017 os valores são inteiros: tolerância de 10 MWmês; desde 2018, 0,05 MWmês."
   ],
   "regra_cobertura": "Todos os dias desde 2000.",
   "politica_ausencia": "Reservatório fora do arquivo não contribui (entrada e saída explícitas).",
   "validacoes": [
    "resíduo de cada evento dentro da tolerância pela precisão do ano"
   ],
   "limitacoes": [
    "Mudança de produtividade (recálculo do ONS) altera a EAR máxima sem obra física."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima"
   ],
   "versao_formula": "1.0",
   "id": "agua_ear_mwmes",
   "titulo": "Energia armazenada em MWmês",
   "pergunta": "Quanta energia está guardada nos reservatórios, em valor absoluto?",
   "definicao": "EAR verificada publicada pelo ONS em MWmês, por subsistema, REE, bacia e reservatório; SIN pela soma dos subsistemas.",
   "unidade": "MWmês",
   "grao_geografico": "subsistema, REE, bacia, reservatório",
   "grao_temporal": "dia (série mensal pelo último dia do mês)",
   "fontes": [
    "ear_subsistema_di",
    "ons_ear_ree_di",
    "ons_ear_bacia_di",
    "ons_ear_reservatorio_di"
   ],
   "formula": "EAR_SIN = Σ EAR(s); série mensal = EAR do último dia do mês",
   "regra_agregacao": "soma (grandeza de estoque); o mês usa o último dia, não a média",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "recorte",
    "dia"
   ],
   "regras_comparabilidade": [
    "MWmês é estoque de energia; não somar com ENA em MWmed sem converter período e produtividade."
   ],
   "regra_cobertura": "Recorte com valor publicado no dia.",
   "politica_ausencia": "Dia sem valor fica vazio.",
   "validacoes": [
    "EAR não negativa",
    "EAR ≤ EAR máxima com folga para volume acima do nível máximo operativo"
   ],
   "limitacoes": [
    "A EAR de um reservatório usa a produtividade acumulada da cascata; muda com usinas novas a jusante.",
    "O ONS revisa dados recentes (consistência recorrente); revisões entram como novas vintages."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima"
   ],
   "versao_formula": "1.0",
   "id": "agua_ear_sin_pct",
   "titulo": "EAR do SIN em % da capacidade",
   "pergunta": "Quanto da capacidade de armazenamento do SIN está ocupado?",
   "definicao": "Soma das energias armazenadas verificadas dos quatro subsistemas dividida pela soma das EAR máximas, no mesmo dia.",
   "unidade": "% da EAR máxima",
   "grao_geografico": "SIN",
   "grao_temporal": "dia",
   "fontes": [
    "ear_subsistema_di",
    "ons_ear_subsistema_conferencia"
   ],
   "numerador": "Σ EAR verificada dos subsistemas (MWmês)",
   "denominador": "Σ EAR máxima dos subsistemas (MWmês)",
   "formula": "EAR_SIN = 100 × Σ EAR(s) ÷ Σ EARmax(s), s ∈ {SE, S, NE, N}",
   "regra_agregacao": "razão de somas ponderada pela capacidade; nunca média dos percentuais",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia"
   ],
   "regras_comparabilidade": [
    "Percentual de capacidades diferentes ao longo do tempo: a EAR máxima mudou várias vezes desde 2000 (ver agua_ear_max_eventos)."
   ],
   "regra_cobertura": "Só dias com os quatro subsistemas; em cada ano vale a captura mais recente do arquivo anual (recaptura do módulo ou silver principal), e a revisão entre as duas fica publicada.",
   "politica_ausencia": "Dia sem algum subsistema fica sem SIN.",
   "validacoes": [
    "percentual publicado por subsistema = EAR ÷ EAR máxima (diferença máxima conferida em toda a série)",
    "soma das bacias e soma dos REE da mesma captura = SIN em MWmês (0,05 MWmês)",
    "soma dos reservatórios por subsistema = subsistema (por ano, com tolerância pela precisão publicada)"
   ],
   "limitacoes": [
    "O Sudeste/Centro-Oeste tem cerca de 70% da capacidade e domina o agregado.",
    "O ONS revisa dados recentes (consistência recorrente); revisões entram como novas vintages."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/afluencia"
   ],
   "versao_formula": "1.0",
   "id": "agua_ena_30d_pct_mlt",
   "titulo": "ENA de 30 dias em % da MLT",
   "pergunta": "A água que chegou nos últimos 30 dias está acima do normal?",
   "definicao": "Soma da ENA bruta diária dos 30 dias dividida pela soma da MLT vigente em cada dia, por subsistema, SIN, REE e bacia.",
   "unidade": "% da MLT",
   "grao_geografico": "subsistema, SIN, REE, bacia",
   "grao_temporal": "janela móvel de 30 dias",
   "fontes": [
    "ena_subsistema_di",
    "ons_ena_subsistema_conferencia",
    "ons_ena_ree_di",
    "ons_ena_bacia_di"
   ],
   "numerador": "Σ ENA bruta diária (MWmed·dia)",
   "denominador": "Σ MLT implícita diária (MWmed·dia)",
   "formula": "ENA30 = 100 × Σ ENA(d) ÷ Σ MLT(d); MLT(d) = ENA(d) ÷ %MLT(d) × 100",
   "regra_agregacao": "razão de somas (equivale a ponderar cada dia pela sua MLT); SIN soma numeradores e denominadores dos subsistemas",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "recorte",
    "dia final da janela"
   ],
   "regras_comparabilidade": [
    "A MLT do conjunto aberto muda (usinas novas, versões novas e retornos a versões anteriores) e difere da MLT do PMO em vários meses (agua_mlt_versao).",
    "Faixa e percentil com a mesma janela nos anos da base (REE afetados pela reconfiguração de 2017 só desde 2018); menos de 5 anos: sem faixa."
   ],
   "regra_cobertura": "Janela com os 30 dias publicados.",
   "politica_ausencia": "Janela com dia ausente não é calculada.",
   "validacoes": [
    "média simples dos percentuais diários calculada só para contraste no teste",
    "percentil frente à mesma janela dos anos da base"
   ],
   "limitacoes": [
    "Janela de 30 dias suaviza eventos curtos.",
    "O ONS revisa dados recentes (consistência recorrente); revisões entram como novas vintages."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/afluencia"
   ],
   "versao_formula": "1.0",
   "id": "agua_mlt_versao",
   "titulo": "Versão da MLT do conjunto aberto",
   "pergunta": "Qual MLT o ONS usa no percentual diário da ENA e ela é a mesma do PMO?",
   "definicao": "Comparação, mês a mês, da MLT implícita no conjunto diário de ENA com a MLT publicada na tabela \"MLT das ENAs (MWmed)\" do Relatório Executivo do PMO; e datas em que a MLT de usinas existentes mudou no conjunto por reservatório.",
   "unidade": "% de diferença e MWmed",
   "grao_geografico": "subsistema e usina",
   "grao_temporal": "mês e evento",
   "fontes": [
    "ena_subsistema_di",
    "ons_ena_reservatorio_di",
    "ons_pmo_relatorio_mlt"
   ],
   "numerador": "MLT implícita do conjunto aberto (MWmed)",
   "denominador": "MLT do PMO (MWmed)",
   "formula": "diferença = 100 × (MLT_aberto ÷ MLT_PMO − 1); revisão = mudança da MLT de uma usina fora do dia 1º; retorno = revisão cujos valores são iguais aos vigentes na mesma data 1 ou 2 anos antes",
   "regra_agregacao": "por subsistema e mês; dias coincidentes quando os quatro subsistemas ficam dentro de 0,05%",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "mês",
    "usina"
   ],
   "regras_comparabilidade": [
    "O PMO publica MWmed inteiros; 0,05% cobre o arredondamento."
   ],
   "regra_cobertura": "Meses com relatório do PMO coletado e extraído.",
   "politica_ausencia": "Mês sem relatório não é comparado.",
   "validacoes": [
    "tabela de 4 subsistemas × 2 meses lida inteira ou descartada",
    "soma das MLT por usina = MLT implícita do subsistema",
    "comparação entre anos pela MLT vigente no último dia do mês (o dia 15 pode cair numa versão provisória)",
    "cita o relatório do PMO do próprio mês e lista todos os que publicam o mês"
   ],
   "limitacoes": [
    "O ONS não publica o período histórico da MLT; a versão é inferida das mudanças observadas, comparadas por igualdade com versões anteriores."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/chuva-e-temperatura"
   ],
   "versao_formula": "1.0",
   "id": "agua_precipitacao_anomalia",
   "titulo": "Anomalia de precipitação",
   "pergunta": "Choveu mais ou menos que o usual para o mês e para os últimos 30 dias?",
   "definicao": "Precipitação do mês (ou dos 30 dias) dividida pela média do mesmo mês (ou mesma janela) em 2001 a 2025, menos 1, em %; percentil na mesma distribuição.",
   "unidade": "%",
   "grao_geografico": "bacia",
   "grao_temporal": "mês e 30 dias",
   "fontes": [
    "clima_precipitacao_bacia"
   ],
   "numerador": "precipitação do período (mm)",
   "denominador": "média do mesmo período em 2001 a 2025 (mm)",
   "formula": "anomalia = 100 × (P ÷ média_2001_2025 − 1)",
   "regra_agregacao": "razão de somas de chuva",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "bacia",
    "mês"
   ],
   "regras_comparabilidade": [
    "Em meses secos a média é pequena e a anomalia percentual fica grande; ler junto com os milímetros."
   ],
   "regra_cobertura": "Mês completo e base com os anos disponíveis (anos_base).",
   "politica_ausencia": "Sem média, sem anomalia.",
   "validacoes": [
    "p10 e p90 da base publicados"
   ],
   "limitacoes": [
    "Anomalia não explica a ENA sozinha.",
    "Associação estatística: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/chuva-e-temperatura"
   ],
   "versao_formula": "1.0",
   "id": "agua_precipitacao_bacia",
   "titulo": "Precipitação média na bacia",
   "pergunta": "Quanto choveu na área de cada bacia hidroenergética?",
   "definicao": "Média ponderada pela área da precipitação diária IMERG (NASA POWER) em pontos de grade dentro do polígono da bacia do ONS.",
   "unidade": "mm/dia (mm no mês e em 30 dias)",
   "grao_geografico": "bacia hidroenergética do ONS",
   "grao_temporal": "dia UTC, mês e 30 dias",
   "fontes": [
    "nasa_power_imerg",
    "ons_bacia_contorno",
    "clima_precipitacao_bacia"
   ],
   "formula": "P(b, d) = Σ cos(lat_i) passo_i² P_i(d) ÷ Σ cos(lat_i) passo_i²",
   "regra_agregacao": "média ponderada pela área; mês = soma dos dias (só mês completo)",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "bacia",
    "dia",
    "mês"
   ],
   "regras_comparabilidade": [
    "Climatologia 2001 a 2025 (não é a normal 1991 a 2020).",
    "Últimos ~3,5 meses em versão IMERG Late (preliminar)."
   ],
   "regra_cobertura": "Dia publicado com ao menos 80% do peso da bacia com dado.",
   "politica_ausencia": "Dia abaixo da cobertura fica vazio; mês incompleto não soma.",
   "validacoes": [
    "não negativa",
    "conferência mensal com estações do ONS em 2020 e 2021 (viés e correlação publicados)"
   ],
   "limitacoes": [
    "Estimativa por satélite, não medição.",
    "Amostragem em grade de 1° (adensada em bacias pequenas), não integral da área.",
    "A bacia SANTA MARIA VIT não tem polígono no shapefile do ONS e fica sem chuva."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/chuva-e-temperatura"
   ],
   "versao_formula": "1.0",
   "id": "agua_previsao_chuva_bacia",
   "titulo": "Previsão de chuva por bacia",
   "pergunta": "Quanto o modelo de previsão espera de chuva em cada bacia nos próximos dias?",
   "definicao": "Precipitação diária prevista pela rodada de 00Z mais recente do ECMWF IFS 0,25° (Open-Meteo, API de rodadas individuais) nos mesmos pontos de grade da estimativa observada, média ponderada pela área; soma de 7 dias e do horizonte, ao lado da média 2001 a 2025 dos mesmos dias pelo IMERG.",
   "unidade": "mm/dia (mm em 7 dias e no horizonte)",
   "grao_geografico": "bacia hidroenergética do ONS",
   "grao_temporal": "dia UTC, rodada",
   "fontes": [
    "clima_previsao",
    "ons_bacia_contorno",
    "clima_precipitacao_bacia"
   ],
   "formula": "P(b, d) = Σ cos(lat_i) passo_i² P_i(d) ÷ Σ cos(lat_i) passo_i²",
   "regra_agregacao": "média ponderada pela área (dia com ao menos 80% do peso); só dias completos da rodada com valor em todas as bacias",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "PREVISTO",
   "dimensoes": [
    "bacia",
    "dia",
    "rodada"
   ],
   "regras_comparabilidade": [
    "Previsão de modelo e climatologia de satélite são produtos diferentes: a comparação é de ordem de grandeza."
   ],
   "regra_cobertura": "Rodada de 00Z de hoje ou de ontem (UTC), publicada até 48 horas depois da emissão.",
   "politica_ausencia": "Rodada indisponível ou lote com falha: nada é agregado e a pendência é publicada.",
   "validacoes": [
    "não negativa",
    "número de pontos devolvidos = pedidos",
    "emissão = rodada pedida"
   ],
   "limitacoes": [
    "Previsão, não observação; substituída a cada rodada.",
    "Sem avaliação de acerto neste módulo."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/chuva-e-temperatura"
   ],
   "versao_formula": "1.0",
   "id": "agua_previsao_temperatura",
   "titulo": "Previsão de temperatura por subsistema",
   "pergunta": "Que temperatura o modelo de previsão espera nas áreas onde está a população de cada subsistema?",
   "definicao": "Temperatura média e máxima diárias previstas pela rodada de 00Z mais recente do ECMWF IFS 0,25° nas mesmas células populosas da estimativa observada, ponderadas pela população (Censo 2022).",
   "unidade": "°C",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "dia UTC, rodada",
   "fontes": [
    "clima_previsao",
    "ibge_localidades_2022",
    "ibge_censo2022_populacao"
   ],
   "formula": "T(UF) = Σ pop_c T_c ÷ Σ pop_c; T(s) = Σ pop_UF T(UF) ÷ Σ pop_UF",
   "regra_agregacao": "média ponderada pela população (80% por UF, 90% por subsistema)",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "PREVISTO",
   "dimensoes": [
    "recorte",
    "dia",
    "rodada"
   ],
   "regras_comparabilidade": [
    "Dia UTC na previsão e hora solar local na reanálise observada; a climatologia ao lado é do MERRA-2."
   ],
   "regra_cobertura": "Mesma rodada da previsão de chuva.",
   "politica_ausencia": "Sem rodada válida, sem previsão (pendência publicada).",
   "validacoes": [
    "intervalo físico",
    "mesmas células e pesos da temperatura observada"
   ],
   "limitacoes": [
    "Previsão, não observação.",
    "Sem avaliação de acerto neste módulo."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/chuva-e-temperatura"
   ],
   "versao_formula": "1.0",
   "id": "agua_temperatura_anomalia",
   "titulo": "Anomalia de temperatura",
   "pergunta": "Os últimos 30 dias foram mais quentes ou mais frios que o usual?",
   "definicao": "Média dos 30 dias menos a média da mesma janela em 2001 a 2025; mensal: média do mês menos a média do mesmo mês na base.",
   "unidade": "°C",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "30 dias e mês",
   "fontes": [
    "clima_temperatura"
   ],
   "formula": "anomalia = T_periodo − média_2001_2025(T_mesmo_periodo)",
   "regra_agregacao": "diferença de médias",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "recorte",
    "período"
   ],
   "regras_comparabilidade": [
    "Base 2001 a 2025."
   ],
   "regra_cobertura": "Janela com os 30 dias.",
   "politica_ausencia": "Janela incompleta não é calculada.",
   "validacoes": [
    "percentil e p10/p90 publicados"
   ],
   "limitacoes": [
    "Reanálise.",
    "Associação estatística: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "gold": "agua_detalhe.json",
   "paginas": [
    "/setor-eletrico/agua-e-clima/chuva-e-temperatura"
   ],
   "versao_formula": "1.0",
   "id": "agua_temperatura_subsistema",
   "titulo": "Temperatura do ar por subsistema",
   "pergunta": "Qual foi a temperatura nas áreas onde está a população de cada subsistema?",
   "definicao": "Temperatura a 2 m (média, máxima e mínima do dia) da reanálise MERRA-2/GEOS-IT (NASA POWER) nas células mais populosas de cada UF, ponderadas pela população; subsistema e SIN ponderados pela população das UF.",
   "unidade": "°C",
   "grao_geografico": "UF, subsistema, SIN",
   "grao_temporal": "dia (hora solar local)",
   "fontes": [
    "nasa_power_merra2",
    "ibge_localidades_2022",
    "ibge_censo2022_populacao",
    "ons_carga_areas_verificacao",
    "clima_temperatura"
   ],
   "formula": "T(UF) = Σ pop_c T_c ÷ Σ pop_c; T(s) = Σ pop_UF T(UF) ÷ Σ pop_UF",
   "regra_agregacao": "média ponderada pela população (Censo 2022)",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "recorte",
    "dia"
   ],
   "regras_comparabilidade": [
    "Mapeamento UF → subsistema de 2026 (conferido contra a carga verificada por área do ONS) aplicado a toda a série.",
    "Últimos 60 dias marcados como preliminares (GEOS-IT antes da substituição pelo MERRA-2)."
   ],
   "regra_cobertura": "UF: células com ao menos 80% da população escolhida; subsistema: ao menos 90% da população.",
   "politica_ausencia": "Abaixo da cobertura, dia vazio.",
   "validacoes": [
    "intervalo físico",
    "soma das áreas de carga do ONS por subsistema reproduz a carga do subsistema (mapeamento)"
   ],
   "limitacoes": [
    "Reanálise, não estação; INMET inacessível em 30/09/2026 impediu a conferência com observação.",
    "Células escolhidas cobrem cerca de metade da população de cada UF."
   ],
   "arquivo": "pipeline/energia/metricas/agua.py"
  },
  {
   "id": "carga_decomposicao_contribuicao",
   "titulo": "Contribuição de calendário, temperatura, sazonalidade e tendência (decomposição estatística)",
   "pergunta": "Quanto da variação da carga é compatível com clima e calendário, segundo um modelo estatístico?",
   "definicao": "Mudança na previsão de ln(carga) de um modelo de regressão estimado só com dias anteriores, atribuída a cada grupo de variáveis (β × diferença das médias das variáveis do grupo). Resíduo = diferença real − diferença prevista. Não é efeito causal nem percentual explicado.",
   "unidade": "log × 100 (aproximadamente pontos percentuais)",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "diário e janelas",
   "fontes": [
    "carga_energia_di",
    "nasa_power_temperatura",
    "ibge_populacao_uf_6579",
    "ibge_centroides_capitais",
    "senado_leis_feriados"
   ],
   "formula": "contribuição_g = 100 × Σ_{j∈g} β_j (x̄_j,A − x̄_j,B); resíduo = 100 × (ȳ_A − ȳ_B) − Σ_g contribuição_g",
   "regra_agregacao": "Soma dentro de cada grupo; médias de ln(carga) nos dias das janelas.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "subsistema",
    "variante do modelo",
    "janela"
   ],
   "regras_comparabilidade": [
    "Contribuições de variantes diferentes não se somam.",
    "Com temperatura ausente em parte da janela, a decomposição usa o maior trecho inicial com todas as variáveis e o informa."
   ],
   "regra_cobertura": "Dias com carga aceita, temperatura do dia e do dia anterior.",
   "politica_ausencia": "Dia sem temperatura fica fora do modelo; nada é interpolado.",
   "validacoes": [
    "Backtest com origens mensais fora da amostra e comparação com a referência de 364 dias.",
    "Sensibilidade a seis especificações."
   ],
   "limitacoes": [
    "Associação estatística, não causa.",
    "Temperatura de reanálise, não observação de estação."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "carga_decomposicao_erro",
   "titulo": "Erro fora da amostra da decomposição estatística",
   "pergunta": "Quão bem o modelo de clima e calendário reproduz a carga em dias que não viu?",
   "definicao": "Erro percentual absoluto médio, viés, erro absoluto em MWmed e cobertura dos intervalos de 80% e 95%, nos dias de cada mês previstos pelo modelo estimado só com os dias anteriores ao mês.",
   "unidade": "% e MWmed",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "diário, agregado no período de avaliação",
   "fontes": [
    "carga_energia_di",
    "nasa_power_temperatura",
    "ibge_populacao_uf_6579",
    "ibge_centroides_capitais"
   ],
   "formula": "MAPE = 100 × média |real ÷ previsto − 1|; viés = 100 × média (real ÷ previsto − 1)",
   "regra_agregacao": "Média simples entre dias previstos.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "subsistema",
    "variante",
    "origem"
   ],
   "regras_comparabilidade": [
    "Comparável entre variantes só no mesmo período de avaliação (mesmas origens).",
    "A referência ingênua (mesmo dia da semana 364 dias antes) é publicada junto."
   ],
   "regra_cobertura": "Origens mensais desde 01/05/2024 com pelo menos 300 dias de treino.",
   "politica_ausencia": "Dia sem previsão (temperatura ausente) fica fora da métrica e da contagem.",
   "validacoes": [
    "Treino estritamente anterior a cada origem (sem olhar o futuro)."
   ],
   "limitacoes": [
    "Usa a temperatura realizada: mede decomposição, não previsão de carga.",
    "Cobertura empírica abaixo da nominal é publicada, não corrigida."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "carga_media_anual",
   "titulo": "Carga média anual e variação entre anos completos",
   "pergunta": "Quanto o sistema consumiu em média em cada ano e quanto isso mudou?",
   "definicao": "Média da carga diária do ano. A variação só é publicada entre dois anos completos inteiramente no mesmo regime do ONS; o ano corrente entra como acumulado até o último dia contra o mesmo período do ano anterior deslocado 364 dias.",
   "unidade": "MWmed e %",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "anual",
   "fontes": [
    "carga_energia_di"
   ],
   "formula": "média anual = Σ carga diária ÷ dias com dado; variação = 100 × (média do ano ÷ média do ano anterior − 1)",
   "regra_agregacao": "Média dos dias (cada dia tem o mesmo peso de 24 horas).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "subsistema"
   ],
   "regras_comparabilidade": [
    "Só compara períodos dentro do mesmo regime do ONS: até 28/02/2021; de 01/03/2021 a 28/04/2023; desde a inclusão da estimativa de MMGD, declarada para 29/04/2023 e observada nos dados em 01/05/2023 (29 e 30/04/2023 são transição e não entram em variação). Variação que atravessa uma dessas datas não é publicada.",
    "Ano parcial não é comparado com ano completo; o acumulado do ano usa o mesmo período do ano anterior.",
    "Variação de carga é observação; não é atribuída à atividade econômica sem evidência adicional."
   ],
   "regra_cobertura": "Ano completo = todos os dias com o SIN (quatro subsistemas aceitos).",
   "politica_ausencia": "Dia em quarentena (validação física) ou ausente fica sem valor: nunca zero, nunca repetido. Janela com dia ausente não tem média nem variação.",
   "validacoes": [
    "Validação física antes da publicação: F1 (valor positivo, domínio do dicionário do ONS), F2 (faixa plausível do subsistema), F3 (salto sobre a mediana da semana anterior). Valor que viola F2 ou F3 é conferido nos componentes do Balanço de Energia nos Subsistemas do ONS (C1: nenhum componente de geração com lacuna no dia e carga do balanço igual ao valor); sem confirmação, quarentena. A curva horária não confere: é o mesmo produto em outro grão.",
    "Registros esperados (A1): todo dia entre o primeiro e o último dia publicado, por subsistema; dia ausente é registrado com o estado conferido no arquivo atual da fonte (célula vazia ou linha ausente) e publicado vazio.",
    "Média das 24 horas da curva horária conferida contra a carga diária (tolerância de 0,01 MWmed; os dias que diferem são publicados em p025.revisoes.curva_contra_diaria)."
   ],
   "limitacoes": [
    "2021 e 2023 misturam dois regimes: não têm variação contra o ano anterior nem o seguinte."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "carga_mmgd_participacao",
   "titulo": "Parcela da carga global atendida por MMGD (estimativa do ONS)",
   "pergunta": "Qual parcela da carga é suprida pela micro e minigeração distribuída, segundo a estimativa do ONS?",
   "definicao": "Energia de MMGD estimada pelo ONS dividida pela carga global verificada, nas mesmas horas, na API de carga verificada. Carga líquida de MMGD = carga global − MMGD, identidade publicada pelo ONS e conferida em cada meia hora.",
   "unidade": "% da carga global",
   "grao_geografico": "submercado e SIN",
   "grao_temporal": "hora, dia e mês",
   "fontes": [
    "ons_carga_verificada_ho"
   ],
   "formula": "100 × Σ MMGD (MWh) ÷ Σ carga global (MWh)",
   "numerador": "energia de MMGD estimada (MWh)",
   "denominador": "carga global verificada (MWh)",
   "regra_agregacao": "Razão de somas de energia nas mesmas horas (nunca média de percentuais).",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês",
    "hora"
   ],
   "regras_comparabilidade": [
    "Não se aplica à carga diária nem à curva de carga: a carga global da API é outra grandeza (maior, sobretudo à noite).",
    "Nenhuma dupla contagem: a MMGD da API nunca é somada à curva (que já inclui uma estimativa de MMGD, declarada para 29/04/2023 e observada nos dados em 01/05/2023) nem subtraída dela."
   ],
   "regra_cobertura": "Horas com as duas meias horas de carga global e de MMGD; mês completo quando todos os dias têm 24 horas.",
   "politica_ausencia": "Antes de 15/02/2019 a MMGD vem vazia na API: ausência, não zero. Dia em curso na captura é descartado.",
   "validacoes": [
    "Identidade carga global = líquida + MMGD em cada meia hora (0,01 MWmed).",
    "MMGD não negativa (dicionário do ONS).",
    "Energia diária por submercado conferida contra o arquivo do módulo Transição (mesma API, outro código; 0,1 MWh)."
   ],
   "limitacoes": [
    "A MMGD é estimativa do ONS, não medição.",
    "A API não informa o método de estimativa; as notas da carga diária falam em dados meteorológicos previstos."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "carga_perfil_tipico",
   "titulo": "Perfil horário típico por mês e tipo de dia",
   "pergunta": "Como a carga se distribui ao longo do dia num mês típico?",
   "definicao": "Média, hora a hora, dos dias completos de uma classe (dia útil; sábado; domingo ou feriado nacional, Paixão e Carnaval) no mês, para a carga da curva e, separadamente, para a carga global, a MMGD e a carga líquida da API.",
   "unidade": "MWmed",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "hora do dia, por mês",
   "fontes": [
    "ons_curva_carga_ho",
    "ons_carga_verificada_ho",
    "senado_leis_feriados"
   ],
   "formula": "perfil(h) = Σ_dias carga(d, h) ÷ número de dias completos da classe",
   "regra_agregacao": "Média simples entre dias (todos com 24 horas).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "classe do dia",
    "hora",
    "subsistema",
    "série"
   ],
   "regras_comparabilidade": [
    "Curva (carga) e API (carga global) são produtos diferentes: aparecem lado a lado, nunca subtraídos um do outro.",
    "Só compara períodos dentro do mesmo regime do ONS: até 28/02/2021; de 01/03/2021 a 28/04/2023; desde a inclusão da estimativa de MMGD, declarada para 29/04/2023 e observada nos dados em 01/05/2023 (29 e 30/04/2023 são transição e não entram em variação). Variação que atravessa uma dessas datas não é publicada."
   ],
   "regra_cobertura": "Dias com as 24 horas; a quantidade de dias de cada média é publicada.",
   "politica_ausencia": "Classe sem dia completo no mês não tem perfil.",
   "validacoes": [
    "Média das 24 horas da curva horária conferida contra a carga diária (tolerância de 0,01 MWmed; os dias que diferem são publicados em p025.revisoes.curva_contra_diaria)."
   ],
   "limitacoes": [
    "Classe de dia pelo calendário nacional: feriados estaduais e municipais não entram."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "carga_pico_horario",
   "titulo": "Pico horário diário da carga e hora do pico",
   "pergunta": "Quando ocorre o pico de carga e de que tamanho ele é?",
   "definicao": "Maior valor horário da Curva de Carga Horária do ONS no dia e a hora local (início da hora) em que ocorreu. Para o SIN, o máximo da soma dos quatro subsistemas hora a hora, não a soma dos picos.",
   "unidade": "MWmed (na hora) e hora 0 a 23",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "diário (a partir de valores horários)",
   "fontes": [
    "ons_curva_carga_ho"
   ],
   "formula": "pico = max_h carga(h); hora = argmax_h (empate: primeira hora)",
   "regra_agregacao": "Máximo diário; distribuição anual = contagem de dias por hora do pico.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "subsistema",
    "ano"
   ],
   "regras_comparabilidade": [
    "Só compara períodos dentro do mesmo regime do ONS: até 28/02/2021; de 01/03/2021 a 28/04/2023; desde a inclusão da estimativa de MMGD, declarada para 29/04/2023 e observada nos dados em 01/05/2023 (29 e 30/04/2023 são transição e não entram em variação). Variação que atravessa uma dessas datas não é publicada.",
    "Antes de 2019 havia horário de verão: a hora local do pico se desloca uma hora nesses meses."
   ],
   "regra_cobertura": "Dia com as 24 horas. No início do horário de verão (até 2018) a hora das 00h não existe: a fonte deixa a célula vazia ou põe zero, o zero é lido como ausência, e o dia fica com 23 horas, sem pico e sem média.",
   "politica_ausencia": "Dia incompleto não tem pico; valor horário zero ou negativo na fonte é ausência (a carga de um subsistema inteiro não é zero).",
   "validacoes": [
    "Média das 24 horas da curva horária conferida contra a carga diária (tolerância de 0,01 MWmed; os dias que diferem são publicados em p025.revisoes.curva_contra_diaria)."
   ],
   "limitacoes": [
    "Desde a inclusão da MMGD estimada (declarada para 29/04/2023, observada nos dados em 01/05/2023) a curva a inclui, o que desloca a forma da curva ao meio-dia; o pico da carga líquida está no painel de MMGD."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "carga_revisao",
   "titulo": "Revisão da carga diária entre capturas",
   "pergunta": "Quanto a fonte mudou um valor já publicado?",
   "definicao": "Diferença entre o valor de uma carga diária numa captura e o valor da captura anterior do mesmo arquivo, em MWmed e em % do valor anterior; correção de valor fora do domínio é marcada à parte.",
   "unidade": "MWmed e %",
   "grao_geografico": "subsistema",
   "grao_temporal": "diário, por captura",
   "fontes": [
    "carga_energia_di"
   ],
   "formula": "diferença = valor(captura k) − valor(captura k − 1); % = 100 × diferença ÷ valor(captura k − 1)",
   "regra_agregacao": "Sem agregação; resumo por mediana (com número par de revisões, média dos dois valores centrais) e máximo do valor absoluto das diferenças percentuais, só nas revisões com valor anterior positivo.",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "dia",
    "captura"
   ],
   "regras_comparabilidade": [
    "Só compara capturas do mesmo arquivo anual; a percentagem não é calculada quando o valor anterior é zero ou negativo."
   ],
   "regra_cobertura": "Capturas integradas no silver (a primeira captura de cada arquivo não tem revisão).",
   "politica_ausencia": "Valor que some numa captura posterior não é revisão para zero: não gera linha.",
   "validacoes": [
    "Revisões lidas das vintages do silver, que só gravam valor novo ou alterado."
   ],
   "limitacoes": [
    "O silver só conhece as capturas feitas pelo observatório; revisões entre duas capturas ficam agregadas."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "carga_variacao_equivalente",
   "titulo": "Variação da carga contra os mesmos dias da semana do ano anterior",
   "pergunta": "Quanto a carga mudou em relação ao mesmo período do ano passado, com a mesma composição de dias?",
   "definicao": "Média da carga diária numa janela (7 dias, 28 dias, mês corrente, último mês completo ou 52 semanas) dividida pela média da mesma janela deslocada 364 dias (52 semanas: mesmos dias da semana), menos 1. Publicada ao lado da comparação com as mesmas datas do calendário e da composição de dias úteis, sábados e domingos ou feriados das duas.",
   "unidade": "%",
   "grao_geografico": "subsistema (SE/CO, S, NE, N) e SIN",
   "grao_temporal": "janela diária móvel",
   "fontes": [
    "carga_energia_di"
   ],
   "formula": "100 × (média(janela) ÷ média(janela − 364 dias) − 1)",
   "numerador": "média da carga diária na janela (MWmed)",
   "denominador": "média da carga diária na janela deslocada 364 dias (MWmed)",
   "regra_agregacao": "Média aritmética de valores diários em MWmed (todos os dias têm 24 horas; SIN = soma dos quatro subsistemas no dia).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "janela",
    "tipo de comparação (mesmas datas ou equivalente)"
   ],
   "regras_comparabilidade": [
    "Só compara períodos dentro do mesmo regime do ONS: até 28/02/2021; de 01/03/2021 a 28/04/2023; desde a inclusão da estimativa de MMGD, declarada para 29/04/2023 e observada nos dados em 01/05/2023 (29 e 30/04/2023 são transição e não entram em variação). Variação que atravessa uma dessas datas não é publicada.",
    "Feriado nacional que cai em dia útil num ano e no fim de semana no outro torna o calendário não equivalente; o indicador marca calendario_equivalente = falso.",
    "Variação de carga é observação; não é atribuída à atividade econômica sem evidência adicional."
   ],
   "regra_cobertura": "Todos os dias das duas janelas presentes e aceitos pela validação física.",
   "politica_ausencia": "Dia em quarentena (validação física) ou ausente fica sem valor: nunca zero, nunca repetido. Janela com dia ausente não tem média nem variação.",
   "validacoes": [
    "Validação física antes da publicação: F1 (valor positivo, domínio do dicionário do ONS), F2 (faixa plausível do subsistema), F3 (salto sobre a mediana da semana anterior). Valor que viola F2 ou F3 é conferido nos componentes do Balanço de Energia nos Subsistemas do ONS (C1: nenhum componente de geração com lacuna no dia e carga do balanço igual ao valor); sem confirmação, quarentena. A curva horária não confere: é o mesmo produto em outro grão.",
    "Registros esperados (A1): todo dia entre o primeiro e o último dia publicado, por subsistema; dia ausente é registrado com o estado conferido no arquivo atual da fonte (célula vazia ou linha ausente) e publicado vazio.",
    "Média das 24 horas da curva horária conferida contra a carga diária (tolerância de 0,01 MWmed; os dias que diferem são publicados em p025.revisoes.curva_contra_diaria)."
   ],
   "limitacoes": [
    "Mesmos dias da semana não igualam temperatura nem eventos locais: a decomposição estatística trata a temperatura.",
    "Os dias mais recentes são revisados pelo ONS depois da publicação."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "conta_bandeira_adicional",
   "titulo": "Bandeira tarifária acionada e adicional por patamar",
   "pergunta": "Qual bandeira vigorou em cada mês e quanto ela acrescenta por kWh?",
   "definicao": "Bandeira acionada pela ANEEL para cada mês de competência e o adicional por MWh consumido definido na resolução vigente para cada patamar.",
   "unidade": "R$/MWh",
   "grao_geografico": "Sistema Interligado Nacional (consumidores cativos, exceto sistemas isolados)",
   "grao_temporal": "mensal",
   "fontes": [
    "aneel_bandeiras_tarifarias"
   ],
   "regra_agregacao": "Valor publicado; contagem de meses por patamar e ano.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "mês",
    "patamar"
   ],
   "regras_comparabilidade": [
    "Adicionais mudam por resolução: comparar meses de resoluções diferentes exige a tabela de adicionais."
   ],
   "regra_cobertura": "Meses publicados no recurso de acionamento.",
   "politica_ausencia": "Mês não publicado não é preenchido nem repetido.",
   "validacoes": [
    "Valor acionado confere com a tabela de adicionais do mesmo conjunto (no mês de referência e na série inteira; divergências históricas ficam listadas).",
    "Adicional da amarela confere com a página oficial da ANEEL (R$ 0,01885/kWh)."
   ],
   "limitacoes": [
    "O dicionário descreve o campo como reais por kWh, mas os valores são R$/MWh."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_cde_custeio",
   "titulo": "Orçamento anual da CDE: quem paga e para onde vai",
   "pergunta": "Quanto a CDE prevê movimentar por ano, quanto vem das quotas cobradas nas tarifas e quanto vai para a Tarifa Social e os descontos tarifários?",
   "definicao": "Orçamento anual da Conta de Desenvolvimento Energético (aprovado ou previsto pela ANEEL, não execução) por rubrica de despesa e de receita, como publicado no conjunto de custeio dos benefícios tarifários, agrupado pelo nome da rubrica (Tarifa Social, descontos tarifários, CCC e Luz para Todos, outras despesas; quotas da CDE, outras receitas). Participação das quotas = quotas ÷ receita total do ano; da Tarifa Social = rubrica Subsídio Baixa Renda ÷ despesa total do ano.",
   "unidade": "R$ nominais e %",
   "grao_geografico": "nacional (conta setorial)",
   "grao_temporal": "anual",
   "fontes": [
    "aneel_cde_custeio"
   ],
   "formula": "quotas_pct = Σ 'Quotas CDE ...' ÷ Σ receitas × 100; tarifa_social_pct = 'Subsídio Baixa Renda' ÷ Σ despesas × 100",
   "numerador": "Σ rubricas do grupo (R$)",
   "denominador": "Σ receitas ou Σ despesas do ano (R$)",
   "regra_agregacao": "Soma de valores publicados no mesmo ano; rubrica sem valor não entra.",
   "versao_formula": "2",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "PREVISTO",
   "dimensoes": [
    "ano",
    "tipo (despesa, receita)",
    "rubrica",
    "grupo"
   ],
   "regras_comparabilidade": [
    "Valores nominais: comparar anos distantes exige correção monetária.",
    "Não somar com o conjunto de subsídios tarifários: um é o valor anual da conta por rubrica, o outro são repasses mensais por distribuidora.",
    "Descontos tarifários não são transferências a famílias; a Tarifa Social é."
   ],
   "regra_cobertura": "Anos publicados no conjunto (2013 em diante).",
   "politica_ausencia": "Rubrica publicada sem valor fica nula e listada no ano; nunca vira zero.",
   "validacoes": [
    "Controle interno: Σ despesas = Σ receitas em cada ano (tolerância R$ 1), identidade do orçamento em que a quota cobre a diferença.",
    "Reconciliação externa: despesa total do ano contra o orçamento divulgado pela ANEEL (2023, 2025 e 2026), com tolerância de meia unidade da última casa publicada.",
    "Rubrica repetida no mesmo ano com valor diferente é contada (nenhuma em 30/09/2026)."
   ],
   "limitacoes": [
    "São valores de orçamento (aprovados ou previstos), não o que a CDE efetivamente arrecadou e gastou.",
    "A reconciliação externa usa o título das notícias oficiais; o corpo das páginas estava restrito no gov.br em 30/09/2026.",
    "Agrupamento pelo nome da rubrica é do observatório."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_composicao_grupo",
   "titulo": "Composição da tarifa B1 por grupo de componentes",
   "pergunta": "Para onde vai o valor pago por kWh: energia, transmissão, distribuição, perdas ou encargos?",
   "definicao": "Soma das componentes tarifárias oficiais da TE e da TUSD de aplicação B1 residencial, agrupadas por código em energia comprada, transmissão e conexão, distribuição (fio B), perdas e receitas irrecuperáveis, encargos setoriais, outros ajustes e créditos. Valor negativo em componente de custo cuja natureza não admite sinal negativo (TE_CFURH) sai do grupo do código e vai para créditos, com a origem provável declarada (repasse da repactuação da UBP). O agrupamento é do observatório; cada código fica visível.",
   "unidade": "R$/MWh e % da tarifa",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "vigência",
   "fontes": [
    "aneel_componentes_tarifarias",
    "aneel_tarifas_aplicacao"
   ],
   "formula": "grupo(g) = Σ componentes com GRUPO(código, valor) = g; participação = grupo ÷ (TE + TUSD); composição média = Σ distribuidoras grupo(g) ÷ Σ distribuidoras (TE + TUSD)",
   "numerador": "Σ das componentes do grupo (R$/MWh)",
   "denominador": "TE + TUSD de aplicação (R$/MWh)",
   "regra_agregacao": "Por distribuidora. Resumo nacional que fecha com o total: média simples entre distribuidoras, com participação pela razão de somas. A mediana de cada grupo também é publicada, mas as medianas não somam o total e não se usam como composição.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "grupo",
    "componente"
   ],
   "regras_comparabilidade": [
    "Componentes já estão dentro da TE e da TUSD: nada é somado por fora.",
    "Componentes negativas (devoluções) reduzem o grupo e são mantidas; valor negativo em componente de custo listada em composicao.creditos vai para o grupo créditos.",
    "Mediana de grupo não é parcela da tarifa mediana; composição que soma o total é a média (razão de somas)."
   ],
   "regra_cobertura": "Distribuidoras com tarifa B1 vigente e componentes publicadas para o mesmo ato e vigência.",
   "politica_ausencia": "Componente ausente não vira zero; distribuidora sem componentes para o ato vigente fica listada em reconciliacao.sem_componentes.",
   "validacoes": [
    "Soma das parcelas = TE e TUSD publicadas no próprio conjunto (tolerância 0,01 R$/MWh).",
    "TE e TUSD do conjunto de componentes = TE e TUSD do conjunto de tarifas (tolerância 0,005 R$/MWh).",
    "Grupo de custo com soma negativa, parcela CDE maior que os encargos e componente atípica (sinal contrário ao grupo de custo ou módulo mais de 10 vezes a mediana da componente, com pelo menos 5% da tarifa) viram ressalva visível, conferida no arquivo original."
   ],
   "limitacoes": [
    "O PRORET 7.1, que define as componentes, não pôde ser lido (acesso bloqueado); o grupo é classificação do observatório.",
    "A leitura do valor negativo de TE_CFURH como crédito do repasse da UBP é do observatório, apoiada na lista de distribuidoras divulgada pela ANEEL em 11/08/2026.",
    "Tributos e iluminação pública não fazem parte da tarifa."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_custo_perfil",
   "titulo": "Custo da energia para um perfil de consumo de referência",
   "pergunta": "Quanto custaria, antes de tributos, consumir 100, 200 ou 300 kWh em cada distribuidora?",
   "definicao": "Consumo do perfil (kWh/mês) multiplicado pela tarifa de aplicação B1 residencial convencional. Perfis definidos pelo observatório para comparação; não são consumo médio. Sem ICMS, PIS/Pasep, Cofins, contribuição de iluminação pública e bandeira.",
   "unidade": "R$/mês",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "vigência",
   "fontes": [
    "aneel_tarifas_aplicacao"
   ],
   "formula": "kWh_perfil × (TE + TUSD) ÷ 1000",
   "numerador": "kWh do perfil × (TE + TUSD) em R$/MWh",
   "denominador": "1000 kWh por MWh",
   "regra_agregacao": "Por distribuidora; resumo nacional pela mediana da tarifa aplicada ao perfil.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "perfil (100, 200, 300 kWh)"
   ],
   "regras_comparabilidade": [
    "Mesmo perfil e mesma data de referência para todas as distribuidoras.",
    "Perfis a partir de 100 kWh não são afetados pelo custo de disponibilidade (mínimo de 30, 50 ou 100 kWh)."
   ],
   "regra_cobertura": "Igual à da tarifa B1.",
   "politica_ausencia": "Distribuidora sem vigência cobrindo a data fica fora e é listada em sem_vigente; TE e TUSD iguais a zero na mesma linha (',00' na fonte) são tarifa não homologada para a subclasse e não entram; nunca se repete a vigência anterior.",
   "validacoes": [
    "Custo = perfil × tarifa conferido por releitura do CSV original no teste."
   ],
   "limitacoes": [
    "Sem bandeira: a bandeira vigente é mostrada à parte.",
    "Não inclui descontos sociais."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_parcela_cde_tarifa",
   "titulo": "Componentes CDE dentro da tarifa B1 residencial",
   "pergunta": "Quanto da tarifa residencial de aplicação corresponde às componentes da CDE?",
   "definicao": "Soma das componentes tarifárias com CDE no código (TUSD_CDE, TUSD_CDE_COVID, TE_CDE_ELET, TE_CDE_GD, TE_CDE_COVID) publicadas para a tarifa de aplicação B1 residencial convencional vigente, e a sua participação em TE + TUSD. É subconjunto do grupo de encargos setoriais, não item adicional.",
   "unidade": "R$/MWh e % da tarifa",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "vigência",
   "fontes": [
    "aneel_componentes_tarifarias",
    "aneel_tarifas_aplicacao"
   ],
   "formula": "cde = Σ componentes com CDE no código; participação = cde ÷ (TE + TUSD) × 100",
   "numerador": "Σ componentes CDE (R$/MWh)",
   "denominador": "TE + TUSD de aplicação (R$/MWh)",
   "regra_agregacao": "Por distribuidora; resumo nacional pela mediana entre distribuidoras (em R$/MWh e em % separadamente, sem ponderação) e pela razão de somas (Σ CDE ÷ Σ tarifa), que é a participação comparável à composição média.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora"
   ],
   "regras_comparabilidade": [
    "Não somar ao grupo de encargos: já está dentro dele.",
    "Componentes CDE negativas (devoluções) reduzem a soma e são mantidas."
   ],
   "regra_cobertura": "Distribuidoras com tarifa B1 vigente e componentes publicadas para o ato vigente.",
   "politica_ausencia": "Sem nenhuma componente CDE publicada, o valor fica nulo (não zero).",
   "validacoes": [
    "Mesmas conferências da composição: parcelas somam TE e TUSD e conferem com o conjunto de tarifas."
   ],
   "limitacoes": [
    "A finalidade de cada código (quota anual, CDE Covid, CDE GD, CDE Eletrobras) está no PRORET, que não pôde ser lido; a soma não é atribuída a programa específico."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_simulacao",
   "titulo": "Estimativa do valor da energia na fatura (simulador)",
   "pergunta": "Como o valor da energia na minha conta varia com o consumo, a classe e a bandeira?",
   "definicao": "Estimativa mensal para uma unidade de baixa tensão: energia faturada pelas faixas da classe (Tarifa Social: 100% de desconto até 80 kWh; Desconto Social: faixa sem CDE até 120 kWh), custo de disponibilidade (30, 50 ou 100 kWh) onde se aplica, e adicional de bandeira por kWh consumido. Sem ICMS, PIS/Pasep, Cofins, contribuição de iluminação pública.",
   "unidade": "R$/mês",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "vigência na data de referência",
   "fontes": [
    "aneel_tarifas_aplicacao",
    "aneel_bandeiras_tarifarias",
    "normas_conta"
   ],
   "formula": "Σ faixas (kWh da faixa × (TE + TUSD) da faixa ÷ 1000) − descontos + kWh sujeitos à bandeira × adicional ÷ 1000",
   "regra_agregacao": "Não se agrega: é uma estimativa por cenário.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "distribuidora",
    "classe",
    "consumo (kWh)",
    "tipo de ligação",
    "bandeira"
   ],
   "regras_comparabilidade": [
    "Resultado rotulado como estimativa sem tributos; não é a fatura."
   ],
   "regra_cobertura": "Distribuidoras com tarifa da classe publicada na vigência; classe sem tarifa devolve indisponível com motivo.",
   "politica_ausencia": "Tarifa da classe ausente torna a simulação indisponível para aquela classe; não se usa tarifa de outra classe.",
   "validacoes": [
    "Casos de referência calculados no pipeline (casos_referencia) devem ser reproduzidos pela interface.",
    "Trechos das normas conferidos a cada captura (simulador.normas); o estado de cada regra separa o trecho normativo conferido da leitura aplicada (simulador.regras_texto[].partes)."
   ],
   "limitacoes": [
    "Desconto Social por parcela e bandeira na Tarifa Social são leituras declaradas (REN não lida por bloqueio de acesso).",
    "Custo de disponibilidade da Tarifa Social acima de 80 kWh não modelado (regra não conferida)."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_subsidio_anual",
   "titulo": "Subsídios tarifários custeados pela CDE por categoria",
   "pergunta": "Quanto a CDE repassa às distribuidoras para cobrir descontos tarifários, e para quais categorias?",
   "definicao": "Soma, por ano de competência, dos repasses mensais homologados (montante Total = previsão + ajuste) a todas as distribuidoras, por categoria de desconto. Não são transferências a famílias; a Tarifa Social não integra o conjunto.",
   "unidade": "R$ nominais",
   "grao_geografico": "nacional e distribuidora",
   "grao_temporal": "anual (competência)",
   "fontes": [
    "aneel_subsidios_tarifarios"
   ],
   "formula": "Σ distribuidoras Σ meses do ano do repasse Total da categoria",
   "regra_agregacao": "Soma de valores monetários nominais; a linha de categoria Total publicada é usada só como conferência.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "categoria",
    "distribuidora"
   ],
   "regras_comparabilidade": [
    "Valores nominais: comparar anos distantes exige correção monetária.",
    "Ano com menos de 12 meses de competência é parcial."
   ],
   "regra_cobertura": "Competências até o mês de referência; competências futuras homologadas ficam fora.",
   "politica_ausencia": "Célula vazia não entra na soma e não vira zero.",
   "validacoes": [
    "Categorias somam o Total publicado por distribuidora e mês (tolerância R$ 0,05).",
    "Total = previsão + ajuste por categoria (tolerância R$ 0,05)."
   ],
   "limitacoes": [
    "Valores homologados em resolução, não desembolso realizado."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_tarifa_b1_aplicacao",
   "titulo": "Tarifa de aplicação residencial B1 convencional",
   "pergunta": "Quanto a distribuidora cobra por kWh de um consumidor residencial comum, antes de tributos?",
   "definicao": "Soma da Tarifa de Energia (TE) e da Tarifa de Uso do Sistema de Distribuição (TUSD) de aplicação homologadas pela ANEEL para o subgrupo B1, subclasse residencial, modalidade convencional, na vigência que cobre a data de referência. Sem ICMS, PIS/Pasep, Cofins, contribuição de iluminação pública e bandeira.",
   "unidade": "R$/MWh (divida por 1000 para R$/kWh)",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "vigência (resolução homologatória)",
   "fontes": [
    "aneel_tarifas_aplicacao"
   ],
   "formula": "TE_aplicação + TUSD_aplicação",
   "regra_agregacao": "Não se soma entre distribuidoras. Resumo nacional = mediana, 25º e 75º percentis entre distribuidoras (quantil tipo 7), sem ponderação por consumo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "vigência",
    "base tarifária (aplicação ou base econômica)"
   ],
   "regras_comparabilidade": [
    "Só compara a mesma modalidade (convencional), subgrupo e subclasse.",
    "Tarifa de aplicação e base econômica não se misturam.",
    "Não é tarifa média de fornecimento nem conta final."
   ],
   "regra_cobertura": "Distribuidoras com linha B1 residencial convencional de aplicação, unidade MWh, cuja vigência cobre a data de referência.",
   "politica_ausencia": "Distribuidora sem vigência cobrindo a data fica fora e é listada em sem_vigente; TE e TUSD iguais a zero na mesma linha (',00' na fonte) são tarifa não homologada para a subclasse e não entram; nunca se repete a vigência anterior.",
   "validacoes": [
    "TE e TUSD iguais no conjunto de tarifas e no de componentes (tolerância 0,005 R$/MWh).",
    "Unidade MWh conferida linha a linha; linha em kW fica fora e é contada.",
    "Vigências sobrepostas com valores diferentes resolvidas pela regra publicada e listadas em conflitos_fonte."
   ],
   "limitacoes": [
    "Mediana entre distribuidoras não representa o consumidor médio do país.",
    "Permissionárias com vigência encerrada e sucessora ainda não publicada no conjunto ficam fora na data."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "id": "conta_variacao_tarifa_b1",
   "titulo": "Variação da tarifa B1 entre vigências e comparação com o IPCA",
   "pergunta": "Quanto a tarifa residencial mudou em cada ato e em relação à inflação do mesmo período?",
   "definicao": "Variação percentual da tarifa de aplicação B1 residencial convencional (TE + TUSD) entre pedaços contíguos da linha do tempo; comparação com o IPCA do IBGE no mesmo intervalo (índices do mês anterior a cada data) e, nas janelas de 12, 60 e 120 meses, entre as tarifas vigentes no último dia dos meses inicial e final do IPCA.",
   "unidade": "%",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "evento tarifário; janelas de 12, 60 e 120 meses",
   "fontes": [
    "aneel_tarifas_aplicacao",
    "ibge_ipca"
   ],
   "formula": "variação = total_depois ÷ total_antes − 1; IPCA = I(mês final) ÷ I(mês inicial) − 1; real = (1 + variação) ÷ (1 + IPCA) − 1",
   "numerador": "tarifa depois (R$/MWh)",
   "denominador": "tarifa antes (R$/MWh)",
   "regra_agregacao": "Por distribuidora; resumo por mediana e quartis entre distribuidoras; contagem das acima e abaixo do IPCA.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "evento",
    "janela"
   ],
   "regras_comparabilidade": [
    "Tarifa e IPCA sempre nos mesmos meses.",
    "Não é o efeito médio do processo tarifário (que pondera todas as classes).",
    "Diferença entre PLD e tarifa não é margem da distribuidora."
   ],
   "regra_cobertura": "Distribuidoras com tarifa nas duas datas e sem mudança de perímetro (incorporação registrada) dentro da janela; as demais são contadas como excluídas.",
   "politica_ausencia": "Sem tarifa em uma das datas ou sem índice publicado no mês, a variação fica vazia.",
   "validacoes": [
    "IPCA de 12 meses pela razão de índices conferido com a variação publicada pelo IBGE (tolerância 0,01 ponto percentual).",
    "Contagem acima e abaixo do IPCA feita com os valores não arredondados."
   ],
   "limitacoes": [
    "O conjunto não diz se o ato é reajuste, revisão periódica ou extraordinária.",
    "Na data de uma incorporação o CNPJ incorporador passa a ter a tarifa da área somada: o evento sai marcado como mudança de perímetro e não é reajuste dos mesmos consumidores."
   ],
   "gold": "conta.json",
   "paginas": [
    "/setor-eletrico/conta-de-luz"
   ],
   "arquivo": "pipeline/energia/metricas/conta.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/metodologia"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_afirmacoes_conferidas",
   "titulo": "Afirmações de integração conferidas com o catálogo",
   "pergunta": "Cada fonte que a Metodologia diz integrada corresponde a um recurso realmente verificado?",
   "definicao": "Contagem das afirmações de integração exibidas na Metodologia em que todo conjunto citado está no catálogo gravado com o mesmo estado, chegou pelo menos a RECURSO VERIFICADO, e o texto só diz 'publicado' quando todos estão PUBLICADO.",
   "unidade": "afirmações",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por publicação",
   "fontes": [
    "catalogo_ckan_ons",
    "catalogo_ckan_aneel",
    "catalogo_ckan_ccee",
    "catalogo_ccee_seed",
    "silvers_declarados"
   ],
   "formula": "n = #{afirmações : ∀ conjunto citado, estado_catálogo = estado_afirmação ≥ RECURSO VERIFICADO}",
   "regra_agregacao": "contagem",
   "dimensoes": [
    "afirmação"
   ],
   "regras_comparabilidade": [
    "O texto de cada afirmação é gerado do estado do catálogo da mesma publicação; entre publicações, muda quando um conjunto sobe ou desce na escada."
   ],
   "regra_cobertura": "As afirmações de publicacao.json (afirmacoes), lidas pela página Metodologia.",
   "politica_ausencia": "Conjunto citado ausente do catálogo reprova a afirmação.",
   "validacoes": [
    "estado de cada conjunto relido no catalogo.json gravado (ficha afirmacoes_conferidas)",
    "afirmação sobre limites de intercâmbio gerada do achado A06 de rede_detalhe.json"
   ],
   "limitacoes": [
    "A conferência atesta o estado do conjunto no catálogo, não a qualidade de cada número que ele alimenta (ver as fichas 'Comprove este número' de cada página).",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_cobertura_ultimo_periodo",
   "titulo": "Cobertura do último período disponível",
   "pergunta": "Quantas séries do conjunto já têm valor no último período disponível, comparado com o anterior?",
   "definicao": "Séries com valor no último período disponível até hoje (o mesmo período que a atualidade publica) e séries com valor no período anterior a ele, pelo passo do conjunto. Referência futura (limite regulatório de ano seguinte, cenário do PDE, programação do PMO) não é o último período do dado.",
   "unidade": "séries",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por conjunto e publicação",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "series_no_ultimo = #{séries com valor em ultimo_periodo}; series_no_anterior = #{séries com valor em ultimo_periodo − passo}",
   "regra_agregacao": "contagem por conjunto",
   "dimensoes": [
    "conjunto"
   ],
   "regras_comparabilidade": [
    "Último período ainda aberto (mês ou ano corrente, marcado em periodo_parcial) costuma ter menos séries que o anterior sem que isso seja falha."
   ],
   "regra_cobertura": "Séries numéricas do silver com formato de referência regular e passo modal seguido por pelo menos metade dos intervalos.",
   "politica_ausencia": "Sem período disponível até hoje: campo ausente; série sem valor no período não é contada (ausência não vira zero).",
   "validacoes": [
    "amostra com referência futura no teste do módulo: a contagem é feita no último período até hoje, não na maior referência"
   ],
   "limitacoes": [
    "Não diz se a série deveria ter valor no período (usina desativada, distribuidora extinta).",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_completude_interna",
   "titulo": "Completude interna das séries de um conjunto",
   "pergunta": "Há buracos no meio das séries que o conjunto traz?",
   "definicao": "Referências distintas presentes divididas pelas esperadas entre a primeira e a última referência de cada série, no passo modal do conjunto, somadas sobre as séries.",
   "unidade": "fração (0 a 1)",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por conjunto e publicação",
   "fontes": [
    "silvers_declarados"
   ],
   "numerador": "Σ referências distintas presentes em cada série",
   "denominador": "Σ referências esperadas de cada série entre a primeira e a última, no passo modal",
   "formula": "completude = Σ presentes ÷ Σ esperadas, limitada a 1",
   "regra_agregacao": "razão de somas (não média de razões por série)",
   "dimensoes": [
    "conjunto",
    "grão"
   ],
   "regras_comparabilidade": [
    "Só se calcula com passo modal seguido por pelo menos metade dos intervalos (cadência regular)."
   ],
   "regra_cobertura": "Séries de observações numéricas do silver com formato de referência regular (horária, diária, mensal, trimestral, anual).",
   "politica_ausencia": "Série com cadência irregular ou cadastro sem período: completude não se aplica (campo ausente).",
   "validacoes": [
    "série com lacuna conhecida (silver de teste) dá completude < 1 com o número exato de faltas (teste do módulo)"
   ],
   "limitacoes": [
    "Não acusa série que começou depois ou terminou antes (usina nova, distribuidora extinta): só lacunas internas.",
    "Nas séries horárias, a referência é a hora local publicada pela fonte, sem fuso: hora que não existe ou se repete numa mudança de horário conta como a fonte a publicou.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_conflitos_entre_recursos",
   "titulo": "Conflitos entre arquivos do mesmo conjunto",
   "pergunta": "Arquivos diferentes do mesmo conjunto trazem valores diferentes para a mesma coisa?",
   "definicao": "Mesma (série, referência), nas observações, ou mesmo (chave, campo), nos cadastros, com valores diferentes no valor mais recente de cada arquivo do conjunto (arquivos anuais que se sobrepõem, relatórios de semanas diferentes, listas de anos diferentes). Não é revisão da fonte: o módulo dono decide qual arquivo vale.",
   "unidade": "referências (observações) ou campos (cadastros)",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por publicação",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "conflito ⇔ #{valores distintos entre os arquivos} > 1 (observações: diferença > 1e-9)",
   "regra_agregacao": "contagem por conjunto, com exemplos",
   "dimensoes": [
    "conjunto"
   ],
   "regras_comparabilidade": [
    "Conjunto com muitos arquivos sobrepostos tem mais oportunidade de conflito."
   ],
   "regra_cobertura": "Conjuntos com mais de um arquivo que trazem a mesma chave.",
   "politica_ausencia": "Chave presente em um só arquivo não entra.",
   "validacoes": [
    "TUSD da distribuidora 05.965.546/0001-09 em 30/11/2021 nos arquivos 2020 e 2021 da ANEEL: conflito, não revisão (teste do módulo)"
   ],
   "limitacoes": [
    "Compara o valor mais recente de cada arquivo; conflitos que a fonte já desfez não aparecem.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_conjuntos_publicados",
   "titulo": "Conjuntos publicados no catálogo",
   "pergunta": "Quantos conjuntos chegaram ao fim da escada, com evidência em cada etapa?",
   "definicao": "Contagem de entradas do catálogo com estado PUBLICADO.",
   "unidade": "conjuntos",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por publicação",
   "fontes": [
    "catalogo_ckan_ons",
    "catalogo_ckan_aneel",
    "catalogo_ckan_ccee",
    "catalogo_ccee_seed",
    "silvers_declarados"
   ],
   "formula": "n = #{entradas : estado = PUBLICADO}",
   "regra_agregacao": "contagem",
   "dimensoes": [
    "órgão",
    "tema"
   ],
   "regras_comparabilidade": [
    "Entre publicações, a contagem muda quando módulos integram conjuntos novos ou golds são reprovadas."
   ],
   "regra_cobertura": "Entradas de catalogo.json.",
   "politica_ausencia": "Não se aplica (contagem).",
   "validacoes": [
    "publicados sem checagem reprovada no relatório e com gold consumidora íntegra (ficha conjuntos_publicados)"
   ],
   "limitacoes": [
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.1",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_equivalencia_parquet",
   "titulo": "Equivalência entre CSV e Parquet",
   "pergunta": "O arquivo Parquet tem exatamente o mesmo conteúdo do CSV?",
   "definicao": "Parquet relido em lotes e comparado com o CSV célula a célula: texto igual, inteiro igual como texto, número decimal igual ao número escrito no CSV (Decimal da representação mais curta do float64 = Decimal do texto) e vazio igual a nulo.",
   "unidade": "células divergentes",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por arquivo e publicação",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "divergências = Σ células com valor Parquet ≠ valor CSV; equivalente ⇔ divergências = 0 e mesmas linhas",
   "regra_agregacao": "contagem de arquivos equivalentes (resumo.parquet)",
   "dimensoes": [
    "arquivo"
   ],
   "regras_comparabilidade": [
    "Colunas de código (CNPJ, IBGE, CEG) ficam como texto para não perder zero à esquerda."
   ],
   "regra_cobertura": "Todo CSV de public/energia/series com pelo menos 2 MiB.",
   "politica_ausencia": "Célula vazia do CSV é nulo no Parquet; nunca zero.",
   "validacoes": [
    "CSV com zero à esquerda, vazio e decimal relido idêntico (teste do módulo)",
    "número com mais de 17 dígitos significativos: a coluna fica como texto, e um Parquet gravado em float64 é acusado como divergente (teste do módulo)"
   ],
   "limitacoes": [
    "A comparação de números é decimal: a representação mais curta do float64 gravado tem de ser o mesmo número decimal escrito no CSV ('1.50' = '1.5'); coluna com número que o float64 não guarda exatamente vira texto.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_estado_catalogo",
   "titulo": "Estado do conjunto no catálogo",
   "pergunta": "Até onde este conjunto chegou: só catalogado, arquivo acessado, integrado, validado ou publicado?",
   "definicao": "Última etapa alcançada em sequência na escada catalogado → recurso verificado → integrado → validado → publicado; cada etapa exige a sua evidência e uma etapa sem evidência interrompe a escada.",
   "unidade": "categoria (CATALOGADO, RECURSO VERIFICADO, INTEGRADO, VALIDADO, PUBLICADO)",
   "grao_geografico": "não se aplica (conjunto de dados)",
   "grao_temporal": "por publicação",
   "fontes": [
    "catalogo_ckan_ons",
    "catalogo_ckan_aneel",
    "catalogo_ckan_ccee",
    "catalogo_ccee_seed",
    "verificacao_recursos",
    "silvers_declarados"
   ],
   "formula": "estado = última etapa e_k com ok(e_1) ∧ … ∧ ok(e_k); catalogado = listagem do portal, package_show versionado, REGISTRO com URL e licença ou cadastro manual; recurso verificado = vintage com sha256 ou leitura parcial com HTTP 200/206; integrado = vintage e conteúdo extraído (ou documento guardado); validado = nenhuma checagem reprovada do conjunto; publicado = alguma gold consumidora íntegra e não reprovada",
   "regra_agregacao": "contagem de conjuntos por estado (resumo.por_estado e catalogo.contagem)",
   "dimensoes": [
    "órgão",
    "tema",
    "estado",
    "papel de uso"
   ],
   "regras_comparabilidade": [
    "O estado é o desta publicação: um conjunto pode voltar de PUBLICADO para VALIDADO se a gold que o consome for reprovada no contrato.",
    "Uso (indicador, modelo, conferência, contexto, histórico) é outro eixo e não muda o estado."
   ],
   "regra_cobertura": "Todos os conjuntos das listagens do ONS, da ANEEL e da CCEE, os declarados nos REGISTRO e o cadastro manual.",
   "politica_ausencia": "Etapa sem evidência é etapa não alcançada; nunca é presumida.",
   "validacoes": [
    "escada sem salto: etapa com evidência depois de etapa sem evidência vira ressalva visível (catalogo.saltos)",
    "publicado conferido contra o relatório de checagens e a varredura das golds (ficha conjuntos_publicados)"
   ],
   "limitacoes": [
    "Recurso verificado por requisição parcial lê só os primeiros 64 KB de um arquivo do conjunto.",
    "Cadastro manual (catalogo_manual.json) fica em CATALOGADO com metadados não verificados na fonte.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_estado_recurso",
   "titulo": "Estado de cada recurso (arquivo) de um conjunto",
   "pergunta": "Quais arquivos de um conjunto o pipeline realmente acessou?",
   "definicao": "Estado de cada recurso listado pelo portal: herda o estado da integração declarada que o capturou com sha256; RECURSO VERIFICADO se foi baixado por outro dataset ou lido por requisição parcial; CATALOGADO nos demais. Recurso que sumiu da listagem fica como removido pela fonte.",
   "unidade": "categoria por recurso; contagem de recursos por estado",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por publicação",
   "fontes": [
    "catalogo_ckan_ons",
    "catalogo_ckan_aneel",
    "catalogo_ckan_ccee",
    "catalogo_ccee_seed",
    "verificacao_recursos",
    "silvers_declarados"
   ],
   "formula": "vínculo recurso ↔ captura pela URL normalizada (esquema e host em minúsculas, caminho decodificado, sem barra final)",
   "regra_agregacao": "contagem por conjunto (recursos_resumo) e por portal (catalogo.recursos)",
   "dimensoes": [
    "órgão",
    "conjunto",
    "formato",
    "estado"
   ],
   "regras_comparabilidade": [
    "Um conjunto com muitos arquivos anuais e só o ano corrente integrado tem poucos recursos acessados sem que isso seja falha: a cobertura de anos está no conjunto do silver."
   ],
   "regra_cobertura": "Recursos das listagens package_search (ONS, ANEEL, CCEE) ou dos package_show versionados quando a listagem falha.",
   "politica_ausencia": "Recurso sem captura nem verificação fica CATALOGADO; URL ausente não casa com captura nenhuma.",
   "validacoes": [
    "contagem por estado igual à soma das linhas de dados_recursos_<orgao>.csv (teste do módulo)"
   ],
   "limitacoes": [
    "URL que muda a cada publicação (token do servidor) quebra o vínculo com a captura anterior.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "manifesto.json",
   "paginas": [
    "/setor-eletrico/dados",
    "/setor-eletrico/metodologia"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_id_publicacao",
   "titulo": "Identificador da publicação",
   "pergunta": "Qual é a versão exata dos arquivos que geraram esta página?",
   "definicao": "sha256 da lista [caminho, bytes, sha256] de todos os arquivos publicados (golds, séries, Parquet e geometrias), em ordem de caminho, serializada em JSON sem espaços: o mesmo conjunto de bytes tem o mesmo id.",
   "unidade": "hexadecimal de 64 caracteres",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por publicação",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "id = sha256(json([[caminho, bytes, sha256], …] ordenado por caminho, separadores ',' e ':'))",
   "regra_agregacao": "não se aplica",
   "dimensoes": [
    "publicação"
   ],
   "regras_comparabilidade": [
    "Dois ids iguais garantem os mesmos bytes; ids diferentes não dizem o quanto mudou (ver o manifesto)."
   ],
   "regra_cobertura": "Arquivos de public/energia/gold, public/energia/series e public/energia/geo; os quatro reescritos pelo orquestrador depois do módulo dados ficam em fora_do_manifesto até a chamada final.",
   "politica_ausencia": "Arquivo ilegível entra com o sha256 dos bytes e legivel = falso.",
   "validacoes": [
    "id recalculado a partir das entradas do manifesto (teste do módulo e teste de contrato TS)",
    "sha256 e tamanho de cada arquivo listado conferidos contra o disco (teste do módulo)"
   ],
   "limitacoes": [
    "O silver (vintages) não é publicado no git; reproduzir uma gold exige o silver da release energia-estado.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_mudancas_registros",
   "titulo": "Mudanças da fonte em cadastros e atos",
   "pergunta": "Quais campos de cadastro a fonte mudou num arquivo que já tinha publicado?",
   "definicao": "Troca do valor de um campo da mesma chave entre capturas consecutivas do MESMO arquivo (recurso). Campos que descrevem o arquivo e não o cadastro (data de geração, de processamento, de verificação) ficam fora e são contados em metadado_do_arquivo.",
   "unidade": "campos alterados; chaves afetadas",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por conjunto e dia de captura",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "mudança ⇔ valor_novo ≠ valor_anterior na mesma (chave, campo, arquivo), capturas em ordem; campo ∉ metadados do arquivo",
   "regra_agregacao": "contagem exata por conjunto; por campo e por dia da captura",
   "dimensoes": [
    "conjunto",
    "campo",
    "dia de captura"
   ],
   "regras_comparabilidade": [
    "Valor diferente da mesma chave em arquivos diferentes (lista de um ano e a do seguinte, código reutilizado, mudança societária entre edições) não é mudança: é conflito entre recursos."
   ],
   "regra_cobertura": "Conjuntos com cadastros ou atos no silver (tabela registros) e pelo menos duas capturas do mesmo arquivo.",
   "politica_ausencia": "Campo que a fonte esvaziou conta como mudança e é contado também em apagados_pela_fonte.",
   "validacoes": [
    "amostra com dois arquivos anuais que divergem: zero mudanças e um conflito entre recursos (teste do módulo)",
    "amostra com duas capturas do mesmo arquivo e um campo alterado: uma mudança; gerado_em alterado: metadado do arquivo"
   ],
   "limitacoes": [
    "A lista de campos de metadado do arquivo (silver_dados.CAMPOS_METADADO_ARQUIVO) é por nome de campo.",
    "Os silvers deste ambiente foram reconstruídos entre 29/09 e 01/10/2026: capturas, falhas e revisões anteriores a essas datas não estão registradas.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_revisao_maior_absoluta",
   "titulo": "Maior revisão absoluta",
   "pergunta": "Qual foi a maior mudança, na unidade da própria série, num valor já publicado?",
   "definicao": "Maior |novo − anterior| entre os eventos de revisão do conjunto, com a série, a referência e as capturas.",
   "unidade": "unidade da série revisada",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por conjunto",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "max |novo − anterior|",
   "regra_agregacao": "máximo entre eventos",
   "dimensoes": [
    "conjunto"
   ],
   "regras_comparabilidade": [
    "Só se compara dentro da mesma série: conjuntos misturam unidades (MWmed, R$/MWh, %)."
   ],
   "regra_cobertura": "Todos os eventos de revisão do conjunto.",
   "politica_ausencia": "Sem evento de revisão: campo ausente.",
   "validacoes": [
    "mesmo evento relido do silver de teste com os valores conhecidos (teste do módulo)"
   ],
   "limitacoes": [
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_revisao_maior_relativa",
   "titulo": "Maior revisão relativa",
   "pergunta": "Qual foi a maior mudança proporcional que a fonte fez num valor já publicado?",
   "definicao": "Maior |novo − anterior| ÷ |anterior| entre os eventos de revisão do conjunto, com a série, a referência e as capturas.",
   "unidade": "%",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por conjunto",
   "fontes": [
    "silvers_declarados"
   ],
   "numerador": "|valor novo − valor anterior| (unidade da série)",
   "denominador": "|valor anterior| (unidade da série)",
   "formula": "100 × |novo − anterior| ÷ |anterior|",
   "regra_agregacao": "máximo entre eventos",
   "dimensoes": [
    "conjunto"
   ],
   "regras_comparabilidade": [
    "Valor anterior perto de zero infla a relativa: leia junto com a maior revisão absoluta."
   ],
   "regra_cobertura": "Eventos com valor anterior diferente de zero; os que partem de zero são contados à parte (a_partir_de_zero).",
   "politica_ausencia": "Sem evento de revisão: campo ausente.",
   "validacoes": [
    "valores de antes e depois lidos das duas vintages no silver (ficha maior_revisao_relativa)"
   ],
   "limitacoes": [
    "Não indica por que a fonte revisou (consistência, reprocessamento, correção).",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.1",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_revisoes_alcance",
   "titulo": "Alcance das revisões da fonte",
   "pergunta": "Quantas observações e quantos períodos a fonte mudou depois de publicar, em quantas séries?",
   "definicao": "Revisão é a troca de valor de uma mesma (série, referência) entre capturas consecutivas do mesmo arquivo (recurso) do silver. Publica-se, separados: eventos; observações revisadas (pares série e referência); referências revisadas (períodos distintos, em qualquer série); séries afetadas; e o intervalo de referências.",
   "unidade": "eventos, observações, referências e séries",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por conjunto e dia de captura",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "revisão ⇔ |valor_novo − valor_anterior| > 1e-9 na mesma (série, referência, arquivo), capturas em ordem; observações = #{(série, referência) revisadas}; referências = #{referência revisada}",
   "regra_agregacao": "contagem exata por conjunto; calendário por dia da captura que trouxe o valor novo (observações revisadas)",
   "dimensoes": [
    "conjunto",
    "série",
    "referência",
    "dia de captura"
   ],
   "regras_comparabilidade": [
    "Conjunto com mais capturas tem mais oportunidade de revelar revisões.",
    "Observações e referências não se somam: um dia revisado nos quatro subsistemas é 1 referência e 4 observações."
   ],
   "regra_cobertura": "Conjuntos com pelo menos duas capturas do mesmo arquivo.",
   "politica_ausencia": "Referência ausente numa captura não é revisão (ausência não vira zero).",
   "validacoes": [
    "revisão real da carga diária do Nordeste (26/09/2026) encontrada na amostra com os valores de antes e depois, recontada em Python puro (teste do módulo)",
    "amostra com 4 séries revisadas na mesma data: 4 observações e 1 referência (teste do módulo)"
   ],
   "limitacoes": [
    "Só há revisão detectável a partir da segunda captura de um mesmo arquivo.",
    "Os silvers deste ambiente foram reconstruídos entre 29/09 e 01/10/2026: capturas, falhas e revisões anteriores a essas datas não estão registradas.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.1",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_situacao_atualidade",
   "titulo": "Atualidade do conjunto (SLA pela frequência declarada)",
   "pergunta": "O conjunto está em dia com a frequência que a própria fonte promete?",
   "definicao": "EM DIA quando hoje não passou do prazo do próximo período; ATRASADO quando passou; SEM SLA quando a fonte não declara frequência legível (ou o conjunto foi descontinuado); SEM DADO quando não há período de referência nem data de publicação informada pela fonte.",
   "unidade": "categoria; dias de atraso",
   "grao_geografico": "não se aplica",
   "grao_temporal": "dia da validação (Brasília)",
   "fontes": [
    "catalogo_ckan_ons",
    "catalogo_ckan_aneel",
    "catalogo_ckan_ccee",
    "metadados_fontes",
    "silvers_declarados"
   ],
   "formula": "prazo = fim do período seguinte ao último disponível + tolerância (casos A e C); fim do último período completo + período da cadência + tolerância (caso B, e casos D e E quando a data da fonte não acompanha o conteúdo); publicação informada pela fonte + período da cadência + tolerância (casos D e E). Caso C só quando a frequência declarada é a rotina do portal (campo 'Schedule de Atualização' do ONS ou horário do dia); cadência declarada mais curta que o grão fora disso é o caso E. Período corrente parcial (fim depois de hoje) não alonga o prazo: a base é o último período completo. Tolerâncias: diária 2, semanal 7, quinzenal 15, mensal 60, trimestral 90, anual 365 dias; dias_atraso = hoje − prazo",
   "regra_agregacao": "contagem de conjuntos por situação (resumo.por_situacao)",
   "dimensoes": [
    "conjunto",
    "cadência",
    "caso da regra"
   ],
   "regras_comparabilidade": [
    "Atraso de conjunto diário e de conjunto anual não têm a mesma escala: compare dentro da cadência.",
    "Caso C usa o grão do dado porque a frequência declarada pelo ONS no campo 'Schedule de Atualização' é o horário da rotina do portal ('Diariamente, às 12h e 19h'), não a promessa de um período novo por dia.",
    "Caso E: quando a ANEEL declara 'Mensal', 'Quinzenal' ou 'Trimestral' para um arquivo de grão anual, a promessa é de arquivo novo nessa cadência, medida pela data de publicação da fonte; o grão anual não pode empurrar o prazo para dois anos depois."
   ],
   "regra_cobertura": "Conjuntos integrados com frequência declarada no portal, nos metadados da fonte (SIDRA, CKAN da CVM e do MME) ou no REGISTRO do módulo.",
   "politica_ausencia": "Sem frequência declarada não se inventa uma: SEM SLA. A data da captura nunca entra no cálculo.",
   "validacoes": [
    "prazo refeito por outra implementação da regra (aritmética de calendário própria) e comparado com o publicado (ficha conjuntos_atrasados)",
    "último período dos conjuntos com falha de coleta procurado no arquivo original do bronze, com sha256 conferido (ficha conjuntos_atrasados)",
    "casos A a E com datas escritas no teste do módulo, inclusive período corrente parcial e falha de coleta simulada"
   ],
   "limitacoes": [
    "Frequência declarada em texto livre é lida por expressões regulares (ckan_dados.frequencias_canonicas).",
    "A data de modificação informada pela CCEE não acompanha o conteúdo dos arquivos: os casos D e E a substituem pelo fim do último período completo quando o arquivo traz período posterior a ela; no caso E, sem data utilizável, SEM DADO.",
    "No caso E, a data de publicação mede se a fonte reescreveu o arquivo, não se o conteúdo mudou.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_situacao_validacao_ficha",
   "titulo": "Situação da validação de um número publicado",
   "pergunta": "O número que aparece na página foi conferido por outro caminho?",
   "definicao": "Eixo separado da natureza (seção 11.3): reconciliação aprovada, controles internos aprovados, ressalva, divergência ou pendência, a partir dos testes e da reconciliação da ficha 'Comprove este número'.",
   "unidade": "categoria",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por publicação",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "divergência se teste ou reconciliação reprovado; ressalva se algum com ressalva; reconciliação aprovada se a reconciliação aprovou; controles aprovados se todos os testes aprovaram; pendência nos demais",
   "regra_agregacao": "matriz natureza × situação (eixos.matriz)",
   "dimensoes": [
    "gold",
    "natureza",
    "situação"
   ],
   "regras_comparabilidade": [
    "Calculado não quer dizer menos confiável, e observado não quer dizer livre de erro."
   ],
   "regra_cobertura": "Toda ficha de evidência encontrada nas golds (objeto com valor_exibido, testes e fonte).",
   "politica_ausencia": "Ficha sem teste nem reconciliação: pendência.",
   "validacoes": [
    "natureza vinculada pela ficha, pela proveniência de mesma chave ou de mesmo indicador, ou pela única proveniência no mesmo objeto da ficha; a de um objeto acima na árvore não é herdada; sem vínculo, SEM_VINCULO"
   ],
   "limitacoes": [
    "A qualidade da reconciliação depende do que cada módulo registrou na ficha.",
    "A natureza ESTIMADO não separa 'estimado pela fonte' de 'estimado pelo observatório' (seção 11.3): o contrato de proveniência compartilhado tem uma só categoria; pedido ao integrador.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "gold": "publicacao.json",
   "paginas": [
    "/setor-eletrico/dados"
   ],
   "versao_formula": "1.0",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "id": "dados_veredito_validacao",
   "titulo": "Veredito das validações automáticas",
   "pergunta": "As checagens automáticas aprovaram esta gold, este CSV ou este conjunto?",
   "definicao": "Pior resultado entre as checagens aplicáveis ao alvo: reprovado > ressalva > aprovado; não aplicável não conta. Checagens: esquema e JSON estrito, proveniência completa, links existentes, datas futuras, drift de esquema em relação ao último commit, tamanho; nos CSV, colunas, ausência textual, duplicadas, chave inferida, datas futuras e dicionário; identidades de agregação declaradas; nos conjuntos, sha256 das capturas e do original, horizonte e drift do cabeçalho da fonte.",
   "unidade": "categoria (aprovado, ressalva, reprovado, nao_aplicavel)",
   "grao_geografico": "não se aplica",
   "grao_temporal": "por publicação",
   "fontes": [
    "silvers_declarados"
   ],
   "formula": "veredito = max_gravidade(resultado das checagens aplicáveis)",
   "regra_agregacao": "contagem de checagens por resultado (resumo.validacao) e de alvos por veredito",
   "dimensoes": [
    "tipo de alvo",
    "tipo de checagem"
   ],
   "regras_comparabilidade": [
    "Divergência entre total e partes publicados pela própria fonte é ressalva; total calculado pela plataforma que não fecha é reprovado."
   ],
   "regra_cobertura": "Todas as golds de public/energia/gold, todos os CSV de public/energia/series e todos os conjuntos declarados.",
   "politica_ausencia": "Alvo sem checagem aplicável: nao_aplicavel, nunca aprovado.",
   "validacoes": [
    "casos de teste com JSON com NaN, link quebrado, CSV com coluna torta e ausência escrita como texto são reprovados (teste do módulo)"
   ],
   "limitacoes": [
    "A chave única dos CSV é inferida pelo nome e pelo tipo das colunas; ressalva de chave pede conferência humana.",
    "Identidades de agregação só valem para as declaradas em validacoes.IDENTIDADES.",
    "Medida sobre a própria plataforma, recalculada a cada execução do pipeline; não descreve o setor elétrico."
   ],
   "arquivo": "pipeline/energia/metricas/dados.py"
  },
  {
   "id": "empresas_ativo_total",
   "titulo": "Ativo total",
   "pergunta": "Qual o ativo total no fim do período?",
   "definicao": "Conta 1 do balanço patrimonial ativo.",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "fim do exercício (DFP) e fim do trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 1 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Saldo no fim do período; não se soma no tempo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência.",
    "Relida do BPA original nos testes: Rio Paranapanema 2025 individual, R$ 3.986.965 mil (consolidado entregue com zero, ausente); AXIA Energia Nordeste em 30/06/2021, consolidado com 1 mil e as demais contas zero (coluna não preenchida, ausente) contra 28.552.507 mil no individual."
   ],
   "limitacoes": [
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_caixa",
   "titulo": "Caixa e equivalentes de caixa",
   "pergunta": "Quanto a companhia tinha em caixa e equivalentes no fim do período?",
   "definicao": "Conta 1.01.01 do balanço patrimonial ativo.",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "fim do exercício (DFP) e fim do trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 1.01.01 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Saldo no fim do período; não se soma no tempo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência."
   ],
   "limitacoes": [
    "Aplicações financeiras fora de equivalentes de caixa ficam em outras contas do ativo.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_caixa_investimento",
   "titulo": "Caixa líquido das atividades de investimento",
   "pergunta": "Quanto caixa foi aplicado (ou gerado) em atividades de investimento?",
   "definicao": "Conta 6.02 da demonstração dos fluxos de caixa (método direto ou indireto).",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "exercício social (DFP) e trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 6.02 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Fluxo: valor do período publicado (exercício, trimestre ou acumulado no ano); o 4º trimestre não é deduzido por diferença.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência.",
    "Relida do DFC original nos testes: Ferreira Gomes 2025 individual, R$ 759 mil; CELGPAR 2025 individual, DFC entregue com zero contra saldo final de caixa de 2024 de R$ 203.811 mil (fluxos não preenchidos, ausente)."
   ],
   "limitacoes": [
    "Inclui aquisições, aplicações financeiras e resgates; não é o investimento em ativos da concessão, que não tem conta fixa.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_caixa_operacional",
   "titulo": "Caixa líquido das atividades operacionais",
   "pergunta": "Quanto caixa as operações geraram (ou consumiram) no período?",
   "definicao": "Conta 6.01 da demonstração dos fluxos de caixa (método direto ou indireto). No ITR, acumulada desde janeiro.",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "exercício social (DFP) e trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 6.01 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Fluxo: valor do período publicado (exercício, trimestre ou acumulado no ano); o 4º trimestre não é deduzido por diferença.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência.",
    "Relida do DFC_MI original nos testes: CPFL Energia consolidado, 1º trimestre de 2025, R$ 2.093.648 mil (acumulado no ano)."
   ],
   "limitacoes": [
    "Método direto e indireto chegam ao mesmo total, mas as linhas internas diferem e não são publicadas aqui.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_capacidade_controle_direto",
   "titulo": "Capacidade sob controle direto",
   "pergunta": "Quanta potência em operação está em usinas em que a empresa detém a maioria?",
   "definicao": "Soma da potência fiscalizada inteira das usinas em operação em que o CNPJ detém mais de 50% da propriedade publicada no SIGA.",
   "unidade": "MW",
   "grao_geografico": "proprietário direto (CNPJ)",
   "grao_temporal": "fotografia diária do SIGA",
   "fontes": [
    "aneel_siga"
   ],
   "formula": "cap_ctrl(e) = Σ_u kW_fiscalizado(u) × [pct(e, u) > 50] ÷ 1.000",
   "regra_agregacao": "Cada usina tem no máximo um controlador majoritário; usinas sem maioria (ex.: 50% e 50%) não são atribuídas e a potência delas é publicada à parte.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "proprietário",
    "tipo de usina"
   ],
   "regras_comparabilidade": [
    "Métrica distinta da capacidade proporcional: não somar as duas nem trocar uma pela outra.",
    "Fronteira: potência fiscalizada das usinas em fase Operação no SIGA cujas participações publicadas somam 100% (tolerância de 0,005 p.p. por parcela), Brasil, na data do SIGA; exclui micro e minigeração distribuída."
   ],
   "regra_cobertura": "Usinas em operação no SIGA com participações válidas.",
   "politica_ausencia": "Usina sem proprietário informado ou com participações que não somam 100% fica fora das medidas de capacidade por proprietário e por grupo e é listada pelo motivo; potência fiscalizada vazia é ausência, nunca zero.",
   "validacoes": [
    "Vínculo usina × proprietário só pelo CNPJ publicado no próprio SIGA; nenhum vínculo por nome."
   ],
   "limitacoes": [
    "Critério de maioria da propriedade do ativo; acordos de acionistas que dão controle a minoritários não estão na fonte."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_capacidade_controle_grupo",
   "titulo": "Capacidade sob controle do grupo",
   "pergunta": "Quanta potência em operação está sob controle de cada grupo econômico com vínculo declarado?",
   "definicao": "Soma da potência fiscalizada das usinas em operação cujo proprietário majoritário (> 50%) tem o grupo como topo da cadeia de controladores únicos declarada à ANEEL.",
   "unidade": "MW",
   "grao_geografico": "grupo (CNPJ do topo da cadeia de controle)",
   "grao_temporal": "SIGA diário × trimestre de referência do Polímero",
   "fontes": [
    "aneel_siga",
    "aneel_polimero"
   ],
   "formula": "cap_ctrl_grupo(g) = Σ_u kW(u) × [topo(majoritário(u)) = g] ÷ 1.000",
   "regra_agregacao": "Partição das usinas com controlador majoritário: cada usina pertence a no máximo um grupo (sem dupla contagem de controladora e controlada).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "grupo",
    "tipo de usina"
   ],
   "regras_comparabilidade": [
    "Grupo = topo da cadeia de controladores únicos declarada à ANEEL na Composição Societária (Polímero): a cadeia para em controle compartilhado, controlador pessoa física, controlador sem CNPJ, declarações que discordam sobre o controlador (menos de 90% de concordância) ou agente sem declaração nos quatro trimestres até o de referência.",
    "Fronteira: potência fiscalizada das usinas em fase Operação no SIGA cujas participações publicadas somam 100% (tolerância de 0,005 p.p. por parcela), Brasil, na data do SIGA; exclui micro e minigeração distribuída."
   ],
   "regra_cobertura": "Proprietários sem declaração no Polímero são o próprio topo (grupo de uma empresa); o motivo de parada de cada cadeia é publicado.",
   "politica_ausencia": "Usina sem proprietário informado ou com participações que não somam 100% fica fora das medidas de capacidade por proprietário e por grupo e é listada pelo motivo; potência fiscalizada vazia é ausência, nunca zero. Cadeia sem controlador único termina no último CNPJ provado; nada é atribuído por semelhança de nome.",
   "validacoes": [
    "Percentual do Polímero confirmado como relativo ao agente declarante (967 de 968 casos do 1º trimestre de 2026).",
    "Ciclos na cadeia são detectados e encerram a subida."
   ],
   "limitacoes": [
    "Depende da cobertura e da qualidade das declarações ao Polímero; declarações de terceiros discordantes deixam o nó ambíguo."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_capacidade_proporcional",
   "titulo": "Capacidade proporcional à participação (proprietário direto)",
   "pergunta": "Quanta potência em operação corresponde às participações de cada empresa nos ativos?",
   "definicao": "Soma, sobre as usinas em operação com participações válidas, da potência fiscalizada multiplicada pela participação do CNPJ publicada no SIGA e dividida pela soma das participações da usina (100% dentro da tolerância de arredondamento; a divisão corrige resíduos como os 100,0001% de Machadinho e fecha a partição).",
   "unidade": "MW",
   "grao_geografico": "proprietário direto (CNPJ)",
   "grao_temporal": "fotografia diária do SIGA",
   "fontes": [
    "aneel_siga"
   ],
   "formula": "cap_prop(e) = Σ_u kW_fiscalizado(u) × pct(e, u) ÷ Σ_e' pct(e', u) ÷ 1.000",
   "regra_agregacao": "Partição exata: a soma sobre todos os CNPJ mais a parcela sem CNPJ é igual à potência da fronteira (identidade verificada a cada geração com tolerância de ponto flutuante de 10⁻⁹).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "proprietário",
    "tipo de usina",
    "regime de exploração"
   ],
   "regras_comparabilidade": [
    "Capacidade não é energia gerada: não misturar com participação na geração verificada.",
    "Fronteira: potência fiscalizada das usinas em fase Operação no SIGA cujas participações publicadas somam 100% (tolerância de 0,005 p.p. por parcela), Brasil, na data do SIGA; exclui micro e minigeração distribuída."
   ],
   "regra_cobertura": "Usinas em operação no SIGA com participações válidas.",
   "politica_ausencia": "Usina sem proprietário informado ou com participações que não somam 100% fica fora das medidas de capacidade por proprietário e por grupo e é listada pelo motivo; potência fiscalizada vazia é ausência, nunca zero.",
   "validacoes": [
    "Vínculo usina × proprietário só pelo CNPJ publicado no próprio SIGA; nenhum vínculo por nome.",
    "Conferência usina a usina com o conjunto Agentes de Geração da ANEEL (arquivo mensal independente): 24.902 de 24.905 usinas comparáveis com a mesma lista de CNPJ e os mesmos percentuais em 30/09/2026.",
    "Identidade de partição: Σ proprietários + parcela sem CNPJ = fronteira (diferença relativa menor que 10⁻⁹)."
   ],
   "limitacoes": [
    "O proprietário direto costuma ser uma sociedade de propósito específico; para o conglomerado ver a capacidade do grupo."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_capacidade_proporcional_grupo",
   "titulo": "Capacidade proporcional das empresas do grupo",
   "pergunta": "Quanta potência corresponde às participações diretas detidas pelas empresas sob controle de cada grupo?",
   "definicao": "Soma, sobre as usinas em operação com participações válidas, da potência × participação de cada proprietário direto cujo topo de cadeia de controle é o grupo. Não multiplica pela fração do grupo no proprietário (não é participação econômica indireta).",
   "unidade": "MW",
   "grao_geografico": "grupo (CNPJ do topo da cadeia de controle)",
   "grao_temporal": "SIGA diário × trimestre de referência do Polímero",
   "fontes": [
    "aneel_siga",
    "aneel_polimero"
   ],
   "formula": "cap_prop_grupo(g) = Σ_e [topo(e) = g] × cap_prop(e)",
   "regra_agregacao": "Partição da capacidade proporcional: Σ grupos = Σ proprietários diretos (identidade verificada).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "grupo",
    "tipo de usina"
   ],
   "regras_comparabilidade": [
    "Grupo = topo da cadeia de controladores únicos declarada à ANEEL na Composição Societária (Polímero): a cadeia para em controle compartilhado, controlador pessoa física, controlador sem CNPJ, declarações que discordam sobre o controlador (menos de 90% de concordância) ou agente sem declaração nos quatro trimestres até o de referência.",
    "Fronteira: potência fiscalizada das usinas em fase Operação no SIGA cujas participações publicadas somam 100% (tolerância de 0,005 p.p. por parcela), Brasil, na data do SIGA; exclui micro e minigeração distribuída."
   ],
   "regra_cobertura": "Mesma da capacidade proporcional.",
   "politica_ausencia": "Usina sem proprietário informado ou com participações que não somam 100% fica fora das medidas de capacidade por proprietário e por grupo e é listada pelo motivo; potência fiscalizada vazia é ausência, nunca zero.",
   "validacoes": [
    "Identidade: Σ grupos = Σ proprietários diretos (diferença relativa menor que 10⁻⁹)."
   ],
   "limitacoes": [
    "Participação econômica indireta (look-through) não calculada: exige todos os caminhos societários com percentuais diretos."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_cobertura_vinculos",
   "titulo": "Cobertura dos vínculos de propriedade dos ativos de geração",
   "pergunta": "Que parte da potência em operação tem todos os proprietários identificados por CNPJ?",
   "definicao": "Potência fiscalizada das usinas em operação cujos proprietários publicados no SIGA têm todos CNPJ e participações somando 100%, dividida pela potência fiscalizada de todas as usinas em operação.",
   "unidade": "% da potência fiscalizada em operação",
   "grao_geografico": "Brasil",
   "grao_temporal": "fotografia diária do SIGA",
   "fontes": [
    "aneel_siga"
   ],
   "numerador": "Σ potência fiscalizada das usinas em operação no estado 'vinculado' (kW)",
   "denominador": "Σ potência fiscalizada das usinas em operação (kW)",
   "formula": "100 × Σ kW(vinculado) ÷ Σ kW(operação)",
   "regra_agregacao": "Razão de somas de potência; a contagem de usinas é publicada ao lado, com o mesmo critério.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "estado do vínculo",
    "fase",
    "tipo de usina"
   ],
   "regras_comparabilidade": [
    "Comparar só fotografias do SIGA (datas diferentes mudam o parque)."
   ],
   "regra_cobertura": "Todas as usinas do SIGA diário (todas as fases nas contagens; só operação na razão de potência).",
   "politica_ausencia": "Usina sem proprietário informado ou com participações que não somam 100% fica fora das medidas de capacidade por proprietário e por grupo e é listada pelo motivo; potência fiscalizada vazia é ausência, nunca zero.",
   "validacoes": [
    "Vínculo usina × proprietário só pelo CNPJ publicado no próprio SIGA; nenhum vínculo por nome.",
    "Campo de proprietários lido por inteiro por expressão ancorada: sobra de texto invalida a usina inteira (nenhuma em 30/09/2026).",
    "Conferência usina a usina com o conjunto Agentes de Geração da ANEEL (arquivo mensal independente): 24.902 de 24.905 usinas comparáveis com a mesma lista de CNPJ e os mesmos percentuais em 30/09/2026."
   ],
   "limitacoes": [
    "Proprietário pessoa física aparece no SIGA sem CPF: a usina fica no estado 'inclui_sem_documento' e o nome não é republicado.",
    "Matriz e filial do mesmo CNPJ raiz publicadas com 100% cada somam 200%: a usina fica fora das medidas de capacidade (sem consolidação por inferência)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_distribuidora_referencias",
   "titulo": "Ficha da distribuidora (referências cruzadas)",
   "pergunta": "Como a distribuidora aparece nos módulos de perdas, qualidade e tarifa?",
   "definicao": "Para cada CNPJ do índice de distribuidoras, os valores de referência publicados pelas golds perdas.json (taxa de perdas totais, não técnicas sobre a baixa tensão), qualidade.json (DEC, FEC e limites) e conta.json (tarifa B1 vigente), copiados sem recálculo, com o controlador declarado ao Polímero e o registro na CVM.",
   "unidade": "as de cada módulo de origem (%, horas, interrupções, R$/MWh)",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "ano de referência de cada módulo; tarifa vigente na data da gold de conta",
   "fontes": [
    "aneel_samp_balanco",
    "aneel_continuidade",
    "aneel_tarifas_aplicacao",
    "aneel_polimero",
    "cvm_cad_cia_aberta"
   ],
   "formula": "cópia pelo CNPJ canônico (14 dígitos) do valor publicado na base publicada de origem; a fórmula de cada número é a do módulo de origem (proveniências distribuidoras_perdas, distribuidoras_pnt, distribuidoras_qualidade e distribuidoras_tarifa na gold)",
   "regra_agregacao": "Nenhuma: um valor por distribuidora, o mesmo da página de origem.",
   "versao_formula": "1",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "naturezas_por_campo": {
    "perdas.taxa_total_pct": "CALCULADO",
    "perdas.pnt_bt_pct": "ESTIMADO",
    "qualidade.dec": "CALCULADO",
    "qualidade.fec": "CALCULADO",
    "qualidade.dec_limite": "CALCULADO",
    "qualidade.fec_limite": "CALCULADO",
    "tarifa.total": "CALCULADO"
   },
   "dimensoes": [
    "distribuidora",
    "módulo de origem"
   ],
   "regras_comparabilidade": [
    "Pares: mesma classificação (concessionária ou permissionária) e mesmo porte do ranking de continuidade.",
    "Anos de referência podem diferir entre módulos; cada bloco traz o seu."
   ],
   "regra_cobertura": "CNPJ presente no SAMP, na continuidade ou nas tarifas; índice com os campos ausentes onde a base publicada de origem não tem o dado.",
   "politica_ausencia": "Módulo sem dado para a distribuidora = bloco nulo (nunca zero).",
   "validacoes": [
    "Slug único por distribuidora; aliases só sem colisão.",
    "Valores iguais aos da base publicada de origem (teste por CNPJ)."
   ],
   "limitacoes": [
    "Distribuidora encerrada (fim de série no SAMP) aparece como inativa com os dados históricos disponíveis.",
    "O índice traz um ano de referência por módulo; a evolução própria vem das séries das bases publicadas de origem (perdas_anual.json, qualidade_distribuidoras_serie.json, conta_historico_b1.json) pelo mesmo CNPJ, indicadas em distribuidoras.series_evolucao e indice[].evolucao."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_divida_bruta",
   "titulo": "Empréstimos, financiamentos e debêntures",
   "pergunta": "Quanto a companhia deve em empréstimos, financiamentos e debêntures?",
   "definicao": "Soma das contas 2.01.04 (circulante) e 2.02.01 (não circulante) do mesmo escopo e da mesma data.",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "fim do exercício (DFP) e fim do trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "divida_bruta = VL(2.01.04) + VL(2.02.01), mesmo escopo e mesma data; ausente se uma das duas faltar",
   "regra_agregacao": "Nenhuma agregação entre companhias. Saldo no fim do período; não se soma no tempo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência.",
    "Recalculada nos testes a partir do BPP original: CEMIG consolidado em 31/12/2024, 2.876.548 + 9.402.752 = R$ 12.279.300 mil."
   ],
   "limitacoes": [
    "Não desconta caixa (não é dívida líquida); arrendamentos entram só quando a companhia os classifica nessas contas.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_ebit",
   "titulo": "Resultado antes do resultado financeiro e dos tributos",
   "pergunta": "Qual o resultado operacional contábil?",
   "definicao": "Conta 3.05 da DRE padronizada da CVM. Não é EBITDA (depreciação e amortização não somadas de volta).",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "exercício social (DFP) e trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 3.05 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Fluxo: valor do período publicado (exercício, trimestre ou acumulado no ano); o 4º trimestre não é deduzido por diferença.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência."
   ],
   "limitacoes": [
    "EBITDA não é conta padronizada e não é publicado pelo observatório.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_emprestimos_cp",
   "titulo": "Empréstimos e financiamentos no passivo circulante",
   "pergunta": "Quanto vence em até 12 meses em empréstimos, financiamentos e debêntures?",
   "definicao": "Conta 2.01.04 do balanço patrimonial passivo (inclui debêntures).",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "fim do exercício (DFP) e fim do trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 2.01.04 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Saldo no fim do período; não se soma no tempo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência.",
    "Relida do BPP original nos testes: CEMIG consolidado em 31/12/2024, R$ 2.876.548 mil."
   ],
   "limitacoes": [
    "Arrendamentos entram só quando a companhia os classifica nessa conta.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_emprestimos_lp",
   "titulo": "Empréstimos e financiamentos no passivo não circulante",
   "pergunta": "Quanto vence depois de 12 meses em empréstimos, financiamentos e debêntures?",
   "definicao": "Conta 2.02.01 do balanço patrimonial passivo (inclui debêntures).",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "fim do exercício (DFP) e fim do trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 2.02.01 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Saldo no fim do período; não se soma no tempo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência.",
    "Relida do BPP original nos testes: CEMIG consolidado em 31/12/2024, R$ 9.402.752 mil."
   ],
   "limitacoes": [
    "Arrendamentos entram só quando a companhia os classifica nessa conta.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_hhi_capacidade",
   "titulo": "Concentração da potência em operação (HHI)",
   "pergunta": "Quão concentrada está a propriedade da potência em operação?",
   "definicao": "Índice Herfindahl-Hirschman: soma dos quadrados das cotas (em %) de cada participante na potência da fronteira. Publicado por proprietário direto (capacidade proporcional), por grupo (capacidade proporcional das empresas do grupo) e por grupo de controle (capacidade sob controle), e por tipo de usina.",
   "unidade": "pontos (0 a 10.000)",
   "grao_geografico": "Brasil (fronteira explícita)",
   "grao_temporal": "fotografia diária do SIGA",
   "fontes": [
    "aneel_siga",
    "aneel_polimero"
   ],
   "formula": "HHI = Σ_i (100 × P_i ÷ T)²; CR4 e CR10 = Σ das 4 e 10 maiores cotas",
   "regra_agregacao": "Cotas sobre o total T da fronteira; a parcela sem participante identificável (pessoas físicas; no controle, usinas sem maioria) fica no denominador e fora do numerador.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "nível (proprietário, grupo, controle)",
    "tipo de usina"
   ],
   "regras_comparabilidade": [
    "Fronteira: potência fiscalizada das usinas em fase Operação no SIGA cujas participações publicadas somam 100% (tolerância de 0,005 p.p. por parcela), Brasil, na data do SIGA; exclui micro e minigeração distribuída.",
    "Não é o mercado relevante de uma análise concorrencial (energia vendida, submercado, contratos). Faixas descritivas do Guia para Análise de Atos de Concentração Horizontal do CADE (2016): abaixo de 1.500 não concentrado, de 1.500 a 2.500 moderadamente concentrado, acima de 2.500 altamente concentrado. As diretrizes americanas de 2010, com os mesmos limiares, foram substituídas em 2023 por outras com limiares diferentes."
   ],
   "regra_cobertura": "Potência da fronteira; a parcela fora é publicada.",
   "politica_ausencia": "Participante sem CNPJ não entra no numerador: o HHI é limite inferior.",
   "validacoes": [
    "Soma das cotas ≤ 100%; HHI entre 0 e 10.000.",
    "Recalculado nos testes por caminho independente: o SIGA original relido por outro parser (recorte de 14 usinas com valores escritos no teste e, quando o bronze existe, o arquivo inteiro: HHI 135,3 e CR4 18,21% por proprietário direto; HHI 392,1 por grupo com o mapa proprietário → grupo publicado)."
   ],
   "limitacoes": [
    "Por proprietário direto subestima a concentração (sociedades de propósito específico contam separadas)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_lucro_controladores",
   "titulo": "Lucro atribuído aos sócios da controladora",
   "pergunta": "Quanto do lucro consolidado pertence aos acionistas da companhia?",
   "definicao": "Conta 3.11.01 da DRE consolidada padronizada da CVM (o lucro sem a parcela dos sócios não controladores).",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "exercício social (DFP) e trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 3.11.01 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Fluxo: valor do período publicado (exercício, trimestre ou acumulado no ano); o 4º trimestre não é deduzido por diferença.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência."
   ],
   "limitacoes": [
    "Só existe no consolidado; no individual o lucro inteiro (3.11) é da companhia.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_lucro_liquido",
   "titulo": "Lucro ou prejuízo do período",
   "pergunta": "Quanto a companhia lucrou?",
   "definicao": "Conta 3.11 da DRE padronizada da CVM; no consolidado inclui a parcela dos não controladores (3.11.02).",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "exercício social (DFP) e trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 3.11 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Fluxo: valor do período publicado (exercício, trimestre ou acumulado no ano); o 4º trimestre não é deduzido por diferença.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência."
   ],
   "limitacoes": [
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_patrimonio_liquido",
   "titulo": "Patrimônio líquido",
   "pergunta": "Qual o patrimônio líquido no fim do período?",
   "definicao": "Conta 2.03 do balanço patrimonial passivo.",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "fim do exercício (DFP) e fim do trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 2.03 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Saldo no fim do período; não se soma no tempo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência."
   ],
   "limitacoes": [
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_receita",
   "titulo": "Receita líquida (companhia aberta)",
   "pergunta": "Quanto a companhia faturou no período?",
   "definicao": "Conta 3.01 (Receita de venda de bens e/ou serviços) da DRE padronizada da CVM.",
   "unidade": "R$ nominais",
   "grao_geografico": "companhia aberta (CNPJ), consolidado ou individual",
   "grao_temporal": "exercício social (DFP) e trimestre (ITR)",
   "fontes": [
    "cvm_cad_cia_aberta",
    "cvm_dfp",
    "cvm_itr"
   ],
   "formula": "VL_CONTA da conta 3.01 × escala (MIL = 1.000; UNIDADE = 1), maior versão do documento",
   "regra_agregacao": "Nenhuma agregação entre companhias. Fluxo: valor do período publicado (exercício, trimestre ou acumulado no ano); o 4º trimestre não é deduzido por diferença.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "companhia",
    "escopo",
    "periodo",
    "documento"
   ],
   "regras_comparabilidade": [
    "Consolidado e individual são séries separadas do mesmo CNPJ; nenhum valor é somado entre companhias (a controladora já consolida as controladas).",
    "Reapresentação: o comparativo da DFP seguinte pode trazer outro valor para o mesmo exercício; o CSV publica os dois quando diferem em mais de R$ 1 mil."
   ],
   "regra_cobertura": "Companhias abertas com setor de energia elétrica declarado à CVM (ou distribuidoras do índice com registro): não representa o setor inteiro.",
   "politica_ausencia": "Conta não publicada no documento fica ausente (nunca zero). Coluna de demonstração com ativo total igual a zero (escopo que a companhia não apresentou e a CVM preenche com zero, como o consolidado de quem deixou de ter controladas) é ausência, nunca zero. Coluna não preenchida pela companhia, com prova no próprio arquivo (valores 0 ou ±1 na unidade do documento contra o outro escopo preenchido; DFC zerada contra saldo de caixa, com a DRE zerada do mesmo documento), também é ausência. Exercício curto de fato (constituição) fica fora da série anual e vai para o CSV com recorte exercicio_irregular; data de início mal preenchida pela companhia num exercício inteiro (balanço positivo no fim do ano anterior no mesmo documento) fica na série com nota.",
   "validacoes": [
    "Só contas fixas (ST_CONTA_FIXA = S) e rótulo da 3.01 iniciado por 'Receita' (plano de empresas comerciais e industriais).",
    "Escala e moeda conferidas linha a linha (REAL; MIL ou UNIDADE); outra escala é descartada e contada.",
    "Escala conferida entre documentos da mesma companhia e escopo: o mesmo número publicado em dois documentos (exercício e comparativo da DFP seguinte; balanço de 31/12 e comparativo do ITR; trimestre e comparativo do ITR do ano seguinte) com razão de 1.000 (±0,1%) prova que uma das marcas MIL/UNIDADE está errada; os documentos ligados são convertidos para a escala da DFP mais recente (63 documentos de 12 companhias em 30/09/2026, entre eles a Equatorial Goiás de 2019 a 2021 e a Celeo Redes em 2019). O valor corrigido tem natureza ESTIMADO e nota no CSV.",
    "Domínio: ativo total publicado sempre maior que zero (coluna com ativo zero é tratada como não apresentada; violação restante vira stub); salto de 300 vezes ou mais no ativo entre exercícios consecutivos fica listado para conferência.",
    "Relida do CSV original por código independente nos testes: CEMIG consolidado 2024, R$ 39.819.620 mil; CEMIG 2º trimestre de 2025, R$ 10.786.295 mil (trimestre) e R$ 20.630.526 mil (acumulado); Equatorial Goiás 2021 individual, R$ 9.735.479 mil depois da correção de escala (a DFP 2021 marca UNIDADE; a DFP 2022 traz o mesmo número em MIL)."
   ],
   "limitacoes": [
    "Nas distribuidoras inclui receita de construção da infraestrutura da concessão, com custo equivalente.",
    "Demonstrações societárias (CVM), não regulatórias (ANEEL).",
    "Valor com nota escala_corrigida no CSV é ESTIMADO pelo observatório (a fonte marcou outra escala no documento)."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas",
    "/setor-eletrico/empresas/[entidade]"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_transmissao_cobertura_cnpj",
   "titulo": "Módulos de transmissão ligados ao CNPJ",
   "pergunta": "Que parte dos ativos de transmissão do SIGET tem a concessionária identificada por CNPJ?",
   "definicao": "Módulos do SIGET cujo contrato proprietário tem CNPJ publicado no recurso de contratos, divididos pelos módulos distintos do SIGET.",
   "unidade": "% dos módulos",
   "grao_geografico": "Brasil",
   "grao_temporal": "fotografia do SIGET",
   "fontes": [
    "aneel_siget"
   ],
   "numerador": "módulos com contrato proprietário ligado a um CNPJ",
   "denominador": "módulos distintos do SIGET",
   "formula": "100 × numerador ÷ denominador",
   "regra_agregacao": "Razão de contagens de módulos distintos.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "tipo de módulo"
   ],
   "regras_comparabilidade": [
    "Comparar só fotografias do SIGET."
   ],
   "regra_cobertura": "Todos os módulos do recurso 'SIGET - Contrato Empreendimento Obra Módulo'.",
   "politica_ausencia": "Contrato sem CNPJ na fonte (1 em 29/09/2026, sem módulos) fica fora e é contado.",
   "validacoes": [
    "Um único contrato proprietário por módulo (nenhum módulo com dois em 29/09/2026)."
   ],
   "limitacoes": [
    "Cobre os contratos de concessão registrados no SIGET."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_transmissao_km_circuito",
   "titulo": "Linhas de transmissão por concessionária (km de circuito)",
   "pergunta": "Quantos quilômetros de circuito de transmissão em operação cada concessionária detém?",
   "definicao": "Soma da extensão (NumEtnLinTms) dos módulos de linha ativos do SIGET cujo contrato proprietário (IdeCcdProprietario) é da concessionária, contando só os módulos com alguma obra em operação ou concluída. Cada módulo de linha é um circuito.",
   "unidade": "km de circuito",
   "grao_geografico": "concessionária de transmissão (CNPJ) e grupo (topo da cadeia de controle)",
   "grao_temporal": "fotografia do SIGET (arquivo gerado diariamente)",
   "fontes": [
    "aneel_siget"
   ],
   "formula": "km(e) = Σ_m NumEtnLinTms(m) × [contrato_proprietário(m) tem CNPJ e] × [linha ativa] × [obra em operação]",
   "regra_agregacao": "Soma por CNPJ e por grupo; cada módulo pertence a um só contrato e conta uma vez (o arquivo repete o módulo por obra).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "concessionária",
    "grupo",
    "situação do módulo"
   ],
   "regras_comparabilidade": [
    "km de circuito, não km de traçado: linha de circuito duplo conta duas vezes; não se compara com o comprimento de geometria da EPE.",
    "Vínculo pelo CNPJ publicado no recurso 'SIGET - Contrato Agente'; nenhum vínculo por nome."
   ],
   "regra_cobertura": "Módulos de linha registrados no SIGET em contratos de concessão de transmissão (1.567 em 29/09/2026, todos com extensão no recurso de linhas e com contrato ligado a CNPJ).",
   "politica_ausencia": "Linha desativada é contada à parte; linha sem obra em operação fica em implantação; módulo sem extensão ficaria fora da soma (nenhum em 29/09/2026).",
   "validacoes": [
    "CNPJ completado com zeros à esquerda (115 contratos publicam o número sem os zeros) e conferido no cadastro de agentes: os 298 CNPJ com módulos estão no cadastro com o ramo transmissão declarado.",
    "Recalculada nos testes por leitura independente do recorte real do SIGET (contratos 012/2007 da AXIA Nordeste e 011/2007 da ATE VI)."
   ],
   "limitacoes": [
    "Instalações de transmissão fora dos contratos registrados no SIGET não estão na medida."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "empresas_transmissao_subestacoes",
   "titulo": "Subestações com equipamento da concessionária",
   "pergunta": "Em quantas subestações cada concessionária tem equipamento em operação?",
   "definicao": "Número de subestações distintas (IdeSbe) em que a concessionária tem módulo de equipamento (transformador, reator, capacitor, compensador, conversora) em operação, pelo contrato proprietário do módulo.",
   "unidade": "subestações",
   "grao_geografico": "concessionária de transmissão (CNPJ) e grupo",
   "grao_temporal": "fotografia do SIGET",
   "fontes": [
    "aneel_siget"
   ],
   "formula": "subestações(e) = |{IdeSbe(m) : m módulo de equipamento do CNPJ e em operação}|",
   "regra_agregacao": "Contagem de distintos; no grupo, união das subestações das empresas (sem contar duas vezes). Não somar entre CNPJ: a mesma subestação pode ter módulos de mais de uma concessionária.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "concessionária",
    "grupo"
   ],
   "regras_comparabilidade": [
    "O SIGET aberto liga à subestação só os módulos de equipamento; manobra e módulo geral ficam sem subestação."
   ],
   "regra_cobertura": "4.318 módulos de equipamento em 29/09/2026, todos com subestação no recurso de equipamentos.",
   "politica_ausencia": "Concessionária só com linhas (sem módulo de equipamento) tem zero subestações por esta definição, o que não significa ausência de pátio de manobra.",
   "validacoes": [
    "Subestações distintas do SIGET inteiro publicadas ao lado (625 com equipamento em operação em 29/09/2026)."
   ],
   "limitacoes": [
    "Não mede a propriedade da subestação inteira; mede presença de equipamento da concessionária nela."
   ],
   "gold": "empresas.json",
   "paginas": [
    "/setor-eletrico/empresas"
   ],
   "arquivo": "pipeline/energia/metricas/empresas.py"
  },
  {
   "id": "expansao_atraso_previsto",
   "titulo": "Atraso previsto em relação ao cronograma outorgado",
   "pergunta": "Quanto da potência com previsão deve entrar depois da data outorgada, e com que atraso típico?",
   "definicao": "Para cada unidade do RALIE mais recente com previsão da fiscalização e data outorgada de operação comercial: diferença em dias entre a previsão e a data outorgada; publica-se a mediana ponderada por kW e a parcela da potência com previsão depois da data outorgada.",
   "unidade": "dias e % do MW com previsão",
   "grao_geografico": "Brasil; usina (CSV da carteira)",
   "grao_temporal": "fotografia do RALIE (data-base)",
   "fontes": [
    "aneel_ralie"
   ],
   "numerador": "Σ kW das unidades com previsão posterior à data outorgada",
   "denominador": "Σ kW das unidades com previsão e data outorgada",
   "formula": "atraso(u) = DatPrevisaoOpComercialSFG − DatUGInicioOpComerOutorgado; mediana ponderada por MdaPotenciaUnitaria",
   "regra_agregacao": "Mediana ponderada (menor valor cuja soma acumulada de pesos alcança metade do total); percentual como razão de somas.",
   "versao_formula": "1",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "usina",
    "unidade geradora"
   ],
   "regras_comparabilidade": [
    "Toda previsão tem data-base: a fotografia do RALIE (DatRalie) em que foi publicada. Nenhuma promessa antiga é reconstruída com o estoque atual; o histórico publicado pela ANEEL começa em 17/06/2021 e o histórico próprio do observatório, na primeira captura do RALIE atual.",
    "É atraso previsto, não atraso realizado: a previsão muda a cada fotografia.",
    "Data em bloco: previsão atribuída a pelo menos 100 usinas distintas na mesma fotografia (o maior complexo do RALIE tem 41 usinas). Ela anda com a fotografia, cerca de 5 anos depois dela (13/09/2031 na fotografia de 18/09/2026), e por isso os números saem também sem essas unidades."
   ],
   "regra_cobertura": "Unidades com as duas datas preenchidas na fotografia mais recente; publicado com e sem as unidades em data em bloco. Unidades sem previsão ficam fora do denominador.",
   "politica_ausencia": "Unidade sem previsão ou sem data outorgada fica fora (nunca atraso zero).",
   "validacoes": [
    "Data-base publicada em cada linha do CSV (data_base_ralie).",
    "Marca de data em bloco por unidade no CSV (previsao_em_bloco)."
   ],
   "limitacoes": [
    "Datas atribuídas em bloco a milhares de unidades sem licença, sem acesso à rede ou com revogação em avaliação (ex.: 13/09/2031 na fotografia de 18/09/2026) indicam previsão convencional da fiscalização, não cronograma de obra.",
    "A parcela depois da data outorgada não se explica só pela data em bloco: sem ela, continua acima da metade da potência com previsão (61,0% em 18/09/2026)."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_capacidade_operacao",
   "titulo": "Capacidade instalada em operação (SIGA)",
   "pergunta": "Quanta potência de geração está em operação no Brasil, por fonte e por UF?",
   "definicao": "Soma da potência fiscalizada (MdaPotenciaFiscalizadaKw, potência em operação) das usinas do SIGA na fase Operação, uma por núcleo de CEG, convertida de kW para MW.",
   "unidade": "MW",
   "grao_geografico": "Brasil; UF principal da usina",
   "grao_temporal": "fotografia diária do SIGA (data de geração do arquivo)",
   "fontes": [
    "aneel_siga"
   ],
   "formula": "capacidade(g) = Σ MdaPotenciaFiscalizadaKw das usinas em Operação no grupo g ÷ 1.000",
   "regra_agregacao": "Soma simples de potência das usinas do grupo (tipo, origem, fonte ou UF); participação = 100 × capacidade do grupo ÷ capacidade total.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "tipo de geração",
    "origem",
    "fonte",
    "UF"
   ],
   "regras_comparabilidade": [
    "MW é potência instalada ou outorgada, não energia: a produção depende do fator de capacidade de cada fonte, e garantia física ou energia firme são outras grandezas.",
    "Usina multiestadual é atribuída à UF principal informada pelo SIGA; a potência não é dividida entre UFs (o número e a potência dessas usinas saem na gold, em capacidade_instalada.multiestaduais).",
    "Capacidade cadastrada não se compara com geração verificada (ONS) sem converter por duração e fator de capacidade."
   ],
   "regra_cobertura": "Todas as usinas do arquivo diário do SIGA na fase Operação (geração centralizada; a micro e minigeração distribuída não está no SIGA).",
   "politica_ausencia": "Potência vazia não soma; núcleo de CEG repetido na fonte conta uma vez (as repetições são registradas no silver).",
   "validacoes": [
    "Potência negativa é violação crítica (a gold não é publicada).",
    "Reconciliação por tipo com o agregado oficial 'empreendimentos em operação' e por UF com 'capacidade instalada por UF', descontando as liberações comerciais do intervalo: resíduo dentro de 1% do grupo ou ressalva publicada.",
    "Usina com potência fiscalizada mais de 20% acima da outorgada é mantida e contada em ressalva."
   ],
   "limitacoes": [
    "Usina multiestadual é atribuída à UF principal informada pelo SIGA; a potência não é dividida entre UFs (o número e a potência dessas usinas saem na gold, em capacidade_instalada.multiestaduais).",
    "O SIGA usa 1900-01-03 para usina sem data de entrada em operação e coordenada 0 para localização não informada: os dois viram ausência, nunca data ou ponto (0, 0).",
    "A MMGD fica fora do SIGA (ver módulo Transição)."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_confiabilidade_previsoes",
   "titulo": "Confiabilidade das previsões de operação comercial em 12 meses",
   "pergunta": "Da potência que a fiscalização previa para os 12 meses seguintes, quanto entrou no prazo?",
   "definicao": "Para cada fotografia mensal S do RALIE (última do mês), a potência das unidades com previsão em (S, S + 365 dias] e quanto dela foi liberada para operação comercial até S + 365 dias, depois disso (até a data do arquivo de liberações) ou não foi liberada. Só janelas encerradas pelo menos 15 dias antes da data do arquivo de liberações.",
   "unidade": "MW e % do MW prometido",
   "grao_geografico": "Brasil; tipo de geração",
   "grao_temporal": "fotografia mensal do RALIE (data-base) e janela de 12 meses",
   "fontes": [
    "aneel_ralie",
    "aneel_liberacao_comercial"
   ],
   "numerador": "Σ kW das unidades prometidas liberadas até o fim da janela",
   "denominador": "Σ kW com previsão na janela na fotografia S",
   "formula": "pct_no_prazo(S) = 100 × Σ kW liberado até S + 365 dias ÷ Σ kW prometido em S",
   "regra_agregacao": "Razão de somas de potência por fotografia; unidades já liberadas antes de S saem do denominador e são contadas à parte.",
   "versao_formula": "1",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fotografia",
    "tipo de geração"
   ],
   "regras_comparabilidade": [
    "Toda previsão tem data-base: a fotografia do RALIE (DatRalie) em que foi publicada. Nenhuma promessa antiga é reconstruída com o estoque atual; o histórico publicado pela ANEEL começa em 17/06/2021 e o histórico próprio do observatório, na primeira captura do RALIE atual.",
    "Janelas recentes têm menos tempo para liberação 'depois do prazo'."
   ],
   "regra_cobertura": "Fotografias mensais desde junho de 2021 com janela encerrada.",
   "politica_ausencia": "Unidade sem liberação no arquivo conta como não liberada até a data do arquivo.",
   "validacoes": [
    "Partição: no prazo + depois + não liberada = prometida em todas as fotografias.",
    "Vínculo exato por (IdeNucleoCEG, NumUgUsina); grupos '1 a 5' do arquivo de liberações são expandidos, texto não numérico não é vinculado.",
    "Unidades de usina com potência fora de escala na fotografia (soma 10 vezes a outorga ou mais) excluídas da janela."
   ],
   "limitacoes": [
    "Unidade renumerada entre a fotografia e a liberação aparece como não liberada."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_contratos_transmissao",
   "titulo": "Contratos de concessão de transmissão assinados por ano",
   "pergunta": "Quanta rede foi contratada depois do último leilão presente no arquivo de leilões?",
   "definicao": "Contratos de concessão de transmissão por ano de assinatura (DatAsnCcd do recurso 'SIGET - Contrato Agente'), com km de circuito e MVA de transformação das obras de Instalação do objeto original de cada contrato (linhas do arquivo de obras com a mesma data de fim do contrato).",
   "unidade": "contratos, km de circuito e MVA",
   "grao_geografico": "Brasil; contrato (CSV)",
   "grao_temporal": "ano de assinatura do contrato",
   "fontes": [
    "aneel_siget"
   ],
   "formula": "km(ano) = Σ NumEtnLinTms dos módulos LT de obras de Instalação dos contratos assinados no ano (objeto original); MVA(ano) = Σ MdaPotAtvMdlEqp dos transformadores de finalidade principal (reserva em mva_tr_reserva)",
   "regra_agregacao": "Somas por ano de assinatura, cada grandeza no seu campo.",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano de assinatura",
    "contrato"
   ],
   "regras_comparabilidade": [
    "Contrato não é leilão: pode vir de leilão, relicitação ou outra origem; não tem RAP de lance nem deságio.",
    "km de circuito: no SIGET cada circuito é um módulo de linha com a extensão da linha (NumEtnLinTms), então linha de circuito duplo ou bipolo conta cada circuito."
   ],
   "regra_cobertura": "Todos os contratos de concessão cadastrados no SIGET (413 em 29/09/2026); ano do período sem contrato é zero observado.",
   "politica_ausencia": "Contrato sem empreendimento cadastrado tem km e MVA ausentes, não zero.",
   "validacoes": [
    "Contratos assinados em 28/06/2024 (15) e 09/12/2024 (3) iguais ao número de lotes dos leilões 001/2024 (15) e 002/2024 (3)."
   ],
   "limitacoes": [
    "Reforço incorporado depois a contrato antigo, com prazo próprio, fica fora das somas.",
    "O SIGET não informa o leilão de origem: a ligação com o arquivo de leilões é só temporal."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_desfecho_coortes",
   "titulo": "Desfecho das usinas que passaram pelo RALIE",
   "pergunta": "Das usinas que estavam em implantação, quantas entraram em operação, tiveram a outorga encerrada ou saíram sem desfecho?",
   "definicao": "Cada usina do Parquet histórico do RALIE é classificada, nesta ordem: em implantação (consta na fotografia mais recente); operação (todas as unidades da primeira fotografia liberadas para operação comercial, ou fase Operação no SIGA quando a usina não operava antes da primeira fotografia); outorga encerrada (ato de revogação ou extinção publicado depois da primeira aparição, ou ato de encerramento sem data de publicação na fonte); sem desfecho. Em ampliação de usina que já operava antes da primeira fotografia (entrada em operação no SIGA ou liberação comercial anterior), a fase Operação do SIGA reflete a parte antiga e não conta: só a liberação de todas as unidades da ampliação. Agrupadas por coorte (estoque da primeira fotografia e ano de entrada no RALIE), ponderadas pela potência das unidades em implantação na primeira aparição, limitada à outorga da usina.",
   "unidade": "% do MW em implantação na primeira fotografia e usinas",
   "grao_geografico": "Brasil; usina (CSV)",
   "grao_temporal": "coorte (primeira fotografia ou ano de entrada)",
   "fontes": [
    "aneel_ralie",
    "aneel_siga",
    "aneel_liberacao_comercial",
    "aneel_atos_outorga_geracao"
   ],
   "numerador": "Σ peso das usinas da coorte com o desfecho; peso = min(Σ MdaPotenciaUnitaria das unidades da primeira fotografia, MdaPotenciaOutorgadaKw da usina na mesma fotografia)",
   "denominador": "Σ peso de todas as usinas da coorte",
   "formula": "pct(desfecho, coorte) = 100 × Σ peso(desfecho) ÷ Σ peso(coorte)",
   "regra_agregacao": "Razão de somas de potência; desfechos disjuntos e exaustivos (somam 100%). A potência outorgada da usina sai ao lado (mw_outorgado), como contexto.",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "coorte",
    "desfecho",
    "tipo",
    "UF"
   ],
   "regras_comparabilidade": [
    "Outorga não é capacidade que certamente entrará: parte da carteira é revogada ou sai do acompanhamento sem operar (ver o desfecho das coortes do RALIE).",
    "Coortes recentes tiveram menos tempo para entrar em operação: comparar coortes de mesma idade."
   ],
   "regra_cobertura": "Usinas presentes em alguma fotografia do Parquet histórico desde 17/06/2021; vínculo pelo núcleo do CEG.",
   "politica_ausencia": "Usina sem operação nem ato de encerramento fica em 'sem desfecho', nunca em operação.",
   "validacoes": [
    "Soma dos desfechos igual ao total da coorte.",
    "Peso limitado à outorga: unidade com potência fora de escala na primeira fotografia (Belvedere 1, 14 unidades somando 45 GW para 45 MW outorgados em 17/06/2021) não domina a coorte."
   ],
   "limitacoes": [
    "Usina em operação parcial que segue no RALIE conta como em implantação.",
    "Ampliação sem liberação das unidades no arquivo de liberações fica em sem desfecho (ou outorga encerrada, se houver ato), mesmo com a usina em operação no SIGA.",
    "Sem desfecho não é abandono: pode ser mudança de CEG, saída do acompanhamento, ato fora do conjunto ou ato de revogação publicado sem núcleo nem código do CEG (320 atos e 13.446,8 MW em 30/09/2026, 293 de 2026 e 27 de 2025), que não se liga a nenhuma usina do RALIE."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_deslizamento_previsoes",
   "titulo": "Revisão das previsões em 12 meses",
   "pergunta": "Quanto a previsão da fiscalização para a mesma unidade muda em 12 meses, sem contar a data convencional que anda com a fotografia?",
   "definicao": "Para a mesma unidade presente nas fotografias mensais S e S + 12 meses com previsão preenchida nas duas: variação da previsão em dias (positivo = adiada), com a parcela da potência adiada, mantida e antecipada e a mediana ponderada por kW. Publicada com todas as unidades e sem as unidades cuja previsão é data em bloco em S ou em S + 12 meses, com a parcela da potência em data em bloco de cada par: o adiamento dessas unidades é o deslocamento da data convencional, não revisão de cronograma de obra.",
   "unidade": "% do MW e dias",
   "grao_geografico": "Brasil",
   "grao_temporal": "par de fotografias mensais com 12 meses de distância",
   "fontes": [
    "aneel_ralie"
   ],
   "numerador": "Σ kW das unidades com previsão adiada (ou mantida, ou antecipada)",
   "denominador": "Σ kW das unidades presentes nas duas fotografias com previsão",
   "formula": "desl(u) = previsão(S + 12 meses) − previsão(S); mediana ponderada por MdaPotenciaUnitaria",
   "regra_agregacao": "Razão de somas de potência; mediana ponderada.",
   "versao_formula": "1",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fotografia"
   ],
   "regras_comparabilidade": [
    "Toda previsão tem data-base: a fotografia do RALIE (DatRalie) em que foi publicada. Nenhuma promessa antiga é reconstruída com o estoque atual; o histórico publicado pela ANEEL começa em 17/06/2021 e o histórico próprio do observatório, na primeira captura do RALIE atual.",
    "Só unidades que continuam em implantação 12 meses depois: as que entraram em operação saem do par."
   ],
   "regra_cobertura": "Pares de fotografias mensais do Parquet histórico.",
   "politica_ausencia": "Unidade sem previsão em uma das fotografias fica fora do par.",
   "validacoes": [
    "Parcelas adiada + mantida + antecipada somam 100% do par.",
    "Unidades de usina com potência fora de escala na fotografia (soma 10 vezes a outorga ou mais) excluídas do par."
   ],
   "limitacoes": [
    "Viés de sobrevivência: o par só contém unidades que não entraram em operação no intervalo.",
    "Datas atribuídas em bloco a milhares de unidades sem licença, sem acesso à rede ou com revogação em avaliação (ex.: 13/09/2031 na fotografia de 18/09/2026) indicam previsão convencional da fiscalização, não cronograma de obra.",
    "Data em bloco: previsão atribuída a pelo menos 100 usinas distintas na mesma fotografia (o maior complexo do RALIE tem 41 usinas). Ela anda com a fotografia, cerca de 5 anos depois dela (13/09/2031 na fotografia de 18/09/2026), e por isso os números saem também sem essas unidades.",
    "Mesmo sem as datas em bloco, a revisão mede a mudança da previsão da fiscalização, não a causa do atraso."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_desvio_prazo_vigente",
   "titulo": "Desvio da liberação comercial em relação ao prazo outorgado vigente",
   "pergunta": "Em relação ao prazo outorgado em vigor na publicação, quando a potência foi liberada para operação comercial?",
   "definicao": "Para cada linha do arquivo detalhado de liberações para operação comercial: data de liberação realizada menos a data outorgada de início da operação comercial da unidade, como publicada no arquivo (prazo vigente, sem data-base); por ano da liberação, mediana ponderada por kW e parcelas da potência liberada depois e antes do prazo. Não é atraso: em autorizações recentes a data outorgada é um prazo limite anos à frente. O que atrasou em relação a uma previsão datada está em expansao_confiabilidade_previsoes.",
   "unidade": "dias e % do MW liberado com data outorgada",
   "grao_geografico": "Brasil; tipo de geração",
   "grao_temporal": "ano da liberação comercial (desde 2014)",
   "fontes": [
    "aneel_liberacao_comercial"
   ],
   "numerador": "Σ kW liberado depois da data outorgada vigente",
   "denominador": "Σ kW liberado com data outorgada preenchida",
   "formula": "desvio = DatLiberOpComerRealizado − DatUGInicioOpComerOutorgado; mediana ponderada por MdaPotenciaLiberadaComercial",
   "regra_agregacao": "Mediana ponderada por potência; percentuais como razão de somas.",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "tipo de geração"
   ],
   "regras_comparabilidade": [
    "O ano corrente é parcial e é marcado (ano_parcial); não compete com anos completos.",
    "Antes de 2014 o arquivo detalhado não cobre toda a potência liberada (nota do dicionário da ANEEL): a série começa em 2014.",
    "Não é publicado como destaque nem chamado de atraso: falta data-base à data outorgada."
   ],
   "regra_cobertura": "Usinas acompanhadas pela fiscalização (o arquivo não cobre todo o SIGA).",
   "politica_ausencia": "Linha sem data outorgada fica fora da mediana e das parcelas.",
   "validacoes": [
    "Potência em kW do campo MdaPotenciaLiberadaComercial (o campo unitário mistura MW e kW em linhas antigas).",
    "Denominador publicado: mw_com_data_outorgada e unidades_ou_grupos_com_data_outorgada; linhas sem data outorgada em campos próprios (os percentuais se reconstroem da gold)."
   ],
   "limitacoes": [
    "A data outorgada é a vigente na publicação: cronograma alterado por ato posterior é medido contra a data alterada.",
    "Em autorizações recentes (sobretudo solares) a data outorgada é um prazo limite: em 2026, parcial, a mediana é de 1.209 dias antes do prazo."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_encerramentos_outorga",
   "titulo": "Encerramentos de outorga (revogação e extinção)",
   "pergunta": "Quanta potência outorgada foi revogada ou extinta, e quando?",
   "definicao": "Atos da ANEEL do conjunto 'Atos de Outorgas de Geração' cujo objeto é revogação de autorização ou extinção de concessão. A potência conta uma vez por usina (núcleo do CEG) em cada ano de publicação e uma vez por usina no total, pelo maior valor conferido entre os atos da usina; a contagem de atos fica à parte. A potência de cada ato (MdaPotenciaInstaladaMW) é conferida contra a potência outorgada da mesma usina no SIGA e no RALIE histórico e contra o limite legal da CGH (5 MW).",
   "unidade": "atos, usinas e MW",
   "grao_geografico": "Brasil; tipo de geração",
   "grao_temporal": "ano de publicação do ato",
   "fontes": [
    "aneel_atos_outorga_geracao",
    "aneel_siga",
    "aneel_ralie"
   ],
   "formula": "MW(ano) = Σ por usina com ato no ano de max(potência conferida dos atos da usina no ano); MW(total) = Σ por usina de max(potência conferida de todos os atos da usina)",
   "regra_agregacao": "Uma vez por usina (núcleo do CEG) por ano e no total; atos contados à parte. Ato sem núcleo do CEG conta como uma unidade (não pode ser deduplicado).",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "tipo de encerramento",
    "tipo de geração do ato",
    "tipo de geração no cadastro do SIGA",
    "situação no SIGA"
   ],
   "regras_comparabilidade": [
    "O ano corrente é parcial e é marcado (ano_parcial); não compete com anos completos.",
    "Revogação de registros anteriores à outorga (DRO, DRI, DRS) não entra: não é outorga de usina.",
    "Usina com atos em anos diferentes aparece em cada um desses anos; o total conta a usina uma vez."
   ],
   "regra_cobertura": "Atos publicados desde 2015 (início do conjunto). Outorga encerrada não é usina retirada: os atos de usinas que seguem na fase Operação do SIGA são contados à parte (conversão de regime ou nova outorga).",
   "politica_ausencia": "Ato sem potência conta como ato, não como 0 MW. Potência com divergência de fator 1.000 sem confirmação de qual lado está certo sai da soma e é listada.",
   "validacoes": [
    "Ruído de ponto flutuante da fonte arredondado a 1 kW.",
    "Valor do ato igual ao do cadastro da usina em kW (fator 1.000): corrigido pelo cadastro quando o valor como MW excede o limite legal do tipo ou outro ato de outorga da mesma usina cita a potência do cadastro; fora da soma quando não há confirmação.",
    "Repetição medida: usinas com mais de um ato e MW que a soma por ato repetiria."
   ],
   "limitacoes": [
    "Encerramentos anteriores a 2015 não constam do conjunto.",
    "O ano corrente é parcial e é marcado (ano_parcial); não compete com anos completos.",
    "Atos sem núcleo nem código do CEG na fonte (320 em 30/09/2026, quase todos de 2025 e 2026) não se ligam a nenhuma usina e não são deduplicados.",
    "Usina sem cadastro no SIGA nem no RALIE (734 atos em 30/09/2026) só tem a potência do ato e o limite do tipo como controle.",
    "O tipo por_tipo é o do ato (a outorga encerrada); o tipo atual no SIGA sai em por_tipo_no_cadastro. Divergem na conversão de regime (concessão ou autorização de PCH ou UHE extinta e usina em operação como CGH sob registro); a conferência de potência usa o tipo do cadastro."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_geracao_e_rede_por_uf",
   "titulo": "Geração em implantação e rede em obra por UF",
   "pergunta": "A expansão da geração em cada UF vem acompanhada de obras de rede?",
   "definicao": "Por UF, lado a lado e sem soma entre si: MW das unidades do RALIE em implantação (e com previsão nos 24 meses seguintes), km de circuito de linhas em obra que tocam a UF e MVA de transformação em obra na UF (SIGET), e km de traçado das linhas existentes e planejadas dentro da UF (WebMap da EPE).",
   "unidade": "MW, km de circuito, MVA e empreendimentos (campos separados)",
   "grao_geografico": "UF",
   "grao_temporal": "fotografias mais recentes do RALIE e do SIGET",
   "fontes": [
    "aneel_ralie",
    "aneel_siget",
    "epe_webmap_rede"
   ],
   "formula": "campos independentes: Σ MdaPotenciaUnitaria (RALIE) por UF; Σ km dos módulos LT em andamento com subestação na UF; Σ MVA em andamento na UF; Σ km das linhas da EPE dentro da UF",
   "regra_agregacao": "Cada grandeza agregada separadamente; nenhuma razão entre MW e km.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "UF"
   ],
   "regras_comparabilidade": [
    "MW é potência instalada ou outorgada, não energia: a produção depende do fator de capacidade de cada fonte, e garantia física ou energia firme são outras grandezas.",
    "MW nominal não indica capacidade firme de escoamento; a comparação é temporal e territorial, não de suficiência."
   ],
   "regra_cobertura": "UFs com geração no RALIE, obra de transmissão em andamento no SIGET ou linha no WebMap da EPE (as 27 UFs em 01/10/2026).",
   "politica_ausencia": "UF sem unidade no RALIE ou sem obra em andamento aparece com 0 (zero observado: os dois arquivos listam todo o seu universo), não com ausência; sem a camada da EPE, os campos da EPE são nulos.",
   "validacoes": [
    "Nenhum campo soma grandezas de unidades diferentes."
   ],
   "limitacoes": [
    "Não mede se a rede comporta a geração: isso exige estudos de acesso e margem de escoamento do ONS e da EPE."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_leiloes_transmissao",
   "titulo": "Leilões de transmissão por ano",
   "pergunta": "Quanta rede foi contratada em leilão e a que preço?",
   "definicao": "Soma por ano do leilão da extensão de linhas (km), da transformação (MVA), do investimento previsto e da receita anual permitida (RAP) do edital e do vencedor dos lotes contratados; deságio agregado pela RAP. Lotes sem vencedor ('SEM LANCE', 'SEM INSCRITO APTO', 'NÃO LEILOADO') são contados à parte, com investimento e RAP do edital como valores ofertados e não contratados.",
   "unidade": "km, MVA, R$ milhões nominais e %",
   "grao_geografico": "Brasil; lote (CSV)",
   "grao_temporal": "ano do leilão",
   "fontes": [
    "aneel_leiloes_transmissao"
   ],
   "numerador": "Σ RAP vencedora dos lotes com as duas RAP",
   "denominador": "Σ RAP do edital dos mesmos lotes",
   "formula": "deságio(ano) = 100 × (1 − Σ RAP vencedora ÷ Σ RAP do edital)",
   "regra_agregacao": "Somas por grandeza, cada uma no seu campo; deságio como razão de somas, nunca média de deságios.",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "leilão",
    "lote",
    "UF",
    "contratado ou sem vencedor"
   ],
   "regras_comparabilidade": [
    "Reais nominais da data de cada leilão, sem correção monetária.",
    "km, MVA e reais nunca são somados entre si."
   ],
   "regra_cobertura": "Lotes de leilões de transmissão desde 1999 até o último leilão presente no arquivo.",
   "politica_ausencia": "Ano sem linha no arquivo é ausência, não zero. Em lote sem vencedor, o 0 de km, MVA, prazo e RAP vencedora é marcador da fonte e vira ausência. Em lote contratado, 0 km só é zero quando a descrição não cita linha (LT ou km), e 0 MVA só quando não cita MVA; nos demais casos é campo não preenchido, fora da soma e contado (29 lotes sem km e 27 sem MVA em 30/09/2026).",
   "validacoes": [
    "Deságio publicado (PctDesagio, fração) conferido contra 1 − RAP vencedora ÷ RAP do edital com tolerância de 0,6 ponto percentual (arredondamento da fonte em duas casas); divergências publicadas."
   ],
   "limitacoes": [
    "Reais nominais da data de cada leilão, sem correção monetária.",
    "Investimento é o previsto no edital, não o realizado.",
    "O MVA dos lotes não segue uma convenção única para o transformador reserva: lotes antigos o incluem ('(6+1) x 250 MVA' = 1.750 MVA no 004/2000, lote 1) e recentes informam só o principal (001/2024, lote 8: '(3+1Res) x 500 MVA' = 1.500 MVA). A série de MVA leiloado mistura as duas convenções e não se compara diretamente com o MVA novo do SIGET, que exclui a reserva."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_obras_transmissao",
   "titulo": "Obras de transmissão: extensão, transformação e prazos",
   "pergunta": "Quanta rede está em obra e quanto dela já passou do prazo do ato legal?",
   "definicao": "Por empreendimento do SIGET: km de circuito dos módulos de linha e MVA dos transformadores de potência de finalidade principal com obra do tipo Instalação (transformador reserva em campo próprio, fora do MVA novo); prazo vigente do ato legal (DatOprComEpd) e data efetiva (DatEfeOprComEpd). Prazo vencido = empreendimento em andamento ou planejado com data do ato legal anterior à data do arquivo. Data efetiva menos prazo do ato legal é desvio em relação ao prazo vigente (já revisto quando houve ato posterior), não atraso com data-base.",
   "unidade": "km de circuito, MVA, empreendimentos e dias",
   "grao_geografico": "empreendimento; UF das subestações (tabela por UF)",
   "grao_temporal": "fotografia diária do SIGET; ano de energização (DatOprComObr)",
   "fontes": [
    "aneel_siget"
   ],
   "formula": "km(emp) = Σ NumEtnLinTms dos módulos LT distintos com obra de Instalação; MVA(emp) = Σ MdaPotAtvMdlEqp dos transformadores de potência com DscFinMdlEqp diferente de 'Reserva'",
   "regra_agregacao": "Somas por grandeza e situação; módulo listado em mais de um empreendimento conta uma vez, no empreendimento da obra de Instalação mais antiga; desvio em relação ao prazo vigente por ano como mediana e percentis de (efetiva − ato legal), com a contagem de empreendimentos em que as duas datas coincidem.",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "situação",
    "UF",
    "ano de energização"
   ],
   "regras_comparabilidade": [
    "km de circuito: no SIGET cada circuito é um módulo de linha com a extensão da linha (NumEtnLinTms), então linha de circuito duplo ou bipolo conta cada circuito.",
    "Reatores e capacitores (Mvar) não entram no MVA de transformação.",
    "Transformador reserva (DscFinMdlEqp = 'Reserva') não acrescenta capacidade: fica em mva_tr_reserva (5.589,6 MVA dos 53.111,3 MVA de transformadores em obras em andamento em 29/09/2026).",
    "Linha interestadual aparece nas duas UFs na tabela por UF: a soma das UFs supera o total nacional."
   ],
   "regra_cobertura": "Empreendimentos com contrato de concessão cadastrados no SIGET.",
   "politica_ausencia": "Módulo sem extensão ou sem potência não soma; empreendimento sem data do ato legal não entra no prazo vencido.",
   "validacoes": [
    "Extensão de cada módulo entre 0 e 3.000 km (o circuito mais longo do SIN tem 2.539 km)."
   ],
   "limitacoes": [
    "km de circuito: no SIGET cada circuito é um módulo de linha com a extensão da linha (NumEtnLinTms), então linha de circuito duplo ou bipolo conta cada circuito.",
    "A previsão informada pela transmissora não está no arquivo aberto: o prazo vencido em andamento é medido contra o prazo vigente do ato legal.",
    "O prazo original do contrato não está no arquivo aberto: o prazo do ato legal publicado é o vigente e coincide com a data efetiva em cerca de um terço a dois quintos dos empreendimentos de cada ano (prazo revisto). Por isso não se publica atraso realizado das obras, só o desvio em relação ao prazo vigente.",
    "O SIGET não tem coordenadas: a territorialização das obras é por UF das subestações; a geometria das linhas vem do WebMap da EPE (expansao_rede_epe), sem chave comum com o SIGET."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_pde_cenarios",
   "titulo": "Cenário oficial do PDE 2035",
   "pergunta": "Como o planejamento oficial enxerga a matriz e a rede até 2035?",
   "definicao": "Valores das figuras 3-6, 3-23, 3-25, 4-19, 4-24, 4-27 e 12-4 do caderno de dados do relatório final do PDE 2035 (EPE e MME), lidos das planilhas publicadas, com título e rótulos das colunas conferidos.",
   "unidade": "GW, MW, km, MVA, R$ bilhões e TWh (por figura)",
   "grao_geografico": "Brasil ou SIN (conforme a figura)",
   "grao_temporal": "ano (ou mês de referência) da figura, 2025 a 2035",
   "fontes": [
    "epe_pde"
   ],
   "regra_agregacao": "Nenhuma: valores como publicados; totais conferidos contra os rótulos do relatório.",
   "versao_formula": "1",
   "natureza_fonte": "CENARIO",
   "natureza_transformacao": "CENARIO",
   "dimensoes": [
    "figura",
    "categoria",
    "ano"
   ],
   "regras_comparabilidade": [
    "PDE 2035 é cenário de planejamento de uma edição específica (data-base das premissas janeiro de 2025, aprovado pela Portaria MME nº 923/2026), nunca realizado nem previsão; é publicado com selo CENÁRIO em camada separada.",
    "Categorias do PDE não correspondem uma a uma às do SIGA: as correspondências diretas e parciais ficam lado a lado, sem diferença calculada.",
    "A UHE das figuras inclui Itaipu 50 Hz, máquinas de Itaipu pertencentes ao Paraguai (Anexo I-3, p. 526): o valor comparável com o SIGA é a linha Hidrelétrica do Anexo I-3 (102,423 GW em dez/2026), sem essa parcela.",
    "A categoria PCH das figuras é 'PCH E CGH' no Anexo I-3: o realizado do SIGA soma PCH e CGH."
   ],
   "regra_cobertura": "Edição PDE 2035 (relatório final aprovado).",
   "politica_ausencia": "Célula vazia na planilha é ausência.",
   "validacoes": [
    "Soma da Figura 3-25 igual aos totais rotulados no relatório (249 GW em 2025 e 359 GW em 2035) com tolerância de 0,5 GW.",
    "Tabela do Anexo I-3 (PDF, p. 526) conferida pelas identidades da própria tabela (Total Considerado = Total do SIN + Itaipu 50 Hz; Renováveis = Hidrelétrica + Outras renováveis) e contra as figuras 3-25 (dez/2035) e 3-6 (2026), com tolerância de 1 MW (arredondamento da figura em GW com três casas).",
    "Soma da Figura 3-6 em 2025 igual a cerca de 251 GW do texto com tolerância de 1 GW: conferência de valor, não de universo (o texto fala em oferta centralizada e a figura inclui a MMGD na coluna Solar)."
   ],
   "limitacoes": [
    "PDE 2035 é cenário de planejamento de uma edição específica (data-base das premissas janeiro de 2025, aprovado pela Portaria MME nº 923/2026), nunca realizado nem previsão; é publicado com selo CENÁRIO em camada separada."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_potencia_por_estagio",
   "titulo": "Potência por estágio do empreendimento (SIGA)",
   "pergunta": "Quanto do parque outorgado já opera, está em obra ou ainda não começou a ser construído?",
   "definicao": "Número de usinas e soma da potência outorgada (MdaPotenciaOutorgadaKw) por fase do SIGA: Operação, Construção e Construção não iniciada (outorgado sem obra). A potência fiscalizada de usina em construção é a parcela que já opera.",
   "unidade": "MW e usinas",
   "grao_geografico": "Brasil; UF principal; tipo de geração",
   "grao_temporal": "fotografia diária do SIGA",
   "fontes": [
    "aneel_siga"
   ],
   "formula": "MW(estágio) = Σ MdaPotenciaOutorgadaKw das usinas na fase ÷ 1.000",
   "regra_agregacao": "Soma por estágio; estágios são disjuntos e exaustivos (cada núcleo de CEG tem uma fase).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "estágio",
    "tipo de geração",
    "UF"
   ],
   "regras_comparabilidade": [
    "Outorga não é capacidade que certamente entrará: parte da carteira é revogada ou sai do acompanhamento sem operar (ver o desfecho das coortes do RALIE).",
    "MW é potência instalada ou outorgada, não energia: a produção depende do fator de capacidade de cada fonte, e garantia física ou energia firme são outras grandezas."
   ],
   "regra_cobertura": "Fases presentes no arquivo aberto do SIGA. Usina com outorga revogada ou extinta pode sair do arquivo ou continuar nele: em 30/09/2026, 196 usinas com ato de encerramento seguem na fase Operação (165 sob registro). Estágios e encerramentos não são disjuntos.",
   "politica_ausencia": "Fase não prevista é preservada como 'outro' com o rótulo original, nunca descartada.",
   "validacoes": [
    "Soma das usinas nos estágios igual ao número de núcleos de CEG do arquivo."
   ],
   "limitacoes": [
    "Outorga não é capacidade que certamente entrará: parte da carteira é revogada ou sai do acompanhamento sem operar (ver o desfecho das coortes do RALIE).",
    "O dicionário do SIGA descreve fases até a revogação, mas o arquivo aberto só traz as três fases ativas."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_previsao_operacao",
   "titulo": "Potência com previsão de operação comercial por ano",
   "pergunta": "Quando a fiscalização prevê que a potência em implantação entre em operação?",
   "definicao": "Soma da potência unitária das unidades do RALIE mais recente por ano (e por mês nos 24 meses seguintes) da previsão de operação comercial da fiscalização (DatPrevisaoOpComercialSFG), por viabilidade; unidades sem previsão são contadas à parte por justificativa.",
   "unidade": "MW",
   "grao_geografico": "Brasil",
   "grao_temporal": "ano (e mês) da previsão, com data-base na fotografia do RALIE",
   "fontes": [
    "aneel_ralie"
   ],
   "formula": "MW(ano) = Σ MdaPotenciaUnitaria das unidades com previsão no ano ÷ 1.000",
   "regra_agregacao": "Soma simples por ano e viabilidade.",
   "versao_formula": "1",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano ou mês previsto",
    "viabilidade"
   ],
   "regras_comparabilidade": [
    "Toda previsão tem data-base: a fotografia do RALIE (DatRalie) em que foi publicada. Nenhuma promessa antiga é reconstruída com o estoque atual; o histórico publicado pela ANEEL começa em 17/06/2021 e o histórico próprio do observatório, na primeira captura do RALIE atual.",
    "Datas atribuídas em bloco a milhares de unidades sem licença, sem acesso à rede ou com revogação em avaliação (ex.: 13/09/2031 na fotografia de 18/09/2026) indicam previsão convencional da fiscalização, não cronograma de obra.",
    "Estoque de projetos não é projeção de entrada."
   ],
   "regra_cobertura": "Unidades da fotografia mais recente do RALIE.",
   "politica_ausencia": "Unidade sem previsão não recebe data: fica na tabela 'sem previsão' com a justificativa da fonte.",
   "validacoes": [
    "Previsão e data outorgada lidas como data ISO; marcadores anteriores a 1901 viram ausência."
   ],
   "limitacoes": [
    "Datas atribuídas em bloco a milhares de unidades sem licença, sem acesso à rede ou com revogação em avaliação (ex.: 13/09/2031 na fotografia de 18/09/2026) indicam previsão convencional da fiscalização, não cronograma de obra.",
    "Toda previsão tem data-base: a fotografia do RALIE (DatRalie) em que foi publicada. Nenhuma promessa antiga é reconstruída com o estoque atual; o histórico publicado pela ANEEL começa em 17/06/2021 e o histórico próprio do observatório, na primeira captura do RALIE atual."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_ralie_potencia_implantacao",
   "titulo": "Potência em implantação acompanhada pelo RALIE",
   "pergunta": "Quanta potência está em implantação e em que situação de obra, viabilidade e cronograma?",
   "definicao": "Soma da potência unitária (MdaPotenciaUnitaria, kW) das unidades geradoras listadas na fotografia mais recente do RALIE, e soma da potência outorgada das usinas, agrupadas pelas classificações da fiscalização (situação da obra, viabilidade, situação do cronograma, justificativa da previsão).",
   "unidade": "MW, usinas e unidades geradoras",
   "grao_geografico": "Brasil; UF principal; tipo de geração",
   "grao_temporal": "fotografia do RALIE (DatRalie)",
   "fontes": [
    "aneel_ralie"
   ],
   "formula": "MW em implantação = Σ MdaPotenciaUnitaria das unidades listadas ÷ 1.000",
   "regra_agregacao": "Soma simples por classificação; potência por unidade geradora preservada no CSV.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "situação da obra",
    "viabilidade",
    "situação do cronograma",
    "justificativa",
    "tipo",
    "UF",
    "leilão"
   ],
   "regras_comparabilidade": [
    "Outorga não é capacidade que certamente entrará: parte da carteira é revogada ou sai do acompanhamento sem operar (ver o desfecho das coortes do RALIE).",
    "MW é potência instalada ou outorgada, não energia: a produção depende do fator de capacidade de cada fonte, e garantia física ou energia firme são outras grandezas.",
    "O RALIE cobre usinas em implantação acompanhadas pela fiscalização; unidades liberadas para operação comercial deixam o relatório nas fotografias seguintes."
   ],
   "regra_cobertura": "Usinas e unidades da fotografia mais recente do RALIE; série mensal desde junho de 2021 pelo Parquet histórico.",
   "politica_ausencia": "Classificação vazia vira '(vazio)', nunca é atribuída a outra categoria.",
   "validacoes": [
    "Chave (IdeNucleoCEG, NumUgUsina) única no arquivo.",
    "Potência unitária não negativa.",
    "Série mensal do Parquet histórico: usina cuja soma das unidades é 10 vezes a outorga ou mais na fotografia (erro de ordem de grandeza, conferido contra as fotografias vizinhas) tem as unidades excluídas daquela fotografia, com a potência excluída publicada (17 pares em 30/09/2026, 7 em fotografia mensal)."
   ],
   "limitacoes": [
    "O RALIE cobre usinas em implantação acompanhadas pela fiscalização; unidades liberadas para operação comercial deixam o relatório nas fotografias seguintes.",
    "A classificação de viabilidade e de cronograma é da fiscalização da ANEEL, não do empreendedor."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_reconciliacao_siga_agregados",
   "titulo": "Reconciliação do SIGA com os agregados oficiais",
   "pergunta": "A soma do SIGA confere com os totais que a própria ANEEL publica?",
   "definicao": "Resíduo = capacidade do SIGA − agregado oficial do último mês publicado − potência liberada para operação comercial publicada entre o fim desse mês e a última data do arquivo de liberações (ou a data do SIGA, se anterior), por tipo de geração e por UF. Os dias entre a última liberação publicada e a data do SIGA não têm liberação para descontar e são declarados (janela_tipo, janela_uf).",
   "unidade": "MW e % do agregado",
   "grao_geografico": "tipo de geração; UF",
   "grao_temporal": "fotografia do SIGA contra o último mês do agregado",
   "fontes": [
    "aneel_siga",
    "aneel_capacidade_agregada",
    "aneel_liberacao_comercial"
   ],
   "numerador": "resíduo em kW",
   "denominador": "agregado oficial em kW",
   "formula": "resíduo_pct = 100 × (SIGA − agregado − liberado no intervalo) ÷ agregado",
   "regra_agregacao": "Comparação por grupo, sem ajuste.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "tipo de geração",
    "UF"
   ],
   "regras_comparabilidade": [
    "O agregado tem mês de referência anterior ao SIGA; revisões de potência e desativações do intervalo não são datadas por arquivo aberto."
   ],
   "regra_cobertura": "Tipos e UFs presentes no agregado oficial mais recente.",
   "politica_ausencia": "Grupo ausente do agregado não é comparado.",
   "validacoes": [
    "Tolerância de 1% do agregado do grupo; fora dela o grupo é listado em fora_da_tolerancia e a evidência vira ressalva."
   ],
   "limitacoes": [
    "O resíduo não identifica a usina responsável: aponta onde conferir.",
    "Liberações entre a última data do arquivo de liberações e a data do SIGA (17 a 30/09/2026 em 30/09/2026) não são descontadas e ficam no resíduo."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "expansao_rede_epe",
   "titulo": "Linhas de transmissão existentes e planejadas por UF (WebMap da EPE)",
   "pergunta": "Onde estão as linhas de transmissão existentes e as da expansão planejada?",
   "definicao": "Comprimento das linhas das camadas 21 (Base Existente) e 10 (Expansão Planejada) do WebMap da EPE, pela geometria publicada (generalizada pelo servidor a 0,005 grau), por tensão, ano e UF; cada segmento vai para a UF do seu ponto médio na malha de UF do IBGE.",
   "unidade": "km de traçado por feição",
   "grao_geografico": "UF; linha (JSON do mapa)",
   "grao_temporal": "ano de operação (existente) ou previsto (planejada), na data de captura",
   "fontes": [
    "epe_webmap_rede"
   ],
   "formula": "km(UF) = Σ comprimento geodésico dos segmentos cujo ponto médio está na UF",
   "regra_agregacao": "Soma de comprimento por UF, tensão e ano.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "camada",
    "UF",
    "tensão",
    "ano"
   ],
   "regras_comparabilidade": [
    "km por feição (traçado; há feições com dois circuitos), não km de circuito do SIGET: as duas medidas não se somam.",
    "A camada planejada é planejamento da EPE, não obra contratada."
   ],
   "regra_cobertura": "Feições das duas camadas na data de captura (contagem conferida contra a informada pelo serviço).",
   "politica_ausencia": "Ano 0 e tensão 0 da fonte viram ausência; segmento fora da malha de UF fica em km_fora_de_uf.",
   "validacoes": [
    "Comprimento da geometria comparado ao campo Extensao feição por feição (mediana de 0,5% de diferença); campo acima de 3.000 km tratado como fora de escala (7 feições da camada planejada, em metros)."
   ],
   "limitacoes": [
    "O serviço não informa a data de atualização das camadas.",
    "Sem chave comum com o SIGET ou com os leilões: a ligação é territorial."
   ],
   "gold": "expansao.json",
   "paginas": [
    "/setor-eletrico/expansao"
   ],
   "arquivo": "pipeline/energia/metricas/expansao.py"
  },
  {
   "id": "geracao_a11_diferenca_solar",
   "titulo": "Conferência da solar do Balanço com a soma das usinas (achado A11)",
   "pergunta": "A quebra da solar em 29/04/2023 é a entrada da MMGD?",
   "definicao": "Diferença diária entre a solar do Balanço de Energia e a soma das usinas FOTOVOLTAICA da Geração por Usina, com e sem o grupo 'Pequenas Usinas (MMGD)'.",
   "unidade": "MWh por dia e MWmed",
   "grao_geografico": "SIN",
   "grao_temporal": "dia",
   "fontes": [
    "ons_geracao_usina",
    "balanco_energia_subsistema_ho"
   ],
   "formula": "diferença = solar do balanço − Σ usinas fotovoltaicas (com MMGD)",
   "regra_agregacao": "Soma diária dos quatro subsistemas.",
   "versao_formula": "1",
   "natureza_fonte": "MISTO: OBSERVADO (usinas) e ESTIMADO (MMGD do ONS, a partir de 29/04/2023)",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia"
   ],
   "regras_comparabilidade": [
    "A MMGD da Geração por Usina e a da API de carga verificada são estimativas de processos diferentes do ONS."
   ],
   "regra_cobertura": "Dias completos desde 01/01/2021; janela de 22/04/2023 a 06/05/2023 para a confirmação.",
   "politica_ausencia": "Antes de 29/04/2023 não há linha do grupo MMGD: ausência, publicada como nula.",
   "validacoes": [
    "Todos os dias da janela da quebra dentro de 1 MWh no SIN."
   ],
   "limitacoes": [
    "Fora da janela há divergências entre balanço e usinas (publicadas na reconciliação)."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_capacidade_ons_aneel",
   "titulo": "Potência do ONS e capacidade da ANEEL na mesma data",
   "pergunta": "Quanto da capacidade em operação registrada pela ANEEL está no retrato das usinas despachadas pelo ONS?",
   "definicao": "Capacidade em operação por tipo de geração na série histórica da ANEEL (base do SIGA) e potência das unidades do retrato da Capacidade Instalada do ONS em operação comercial no último dia do mesmo mês, por grupo (hidráulica, eólica, solar centralizada, nuclear, térmicas); a parcela é ONS ÷ ANEEL.",
   "unidade": "MW e %",
   "grao_geografico": "Brasil (ANEEL) e SIN (ONS), por grupo de fonte",
   "grao_temporal": "datas de referência da série da ANEEL (trimestral desde 2021)",
   "fontes": [
    "ons_capacidade_geracao",
    "aneel_empreendimentos_operacao"
   ],
   "numerador": "potência do ONS em operação comercial no último dia do mês (MW)",
   "denominador": "capacidade em operação da ANEEL na mesma data de referência (MW)",
   "regra_agregacao": "Soma de potências de unidades (ONS) e de tipos de geração (ANEEL) no grupo; razão na mesma data.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "grupo de fonte",
    "data de referência"
   ],
   "regras_comparabilidade": [
    "Universos diferentes: a ANEEL inclui usinas não despachadas pelo ONS, sistemas isolados e autoprodução; nada é somado.",
    "Não é fator de capacidade: compara potência com potência na mesma data."
   ],
   "regra_cobertura": "Datas da série da ANEEL a partir do primeiro mês da Geração por Usina integrada.",
   "politica_ausencia": "Data sem valor de um tipo na ANEEL fica nula no grupo.",
   "validacoes": [
    "Datas de referência só as publicadas pela ANEEL; nenhum valor interpolado entre elas."
   ],
   "limitacoes": [
    "O retrato do ONS não tem histórico: a potência de cada data é reconstituída pelas datas de entrada e desativação das unidades atuais.",
    "A série da ANEEL não separa combustível: as térmicas são comparadas juntas."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_categoria_mwmed",
   "titulo": "Geração por fonte e combustível",
   "pergunta": "Quanta energia cada fonte e cada combustível gerou no período?",
   "definicao": "Soma da geração horária das usinas, conjuntos e grupos da Geração por Usina do ONS em cada categoria (hidráulica, eólica, solar centralizada, solar MMGD, nuclear, gás natural, carvão, óleo, biomassa, outras térmicas e térmicas sem combustível identificado), dividida pelas horas do período.",
   "unidade": "MWmed (MWh no CSV)",
   "grao_geografico": "SIN e subsistemas (SE, S, NE, N)",
   "grao_temporal": "hora (SIN), dia, mês, ano civil e janelas de 1, 7, 30 e 365 dias",
   "fontes": [
    "ons_geracao_usina"
   ],
   "numerador": "Σ val_geracao × 1 h das linhas da categoria (MWh)",
   "denominador": "horas dos dias completos do período",
   "formula": "MWmed = Σ MWh ÷ horas",
   "regra_agregacao": "Soma de energia; SIN = soma dos quatro subsistemas; MWmed nunca é média de médias diárias.",
   "versao_formula": "2",
   "natureza_fonte": "MISTO: OBSERVADO (geração verificada), PREVISTO (grupos de pequenas usinas Tipo III) e ESTIMADO (MMGD estimada pelo ONS); fração de cada natureza publicada em natureza_pct",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "categoria",
    "subsistema",
    "natureza (verificada, grupo Tipo III, grupo MMGD)",
    "rótulo da fonte"
   ],
   "regras_comparabilidade": [
    "Desde 29/04/2023 a Geração por Usina inclui a estimativa de MMGD (grupos 'Pequenas Usinas (MMGD)'); comparação que atravessa a data só no perímetro sem MMGD.",
    "Categoria pelo tipo da usina, como no Balanço de Energia: conjunto híbrido rotulado 'Fotovoltaica' dentro de usina eólica conta como eólica."
   ],
   "regra_cobertura": "Arquivos de 2021 em diante (o anual de 2021 e os mensais seguintes); só dias com 24 instantes em todos os subsistemas.",
   "politica_ausencia": "Valor vazio na fonte é ausência: não entra na soma nem nas horas daquela série; dia sem as 24 horas em todos os subsistemas fica fora das janelas; usina com todas as horas vazias no mês é contada como lacuna, nunca como zero.",
   "validacoes": [
    "Energia não negativa por categoria.",
    "Dia de referência não posterior à data de processamento.",
    "Categoria sem nenhuma linha no período é nula, não zero (MMGD antes de 29/04/2023, grupos Tipo III térmicos antes de 03/2021).",
    "Reconciliação diária com o Balanço de Energia nos Subsistemas por fonte, subsistema e dia (tolerância de 1 MWh)."
   ],
   "limitacoes": [
    "Grupos de pequenas usinas Tipo III e de MMGD são previsões e estimativas do ONS (dicionário da Geração por Usina, versão 1.2); a parcela de cada natureza é publicada à parte.",
    "Mudanças de universo na fonte (rótulos que aparecem, deixam de ter valor ou somem, usinas que passam a vir sem valor ou deixam de constar do arquivo, sequências longas de zero exato) são detectadas por regra publicada e listadas em 'quebras' e em matriz.universo; cada janela, mês e ano traz em ressalvas_universo as categorias afetadas.",
    "A categoria 'outras térmicas' segue o rótulo 'Resíduos Industriais' do ONS, que reúne gases de siderurgia (CEG UTE.CM) e licor negro de celulose (CEG UTE.FL, biomassa florestal na ANEEL): a decomposição por código do CEG sai em matriz.outros_por_ceg.",
    "Grupos térmicos Tipo III ('Outras Multi-Combustível') não têm combustível na fonte: categoria própria, explícita."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_cvu",
   "titulo": "Custo variável unitário (CVU) das térmicas",
   "pergunta": "Quanto custa, declaradamente, despachar cada térmica nesta semana?",
   "definicao": "CVU considerado no Programa Mensal da Operação para a semana operativa (sábado a sexta), por usina, como o ONS publica.",
   "unidade": "R$/MWh",
   "grao_geografico": "usina (código do ONS nos modelos)",
   "grao_temporal": "semana operativa (vigência de sábado a sexta) e revisão do PMO",
   "fontes": [
    "ons_cvu_termica"
   ],
   "regra_agregacao": "Distribuição por combustível (mínimo, quartis, máximo) na semana vigente; mediana mensal de usinas e semanas; no ranking térmico, CVU por parcela (código do ONS).",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "usina",
    "combustível",
    "semana operativa"
   ],
   "regras_comparabilidade": [
    "CVU é custo declarado para despacho, não preço do combustível nem custo realizado."
   ],
   "regra_cobertura": "Semanas operativas de 2005 em diante; na gold, a semana vigente na data de processamento.",
   "politica_ausencia": "Usina sem CVU na semana não aparece; linha repetida idêntica conta uma vez; conflito é registrado.",
   "validacoes": [
    "Conflito de CVU para a mesma usina e semana derruba a escolha (contado, nenhuma versão escolhida em silêncio).",
    "Código do ONS ligado a mais de uma usina fica sem par e é contado (controle publicado)."
   ],
   "limitacoes": [
    "O par com a usina da térmica por motivo é pelo código do ONS nos modelos, com todos os códigos (parcelas) que cada usina já teve; usina com várias parcelas tem um CVU por parcela, e o ranking publica cada um.",
    "Usinas do CVU sem nenhum código na térmica por motivo ficam sem combustível identificado."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_fator_capacidade",
   "titulo": "Fator de capacidade",
   "pergunta": "Quanto as usinas produzem em relação ao que poderiam produzir a plena potência?",
   "definicao": "Geração dividida pela potência em operação comercial média do mês vezes as horas com dado, só em grupos de pareamento com unidades no conjunto de capacidade (mesmo CEG, CEG sem versão ou usinas do conjunto com relacionamento vigente).",
   "unidade": "%",
   "grao_geografico": "SIN por categoria; grupo de usinas",
   "grao_temporal": "mês e 12 meses completos",
   "fontes": [
    "ons_capacidade_geracao",
    "ons_usina_conjunto",
    "ons_geracao_usina"
   ],
   "numerador": "geração dos grupos pareados (MWh)",
   "denominador": "Σ potência em operação comercial média do mês × horas com dado (MWh)",
   "regra_agregacao": "Razão de somas por categoria; grupos com o mesmo CEG somam a geração e usam a potência uma vez.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "categoria",
    "mês",
    "grupo de usinas"
   ],
   "regras_comparabilidade": [
    "Nunca a capacidade final para todo o histórico: cada mês usa as unidades em operação naquele mês.",
    "Eólica e solar conferidas contra o fator de capacidade publicado pelo ONS (tolerância de 2 pontos percentuais)."
   ],
   "regra_cobertura": "Usinas e conjuntos despachados (natureza verificada); grupos Tipo III e MMGD ficam fora do numerador e do denominador.",
   "politica_ausencia": "Grupo sem unidade pareada fica fora; a cobertura (energia pareada ÷ energia da categoria) é publicada.",
   "validacoes": [
    "Mês de usina acima de 100% contado e listado, não descartado (unidade em teste, potência desatualizada).",
    "Capacidade-hora média do denominador não passa da potência média em operação da categoria (mesma classificação nos dois)."
   ],
   "limitacoes": [
    "Geração em teste antes da operação comercial infla o fator do mês de entrada.",
    "Nucleares passam de 100% em vários meses: a potência nominal do ato da ANEEL é menor que a geração bruta verificada."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_participacao",
   "titulo": "Participação na geração (matriz efetiva)",
   "pergunta": "Que fração da energia gerada veio de cada fonte e combustível?",
   "definicao": "Energia da categoria dividida pela energia de todas as categorias no mesmo período e região, em dois perímetros: com MMGD (igual ao total do Balanço) e sem MMGD.",
   "unidade": "% da geração",
   "grao_geografico": "SIN e subsistemas",
   "grao_temporal": "dia, janelas de 7, 30 e 365 dias, mês e ano civil",
   "fontes": [
    "ons_geracao_usina"
   ],
   "numerador": "energia da categoria no período (MWh)",
   "denominador": "energia de todas as categorias no período (MWh), com ou sem a solar MMGD",
   "regra_agregacao": "Razão de somas de energia do mesmo perímetro; nunca média de participações diárias.",
   "versao_formula": "2",
   "natureza_fonte": "MISTO: OBSERVADO (geração verificada), PREVISTO (grupos de pequenas usinas Tipo III) e ESTIMADO (MMGD estimada pelo ONS); fração de cada natureza publicada em natureza_pct",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "categoria",
    "subsistema",
    "perímetro (com ou sem MMGD)"
   ],
   "regras_comparabilidade": [
    "Desde 29/04/2023 a Geração por Usina inclui a estimativa de MMGD (grupos 'Pequenas Usinas (MMGD)'); comparação que atravessa a data só no perímetro sem MMGD.",
    "Participação de geração não se compara com participação de capacidade instalada."
   ],
   "regra_cobertura": "Dias completos do período; o número de dias usados acompanha cada janela.",
   "politica_ausencia": "Valor vazio na fonte é ausência: não entra na soma nem nas horas daquela série; dia sem as 24 horas em todos os subsistemas fica fora das janelas; usina com todas as horas vazias no mês é contada como lacuna, nunca como zero.",
   "validacoes": [
    "Participações somam 100% (tolerância 0,05 ponto percentual) em todas as janelas e regiões; falha derruba a publicação.",
    "Categoria ausente no período tem participação nula, fora do total.",
    "Ressalva de universo junto da participação: salto de universo dentro do período ou universo reduzido (até 75% do maior número de identificadores com valor dos 12 meses anteriores)."
   ],
   "limitacoes": [
    "Grupos de pequenas usinas Tipo III e de MMGD são previsões e estimativas do ONS (dicionário da Geração por Usina, versão 1.2); a parcela de cada natureza é publicada à parte.",
    "Mudanças de universo na fonte (rótulos que aparecem, deixam de ter valor ou somem, usinas que passam a vir sem valor ou deixam de constar do arquivo, sequências longas de zero exato) são detectadas por regra publicada e listadas em 'quebras' e em matriz.universo; cada janela, mês e ano traz em ressalvas_universo as categorias afetadas.",
    "A categoria 'outras térmicas' segue o rótulo 'Resíduos Industriais' do ONS, que reúne gases de siderurgia (CEG UTE.CM) e licor negro de celulose (CEG UTE.FL, biomassa florestal na ANEEL): a decomposição por código do CEG sai em matriz.outros_por_ceg."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_potencia_operacional",
   "titulo": "Potência em operação comercial",
   "pergunta": "Quanta capacidade despachada pelo ONS estava em operação em cada mês?",
   "definicao": "Soma da potência nominal das unidades geradoras (conjunto Capacidade Instalada de Geração do ONS) ponderada pelos dias do mês entre a entrada em operação comercial e a desativação.",
   "unidade": "MW (média do mês)",
   "grao_geografico": "SIN, por categoria",
   "grao_temporal": "mês; retrato na data da captura",
   "fontes": [
    "ons_capacidade_geracao"
   ],
   "formula": "Σ_unidades potência × dias em operação no mês ÷ dias do mês",
   "regra_agregacao": "Soma de potências de unidades distintas.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "categoria",
    "mês"
   ],
   "regras_comparabilidade": [
    "Capacidade do ONS (usinas despachadas) não é a do SIGA da ANEEL nem inclui a MMGD: universos diferentes, nunca somados.",
    "A unidade entra na categoria da usina na Geração por Usina (mesmo CEG), a mesma do fator de capacidade: a turbina a vapor de ciclo combinado ('Resíduo Ciclo Combinado') de uma usina a gás é gás."
   ],
   "regra_cobertura": "Unidades presentes no retrato do dia; o conjunto não tem histórico.",
   "politica_ausencia": "Unidade sem data de entrada em operação comercial fica fora.",
   "validacoes": [
    "Potência positiva em todas as unidades (o dicionário não admite zero): resultado tirado da contagem gravada na importação.",
    "Capacidade-hora média do fator de capacidade não passa da potência média em operação da categoria (controle crítico)."
   ],
   "limitacoes": [
    "Usinas que saíram do despacho centralizado não aparecem no retrato; potência atual aplicada a todo o histórico da unidade (repotenciações não reconstituídas)."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_reconciliacao_balanco",
   "titulo": "Reconciliação com o Balanço de Energia",
   "pergunta": "A soma das usinas fecha com o balanço do ONS?",
   "definicao": "Diferença entre a geração do Balanço de Energia nos Subsistemas e a soma das usinas da Geração por Usina, por fonte do balanço (hidráulica, térmica com nuclear, eólica e solar), subsistema e dia; a térmica do Norte é ajustada pelas usinas de Roraima nos dias em que o balanço as exclui.",
   "unidade": "MWh e dias conciliados",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "dia e mês",
   "fontes": [
    "ons_geracao_usina",
    "balanco_energia_subsistema_ho"
   ],
   "formula": "diferença = balanço − Σ usinas; conciliado quando |diferença| ≤ 1 MWh",
   "regra_agregacao": "Soma das diferenças diárias; contagem de dias conciliados no subsistema e no SIN.",
   "versao_formula": "1",
   "natureza_fonte": "MISTO: OBSERVADO, PREVISTO e ESTIMADO nos dois lados (o Balanço e a soma das usinas incluem os grupos Tipo III e a MMGD)",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fonte do balanço",
    "subsistema",
    "mês"
   ],
   "regras_comparabilidade": [
    "Diferença de alocação entre subsistemas some no SIN; por isso a conciliação é publicada nos dois níveis."
   ],
   "regra_cobertura": "Dias com 24 horas no balanço e dia completo na Geração por Usina.",
   "politica_ausencia": "Dia sem as 24 horas no balanço não entra na comparação.",
   "validacoes": [
    "Tolerância de 1 MWh por subsistema, fonte e dia, justificada pelo arredondamento dos dois arquivos."
   ],
   "limitacoes": [
    "O balanço excluiu as térmicas de Roraima até 14/07/2025 (detectado no dado, não declarado na documentação).",
    "Há dias isolados com grandes divergências (ex.: eólica do Nordeste em 16/01/2026); a plataforma publica, não corrige."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_restricao_energia",
   "titulo": "Energia não gerada por restrição de operação (constrained-off)",
   "pergunta": "Quanta geração eólica e solar foi cortada por ordem do ONS?",
   "definicao": "Soma, nas meias horas em que o ONS limitou a usina ou conjunto, de max(geração de referência − geração verificada, 0) × 0,5 h; é a Geração Não Realizada Apurada (GNRa) do dicionário, conferida contra o campo publicado. Por razão oficial: REL (elétrica, indisponibilidade externa), CNF (confiabilidade), ENE (energética), PAR (parecer de acesso), e origem LOC ou SIS.",
   "unidade": "MWh (GWh na interface)",
   "grao_geografico": "SIN, subsistema e usina ou conjunto (id do ONS)",
   "grao_temporal": "meia hora agregada por dia e mês; 12 meses completos",
   "fontes": [
    "ons_coff_eolica",
    "ons_coff_fotovoltaica"
   ],
   "formula": "Σ max(val_geracaoreferencia − val_geracao, 0) × 0,5 h, só onde val_geracaolimitada não é nula",
   "regra_agregacao": "Soma de energia; razão e origem como o ONS classifica cada meia hora.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fonte (eólica, solar)",
    "razão",
    "origem",
    "subsistema",
    "usina"
   ],
   "regras_comparabilidade": [
    "Restrição não é indisponibilidade nem falta de vento ou sol: meia hora sem limitação do ONS não entra.",
    "A série fotovoltaica começa em abril de 2024; a eólica, em outubro de 2021."
   ],
   "regra_cobertura": "Usinas e conjuntos Tipo I, II-B e II-C presentes nos arquivos do ONS.",
   "politica_ausencia": "Meia hora limitada sem geração de referência fica fora da soma e é contada no controle.",
   "validacoes": [
    "Regra igual ao campo GNRa publicado (tolerância 0,001 MWmed por meia hora).",
    "Razão dentro do domínio do dicionário (REL, CNF, ENE, PAR)."
   ],
   "limitacoes": [
    "A geração de referência é estimativa do ONS (RO-AO.BR.13): a energia não gerada é estimada, não medida.",
    "O ONS republica meses antigos; revisões entre capturas são detectadas."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_restricao_potencia_max",
   "titulo": "Maior corte simultâneo",
   "pergunta": "Qual foi a maior potência cortada ao mesmo tempo?",
   "definicao": "Maior soma, numa mesma meia hora, dos cortes (referência − verificada) das usinas limitadas; potência média da meia hora, não energia.",
   "unidade": "MW",
   "grao_geografico": "SIN e subsistema",
   "grao_temporal": "meia hora (máximo diário e mensal)",
   "fontes": [
    "ons_coff_eolica",
    "ons_coff_fotovoltaica"
   ],
   "formula": "max sobre meias horas de Σ_usinas max(referência − verificada, 0)",
   "regra_agregacao": "Máximo; nunca somado entre dias.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fonte",
    "subsistema",
    "dia",
    "mês"
   ],
   "regras_comparabilidade": [
    "Potência (MW) não se compara com energia (MWh)."
   ],
   "regra_cobertura": "Mesmo universo da energia não gerada.",
   "politica_ausencia": "Dia sem limitação tem corte zero (há linhas sem limitação), não ausência.",
   "validacoes": [
    "Corte simultâneo não excede a soma das referências das mesmas linhas na meia hora: contado na importação em todas as meias horas com corte, por subsistema, e conferido no silver no maior corte de cada dia (ressalva se violar)."
   ],
   "limitacoes": [
    "Depende da referência estimada pelo ONS."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_restricao_taxa",
   "titulo": "Taxa de restrição",
   "pergunta": "Que fração da geração possível foi cortada?",
   "definicao": "Energia não gerada estimada dividida pela soma da geração verificada e da energia não gerada, no mesmo universo de usinas e período.",
   "unidade": "%",
   "grao_geografico": "SIN, subsistema e usina",
   "grao_temporal": "mês e 12 meses completos",
   "fontes": [
    "ons_coff_eolica",
    "ons_coff_fotovoltaica"
   ],
   "numerador": "energia não gerada estimada (MWh)",
   "denominador": "geração verificada de todas as meias horas do universo + energia não gerada (MWh)",
   "regra_agregacao": "Razão de somas; nunca média de taxas mensais ou de usinas.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fonte",
    "subsistema",
    "usina",
    "mês"
   ],
   "regras_comparabilidade": [
    "O denominador é a geração possível estimada só nas meias horas restringidas mais a verificada; não é a capacidade instalada."
   ],
   "regra_cobertura": "Universo de usinas e conjuntos dos arquivos de restrição (Tipo I, II-B e II-C).",
   "politica_ausencia": "Usina sem geração e sem corte no período não entra na lista; taxa sem denominador é nula.",
   "validacoes": [
    "Numerador e denominador do mesmo universo e período."
   ],
   "limitacoes": [
    "Usinas Tipo III e MMGD não fazem parte do registro de restrições."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "geracao_termica_motivo",
   "titulo": "Geração térmica por motivo de despacho",
   "pergunta": "Por que as térmicas foram acionadas?",
   "definicao": "Geração verificada das térmicas e nucleares despachadas pelo ONS repartida pelos motivos do próprio ONS, sem dupla contagem: ordem de mérito acima da inflexibilidade, inflexibilidade (pura e embutida no mérito), razão elétrica, garantia energética, GFOM, reposição de perdas, exportação, reserva de potência, substituição e unit commitment; o resto é 'não classificado', com sinal.",
   "unidade": "MWmed e % da geração térmica verificada",
   "grao_geografico": "SIN, subsistema e usina (CEG)",
   "grao_temporal": "hora agregada por dia e mês; 12 meses completos",
   "fontes": [
    "ons_geracao_termica_motivo"
   ],
   "numerador": "geração verificada pelo motivo (MWh)",
   "denominador": "geração verificada total, val_verifgeracao (MWh)",
   "regra_agregacao": "Soma de energia por motivo; parcela = soma do motivo ÷ soma do total.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "motivo",
    "combustível (dimensão separada)",
    "usina",
    "subsistema"
   ],
   "regras_comparabilidade": [
    "Combustível e motivo são dimensões separadas: o combustível vem da própria fonte (2026) ou do mesmo CEG em outros conjuntos do ONS, com todos os CEGs que cada usina já publicou.",
    "Usina = identidade que liga CEGs com o mesmo número de empreendimento e elo publicado pelo ONS (mesmo código nos modelos ou mesmo identificador na Geração por Usina): a troca de CEG da fonte não quebra a série nem duplica a usina no ranking.",
    "O motivo é a classificação do ONS, nunca inferida do PLD ou do CMO.",
    "Unit commitment só existe a partir de janeiro de 2020 (DESSEM); antes é 'não se aplica'."
   ],
   "regra_cobertura": "Arquivos anuais de 2013 a 2021 e mensais de 2022 em diante; os anuais de 2022 e 2023 duplicam os mensais e ficam de fora.",
   "politica_ausencia": "Coluna que não existia no período = não se aplica (nulo), não zero.",
   "validacoes": [
    "Partição fecha com a geração verificada: 'não classificado' publicado; até 0,5% do total = aprovado.",
    "Mesmas usinas (CEG) somadas na Geração por Usina: diferença mensal até 1%."
   ],
   "limitacoes": [
    "Valores negativos em anos antigos da fonte, que o dicionário não admite, mantidos e contados.",
    "Usinas sem combustível identificado ficam na categoria 'não mapeada' (lista e energia em mapa_combustivel)."
   ],
   "gold": "geracao_detalhe.json",
   "paginas": [
    "/setor-eletrico/geracao"
   ],
   "arquivo": "pipeline/energia/metricas/geracao.py"
  },
  {
   "id": "inclusao.cde_custeio",
   "titulo": "CDE: valores anuais para Tarifa Social, Luz para Todos e CCC",
   "pergunta": "Quanto a CDE destina por ano à Tarifa Social, à universalização e aos sistemas isolados?",
   "definicao": "Valores anuais de despesa da CDE nas rubricas Subsídio Baixa Renda, Programa Luz para Todos e CCC, como publicados pela ANEEL.",
   "unidade": "R$ correntes por ano",
   "grao_geografico": "Brasil",
   "grao_temporal": "ano",
   "fontes": [
    "aneel_cde_custeio"
   ],
   "regra_agregacao": "valor da fonte; participação = rubrica ÷ soma das rubricas de despesa do ano",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "ano",
    "rubrica"
   ],
   "regras_comparabilidade": [
    "valores nominais",
    "ano em curso é orçamento"
   ],
   "regra_cobertura": "anos publicados (desde 2013)",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "rubricas conferidas por nome exato"
   ],
   "limitacoes": [
    "o conjunto não separa orçado de executado"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.cde_desconto_liquido",
   "titulo": "Desconto líquido da Tarifa Social no mês (Beneficiários da CDE)",
   "pergunta": "Quanto de desconto ficou nas faturas da Tarifa Social depois de cancelamentos e refaturamentos?",
   "definicao": "Soma de VlrSubsidio das linhas SubsBaixaRenda das subclasses 3.2 a 3.6 nos tipos de faturamento 1 a 4 (faturamento, cancelamento e os dois refaturamentos), com o sinal da fonte. Linhas SubsBaixaRenda de outras subclasses (iluminação pública, industrial, comercial) ficam fora e são publicadas à parte como diagnóstico (desconto_fora_das_subclasses_reais).",
   "unidade": "R$ correntes no mês",
   "grao_geografico": "Brasil",
   "grao_temporal": "mês do arquivo",
   "fontes": [
    "aneel_cde_beneficiarios"
   ],
   "numerador": "Σ VlrSubsidio (subclasses 3.2 a 3.6; tipos 1 a 4)",
   "regra_agregacao": "soma nacional; o diagnóstico de outras subclasses soma os tipos 1 a 4 das demais subclasses com SubsBaixaRenda",
   "versao_formula": "1.1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "valores nominais",
    "regra de desconto mudou em 05/07/2025",
    "versão 1.0 somava também as outras subclasses (R$ -26,1 milhões em mar/2026) e foi corrigida"
   ],
   "regra_cobertura": "meses com o original no bronze",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "mar/2026: R$ 786.968.415,45 em releitura independente do arquivo (subclasses 3.2 a 3.6, tipos 1 a 4)",
    "mai/2025: R$ 530.597.136,83 na mesma releitura"
   ],
   "limitacoes": [
    "cancelamento e refaturamento podem referir-se a faturas de meses anteriores"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.cde_desconto_medio_fatura",
   "titulo": "Desconto médio por fatura com Tarifa Social",
   "pergunta": "Quanto vale, em média, o desconto em cada fatura com Tarifa Social?",
   "definicao": "Desconto das faturas de faturamento (tipo 1, subclasses 3.2 a 3.6) dividido pelo número dessas faturas, no Brasil ou na UF, no mesmo mês do arquivo.",
   "unidade": "R$ por fatura no mês",
   "grao_geografico": "Brasil, UF",
   "grao_temporal": "mês do arquivo",
   "fontes": [
    "aneel_cde_beneficiarios"
   ],
   "numerador": "Σ VlrSubsidio das faturas tipo 1 das subclasses 3.2 a 3.6",
   "denominador": "número dessas faturas",
   "formula": "Σ desconto ÷ Σ faturas (razão de somas, nunca média de médias municipais)",
   "regra_agregacao": "razão de somas no território",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "UF",
    "mês"
   ],
   "regras_comparabilidade": [
    "depende da tarifa local e do consumo",
    "a regra de 05/07/2025 (gratuidade até 80 kWh) muda o patamar a partir de jul/2025"
   ],
   "regra_cobertura": "faturas > 0; UF só com municípios válidos",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "mesmas faturas no numerador e no denominador"
   ],
   "limitacoes": [
    "média por fatura, não desconto de cada família"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.cde_desconto_tsee",
   "titulo": "Desconto da Tarifa Social nas faturas (Beneficiários da CDE)",
   "pergunta": "Quanto de desconto chegou às faturas em cada UF?",
   "definicao": "Soma de VlrSubsidio das faturas de faturamento (tipo 1) com subsídio baixa renda nas subclasses 3.2 a 3.6.",
   "unidade": "R$ correntes no mês",
   "grao_geografico": "município, UF, distribuidora",
   "grao_temporal": "mês do arquivo",
   "fontes": [
    "aneel_cde_beneficiarios"
   ],
   "numerador": "Σ VlrSubsidio",
   "regra_agregacao": "soma; cancelamentos e refaturamentos (tipos 2 a 4) só no desconto líquido do mês (inclusao.cde_desconto_liquido)",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "município",
    "UF",
    "distribuidora"
   ],
   "regras_comparabilidade": [
    "valores nominais",
    "regra de desconto mudou em 05/07/2025"
   ],
   "regra_cobertura": "mesma do número de faturas",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "comparação com a DMR do SCS por distribuidora no mês de conferência"
   ],
   "limitacoes": [
    "o desconto médio por fatura depende da tarifa local e do consumo"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.cde_faturas_tsee",
   "titulo": "Faturas com desconto da Tarifa Social (Beneficiários da CDE)",
   "pergunta": "Onde, por município e UF, estão as unidades que recebem o desconto?",
   "definicao": "Número de linhas de faturamento (tipo 1) com subsídio baixa renda nas subclasses 3.2 a 3.6 do arquivo mensal de Beneficiários da CDE; cada linha é a fatura de uma UC no mês.",
   "unidade": "faturas de faturamento com desconto no mês (em regra uma por UC; a conferência com o SCS mede o desvio)",
   "grao_geografico": "município (código IBGE), UF, distribuidora",
   "grao_temporal": "mês do arquivo processado",
   "fontes": [
    "aneel_cde_beneficiarios"
   ],
   "numerador": "contagem de linhas com DscTipoSubsidio = SubsBaixaRenda, IdcTipoFaturamento = 1, IdcSubclasse em 3.2 a 3.6",
   "regra_agregacao": "contagem por município; UF = soma dos municípios; linhas com código de município em formato inválido ou inexistente na lista de municípios do IBGE (Cadastro Único) só no total nacional",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "município",
    "UF",
    "distribuidora",
    "subclasse"
   ],
   "regras_comparabilidade": [
    "mês do mapa: o mais recente com cobertura ≥ 99,5% das UC do SCS",
    "fatura não é família",
    "série mensal só com meses cujo original está no bronze; mês sondado abaixo da cobertura mínima publica só a cobertura"
   ],
   "regra_cobertura": "cobertura = UC do SCS (mês de conferência) das distribuidoras presentes no arquivo ÷ UC do SCS de todas",
   "politica_ausencia": "Município sem fatura no arquivo aparece sem valor (ausente), não como zero.",
   "validacoes": [
    "nenhum campo pessoal lido ou publicado",
    "esquema do arquivo conferido a cada leitura",
    "conferência com o SCS por distribuidora"
   ],
   "limitacoes": [
    "base sujeita a retificação a qualquer momento, segundo a ANEEL"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.cobertura_proxy",
   "titulo": "Cobertura potencial da Tarifa Social (proxy)",
   "pergunta": "Quem pode estar ficando de fora?",
   "definicao": "UC (ou faturas) com Tarifa Social por 100 famílias do Cadastro Único com renda per capita de até meio salário mínimo e cadastro atualizado, no mesmo mês e território. É PROXY: o numerador inclui beneficiários pelo BPC e por equipamento médico, fora do denominador, e conta UC, não famílias.",
   "unidade": "UC (série mensal nacional, SCS) ou faturas com desconto (Brasil, UF e município no mês do mapa, CDE) com Tarifa Social por 100 famílias",
   "grao_geografico": "município, UF, Brasil",
   "grao_temporal": "mês",
   "fontes": [
    "aneel_scs",
    "aneel_cde_beneficiarios",
    "mds_cadunico"
   ],
   "numerador": "UC com Tarifa Social (SCS, série nacional) ou faturas com Tarifa Social (CDE, município e UF)",
   "denominador": "famílias do Cadastro Único com renda per capita até ½ salário mínimo e cadastro atualizado (MI Social)",
   "formula": "100 × Σ numerador ÷ Σ denominador; faixa de sensibilidade com todas as famílias cadastradas no denominador",
   "regra_agregacao": "razão de somas; município com menos de 50 famílias fora da distribuição",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "município",
    "UF",
    "mês"
   ],
   "regras_comparabilidade": [
    "mesmo mês no numerador e no denominador",
    "critérios de elegibilidade iguais no período (verificado na ANEEL em 30/09/2026)"
   ],
   "regra_cobertura": "municípios com fatura no arquivo e cadastro no MDS; vínculo pelos 6 dígitos do código IBGE",
   "politica_ausencia": "Município sem fatura no arquivo: razão ausente, não zero.",
   "validacoes": [
    "não se publica número de famílias fora do benefício",
    "rótulo PROXY em toda exibição"
   ],
   "limitacoes": [
    "titularidade da conta, falta de acesso à rede e critérios II e III afastam a razão da cobertura real"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.lpt_domicilios_atendidos",
   "titulo": "Domicílios atendidos pelo Luz para Todos",
   "pergunta": "Quantos domicílios o programa de universalização ligou, onde e quando?",
   "definicao": "Soma de qtddomicilios do arquivo domicilios_atendidos.csv do MME: ligações novas homologadas, por programa (rural, regiões remotas da Amazônia Legal, recurso da distribuidora), município, UF e mês do atendimento.",
   "unidade": "domicílios",
   "grao_geografico": "município (código IBGE pelo nome exato na UF); UF; Brasil",
   "grao_temporal": "mês do atendimento; ano",
   "fontes": [
    "mme_luz_para_todos"
   ],
   "numerador": "Σ qtddomicilios",
   "regra_agregacao": "soma; UF e Brasil somam todos os municípios, inclusive os sem código IBGE",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "programa",
    "UF",
    "município",
    "mês",
    "ano"
   ],
   "regras_comparabilidade": [
    "domicílio ligado não é pessoa nem unidade consumidora com Tarifa Social",
    "o ano corrente está incompleto e não compete com anos completos",
    "não se compara com domicílios sem energia da PNAD como se fosse o mesmo universo"
   ],
   "regra_cobertura": "todas as linhas válidas do arquivo; linha com quantidade, data, estado ou programa inválido fica fora e contada no diagnóstico",
   "politica_ausencia": "Programa sem nenhuma linha no ano ou na UF: sem valor. Programa com linhas que somam zero (qtddomicilios = 0 na fonte): 0 publicado, como em 'Recurso da Distribuidora' em 2017 e 2018.",
   "validacoes": [
    "soma por UF e por município iguais ao total nacional",
    "municípios sem correspondência exata de nome contados e publicados"
   ],
   "limitacoes": [
    "o arquivo muda quando chegam homologações de meses anteriores",
    "sem código IBGE na fonte"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.lpt_recursos",
   "titulo": "Recursos do Luz para Todos por UF e fonte",
   "pergunta": "Quanto foi contratado e pago no programa, e de que fonte?",
   "definicao": "Soma, por UF, dos valores contratados e pagos por contrato no arquivo recursos_aplicados.csv do MME, separados por fonte: subvenção da CDE, empréstimo da RGR, Caixa ou outras fontes e contrapartida do agente executor.",
   "unidade": "R$ correntes",
   "grao_geografico": "UF",
   "grao_temporal": "vida do contrato (primeira a última liberação)",
   "fontes": [
    "mme_luz_para_todos"
   ],
   "numerador": "Σ valor do campo por contrato",
   "regra_agregacao": "soma por UF e fonte; contratado e pago nunca se somam",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "UF",
    "fonte do recurso",
    "situação (contratado, pago)"
   ],
   "regras_comparabilidade": [
    "valores nominais de anos diferentes, sem correção",
    "não se somam aos valores anuais da CDE (custeio)"
   ],
   "regra_cobertura": "contratos do arquivo com estado reconhecido",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "números no formato brasileiro conferidos na leitura",
    "contratos repetidos contados no diagnóstico"
   ],
   "limitacoes": [
    "o dicionário do MME descreve vlrpagocaixa como pago da RGR; o módulo segue a correspondência com vlrempenhadocaixa"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pnad_com_energia",
   "titulo": "Domicílios com energia elétrica (PNAD Contínua)",
   "pergunta": "Quantos domicílios têm energia elétrica, e de que fonte?",
   "definicao": "Percentual de domicílios com energia elétrica de qualquer fonte e percentual com energia da rede geral (tabela 6737), com o coeficiente de variação publicado.",
   "unidade": "% dos domicílios",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "ano",
   "fontes": [
    "ibge_pnadc_energia"
   ],
   "regra_agregacao": "publicado pelo IBGE",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "território",
    "ano",
    "situação (urbana, rural)"
   ],
   "regras_comparabilidade": [
    "erro-padrão = CV × estimativa ÷ 100"
   ],
   "regra_cobertura": "domicílios particulares permanentes",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "percentual entre 0 e 100",
    "CV publicado junto"
   ],
   "limitacoes": [
    "não mede qualidade nem continuidade"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pnad_rede_integral",
   "titulo": "Fornecimento da rede geral em tempo integral (PNAD Contínua)",
   "pergunta": "Entre os domicílios ligados à rede, quantos têm energia o tempo todo?",
   "definicao": "Percentual dos domicílios com energia da rede geral que declaram fornecimento em tempo integral (tabela 6738).",
   "unidade": "% dos domicílios ligados à rede geral",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "ano",
   "fontes": [
    "ibge_pnadc_energia"
   ],
   "regra_agregacao": "publicado pelo IBGE",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "território",
    "ano",
    "situação"
   ],
   "regras_comparabilidade": [
    "denominador são os domicílios ligados à rede, não todos"
   ],
   "regra_cobertura": "domicílios com energia de rede geral",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "denominador conferido: domicílios em tempo integral ÷ domicílios de rede geral reproduz o percentual publicado"
   ],
   "limitacoes": [
    "declaração do morador, não medição de interrupções"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pnad_sem_energia",
   "titulo": "Domicílios sem energia elétrica (diferença calculada)",
   "pergunta": "Quantos domicílios ainda não têm energia elétrica?",
   "definicao": "Domicílios (tabela 6731, total) menos domicílios com energia elétrica de qualquer fonte (tabela 6737), em mil.",
   "unidade": "mil domicílios",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "ano",
   "fontes": [
    "ibge_pnadc_energia"
   ],
   "numerador": "domicílios − domicílios com energia",
   "formula": "domicílios_mil − domicílios_com_energia_mil",
   "regra_agregacao": "diferença de duas estimativas publicadas",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "território",
    "ano",
    "situação"
   ],
   "regras_comparabilidade": [
    "sem erro-padrão publicado; valores pequenos são imprecisos"
   ],
   "regra_cobertura": "domicílios particulares permanentes",
   "politica_ausencia": "Estimativa ausente: sem valor (estado ausente). Diferença zero entre as duas contagens arredondadas em milhares: sem valor e estado menos_de_1_mil (a verdadeira fica entre 0 e 1 mil), nunca 0,0 mil.",
   "validacoes": [
    "percentual complementar coerente com 100 − percentual com energia",
    "RR 2025 rural: 20 − 20 mil com 99,3% com energia vira menos_de_1_mil, não zero"
   ],
   "limitacoes": [
    "as duas estimativas vêm arredondadas em milhares"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pof_acima_limiar",
   "titulo": "Famílias com energia acima de um limiar do orçamento (sensibilidade)",
   "pergunta": "Quantas famílias gastam com energia mais que 3%, 5% ou 10% da renda ou da despesa?",
   "definicao": "Proporção ponderada de famílias cuja despesa com energia supera o limiar da renda (ou da despesa total). Os limiares são análise de sensibilidade, não definição oficial de pobreza energética.",
   "unidade": "% das famílias",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "2017-2018",
   "fontes": [
    "ibge_pof_microdados"
   ],
   "numerador": "Σ w·1(energia ÷ base > limiar)",
   "denominador": "Σ w (famílias com base positiva)",
   "formula": "100 × Σ w·indicador ÷ Σ w",
   "regra_agregacao": "proporção ponderada; erro-padrão por linearização",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "território",
    "classe de rendimento",
    "limiar (3, 5, 10%)",
    "base"
   ],
   "regras_comparabilidade": [
    "sempre apresentado com os três limiares"
   ],
   "regra_cobertura": "famílias com base positiva",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "proporções entre 0 e 100 e decrescentes com o limiar"
   ],
   "limitacoes": [
    "não mede privação (família que deixa de usar energia para economizar não aparece)"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pof_energia_media",
   "titulo": "Despesa média mensal com energia elétrica por família (POF)",
   "pergunta": "Quanto as famílias gastam com energia elétrica por mês?",
   "definicao": "Despesa monetária e não monetária média mensal familiar com energia elétrica (POF 2017-2018), em reais de 15/01/2018. Estimativa amostral: a publicada pelo IBGE na tabela 6715 (estimado pela fonte) e a refeita dos microdados com o plano amostral (estimado pelo observatório), conferidas uma contra a outra.",
   "unidade": "R$ por família e mês (15/01/2018)",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "período da pesquisa (jul/2017 a jul/2018)",
   "fontes": [
    "ibge_pof_6715",
    "ibge_pof_cv",
    "ibge_pof_microdados"
   ],
   "numerador": "Σ w·despesa com energia",
   "denominador": "Σ w (famílias)",
   "formula": "Σ w·y ÷ Σ w; erro-padrão por linearização com estrato e UPA",
   "regra_agregacao": "média ponderada pelo fator de expansão",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "território",
    "classe de rendimento (Brasil e regiões)"
   ],
   "regras_comparabilidade": [
    "estatística histórica; não representa 2026",
    "reais de 15/01/2018"
   ],
   "regra_cobertura": "CV até 15% publicado; 15% a 30% com cautela; acima de 30% suprimido",
   "politica_ausencia": "Estimativa suprimida por precisão aparece como suprimida, não como zero.",
   "validacoes": [
    "igual à tabela 6715 em todos os territórios e classes (meio centavo)",
    "CV comparado ao publicado pelo IBGE (Brasil)"
   ],
   "limitacoes": [
    "despesa declarada: família sem conta própria aparece com zero"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pof_media_razoes",
   "titulo": "Participação média da energia no orçamento de cada família (média das razões)",
   "pergunta": "Para a família típica, quanto a energia pesa no orçamento?",
   "definicao": "Média ponderada, entre famílias, da razão despesa com energia ÷ despesa total (ou ÷ rendimento total e variação patrimonial), e a mediana ponderada da mesma razão.",
   "unidade": "% da despesa total ou da renda",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "2017-2018",
   "fontes": [
    "ibge_pof_microdados"
   ],
   "numerador": "Σ w·(energia ÷ base)",
   "denominador": "Σ w (famílias com base positiva)",
   "formula": "100 × Σ w·(y ÷ x) ÷ Σ w",
   "regra_agregacao": "média ponderada de razões individuais; erro-padrão por linearização",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "território",
    "classe de rendimento",
    "base (despesa ou renda)"
   ],
   "regras_comparabilidade": [
    "publicada ao lado da razão de médias, nunca no lugar dela",
    "na renda, sempre acompanhada da mediana e da sensibilidade (inclusao.pof_sensibilidade_renda)"
   ],
   "regra_cobertura": "famílias com despesa total (ou renda) positiva",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "mesma base de famílias conferida contra a tabela 6715"
   ],
   "limitacoes": [
    "sensível a famílias com renda muito baixa; por isso a mediana acompanha"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pof_razao_medias",
   "titulo": "Participação da energia na despesa total (razão de médias)",
   "pergunta": "Que parte do gasto total das famílias vai para energia elétrica, somando todas?",
   "definicao": "Média da despesa com energia dividida pela média da despesa total do mesmo domínio: é a 'distribuição' publicada pelo IBGE.",
   "unidade": "% da despesa total",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "2017-2018",
   "fontes": [
    "ibge_pof_6715",
    "ibge_pof_microdados"
   ],
   "numerador": "Σ w·despesa com energia",
   "denominador": "Σ w·despesa total",
   "formula": "100 × Σ w·energia ÷ Σ w·despesa",
   "regra_agregacao": "razão de totais ponderados",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "território",
    "classe de rendimento"
   ],
   "regras_comparabilidade": [
    "não é a média das participações de cada família (pesa mais as famílias que gastam mais)"
   ],
   "regra_cobertura": "igual à despesa média",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "igual à distribuição da tabela 6715 até o arredondamento de uma casa"
   ],
   "limitacoes": [
    "subestima o peso típico nas famílias de menor despesa"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.pof_sensibilidade_renda",
   "titulo": "Sensibilidade da participação média da energia na renda",
   "pergunta": "Quanto a média das participações na renda depende de poucas famílias com renda declarada quase nula?",
   "definicao": "Para o mesmo domínio da média das participações na renda: (a) a mesma média sem as famílias com despesa de energia acima da renda; (b) o número dessas famílias na amostra e o seu peso em % das famílias; (c) a soma das 3 maiores parcelas w·(energia ÷ renda) ÷ Σw, em ponto percentual. É análise de sensibilidade, não correção da estimativa.",
   "unidade": "% da renda; famílias da amostra; % das famílias; ponto percentual",
   "grao_geografico": "Brasil, grande região, UF",
   "grao_temporal": "2017-2018",
   "fontes": [
    "ibge_pof_microdados"
   ],
   "numerador": "Σ w·(energia ÷ renda) das famílias com energia ≤ renda",
   "denominador": "Σ w dessas famílias",
   "formula": "100 × Σ w·(y ÷ x) ÷ Σ w no subconjunto; parcelas máximas = 100 × Σ dos 3 maiores w·(y ÷ x) ÷ Σ w",
   "regra_agregacao": "média ponderada no subconjunto; erro-padrão por linearização",
   "versao_formula": "1.0",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "território",
    "classe de rendimento"
   ],
   "regras_comparabilidade": [
    "sempre ao lado da média completa e da mediana; nunca substitui a média publicada"
   ],
   "regra_cobertura": "famílias com renda positiva",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "Brasil, até R$ 1.908: média 6,88%, mediana 4,27% (conferidas em reprodução independente dos microdados)"
   ],
   "limitacoes": [
    "o corte em energia acima da renda é uma escolha de sensibilidade: renda subdeclarada e despesa esporádica alta não se distinguem na POF"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.sisol_localidades",
   "titulo": "Localidades e população dos sistemas isolados (PASI)",
   "pergunta": "Quantas pessoas vivem em localidades fora do SIN?",
   "definicao": "Localidades listadas no ciclo de planejamento dos sistemas isolados (EPE, PASI) e a soma da população informada.",
   "unidade": "localidades; pessoas",
   "grao_geografico": "localidade, município, UF, distribuidora",
   "grao_temporal": "ciclo anual de planejamento",
   "fontes": [
    "epe_pasi_localidades"
   ],
   "numerador": "contagem de localidades; Σ população",
   "regra_agregacao": "contagem e soma por ciclo",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "ciclo",
    "UF",
    "distribuidora",
    "programa de universalização"
   ],
   "regras_comparabilidade": [
    "entrada e saída da lista entre ciclos não têm motivo informado"
   ],
   "regra_cobertura": "localidades do ciclo; a soma de população usa só as localidades que a informam",
   "politica_ausencia": "População ausente não vira zero: cada agregado (ciclo, UF, distribuidora) soma só as populações informadas, traz a contagem de localidades sem população e fica sem valor quando nenhuma localidade do grupo informa (caso da VIBRA ENERGIA no ciclo 2025).",
   "validacoes": [
    "ciclo 2025 conferido contra o caderno em PDF da EPE (160 localidades, 1,965 milhão de pessoas)"
   ],
   "limitacoes": [
    "população informada no planejamento, não censitária"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_dmr",
   "titulo": "Diferença Mensal de Receita da Tarifa Social",
   "pergunta": "Quanto custa o desconto da Tarifa Social por mês?",
   "definicao": "Diferença Mensal de Receita (VlrDMR) aprovada pela ANEEL no despacho vigente: a receita que a distribuidora deixa de cobrar das UC com Tarifa Social e recebe da CDE.",
   "unidade": "R$ correntes",
   "grao_geografico": "distribuidora; Brasil",
   "grao_temporal": "mês de competência",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "Σ VlrDMR (um valor por distribuidora e mês)",
   "regra_agregacao": "soma entre distribuidoras; o valor, repetido nas cinco linhas de faixa do arquivo, é lido uma vez",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "distribuidora",
    "mês"
   ],
   "regras_comparabilidade": [
    "valores nominais",
    "não coincide com o valor anual da CDE (competência versus ano de referência do orçamento)"
   ],
   "regra_cobertura": "distribuidoras com despacho no mês",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "DMR idêntica nas cinco faixas de cada despacho",
    "soma por faixa nunca usada"
   ],
   "limitacoes": [
    "a DMR não é o desconto por família"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_dmr_12m",
   "titulo": "DMR da Tarifa Social em 12 meses",
   "pergunta": "Quanto custou a Tarifa Social nos últimos 12 meses, pelo SCS?",
   "definicao": "Soma da Diferença Mensal de Receita (VlrDMR, despacho vigente, um valor por distribuidora e mês) dos 12 meses até o mês de referência.",
   "unidade": "R$ correntes em 12 meses",
   "grao_geografico": "Brasil",
   "grao_temporal": "12 meses móveis",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "Σ DMR mensal nacional dos 12 meses",
   "regra_agregacao": "soma de 12 meses; sem valor quando falta qualquer mês da janela; meses incompletos (distribuidora esperada faltando) entram e são contados em meses_incompletos",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "janela de 12 meses"
   ],
   "regras_comparabilidade": [
    "valores nominais",
    "não coincide com o valor anual da CDE (ano de referência do orçamento)"
   ],
   "regra_cobertura": "12 meses presentes no SCS; mês incompleto na janela é declarado, não completado",
   "politica_ausencia": "Mês ausente na janela: soma sem valor (não soma parcial).",
   "validacoes": [
    "jun/2024 a mai/2025: R$ 6.498.825.755,39, conferido por soma direta do CSV"
   ],
   "limitacoes": [
    "mês incompleto na janela subestima a soma; o número de meses incompletos acompanha o valor"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_dmr_por_uc",
   "titulo": "DMR por unidade consumidora",
   "pergunta": "Qual é, em média, o valor do desconto por UC beneficiada no mês?",
   "definicao": "DMR da distribuidora (ou do Brasil) dividida pelas UC com Tarifa Social no mesmo mês.",
   "unidade": "R$ por UC no mês",
   "grao_geografico": "distribuidora; Brasil",
   "grao_temporal": "mês",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "Σ VlrDMR",
   "denominador": "Σ UC com Tarifa Social",
   "formula": "Σ DMR ÷ Σ UC",
   "regra_agregacao": "razão de somas",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês"
   ],
   "regras_comparabilidade": [
    "depende da tarifa de cada distribuidora e da regra de desconto vigente"
   ],
   "regra_cobertura": "UC > 0 e DMR informada",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "mesma competência e mesmo despacho no numerador e no denominador"
   ],
   "limitacoes": [
    "média por UC, não valor de cada fatura"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_faixas_consumo",
   "titulo": "UC com Tarifa Social por faixa de consumo",
   "pergunta": "Em que faixa de consumo estão as UC com Tarifa Social?",
   "definicao": "UC com Tarifa Social em cada uma das cinco faixas de consumo do SCS (até 30 kWh, 31 a 50, 51 a 100, 101 a 220, acima de 220) e a parte de cada faixa no total do mês.",
   "unidade": "unidades consumidoras; % das UC com Tarifa Social",
   "grao_geografico": "Brasil",
   "grao_temporal": "mês",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "Σ UC com Tarifa Social da faixa",
   "denominador": "Σ UC com Tarifa Social das cinco faixas",
   "formula": "100 × UC da faixa ÷ UC das cinco faixas",
   "regra_agregacao": "soma entre distribuidoras no despacho vigente",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "faixa",
    "mês"
   ],
   "regras_comparabilidade": [
    "faixas do SCS, não as da regra de desconto de 05/07/2025"
   ],
   "regra_cobertura": "mês de referência e 12 meses antes",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "soma das faixas igual ao total do mês"
   ],
   "limitacoes": [
    "faixa do consumo faturado do mês, não do consumo habitual"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_kwh_por_uc",
   "titulo": "Consumo faturado médio das UC com Tarifa Social",
   "pergunta": "Quanto consome, em média, uma UC com Tarifa Social?",
   "definicao": "Energia faturada das UC com Tarifa Social (soma das modalidades) dividida pelo número dessas UC.",
   "unidade": "kWh por UC no mês",
   "grao_geografico": "distribuidora; Brasil",
   "grao_temporal": "mês",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "1.000 × Σ MdaMWh das modalidades",
   "denominador": "Σ UC com Tarifa Social",
   "formula": "1000 × Σ MWh ÷ Σ UC",
   "regra_agregacao": "razão de somas",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês"
   ],
   "regras_comparabilidade": [
    "MWh convertido em kWh por 1.000"
   ],
   "regra_cobertura": "UC > 0",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "unidade conferida no dicionário do SCS (MdaMWh em MWh)"
   ],
   "limitacoes": [
    "energia faturada, não consumo medido de cada domicílio"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_participacao_residencial",
   "titulo": "Participação da Tarifa Social nas UC residenciais",
   "pergunta": "Que parte das unidades consumidoras residenciais tem a Tarifa Social?",
   "definicao": "UC com Tarifa Social divididas pelas UC da classe residencial das mesmas distribuidoras e mês.",
   "unidade": "%",
   "grao_geografico": "distribuidora; Brasil",
   "grao_temporal": "mês",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "Σ UC com Tarifa Social das distribuidoras com total residencial consistente",
   "denominador": "Σ QtdConsResTotal das mesmas distribuidoras",
   "formula": "100 × Σ numerador ÷ Σ denominador",
   "regra_agregacao": "razão de somas; distribuidora com total residencial inconsistente sai das duas somas no mês",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês"
   ],
   "regras_comparabilidade": [
    "nunca média simples das participações das distribuidoras",
    "não é cobertura do público elegível"
   ],
   "regra_cobertura": "total residencial inconsistente: ausente, zero, menor que as UC com Tarifa Social ou a mais de 25% da mediana de ±3 meses; quando a distribuidora incorporou outra, a mediana só compara meses do mesmo lado da incorporação (incorporação detectada no SCS: saída definitiva de uma distribuidora e salto da sucessora a até 25% do total residencial da incorporada)",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "caso real: ELETROPAULO dez/2021 (total residencial cai de 7,44 milhões para 2,55 milhões e volta) marcado como inconsistente",
    "caso real de incorporação: RGE SUL fev/2020 (2.454.222 UC residenciais depois de incorporar a RGE, 1.279.372) fica na participação; a mesma RGE SUL em jun/2020 (991.302, queda isolada) continua inconsistente"
   ],
   "limitacoes": [
    "o total residencial é informado pela própria distribuidora no SCS"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_uc",
   "titulo": "Unidades consumidoras com Tarifa Social",
   "pergunta": "Quantas unidades consumidoras recebem o desconto da Tarifa Social?",
   "definicao": "Soma das UC das cinco modalidades da subclasse residencial baixa renda (baixa renda, BPC, indígena, quilombola e multifamiliar) informadas pelas distribuidoras no SCS, nas cinco faixas de consumo, no despacho vigente.",
   "unidade": "unidades consumidoras",
   "grao_geografico": "distribuidora; Brasil (soma)",
   "grao_temporal": "mês de competência",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "Σ NumConsBaixaRenda + NumConsIndigena + NumConsQuilombola + NumConsBPC + NumConsMultifamiliar",
   "regra_agregacao": "soma entre faixas e distribuidoras; série nacional só em meses completos (pelo menos 90 informantes e nenhuma distribuidora esperada faltando: lacuna entre dois informes ou ausência nos 3 últimos meses do arquivo; incorporação não conta como falta)",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "distribuidora (CNPJ)",
    "modalidade",
    "faixa de consumo",
    "mês"
   ],
   "regras_comparabilidade": [
    "UC não é família nem pessoa",
    "meses incompletos não entram em comparação nacional",
    "concessão automática a partir de jan/2022 e nova regra de desconto a partir de 05/07/2025 mudam o regime"
   ],
   "regra_cobertura": "distribuidoras que informaram o SCS no mês; o último mês do arquivo costuma estar incompleto",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "exatamente 5 faixas por despacho",
    "despacho vigente por competência",
    "conferência com os Beneficiários da CDE no mês de conferência, ±2% por distribuidora",
    "conferência com a série antiga da ANEEL nos trimestres comuns (2014 a 2019)"
   ],
   "limitacoes": [
    "não distingue famílias com mais de uma UC (a regra permite uma só)",
    "sujeito a retificação pela distribuidora"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "inclusao.tsee_variacao_12m",
   "titulo": "Variação das UC com Tarifa Social em 12 meses",
   "pergunta": "O número de UC com Tarifa Social cresceu ou caiu no último ano?",
   "definicao": "Variação percentual das UC com Tarifa Social do mês de referência contra o mesmo mês do ano anterior, no Brasil (série nacional) ou na distribuidora (mesmo CNPJ).",
   "unidade": "%",
   "grao_geografico": "Brasil; distribuidora",
   "grao_temporal": "mês contra o mesmo mês 12 meses antes",
   "fontes": [
    "aneel_scs"
   ],
   "numerador": "UC com Tarifa Social no mês",
   "denominador": "UC com Tarifa Social 12 meses antes",
   "formula": "100 × (UC_m ÷ UC_(m−12) − 1)",
   "regra_agregacao": "razão entre dois totais do mesmo universo",
   "versao_formula": "1.0",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "distribuidora"
   ],
   "regras_comparabilidade": [
    "no Brasil, só comparável quando o mês base também é completo (campo comparavel)",
    "na distribuidora, incorporação no intervalo muda o universo (ver incorporacoes)"
   ],
   "regra_cobertura": "mês base presente; ausente fica sem valor",
   "politica_ausencia": "Ausência na fonte fica sem valor (nunca zero); o motivo aparece na evidência.",
   "validacoes": [
    "mai/2025 contra mai/2024: 2,36%, conferido por soma direta do CSV"
   ],
   "limitacoes": [
    "não separa entrada de novas famílias de recadastramento e revisão cadastral"
   ],
   "gold": "inclusao.json",
   "paginas": [
    "/setor-eletrico/inclusao-energetica"
   ],
   "arquivo": "pipeline/energia/metricas/inclusao.py"
  },
  {
   "id": "mcti_fator_medio_emissao",
   "titulo": "Fator médio de emissão de CO2 do SIN (inventários)",
   "pergunta": "Quanto CO2, em média, foi emitido por MWh gerado no SIN?",
   "definicao": "Fator médio mensal e anual publicado pelo MCTI: média das emissões de todas as usinas em operação no SIN por MWh gerado. Serve para inventários. Não é fator marginal.",
   "unidade": "tCO2/MWh",
   "grao_geografico": "SIN (nacional)",
   "grao_temporal": "mês e ano",
   "fontes": [
    "mcti_fator_emissao"
   ],
   "regra_agregacao": "Nenhuma: valores oficiais como publicados. O anual oficial é o do MCTI, não média dos meses.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "mês",
    "ano"
   ],
   "regras_comparabilidade": [
    "Não comparar com margem de operação ou de construção.",
    "CO2, não CO2e.",
    "Fator nacional: não existe versão municipal nem horária."
   ],
   "regra_cobertura": "Mensal de jan/2006 ao último mês publicado; anual de 2006 ao último ano completo (planilha de inventários da página vigente do MCTI). O ano corrente não tem anual.",
   "politica_ausencia": "Mês ou ano sem valor publicado fica sem valor; nada é estimado para preencher.",
   "validacoes": [
    "0 ≤ fator < 2 tCO2/MWh.",
    "12 meses em cada ano com fator anual.",
    "Anual publicado comparado à média simples dos 12 meses publicados, tolerância 0,0001 tCO2/MWh (arredondamento da quarta casa); ano fora vira ressalva, sem ajuste.",
    "Valores da página vigente comparados aos do site institucional anterior do MCTI (2006 a 2021); diferenças publicadas."
   ],
   "limitacoes": [
    "Fator estimado pelo MCTI (emissões calculadas a partir do consumo de combustível e de fatores metodológicos, divididas pela geração do ONS), não medido; a plataforma publica o valor oficial sem alteração, por isso a transformação também é ESTIMADO (da fonte) e não CALCULADO.",
    "Base de usinas do ONS ampliada a partir de jan/2025 (nota técnica NT_FE_jun25): comparações que atravessam jan/2025 misturam bases.",
    "Emissões da operação das usinas, só CO2; não é ciclo de vida nem CO2e.",
    "A página vigente do MCTI pode responder com desafio de verificação humana; o pipeline não contorna e mantém a última captura válida."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "mcti_margem_construcao",
   "titulo": "Fator de emissão da margem de construção (MDL)",
   "pergunta": "Qual a intensidade de CO2 das usinas construídas mais recentemente, para projetos de MDL?",
   "definicao": "Fator anual da margem de construção publicado pelo MCTI nas planilhas do MDL.",
   "unidade": "tCO2/MWh",
   "grao_geografico": "SIN",
   "grao_temporal": "ano",
   "fontes": [
    "mcti_fator_emissao"
   ],
   "regra_agregacao": "Nenhuma: valor oficial.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "ano"
   ],
   "regras_comparabilidade": [
    "Não comparar com o fator médio."
   ],
   "regra_cobertura": "Anos com valor publicado; o ano corrente fica ausente com a nota da fonte (\"será disponibilizado no início\" do ano seguinte).",
   "politica_ausencia": "Texto no lugar do valor (\"a ser publicado\") = ausência com a nota da fonte.",
   "validacoes": [
    "0 ≤ fator < 2 tCO2/MWh.",
    "Valor atípico conferido na planilha original antes de publicar (ex.: 0,0028 em 2017, célula G4 da planilha do MCTI)."
   ],
   "limitacoes": [
    "Fator estimado pelo MCTI (emissões calculadas a partir do consumo de combustível e de fatores metodológicos, divididas pela geração do ONS), não medido; a plataforma publica o valor oficial sem alteração, por isso a transformação também é ESTIMADO (da fonte) e não CALCULADO.",
    "Método do MDL.",
    "Revisões declaradas pela fonte (valor anterior e corrigido) publicadas junto da série."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "mcti_margem_operacao",
   "titulo": "Fator de emissão da margem de operação (MDL)",
   "pergunta": "Qual a intensidade de CO2 das usinas na margem do despacho, para projetos de MDL?",
   "definicao": "Fator da margem de operação pelo método da análise de despacho (mensal e diário) e pelo método simples ajustado (anual), publicados pelo MCTI conforme a ferramenta do Conselho Executivo do MDL.",
   "unidade": "tCO2/MWh",
   "grao_geografico": "SIN",
   "grao_temporal": "dia, mês (despacho) e ano (simples ajustado)",
   "fontes": [
    "mcti_fator_emissao"
   ],
   "regra_agregacao": "Nenhuma: valores oficiais.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "dia",
    "mês",
    "ano",
    "método"
   ],
   "regras_comparabilidade": [
    "Uso exclusivo em projetos de MDL; não é intensidade média da eletricidade consumida."
   ],
   "regra_cobertura": "Despacho: diário e mensal de 2006 ao último mês publicado. Simples ajustado: anual de 2006 ao último ano publicado.",
   "politica_ausencia": "Dia inexistente no calendário (ex.: 29/02 em ano não bissexto, preenchido com 0 na planilha) é descartado.",
   "validacoes": [
    "Média simples dos fatores diários comparada ao mensal publicado.",
    "Leitura do mês pela posição quando o rótulo da coluna diverge (registrado em problemas de leitura)."
   ],
   "limitacoes": [
    "Fator estimado pelo MCTI (emissões calculadas a partir do consumo de combustível e de fatores metodológicos, divididas pela geração do ONS), não medido; a plataforma publica o valor oficial sem alteração, por isso a transformação também é ESTIMADO (da fonte) e não CALCULADO.",
    "Método do MDL; não descreve o sistema médio."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_agentes_aneel",
   "titulo": "Agentes cadastrados na ANEEL por atividade",
   "pergunta": "Quantas pessoas jurídicas exercem cada atividade do setor?",
   "definicao": "Cadastro de agentes do setor elétrico da ANEEL: CNPJ distintos, situação ativa e indicadores de comercialização, distribuição, geração e transmissão.",
   "unidade": "agentes (CNPJ)",
   "grao_geografico": "Brasil",
   "grao_temporal": "posição (data de geração do arquivo)",
   "fontes": [
    "aneel_agentes_mercado"
   ],
   "formula": "contagem de CNPJ ativos com o indicador da atividade",
   "regra_agregacao": "Contagens por atividade (um CNPJ pode ter várias).",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "atividade"
   ],
   "regras_comparabilidade": [
    "Cadastro da ANEEL não é a lista de associados da CCEE."
   ],
   "regra_cobertura": "Posição do arquivo publicado.",
   "politica_ausencia": "Situação vazia não conta como ativa.",
   "validacoes": [
    "Esquema conferido (colunas exigidas); indicador fora de 0 e 1 é contado."
   ],
   "limitacoes": [
    "O indicador 2 em geração aparece em uma linha sem definição no dicionário."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_agentes_contabilizados",
   "titulo": "Agentes na contabilização da CCEE",
   "pergunta": "Quantos agentes participaram da contabilização do mês, por classe?",
   "definicao": "Coluna QUANTIDADE_AGENTE_CONTABILIZACAO do conjunto AGENTE_QTD_CONTABILIZACAO, por classe e somada no mês.",
   "unidade": "agentes",
   "grao_geografico": "SIN",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_agente_qtd_contabilizacao"
   ],
   "formula": "Σ QUANTIDADE_AGENTE_CONTABILIZACAO das classes do mês",
   "regra_agregacao": "Soma das classes do mesmo mês (a fonte conta cada agente na sua classe).",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "classe"
   ],
   "regras_comparabilidade": [
    "Agente é pessoa jurídica (CNPJ): novo perfil não é empresa nova."
   ],
   "regra_cobertura": "Dezembro de 2023 até o último mês contabilizado.",
   "politica_ausencia": "Classe sem linha no mês não é somada (não vira zero).",
   "validacoes": [
    "Classes dentro do domínio do dicionário mais Varejista, Importador e Transmissor (conferidas nos arquivos); outra classe recusa o arquivo.",
    "Conferido com o InfoMercado (agosto e outubro de 2024: 15.803 e 15.936 no conjunto aberto contra 15.795 e 15.932 publicados; julho de 2026: 16.376 contra 16.364): ressalva, o conjunto é a versão vigente da contabilização."
   ],
   "limitacoes": [
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos.",
    "A CCEE pode recontabilizar meses já publicados; cada captura fica no silver e a revisão entre capturas é registrada e publicada na evidência."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_consumo_cativo_livre_epe",
   "titulo": "Consumo de energia elétrica na rede, cativo e livre (EPE)",
   "pergunta": "Quanto se consumiu na rede em cada ambiente de contratação?",
   "definicao": "Coluna Consumo (MWh) da tabela 'CONSUMO E NUMCONS SAM' (e 'SAM UF') dos dados abertos de consumo mensal da EPE, somada por tipo de consumidor e pela abertura pedida.",
   "unidade": "MWh",
   "grao_geografico": "Brasil; região; subsistema (SE, S, NE, N, sistemas isolados); UF",
   "grao_temporal": "mês; ano civil; 12 meses",
   "fontes": [
    "epe_consumo_mensal",
    "epe_consumo_classe"
   ],
   "formula": "Σ Consumo das linhas da abertura e do tipo no período",
   "regra_agregacao": "Soma simples de volumes do mesmo período e do mesmo tipo.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "mês",
    "ano",
    "região",
    "subsistema",
    "classe",
    "tipo",
    "UF"
   ],
   "regras_comparabilidade": [
    "Consumo não é carga: a carga do ONS inclui perdas na rede e consumo não apurado; o Boletim do MME publica a diferença como 'Perdas e Diferenças'. ACL + ACR fecha com o universo da própria fonte, não com a carga.",
    "O ano corrente é preliminar pela EPE (asterisco na planilha formatada) e pode ser revisado."
   ],
   "regra_cobertura": "Janeiro de 2004 até o último mês publicado.",
   "politica_ausencia": "Célula vazia é ausência (None); a soma só usa o que a fonte publicou e o mês sem linha do tipo fica sem valor.",
   "validacoes": [
    "Esquema conferido na chegada: colunas, regiões, subsistemas, classes, tipos e UF fora do dicionário interrompem a leitura.",
    "Reconciliação com o total nacional da planilha formatada da EPE."
   ],
   "limitacoes": [
    "A tabela por UF vai até o penúltimo mês publicado."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_consumo_sobre_carga_mme",
   "titulo": "Consumo na rede como parte da carga (Boletim do MME)",
   "pergunta": "Por que ACL + ACR não é igual à carga do sistema?",
   "definicao": "Consumo total da EPE no mês (GWh) dividido pela carga do Brasil publicada na tabela de consumo por classe do Boletim Mensal de Monitoramento do MME, que traz a linha 'Perdas e Diferenças'.",
   "unidade": "%",
   "grao_geografico": "Brasil",
   "grao_temporal": "mês (edição do boletim)",
   "fontes": [
    "epe_consumo_mensal",
    "epe_consumo_classe",
    "mme_boletim_monitoramento"
   ],
   "numerador": "consumo cativo + livre da EPE no mês (GWh)",
   "denominador": "carga total do mês no boletim (GWh)",
   "formula": "consumo_sobre_carga_pct = 100 × consumo_EPE ÷ carga_MME",
   "regra_agregacao": "Razão de um mês; não é agregada.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "Consumo não é carga: a carga do ONS inclui perdas na rede e consumo não apurado; o Boletim do MME publica a diferença como 'Perdas e Diferenças'. ACL + ACR fecha com o universo da própria fonte, não com a carga."
   ],
   "regra_cobertura": "Meses das edições de 2026 do boletim (as pastas de 2023 a 2025 exigem login no portal do MME).",
   "politica_ausencia": "Edição sem a tabela reconhecida não gera linha.",
   "validacoes": [
    "Tabela de consumo por ambiente do boletim conferida na extração: ACR + ACL = Total (tolerância de 1 GWh).",
    "Participação anual do ACL na consolidação de 2025 do MME (45,6% de 562.243 GWh) × EPE dados abertos (44,82% de 567.232 GWh): divergência de 0,78 p.p. publicada."
   ],
   "limitacoes": [
    "As pastas das edições mensais de 2023 a 2025 exigem login no portal do MME; a consolidação anual de 2025 é pública."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_desligamentos",
   "titulo": "Desligamentos de agentes da CCEE",
   "pergunta": "Quantos agentes deixaram a CCEE, por tipo e classe?",
   "definicao": "Conjuntos DESLIGAMENTO_VOLUNTARIO e DESLIGAMENTO_COMPULSORIO: desligamentos por ano da data, tipo e classe do agente desligado, com o tipo de sucessão.",
   "unidade": "desligamentos",
   "grao_geografico": "SIN",
   "grao_temporal": "ano (data do desligamento)",
   "fontes": [
    "ccee_desligamento_voluntario",
    "ccee_desligamento_compulsorio"
   ],
   "formula": "contagem de linhas por ano, tipo e classe",
   "regra_agregacao": "Contagem; cada linha é um desligamento aprovado pelo Conselho de Administração.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "tipo",
    "classe",
    "sucessão"
   ],
   "regras_comparabilidade": [
    "Desligamento voluntário com sucessão não é saída da atividade: o sucessor continua."
   ],
   "regra_cobertura": "Histórico publicado nos arquivos de 2026 (desligamentos voluntários desde 2010 e compulsórios desde 2013).",
   "politica_ausencia": "Linha sem data é contada à parte e não entra.",
   "validacoes": [
    "Cabeçalho conferido (falha fechada); CNPJ validado.",
    "Cada ano traz meses cobertos, última data e completo; o ano corrente é parcial (2026 até 01/09/2026 na captura de 01/10/2026)."
   ],
   "limitacoes": [
    "Arquivo único com o histórico; atualização anual pela fonte.",
    "Ano parcial não compete com ano completo em comparação sem o aviso de cobertura."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_eer",
   "titulo": "Encargo de energia de reserva (EER)",
   "pergunta": "Quanto os usuários pagaram pela contratação da energia de reserva?",
   "definicao": "Coluna ENCARGO_ENERGIA_RESERVA do conjunto RESERVA_ENCARGO, por mês de competência; janela de 12 meses = soma.",
   "unidade": "R$ nominais",
   "grao_geografico": "SIN",
   "grao_temporal": "mês; 12 meses",
   "fontes": [
    "ccee_reserva_encargo"
   ],
   "formula": "EER_12m = Σ ENCARGO_ENERGIA_RESERVA dos 12 meses",
   "regra_agregacao": "Soma de valores nominais.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "Não é ESS: é cobrado via CONER, conta própria da energia de reserva."
   ],
   "regra_cobertura": "Setembro de 2023 até o último mês publicado.",
   "politica_ausencia": "Janela de 12 meses só é calculada com os 12 meses publicados; mês ausente interrompe a janela (nunca é completado, interpolado ou tratado como zero).",
   "validacoes": [
    "Cabeçalho conferido na chegada (7 colunas; falha fechada)."
   ],
   "limitacoes": [
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_ess",
   "titulo": "Encargos de serviços do sistema (ESS)",
   "pergunta": "Quanto custaram, por tipo, os serviços do sistema cobrados na contabilização?",
   "definicao": "Soma dos nove tipos do conjunto ENCARGO_ESS_ANCILAR (ENCARGO_CONST_ON, ENCARGO_CONST_OFF, ENCARGO_REST_OP_UNIT_COMT, ENCARGO_CS, OUTROS_SERVICOS_ANCILARES, ENCARGO_SEG_ENER, RECEBIMENTO_ENCARGO_DH, ENCARGO_IMPORTACAO e RECEBIMENTO_ENCARGO_RESERVA_OP) no mês de competência; as seis colunas RESSARCIMENTO_* detalham OUTROS_SERVICOS_ANCILARES e não são somadas de novo.",
   "unidade": "R$ nominais",
   "grao_geografico": "SIN",
   "grao_temporal": "mês de competência; 12 meses",
   "fontes": [
    "ccee_encargo_ess_ancilar",
    "ccee_infomercado",
    "mme_boletim_monitoramento"
   ],
   "formula": "ESS_m = Σ dos nove tipos; ESS_12m = Σ ESS_m",
   "regra_agregacao": "Soma de valores nominais por tipo e por mês.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "tipo de encargo"
   ],
   "regras_comparabilidade": [
    "Competência (mês de referência) não é pagamento: o pagamento sai depois do alívio com recursos do mercado.",
    "O total do InfoMercado e do boletim do MME inclui a resposta da demanda, que fica em métrica própria.",
    "O PLD é o preço do mercado de curto prazo, não o preço dos contratos do mercado livre; o módulo não publica preço de contrato, de PPA nem curva a termo."
   ],
   "regra_cobertura": "Julho de 2023 até o último mês contabilizado.",
   "politica_ausencia": "Mês com algum tipo vazio fica sem total e interrompe a janela.",
   "validacoes": [
    "OUTROS_SERVICOS_ANCILARES = Σ ressarcimentos em todos os meses (diferença de R$ 0,00).",
    "Componentes e total sem as parcelas fora do conjunto (resposta da demanda, suporte de reativo do sandbox) conferidos com o InfoMercado: R$ 477,52, 265,48 e 63,89 milhões em agosto e outubro de 2024 e julho de 2026 (tolerância de R$ 0,06 milhão no total e R$ 0,005 milhão por parcela publicada).",
    "Tipos por mês conferidos com o Boletim do MME de 2026 (66 de 66 dentro de 0,5 mil R$).",
    "Total de 2025 conferido com a consolidação anual do MME ('R$ 1,2 bilhão, 53% menor que 2024'): R$ 1,192 bilhão e −53,6% no conjunto (tolerâncias de R$ 0,05 bilhão e 1 p.p.)."
   ],
   "limitacoes": [
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos.",
    "A CCEE pode recontabilizar meses já publicados; cada captura fica no silver e a revisão entre capturas é registrada e publicada na evidência."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_ess_boletim_mme",
   "titulo": "Encargos de serviços do sistema no Boletim do MME",
   "pergunta": "Como o boletim oficial do MME apresenta os encargos e como eles foram revistos entre edições?",
   "definicao": "Tabela 'Encargos de Serviços de Sistema' de cada edição de 2026 do Boletim Mensal de Monitoramento do Sistema Elétrico (mil R$, fonte declarada CCEE); vale a edição mais recente de cada mês e as revisões entre edições são publicadas.",
   "unidade": "mil R$ nominais",
   "grao_geografico": "SIN",
   "grao_temporal": "mês de competência (edição)",
   "fontes": [
    "mme_boletim_monitoramento"
   ],
   "formula": "Σ da linha Total nos meses publicados",
   "regra_agregacao": "Soma de meses da edição vigente.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "tipo",
    "edição"
   ],
   "regras_comparabilidade": [
    "Traço lido como zero só quando a soma do mês fecha com ele."
   ],
   "regra_cobertura": "Edições de 2026 (as pastas de 2023 a 2025 exigem login no portal do MME).",
   "politica_ausencia": "Mês que não fecha é descartado inteiro.",
   "validacoes": [
    "Em cada mês, Σ tipos = Total e Σ parcelas = tipo (tolerância de 2 mil R$).",
    "Total anual de 2025 da consolidação do MME conferido com o conjunto ENCARGO_ESS_ANCILAR da CCEE."
   ],
   "limitacoes": [
    "As edições mensais de 2023 a 2025 exigem login no portal; não foram acessadas por outro caminho."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_exportacao_ccee",
   "titulo": "Exportação de energia contabilizada pela CCEE",
   "pergunta": "Quanta energia foi vendida a outros países e ficou fora da participação do ACL?",
   "definicao": "CONSUMO da classe de agente Exportador no conjunto CONSUMO_CLASSE_AGENTE (centro de gravidade, MWmed); em MWh, multiplicado pelas horas do mês. A CCEE soma a exportação ao ACL no conjunto de consumo por ambiente; o observatório a publica como componente separado.",
   "unidade": "MWmed; MWh",
   "grao_geografico": "SIN",
   "grao_temporal": "mês; 12 meses",
   "fontes": [
    "ccee_consumo_classe_agente",
    "ccee_infomercado"
   ],
   "formula": "exportacao_mwh = CONSUMO(Exportador) × horas do mês; 12 meses = Σ",
   "regra_agregacao": "Soma de energias (MWmed × horas).",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "Exportação não é consumo de unidade consumidora no Brasil."
   ],
   "regra_cobertura": "Maio de 2023 até o último mês contabilizado.",
   "politica_ausencia": "Mês sem a linha da classe Exportador fica sem exportação (não vira zero).",
   "validacoes": [
    "Conferida com a exportação publicada em nota do InfoMercado (agosto e outubro de 2024 e julho de 2026; tolerância de 0,005 MW médio)."
   ],
   "limitacoes": [
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_fluxo_agentes_associados",
   "titulo": "Entradas e saídas de agentes associados (CNPJ)",
   "pergunta": "Quantas empresas entraram e saíram da CCEE em cada mês?",
   "definicao": "Lista de agentes associados mês a mês (LISTA_AGENTE_ASSOCIADO): entrada no mês m = CNPJ presente em m e ausente em m−1; saída = presente em m−1 e ausente em m; estoque = CNPJ distintos no mês.",
   "unidade": "agentes (CNPJ)",
   "grao_geografico": "SIN",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_lista_agente_associado"
   ],
   "formula": "entradas_m = |CNPJ_m − CNPJ_{m−1}|; saídas_m = |CNPJ_{m−1} − CNPJ_m|",
   "regra_agregacao": "Contagem de conjuntos de CNPJ entre meses consecutivos; o primeiro mês da série não tem fluxo.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "classe do agente"
   ],
   "regras_comparabilidade": [
    "Saída da lista não é sinônimo de desligamento: sucessão e mudança de CNPJ também tiram um CNPJ da lista.",
    "Identidade pelo CNPJ de 14 dígitos (nunca por semelhança de nome)."
   ],
   "regra_cobertura": "Outubro de 2025 (primeiro mês publicado) até o último mês.",
   "politica_ausencia": "Mês sem lista não tem estoque; mês seguinte a uma lacuna não tem fluxo.",
   "validacoes": [
    "CNPJ validado (14 dígitos); linha sem mês ou CNPJ é contada à parte e não entra."
   ],
   "limitacoes": [
    "A lista mês a mês só existe a partir de outubro de 2025."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_gsf",
   "titulo": "Fator de ajuste do MRE (GSF)",
   "pergunta": "Quanto as hidrelétricas do MRE geraram em relação à garantia física ajustada?",
   "definicao": "Geração das usinas do MRE no centro de gravidade (GERACAO_MRE, soma dos quatro submercados, conjunto GERACAO_SUBMERCADO) dividida pela garantia física modulada ajustada pelo fator de disponibilidade (GARANTIA_FISICA_MODULADA_FDISP, conjunto MRE_MENSAL).",
   "unidade": "%",
   "grao_geografico": "MRE (SIN)",
   "grao_temporal": "mês; ano; 12 meses",
   "fontes": [
    "ccee_geracao_submercado",
    "ccee_mre_mensal",
    "ccee_garantia_fisica_sazo_mre_submercado",
    "ccee_infomercado"
   ],
   "numerador": "Σ GERACAO_MRE × horas (MWh)",
   "denominador": "Σ GARANTIA_FISICA_MODULADA_FDISP × horas (MWh)",
   "formula": "GSF = 100 × Σ(geração MRE × horas) ÷ Σ(GFIS_2 × horas)",
   "regra_agregacao": "Período = razão das somas em MWh; nunca média de fatores mensais.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "ano"
   ],
   "regras_comparabilidade": [
    "Garantia física e geração ficam em colunas separadas; o fator é razão de energias do mesmo perímetro.",
    "Não se infere exposição financeira de usina ou agente."
   ],
   "regra_cobertura": "Maio de 2023 até o último mês contabilizado, com os quatro submercados.",
   "politica_ausencia": "Mês sem os quatro submercados fica sem GSF; janela incompleta não é calculada.",
   "validacoes": [
    "Reproduz o fator mensal publicado no InfoMercado mensal: 79,37% em agosto e 73,49% em outubro de 2024 e 76,83% em julho de 2026 (tolerância de 0,006 p.p.).",
    "GSF de 12 meses × 'ajuste médio do MRE nos últimos doze meses' do InfoMercado de julho de 2026 (92,55%): diverge (razão de energias 80,43%; média simples 81,65%; razão sobre a garantia física sazonalizada 77,03%; acumulado de 2026 92,48%); divergência publicada, sem reconciliação.",
    "Σ garantia física sazonalizada dos submercados = garantia física sazonalizada do MRE (diferença 0)."
   ],
   "limitacoes": [
    "A CCEE não publica o GSF como coluna dos dados abertos.",
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos.",
    "A definição do número de 12 meses do InfoMercado (janela, ponderação, base de garantia física) não é informada pela fonte."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_inadimplencia_liquidacao",
   "titulo": "Inadimplência na liquidação do mercado de curto prazo",
   "pergunta": "Que parte do valor a liquidar no MCP não foi paga?",
   "definicao": "Conjunto SUMARIO_MENSAL_LIQUIDACAO: VALOR_INAD ÷ VALOR_TOTAL_LIQ_PRE no mês de apuração; só nos meses em que a liquidar = liquidado + inadimplência.",
   "unidade": "%",
   "grao_geografico": "SIN",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_sumario_mensal_liquidacao",
    "ccee_infomercado"
   ],
   "numerador": "VALOR_INAD (R$)",
   "denominador": "VALOR_TOTAL_LIQ_PRE (R$)",
   "formula": "inadimplencia_pct = 100 × VALOR_INAD ÷ VALOR_TOTAL_LIQ_PRE",
   "regra_agregacao": "Razão de um mês; não é média entre meses.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "Mês com liquidado e inadimplência publicados como 0 e valor a liquidar positivo é 'liquidação não informada': liquidado, inadimplência e taxa nulos (o zero publicado fica no CSV, rotulado)."
   ],
   "regra_cobertura": "Julho de 2023 até o último mês liquidado, em grade completa de meses.",
   "politica_ausencia": "Mês sem os três valores fica sem taxa; mês ausente do arquivo (abril de 2025) aparece como 'mes_ausente_na_fonte', com tudo nulo.",
   "validacoes": [
    "A liquidar = liquidado + inadimplência (tolerância de R$ 1).",
    "Valor a liquidar conferido com o InfoMercado (R$ 2,14 e 5,84 bilhões em agosto e outubro de 2024; R$ 2,13 bilhões em julho de 2026)."
   ],
   "limitacoes": [
    "Maio de 2025, março e abril de 2026 vêm com zeros que não fecham a identidade.",
    "Abril de 2025 não está no arquivo de 2025 do conjunto."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_livre_distribuidora_samp",
   "titulo": "Energia e unidades do mercado livre e cativo faturadas por distribuidora (SAMP)",
   "pergunta": "Quanto do mercado de cada distribuidora já é livre?",
   "definicao": "SAMP da ANEEL: Energia TUSD (kWh) e número de consumidores com DscOpcaoEnergia = LIVRE; Energia TE (kWh) e número de consumidores do CATIVO; só os tipos de mercado faturados na própria competência (refaturamento em coluna própria). Participação faturada = livre ÷ (livre + cativo) do ano.",
   "unidade": "MWh; unidades consumidoras; %",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "mês; ano civil",
   "fontes": [
    "aneel_samp_mercado"
   ],
   "numerador": "Σ energia TUSD livre do ano (MWh)",
   "denominador": "Σ energia TUSD livre + energia TE cativa do ano (MWh)",
   "formula": "livre_pct_faturada = 100 × livre ÷ (livre + cativo); kWh ÷ 1.000 = MWh",
   "regra_agregacao": "Soma das linhas da mesma distribuidora, mês e medida (abertura por classe, subgrupo e posto da fonte); taxa só com os 12 meses do ano.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês",
    "ano",
    "característica do consumidor livre"
   ],
   "regras_comparabilidade": [
    "Mês completo: publicado por pelo menos 95% da mediana de distribuidoras dos 12 meses anteriores e nenhuma distribuidora sem as linhas LIVRE que tinha no mês anterior.",
    "Mês comparável com a EPE: completo, sem linhas Regular repetidas exatamente do mês anterior e sem variação abrupta (mais de 50%, com pelo menos 100 unidades) no estoque de unidades livres de uma distribuidora.",
    "Energia cativa de quem tem micro ou minigeração é a líquida da compensação."
   ],
   "regra_cobertura": "Janeiro de 2019 até a última competência publicada; ano de referência = último ano civil completo.",
   "politica_ausencia": "Distribuidora sem linha no mês não entra na soma do mês; taxa anual exige 12 meses.",
   "validacoes": [
    "Esquema conferido no Parquet (colunas exigidas); tipos de mercado desconhecidos são contados e ficam fora.",
    "Completude por mês, medida e distribuidora: julho de 2026 é incompleto (ELEKTRO, com 4.302 unidades livres em junho, e EQUATORIAL PA, com 2.157, sem linhas LIVRE; linhas CATIVO Regular da ELEKTRO iguais às de junho).",
    "Unidades livres do SAMP comparadas às da EPE no último mês comparável (98,2% em junho de 2026: 93.035 contra 94.720)."
   ],
   "limitacoes": [
    "Consumidor livre ligado direto à rede básica não é faturado por distribuidora e não aparece.",
    "'Fonte incentivada' inclui os consumidores especiais sem separá-los; 'ERC' não é definido no dicionário."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_pagamento_ess",
   "titulo": "Pagamento de ESS depois do alívio",
   "pergunta": "Quanto do ESS apurado foi efetivamente pago pelos consumidores, depois do alívio?",
   "definicao": "Colunas PAGAMENTO_ENCARGO_ESS e PAGAMENTO_ENCARGO_SE do conjunto ENCARGO_PGTO_MENSAL; recursos de alívio (RESERVA_ALIVIO_ESS) e penalidades em colunas próprias.",
   "unidade": "R$ nominais",
   "grao_geografico": "SIN",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_encargo_pgto_mensal",
    "ccee_infomercado"
   ],
   "formula": "pagamento = PAGAMENTO_ENCARGO_ESS + PAGAMENTO_ENCARGO_SE",
   "regra_agregacao": "Soma de valores nominais.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "Pagamento não é competência: o alívio reduz o valor pago."
   ],
   "regra_cobertura": "Setembro de 2023 até o último mês publicado.",
   "politica_ausencia": "Célula vazia é ausência.",
   "validacoes": [
    "InfoMercado: total de encargos − alívio = pagamento em agosto e outubro de 2024 (R$ 361,54 e 20,87 milhões; tolerância de R$ 0,06 milhão); em julho de 2026 o InfoMercado implica R$ 2,55 milhões e o conjunto traz R$ 0,00 milhão: divergência publicada.",
    "Controle de sequências repetidas (seis meses ou mais com o mesmo valor): PAGAMENTO_ENCARGO_ESS = 0 de fevereiro de 2025 a julho de 2026 (18 meses) com ESS positivo em todos; os meses ficam 'zero_nao_confirmado', nulos na gold e rotulados no CSV."
   ],
   "limitacoes": [
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos.",
    "O conjunto traz FATOR_AJUSTE_ESS também 0 nesses meses, coerente com alívio total; sem publicação independente que confirme, o zero não é exibido como pagamento nulo."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_parcelas_carga_migracao",
   "titulo": "Parcelas de carga dos agentes do ACL e migrações no mês",
   "pergunta": "Quantas unidades de consumo dos agentes do mercado livre estão modeladas na CCEE e quantas migraram no mês?",
   "definicao": "Conjunto PARCELA_CARGA_CONSUMO: parcelas (COD_PARCELA_CARGA) distintas com linha no mês, dos perfis que não são da classe Distribuidor no cadastro LISTA_PERFIL_V1 (consumidores livres, especiais, autoprodutores e exportadores); as parcelas dos perfis Distribuidor, uma por área de concessão, são o consumo do ACR e ficam em série própria. Migração no mês = parcela cuja DATA_MIGRACAO cai no próprio mês de referência; consumo do ACL = Σ CONSUMO_ACL das parcelas do ACL (MWh), com a exportação à parte.",
   "unidade": "parcelas de carga; MWh",
   "grao_geografico": "SIN; submercado; UF",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_parcela_carga_consumo",
    "ccee_lista_perfil_v1",
    "ccee_consumo_classe_agente"
   ],
   "formula": "contagem de COD_PARCELA_CARGA distintos de perfis fora da classe Distribuidor; migrações = parcelas com DATA_MIGRACAO no mês",
   "regra_agregacao": "Contagens de códigos distintos por mês; consumo somado.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "submercado",
    "UF",
    "classe do perfil"
   ],
   "regras_comparabilidade": [
    "Parcela de carga não é unidade consumidora: uma parcela pode reunir várias UCs.",
    "As parcelas das distribuidoras não são parcelas do ACL (julho de 2026: 139 parcelas e 29.353.995 MWh, o consumo da classe Distribuidor)."
   ],
   "regra_cobertura": "Abril de 2024 (mês parcial na fonte) até o último mês publicado.",
   "politica_ausencia": "Linha sem código de parcela é contada à parte e não entra.",
   "validacoes": [
    "Parcelas por submercado somam o total do ACL no mês.",
    "Mês a mês, parcelas das distribuidoras = consumo da classe Distribuidor e parcelas do ACL = classes Consumidor Livre, Especial, Autoprodutor e Exportador (tolerância de 5 MW médios); julho de 2026: 21.787.337 MWh no ACL, resíduo de 2,15 MW médios. Fora da tolerância e marcados: abril de 2024 (mês parcial) e outubro de 2025 a janeiro de 2026 (52 a 77 MW médios a menos nas parcelas, sem explicação da fonte)."
   ],
   "limitacoes": [
    "A data de migração é a da parcela no cadastro atual; migração de parcela depois desligada pode não aparecer.",
    "As cargas representadas por comercializador varejista não aparecem como parcela no conjunto; o consumo delas está na classe Comercializador (até janeiro de 2026) ou Varejista.",
    "A classe do perfil vem do cadastro vigente; perfil encerrado fora do cadastro entra no ACL como 'sem cadastro'."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_participacao_acl_ccee",
   "titulo": "Participação do ACL no consumo contabilizado (CCEE), sem a exportação",
   "pergunta": "Que parte do consumo contabilizado pela CCEE está no ambiente livre?",
   "definicao": "ACL = soma do CONSUMO das classes de agente de consumo (todas exceto Distribuidor e Exportador); ACR = CONSUMO da classe Distribuidor; exportação = CONSUMO da classe Exportador, publicada à parte (conjunto CONSUMO_CLASSE_AGENTE, centro de gravidade, MWmed). Participação = razão das energias do período (MWmed × horas do mês), sem a exportação, como o InfoMercado da CCEE apresenta o consumo; a participação com a exportação somada ao ACL (como no conjunto de consumo por ambiente) é publicada ao lado.",
   "unidade": "%",
   "grao_geografico": "SIN",
   "grao_temporal": "mês; 12 meses",
   "fontes": [
    "ccee_consumo_classe_agente",
    "ccee_consumo_mensal_ambiente_comercializacao",
    "ccee_infomercado"
   ],
   "numerador": "Σ ACL_m × horas_m (MWh), sem a classe Exportador",
   "denominador": "Σ (ACR_m + ACL_m) × horas_m (MWh), sem a classe Exportador",
   "formula": "acl_pct = 100 × Σ(ACL × horas) ÷ Σ((ACR + ACL) × horas); acl_com_exportacao_pct = 100 × Σ((ACL + exportação) × horas) ÷ Σ((ACR + ACL + exportação) × horas)",
   "regra_agregacao": "Razão das somas em MWh, ponderada pelas horas de cada mês.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "classe de agente"
   ],
   "regras_comparabilidade": [
    "Centro de gravidade (perdas da rede básica rateadas): não é comparável ao consumo da EPE sem esse ajuste.",
    "Quebra na CCEE em fevereiro de 2026: a classe Comercializador deu lugar à Varejista e o conjunto CONSUMO_MENSAL_AMBIENTE_COMERCIALIZACAO deixou de contar a Varejista no ACL (cerca de 2.500 MW médios); o ACL do observatório soma as classes de consumo (todas exceto Distribuidor e Exportador), o que mantém a série comparável.",
    "Consumo não é carga: a carga do ONS inclui perdas na rede e consumo não apurado; o Boletim do MME publica a diferença como 'Perdas e Diferenças'. ACL + ACR fecha com o universo da própria fonte, não com a carga."
   ],
   "regra_cobertura": "Maio de 2023 até o último mês contabilizado.",
   "politica_ausencia": "Janela de 12 meses só é calculada com os 12 meses publicados; mês ausente interrompe a janela (nunca é completado, interpolado ou tratado como zero).",
   "validacoes": [
    "Σ classes = ACR + ACL do conjunto de ambiente (mais a classe Varejista a partir de fevereiro de 2026), resíduo até 5 MW médios por mês.",
    "ACR + ACL sem a exportação = 'O consumo contabilizou X MW médios' do InfoMercado: 68.936,2 contra 68.937 em agosto de 2024, 73.149,1 contra 73.150 em outubro de 2024 e 70.235,7 contra 70.238 em julho de 2026 (tolerância de 5,5 MW médios: 0,5 do arredondamento do PDF e até 5 da diferença entre os conjuntos por classe e por ambiente).",
    "Exportação = nota de rodapé do InfoMercado (970,85, 3,65 e 929,07 MW médios; tolerância de 0,005 MW médio) e variação do ACL sem exportação em 12 meses = 3,1% publicado no InfoMercado de julho de 2026 (3,13% calculado; tolerância de 0,05 p.p.)."
   ],
   "limitacoes": [
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos.",
    "A CCEE pode recontabilizar meses já publicados; cada captura fica no silver e a revisão entre capturas é registrada e publicada na evidência.",
    "O 'Consumo/Geração' do sumário executivo do InfoMercado é o lado da geração e não é comparado ao consumo."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_participacao_livre_epe",
   "titulo": "Participação do mercado livre no consumo na rede (EPE)",
   "pergunta": "Que parte do consumo de energia elétrica na rede foi comprada no mercado livre?",
   "definicao": "Consumo dos consumidores livres (TipoConsumidor = Livre) dividido pelo consumo total (cativo + livre) da tabela 'CONSUMO E NUMCONS SAM' dos dados abertos da EPE, no mês, no ano civil ou na janela de 12 meses.",
   "unidade": "%",
   "grao_geografico": "Brasil; região, subsistema e UF (aberturas da fonte)",
   "grao_temporal": "mês; ano civil; 12 meses",
   "fontes": [
    "epe_consumo_mensal",
    "epe_consumo_classe"
   ],
   "numerador": "Σ consumo livre do período (MWh)",
   "denominador": "Σ consumo cativo + livre do período (MWh)",
   "formula": "livre_pct = 100 × Σ livre ÷ Σ (cativo + livre)",
   "regra_agregacao": "Razão das somas em MWh do período; nunca média de percentuais mensais ou regionais.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "ano",
    "região",
    "subsistema",
    "classe",
    "UF"
   ],
   "regras_comparabilidade": [
    "Ano incompleto (menos de 12 meses com cativo e livre) não compete com ano completo.",
    "O ano corrente é preliminar pela EPE (asterisco na planilha formatada) e pode ser revisado.",
    "Consumo não é carga: a carga do ONS inclui perdas na rede e consumo não apurado; o Boletim do MME publica a diferença como 'Perdas e Diferenças'. ACL + ACR fecha com o universo da própria fonte, não com a carga."
   ],
   "regra_cobertura": "Janeiro de 2004 até o último mês publicado pela EPE (UF até o penúltimo).",
   "politica_ausencia": "Mês sem cativo ou sem livre fica sem participação; linha sem consumo não entra na soma (não vira zero).",
   "validacoes": [
    "Soma das linhas da tabela longa = total nacional da planilha formatada da EPE, mês a mês, para total, cativo, livre e consumidores (tolerância: maior entre 1 MWh e 10⁻⁶ do total do mês; 1 unidade consumidora).",
    "Soma de 12 meses do ACL conferida com o Boletim Mensal do MME (GWh inteiros; diferença acima de 1 GWh vira ressalva, pois o boletim usa a consolidação da EPE da data da edição)."
   ],
   "limitacoes": [
    "Livre inclui consumidores livres, especiais e autoprodutores que compram no ACL; a fonte não separa as categorias.",
    "Não inclui autoprodução sem uso da rede nem perdas."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_perfis_cadastro",
   "titulo": "Perfis de agente cadastrados na CCEE",
   "pergunta": "Quantos perfis existem, de quantos agentes, e quantos perfis cada agente tem?",
   "definicao": "Posição do cadastro LISTA_PERFIL_V1: perfis (COD_PERF_AGENTE) e agentes (COD_AGENTE) distintos por classe do perfil e status; distribuição do número de perfis ativos por agente.",
   "unidade": "perfis; agentes",
   "grao_geografico": "SIN",
   "grao_temporal": "posição (o arquivo não traz data; exibe-se a data de modificação do recurso informada pelo portal, nunca a de captura)",
   "fontes": [
    "ccee_lista_perfil_v1"
   ],
   "formula": "contagem de códigos distintos por classe e status",
   "regra_agregacao": "Contagens de códigos distintos; agentes por classe não se somam (um agente pode ter perfis em mais de uma classe).",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "classe do perfil",
    "status"
   ],
   "regras_comparabilidade": [
    "Perfil não é empresa: um agente pode ter vários perfis (por exemplo, por fonte incentivada)."
   ],
   "regra_cobertura": "Uma posição do cadastro (a mais recente publicada).",
   "politica_ausencia": "Linha sem código de agente ou de perfil é contada à parte.",
   "validacoes": [
    "Classes dentro do domínio (com as não documentadas declaradas); outra classe recusa o arquivo."
   ],
   "limitacoes": [
    "Sem histórico mensal: o cadastro é uma posição, então o fluxo de perfis não é publicado."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_resposta_demanda",
   "titulo": "Encargo de resposta da demanda",
   "pergunta": "Quanto foi pago por redução voluntária de consumo, repassado como encargo?",
   "definicao": "Coluna RECEBIMENTO_ENCARGO_RD do conjunto RD_ENCARGOS_CONTAB_MENSAL, somada nos submercados com valor no mês.",
   "unidade": "R$ nominais",
   "grao_geografico": "SIN; submercado",
   "grao_temporal": "mês de competência",
   "fontes": [
    "ccee_rd_encargos_contab_mensal",
    "mme_boletim_monitoramento",
    "ccee_infomercado"
   ],
   "formula": "RD_m = Σ RECEBIMENTO_ENCARGO_RD dos submercados com valor",
   "regra_agregacao": "Soma dos submercados com valor publicado.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "submercado"
   ],
   "regras_comparabilidade": [
    "Não faz parte do conjunto ENCARGO_ESS_ANCILAR."
   ],
   "regra_cobertura": "Janeiro de 2024 até o último mês publicado; outubro de 2024 não está no arquivo.",
   "politica_ausencia": "Célula vazia é ausência; mês com os quatro submercados vazios fica sem valor (não vira zero).",
   "validacoes": [
    "Agosto de 2024 = InfoMercado (R$ 3,87 milhões); fevereiro a maio de 2026 = boletim do MME.",
    "Janeiro de 2026 diverge do boletim do MME (5.859 mil R$ no boletim; 0 no conjunto): divergência entre fontes publicada."
   ],
   "limitacoes": [
    "A fonte não explica a diferença de janeiro de 2026 nem a ausência de outubro de 2024."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_resultado_mcp_submercado",
   "titulo": "Balanço energético e resultado do MCP por submercado",
   "pergunta": "Quanto foi liquidado no mercado de curto prazo em cada submercado?",
   "definicao": "Conjunto SUMARIO_MENSAL_COMPRA_VENDA_SUBMERCADO: balanço energético positivo e negativo (MWh) e resultado de venda e compra no MCP (R$), por submercado e mês.",
   "unidade": "MWh; R$ nominais",
   "grao_geografico": "submercado",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_sumario_mensal_compra_venda_submercado"
   ],
   "formula": "valores como publicados",
   "regra_agregacao": "Sem agregação além do arredondamento.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "mês",
    "submercado"
   ],
   "regras_comparabilidade": [
    "O PLD é o preço do mercado de curto prazo, não o preço dos contratos do mercado livre; o módulo não publica preço de contrato, de PPA nem curva a termo."
   ],
   "regra_cobertura": "Maio de 2023 até o último mês contabilizado.",
   "politica_ausencia": "Célula vazia é ausência.",
   "validacoes": [
    "Cabeçalho conferido com o package_show versionado (falha fechada)."
   ],
   "limitacoes": [
    "Os conjuntos abertos da CCEE começam em 2023 (entre maio e dezembro, conforme o conjunto); não há série anterior neste formato no portal de dados abertos."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_risco_hidrologico_acr",
   "titulo": "Custo do risco hidrológico alocado às distribuidoras",
   "pergunta": "Quanto do risco hidrológico recaiu sobre o mercado regulado?",
   "definicao": "Conta Bandeira (ANEEL), custos apurados pela CCEE por distribuidora e competência: risco hidrológico de Itaipu + das usinas repactuadas + das cotas de garantia física (CCGF); a previsão de risco na tarifa e o prêmio de risco são publicados à parte.",
   "unidade": "R$ nominais",
   "grao_geografico": "distribuidora (CNPJ); Brasil",
   "grao_temporal": "mês de competência; ano; 12 meses",
   "fontes": [
    "aneel_conta_bandeira"
   ],
   "formula": "rh_bruto = VlrRiscoHidrologicoItaipu + VlrRiscoHidrologicoRepactuadas + VlrRiscoHidrologicoCCGF",
   "regra_agregacao": "Soma de valores nominais das competências e das distribuidoras (inclusive linhas sem CNPJ).",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "ano",
    "distribuidora"
   ],
   "regras_comparabilidade": [
    "Valores nominais: comparação entre anos distantes sem correção monetária é indicativa."
   ],
   "regra_cobertura": "Janeiro de 2015 até a última competência publicada.",
   "politica_ausencia": "Campo vazio não entra na soma; mês sem algum dos três componentes fica sem total.",
   "validacoes": [
    "Identidade do dicionário em cada linha: CCGF e repactuadas líquido = repactuadas + CCGF + previsão + prêmio (0 linhas fora da tolerância de R$ 1)."
   ],
   "limitacoes": [
    "É o risco que cabe ao consumidor cativo, não o resultado das usinas.",
    "A ANEEL não informa a data de cada atualização da base."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "gold": "mercado.json",
   "paginas": [
    "/setor-eletrico/mercado"
   ],
   "versao_formula": "1",
   "id": "mercado_ucs_livres_epe",
   "titulo": "Unidades consumidoras no mercado livre (EPE)",
   "pergunta": "Quantos pontos de consumo compram energia no mercado livre?",
   "definicao": "Coluna Consumidores (número de unidades consumidoras) das linhas com TipoConsumidor = Livre, somada no mês; variação líquida = estoque do mês menos o do mês anterior (ou de 12 meses antes).",
   "unidade": "unidades consumidoras",
   "grao_geografico": "Brasil; classe",
   "grao_temporal": "mês",
   "fontes": [
    "epe_consumo_mensal",
    "epe_consumo_classe"
   ],
   "formula": "Σ Consumidores (Livre) no mês; variação = estoque_m − estoque_{m−k}",
   "regra_agregacao": "Soma de estoques do mesmo mês; variação entre estoques de meses diferentes.",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês",
    "classe"
   ],
   "regras_comparabilidade": [
    "Unidade consumidora não é agente nem perfil: uma empresa pode ter várias unidades.",
    "Variação líquida não separa quem entrou de quem saiu."
   ],
   "regra_cobertura": "Janeiro de 2004 até o último mês publicado.",
   "politica_ausencia": "Mês sem número de consumidores fica sem estoque e sem variação.",
   "validacoes": [
    "Soma = número de consumidores livres da planilha formatada da EPE (tolerância de 1 unidade).",
    "Comparação com as unidades livres faturadas no SAMP no último mês publicado por quase todas as distribuidoras (tolerância de 3%: universos diferentes)."
   ],
   "limitacoes": [
    "Definição de unidade consumidora da Resolução ANEEL 83/2004, citada pelo dicionário da EPE."
   ],
   "arquivo": "pipeline/energia/metricas/mercado.py"
  },
  {
   "id": "mmgd_crescimento_estoque_ano",
   "titulo": "Crescimento da potência de MMGD no último ano completo",
   "pergunta": "Onde a geração distribuída cresceu mais no último ano completo?",
   "definicao": "Potência conectada no ano de referência (último ano completo antes da data do cadastro) dividida pela potência conectada até 31/12 do ano anterior, no cadastro vigente.",
   "unidade": "%",
   "grao_geografico": "município, UF",
   "grao_temporal": "ano",
   "fontes": [
    "aneel_mmgd_empreendimentos"
   ],
   "formula": "100 × kW conectados no ano ÷ kW conectados até o fim do ano anterior",
   "numerador": "kW com data de conexão no ano de referência",
   "denominador": "kW com data de conexão até 31/12 do ano anterior",
   "regra_agregacao": "Razão de somas por território.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "município",
    "UF"
   ],
   "regras_comparabilidade": [
    "Estoque anterior zero: crescimento ausente (não infinito).",
    "Ranking municipal só com população ≥ 100 mil."
   ],
   "regra_cobertura": "Territórios com estoque anterior positivo.",
   "politica_ausencia": "Estoque anterior zero ou sem data: ausente.",
   "validacoes": [
    "Identidade de estoque: estoque acumulado por ano de conexão + unidades sem data = total do cadastro (o estoque por ano não alcança o total sem os registros de data sentinela)."
   ],
   "limitacoes": [
    "Conexões do ano de referência ainda não cadastradas o subestimariam até a captura seguinte.",
    "Capacidade instalada cadastrada, não energia gerada."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "mmgd_potencia_instalada",
   "titulo": "Potência instalada de MMGD",
   "pergunta": "Quanta capacidade de micro e minigeração distribuída existe em cada lugar?",
   "definicao": "Soma da potência instalada (MdaPotenciaInstaladaKW: soma das potências elétricas ativas nominais das unidades geradoras) dos empreendimentos do cadastro vigente. Capacidade instalada cadastrada, não energia gerada.",
   "unidade": "kW (MW nas tabelas, kW ÷ 1000)",
   "grao_geografico": "município (código IBGE), UF, distribuidora (CNPJ), Brasil",
   "grao_temporal": "ano e mês de conexão; estoque na data do cadastro",
   "fontes": [
    "aneel_mmgd_empreendimentos"
   ],
   "regra_agregacao": "Soma dos kW; estoque acumulado por data de conexão.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "município",
    "UF",
    "distribuidora",
    "fonte",
    "classe",
    "modalidade",
    "porte",
    "ano e mês de conexão"
   ],
   "regras_comparabilidade": [
    "Capacidade (MW) não se compara nem se soma com energia (MWh, MWmed).",
    "Ano parcial (o da data do cadastro) não entra em comparação de crescimento; usa-se o último ano completo."
   ],
   "regra_cobertura": "Igual à de unidades.",
   "politica_ausencia": "Combinação sem registro no cadastro = zero empreendimentos (o arquivo é o cadastro completo), dentro da cobertura declarada pela ANEEL (a partir de dez/2008); antes dela, período sem registro = nulo rotulado (cobertura_declarada fora ou parcial), e registro existente é publicado com o rótulo. Potência ausente em um registro não vira zero: a unidade conta, a potência fica fora da soma, cada agregado traz unidades_sem_potencia (soma parcial) e agregado sem nenhuma potência informada publica potência nula. Data sentinela (ano < 2000) = sem ano de conexão, no estoque e fora das séries por ano.",
   "validacoes": [
    "Código de empreendimento único no arquivo (repetição derruba a publicação).",
    "Identidade de agregação: soma por município = soma por UF e mês = soma por distribuidora = soma por distribuidora e município = linhas do arquivo.",
    "Identidade de estoque: estoque acumulado por data de conexão (séries anual e mensal) + unidades com data sentinela = total do cadastro, em unidades (exato) e kW (0,01 kW); diferença derruba a publicação.",
    "Área da distribuidora: unidades em UF onde o CNPJ da distribuidora não tem conjunto elétrico (base de continuidade da ANEEL) são contadas por município e sinalizadas, sem correção, e separadas pelo CEP publicado em provável município errado (CEP na área da distribuidora), provável distribuidora errada (CEP, código do empreendimento e UF publicada na UF do município) e indeterminadas; as classes somam o total sinalizado (diferença derruba a publicação).",
    "Unidades sem potência nos agregados = registros com potência ausente ou negativa no arquivo (diferença derruba a publicação).",
    "Potência não negativa; datas não posteriores à data de geração do conjunto.",
    "Data de conexão conferida com DatConexao do recurso técnico fotovoltaico, pelo código.",
    "Parquet e CSV oficiais do mesmo conjunto conferidos entre si por UF e ano (30/09/2026)."
   ],
   "limitacoes": [
    "O cadastro é o vigente na data do arquivo; unidades desativadas não aparecem no histórico.",
    "Meses recentes provisórios: conexões desses meses ainda podem entrar em capturas seguintes; a queda nos meses finais do arquivo não tem causa atribuída.",
    "Duplicidade candidata medida e não removida (CPF e CEP de pessoa física vêm tarjados).",
    "Há unidades cadastradas em UF onde a distribuidora informada não tem conjunto elétrico: algum campo está errado na origem. Pelo CEP, parte provavelmente tem o município errado (infla o município publicado) e parte provavelmente tem o CNPJ errado (fica no município publicado e infla o total da distribuidora informada); ficam sinalizadas, sem correção.",
    "Minigeração em autoconsumo remoto e em geração compartilhada fica no município da usina, não no de quem usa o crédito: no autoconsumo remoto a energia compensa outras unidades do mesmo titular, e na geração compartilhada o consumo dos participantes de consórcio, cooperativa, condomínio ou associação (definições da ANEEL), possivelmente em outro município."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "mmgd_potencia_por_habitante",
   "titulo": "Potência de MMGD por habitante",
   "pergunta": "Onde há mais capacidade de geração distribuída em relação à população?",
   "definicao": "Potência instalada cadastrada no território dividida pela população residente estimada pelo IBGE. Relaciona território, não renda nem perfil de beneficiário.",
   "unidade": "W por habitante",
   "grao_geografico": "município, UF, Brasil",
   "grao_temporal": "estoque na data do cadastro; população do último ano estimado",
   "fontes": [
    "aneel_mmgd_empreendimentos",
    "ibge_populacao_6579"
   ],
   "formula": "Σ kW instalados × 1000 ÷ população estimada",
   "numerador": "potência instalada cadastrada no território (W)",
   "denominador": "população residente estimada (IBGE, SIDRA 6579)",
   "regra_agregacao": "Razão de somas: Σ W ÷ Σ habitantes do território; nunca média de razões municipais.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "município",
    "UF"
   ],
   "regras_comparabilidade": [
    "Rankings só entre municípios com pelo menos 100 mil habitantes estimados (denominador pequeno é instável).",
    "Não indica renda nem quem se beneficia da geração."
   ],
   "regra_cobertura": "Municípios com população estimada publicada; sem população = razão ausente.",
   "politica_ausencia": "Município sem população publicada: razão ausente (não zero). Município sem MMGD: zero real.",
   "validacoes": [
    "Soma municipal da população igual à da UF publicada pelo IBGE (conferida no teste com amostra real).",
    "Município com unidades de distribuidora sem conjunto elétrico na UF fica sinalizado, com a contagem e os kW dessas unidades e de cada classe pelo CEP.",
    "Município com unidade sem potência informada fica fora dos rankings e dos quantis (soma parcial)."
   ],
   "limitacoes": [
    "População é estimativa do IBGE para 1º de julho do ano, não contagem censitária.",
    "Capacidade instalada cadastrada, não energia gerada.",
    "Em município com unidades da classe de provável município errado (CEP publicado numa UF da área da distribuidora), a razão inclui unidades que provavelmente ficam em outro município e pode estar inflada (ex.: São Caetano de Odivelas, PA, com 185 de 249 unidades da Neoenergia PE); para refazê-la, desconte só essa classe (colunas do CSV municipal). A classe de provável distribuidora errada (CEP, código e UF publicada na UF do município) fica no município publicado e não infla a razão municipal."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "mmgd_unidades",
   "titulo": "Unidades de micro e minigeração distribuída",
   "pergunta": "Quantos empreendimentos de MMGD estão conectados e cadastrados?",
   "definicao": "Número de empreendimentos (códigos distintos) na Relação de empreendimentos de MMGD da ANEEL, no cadastro vigente, por território, distribuidora, fonte, classe, modalidade ou ano de conexão.",
   "unidade": "empreendimentos",
   "grao_geografico": "município (código IBGE), UF, distribuidora (CNPJ), Brasil",
   "grao_temporal": "ano e mês de conexão; estoque na data do cadastro",
   "fontes": [
    "aneel_mmgd_empreendimentos"
   ],
   "regra_agregacao": "Contagem simples de registros; soma entre territórios e anos (cada empreendimento conta uma vez).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "município",
    "UF",
    "distribuidora",
    "fonte",
    "classe de consumo",
    "modalidade",
    "porte",
    "tipo de consumidor",
    "ano de conexão"
   ],
   "regras_comparabilidade": [
    "Unidade de MMGD não é domicílio nem consumidor: uma unidade pode repartir créditos com várias outras.",
    "Ano parcial (o da data do cadastro) não entra em comparação de crescimento; usa-se o último ano completo."
   ],
   "regra_cobertura": "Todas as distribuidoras que enviaram dados ao sistema de MMGD da ANEEL; cobertura declarada a partir de dez/2008 (registro anterior publicado com rótulo; período anterior sem registro nulo, não zero).",
   "politica_ausencia": "Combinação sem registro no cadastro = zero empreendimentos (o arquivo é o cadastro completo), dentro da cobertura declarada pela ANEEL (a partir de dez/2008); antes dela, período sem registro = nulo rotulado (cobertura_declarada fora ou parcial), e registro existente é publicado com o rótulo. Potência ausente em um registro não vira zero: a unidade conta, a potência fica fora da soma, cada agregado traz unidades_sem_potencia (soma parcial) e agregado sem nenhuma potência informada publica potência nula. Data sentinela (ano < 2000) = sem ano de conexão, no estoque e fora das séries por ano.",
   "validacoes": [
    "Código de empreendimento único no arquivo (repetição derruba a publicação).",
    "Identidade de agregação: soma por município = soma por UF e mês = soma por distribuidora = soma por distribuidora e município = linhas do arquivo.",
    "Identidade de estoque: estoque acumulado por data de conexão (séries anual e mensal) + unidades com data sentinela = total do cadastro, em unidades (exato) e kW (0,01 kW); diferença derruba a publicação.",
    "Área da distribuidora: unidades em UF onde o CNPJ da distribuidora não tem conjunto elétrico (base de continuidade da ANEEL) são contadas por município e sinalizadas, sem correção, e separadas pelo CEP publicado em provável município errado (CEP na área da distribuidora), provável distribuidora errada (CEP, código do empreendimento e UF publicada na UF do município) e indeterminadas; as classes somam o total sinalizado (diferença derruba a publicação).",
    "Unidades sem potência nos agregados = registros com potência ausente ou negativa no arquivo (diferença derruba a publicação).",
    "Potência não negativa; datas não posteriores à data de geração do conjunto.",
    "Data de conexão conferida com DatConexao do recurso técnico fotovoltaico, pelo código.",
    "Parquet e CSV oficiais do mesmo conjunto conferidos entre si por UF e ano (30/09/2026)."
   ],
   "limitacoes": [
    "O cadastro é o vigente na data do arquivo; unidades desativadas não aparecem no histórico.",
    "Meses recentes provisórios: conexões desses meses ainda podem entrar em capturas seguintes; a queda nos meses finais do arquivo não tem causa atribuída.",
    "Duplicidade candidata medida e não removida (CPF e CEP de pessoa física vêm tarjados).",
    "Há unidades cadastradas em UF onde a distribuidora informada não tem conjunto elétrico: algum campo está errado na origem. Pelo CEP, parte provavelmente tem o município errado (infla o município publicado) e parte provavelmente tem o CNPJ errado (fica no município publicado e infla o total da distribuidora informada); ficam sinalizadas, sem correção."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "mmgd_unidades_por_mil_habitantes",
   "titulo": "Unidades de MMGD por mil habitantes",
   "pergunta": "Quão difundida está a geração distribuída em cada território?",
   "definicao": "Empreendimentos de MMGD no território por mil habitantes estimados pelo IBGE.",
   "unidade": "unidades por mil habitantes",
   "grao_geografico": "município, UF",
   "grao_temporal": "estoque na data do cadastro",
   "fontes": [
    "aneel_mmgd_empreendimentos",
    "ibge_populacao_6579"
   ],
   "formula": "Σ unidades × 1000 ÷ população estimada",
   "numerador": "unidades de MMGD no território",
   "denominador": "população residente estimada",
   "regra_agregacao": "Razão de somas.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "município",
    "UF"
   ],
   "regras_comparabilidade": [
    "Unidade não é domicílio: não é taxa de adoção por família."
   ],
   "regra_cobertura": "Municípios com população estimada publicada.",
   "politica_ausencia": "Sem população: razão ausente.",
   "validacoes": [
    "Mesmas da potência por habitante."
   ],
   "limitacoes": [
    "Não mede quantas famílias se beneficiam: créditos podem ir para várias unidades."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "ons_mmgd_estimada_mwmed",
   "titulo": "MMGD estimada pelo ONS",
   "pergunta": "Quanta energia a micro e minigeração distribuída entregou, segundo a estimativa do ONS?",
   "definicao": "Parcela da carga atendida por MMGD (val_cargammgd) na Carga de Energia Verificada do ONS, em MWmed do período: energia estimada dividida pelas horas cobertas.",
   "unidade": "MWmed",
   "grao_geografico": "submercado (SE/CO, S, NE, N) e SIN",
   "grao_temporal": "dia e mês (fonte semi-horária)",
   "fontes": [
    "ons_carga_verificada_mmgd"
   ],
   "formula": "Σ(val_cargammgd × 0,5 h) ÷ Σ horas cobertas; SIN = soma dos quatro submercados nos dias completos",
   "numerador": "energia de MMGD estimada (MWh)",
   "denominador": "horas cobertas",
   "regra_agregacao": "Razão de somas de energia por horas; nunca média de médias diárias.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "dia",
    "mês",
    "ano"
   ],
   "regras_comparabilidade": [
    "Energia estimada (MWmed) não se soma com capacidade cadastrada (MW).",
    "Só SIN: não inclui sistemas isolados."
   ],
   "regra_cobertura": "Desde 15/02/2019, primeiro dia com valor na API (antes, o campo vem vazio); dias sem valor depois disso são ausência.",
   "politica_ausencia": "Meia hora sem valor fora da soma e das horas; dia sem as 24 horas não entra no SIN.",
   "validacoes": [
    "Identidade do ONS: carga global = carga sem MMGD + MMGD, dia a dia (0,1 MWh).",
    "Valores não negativos (o dicionário não admite negativo)."
   ],
   "limitacoes": [
    "Estimativa do ONS, não medição: o ONS a chama de valor estimado e a separa, no dicionário da carga verificada, da parcela supervisionada; os documentos consultados não descrevem o método.",
    "O ONS revisa o histórico; meses antigos são recoletados a cada 30 dias."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "ons_mmgd_participacao_carga",
   "titulo": "Participação da MMGD estimada na carga global",
   "pergunta": "Que parte da carga do SIN foi atendida por MMGD, segundo o ONS?",
   "definicao": "Energia de MMGD estimada dividida pela energia da carga global, no mesmo período e perímetro.",
   "unidade": "%",
   "grao_geografico": "submercado e SIN",
   "grao_temporal": "mês e ano",
   "fontes": [
    "ons_carga_verificada_mmgd"
   ],
   "formula": "100 × Σ MWh de MMGD ÷ Σ MWh da carga global",
   "numerador": "energia de MMGD estimada (MWh)",
   "denominador": "energia da carga global (MWh), mesmos intervalos",
   "regra_agregacao": "Razão de somas; nunca média de percentuais.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês",
    "ano"
   ],
   "regras_comparabilidade": [
    "Numerador e denominador do mesmo conjunto e intervalos."
   ],
   "regra_cobertura": "Dias completos.",
   "politica_ausencia": "Mês sem dia completo: ausente.",
   "validacoes": [
    "Participação entre 0 e 100%, executada a cada publicação: mês (submercado ou SIN) ou ano fora do intervalo derruba a publicação (stub); dia com MMGD negativa ou maior que a carga global vira ressalva na proveniência."
   ],
   "limitacoes": [
    "Herda a natureza estimada da parcela de MMGD."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "id": "perdas_area_municipios",
   "titulo": "Área de atuação por municípios (vínculos oficiais)",
   "pergunta": "Em quais municípios cada distribuidora atua, segundo a ANEEL?",
   "definicao": "Municípios ligados à distribuidora por algum conjunto elétrico de continuidade do ano (limites de continuidade) presente na relação IndQual Município. Vínculo confirmado quando o cadastro de micro e minigeração distribuída tem ao menos um empreendimento da distribuidora no município.",
   "unidade": "municípios",
   "grao_geografico": "município (código IBGE) × distribuidora (CNPJ)",
   "grao_temporal": "relação vigente do ano",
   "fontes": [
    "aneel_continuidade_limites",
    "aneel_indqual_municipio",
    "aneel_mmgd_municipio"
   ],
   "formula": "vínculo(d, m) ⇔ ∃ conjunto c: CNPJ(c, ano) = d e m ∈ municípios(c)",
   "regra_agregacao": "Contagem de municípios; compartilhado quando mais de uma distribuidora tem vínculo confirmado.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "município",
    "UF"
   ],
   "regras_comparabilidade": [
    "Nunca ratear volume ou taxa da distribuidora entre municípios."
   ],
   "regra_cobertura": "Conjuntos com limite de continuidade no ano da relação.",
   "politica_ausencia": "Conjunto sem município na relação IndQual fica listado; município sem distribuidora não recebe cor.",
   "validacoes": [
    "Código de município conferido na lista oficial do IBGE.",
    "Vínculo sem MMGD marcado como não confirmado, não removido."
   ],
   "limitacoes": [
    "Município inteiro mesmo quando atendido só em parte; não é polígono de concessão."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_associacao_renda",
   "titulo": "Associação entre renda da área e perdas (Spearman)",
   "pergunta": "Distribuidoras cujas áreas têm renda média menor tendem a ter perdas maiores?",
   "definicao": "Correlação de postos de Spearman entre a renda média domiciliar per capita dos municípios da área no ano das perdas (Censo 2022; relação conjunto × distribuidora dos limites de continuidade de 2022) e a taxa de perdas (não técnicas sobre BT e totais sobre a injetada) das concessionárias no ano do Censo, com o número de pares; postos sobre os valores sem arredondamento.",
   "unidade": "coeficiente entre −1 e 1",
   "grao_geografico": "concessionária",
   "grao_temporal": "2022 (ano do Censo)",
   "fontes": [
    "aneel_samp_balanco",
    "ibge_censo2022_municipio",
    "aneel_indqual_municipio",
    "aneel_continuidade_limites",
    "aneel_mmgd_municipio"
   ],
   "formula": "ρ = correlação de Pearson entre os postos (empates com posto médio); ausente com menos de 5 pares",
   "regra_agregacao": "Um par por concessionária com ano completo, sem alerta e com território identificado.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "concessionária"
   ],
   "regras_comparabilidade": [
    "Associação descritiva entre áreas; não é causa nem descreve cada família."
   ],
   "regra_cobertura": "Concessionárias com perdas de 2022 completas, sem alerta e com território na relação de 2022; vínculos confirmados pelo cadastro de MMGD ou, para a distribuidora incorporada depois (ausente do cadastro atual: EBO e ENF), os da UF principal.",
   "politica_ausencia": "Concessionária sem a taxa ou sem renda fica fora do par; n publicado ao lado.",
   "validacoes": [
    "Spearman conferido em teste com empates (valores conhecidos)."
   ],
   "limitacoes": [
    "Municípios compartilhados entram inteiros; renda municipal média esconde a desigualdade interna.",
    "Não atribui perdas não técnicas às famílias de uma área."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_contexto_renda",
   "titulo": "Renda domiciliar per capita média na área (Censo 2022)",
   "pergunta": "Qual é a renda média dos moradores dos municípios onde a distribuidora atua?",
   "definicao": "Média do rendimento nominal mensal domiciliar per capita dos moradores em domicílios particulares permanentes ocupados (Censo 2022, tabela 10295), ponderada pelo número de moradores de cada município confirmado da área; versão só com municípios exclusivos ao lado.",
   "unidade": "R$ de 2022 por mês",
   "grao_geografico": "conjunto dos municípios da distribuidora",
   "grao_temporal": "2022 (censitário)",
   "fontes": [
    "ibge_censo2022_municipio"
   ],
   "numerador": "Σ renda média per capita × moradores",
   "denominador": "Σ moradores",
   "formula": "Σ(r_m × n_m) ÷ Σ n_m",
   "regra_agregacao": "Ponderada por moradores; nunca média simples de médias municipais.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora"
   ],
   "regras_comparabilidade": [
    "Contexto territorial, não explicação de perdas; associação descritiva (Spearman) com n e sem causalidade."
   ],
   "regra_cobertura": "Municípios confirmados com dado do Censo.",
   "politica_ausencia": "Município sem valor do IBGE fica fora do numerador e do denominador; a contagem aparece.",
   "validacoes": [
    "Soma de moradores e média ponderada conferidas com valores do IBGE em teste."
   ],
   "limitacoes": [
    "Municípios compartilhados entram inteiros; a cobertura exclusiva mostra o peso deles.",
    "Perda não técnica não é atribuída às famílias da área."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_custo_tarifa_b1",
   "titulo": "Custo unitário das perdas na tarifa residencial",
   "pergunta": "Quanto da tarifa residencial remunera perdas de energia, segundo o processo tarifário?",
   "definicao": "Soma das componentes TUSD_PT (perdas técnicas), TUSD_PNT (não técnicas), TUSD_Per_RB_D e TE_Per_RB (perdas na Rede Básica) da tarifa B1 residencial convencional, base econômica, publicadas pela ANEEL por resolução homologatória e vigência; participação = essa soma ÷ (TUSD + TE).",
   "unidade": "R$/MWh nominais, sem tributos; % da tarifa",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "processo tarifário (vigência)",
   "fontes": [
    "aneel_componentes_tarifarias_b1"
   ],
   "numerador": "TUSD_PT + TUSD_PNT + TUSD_Per_RB_D + TE_Per_RB (R$/MWh)",
   "denominador": "TUSD + TE (R$/MWh)",
   "formula": "participação = 100 × perdas ÷ (TUSD + TE)",
   "regra_agregacao": "Não se agrega entre distribuidoras (tarifas diferentes, mercados diferentes).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "resolução homologatória",
    "vigência",
    "base tarifária"
   ],
   "regras_comparabilidade": [
    "Valores nominais: comparar anos exige cuidado com inflação e preço da energia.",
    "É nível regulatório reconhecido, não custo das perdas reais."
   ],
   "regra_cobertura": "Processos publicados nos arquivos anuais de componentes tarifárias de 2012 a 2026 (primeiro início de vigência: 03/02/2012).",
   "politica_ausencia": "Processo sem alguma das seis componentes não tem resumo. Sem processo vigente na data da consulta (início ≤ data ≤ fim), o último já iniciado aparece com a situação 'vigencia_encerrada' e a data de fim, nunca como vigente.",
   "validacoes": [
    "TUSD igual à soma das componentes TUSD_* e TE igual à soma das TE_* (tolerância de 0,01 R$/MWh, arredondamento da fonte).",
    "Vigência conferida contra a data da consulta: em 30/09/2026, 23 distribuidoras ativas só têm processo encerrado no arquivo (CEDRI, REH 3.531/2025, até 29/09/2026)."
   ],
   "limitacoes": [
    "Não é o custo total em reais reconhecido no processo (planilhas do processo inacessíveis).",
    "Não se multiplica pela tarifa cheia nem por mercado para inventar um custo total."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_nao_tecnicas_bt",
   "titulo": "Perdas não técnicas sobre o mercado de baixa tensão",
   "pergunta": "Quanto da energia perdida não se explica pela física da rede, em relação ao consumo de baixa tensão?",
   "definicao": "Linha 'Perdas Não-Técnicas' publicada pelo SAMP (valor medido; pela definição da ANEEL, perdas totais menos técnicas, identidade conferida mês a mês) dividida pelo mercado de baixa tensão medido: energia medida entregue em BT a cativos, consumo próprio e livres. É a base que a ANEEL usa para a referência regulatória não técnica (mercado medido desde 2025). Inclui furto, fraude e erros de medição, leitura e faturamento, que a fonte não separa.",
   "unidade": "% do mercado de baixa tensão medido",
   "grao_geografico": "distribuidora (CNPJ); Brasil por universo",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_samp_balanco"
   ],
   "numerador": "Σ perdas não técnicas medidas do ano (MWh)",
   "denominador": "Σ mercado BT medido do ano (MWh)",
   "formula": "100 × Σ pnt_medidas ÷ Σ mercado_BT_medido",
   "regra_agregacao": "100 × Σ numeradores ÷ Σ denominadores do subconjunto com as duas grandezas nos 12 meses e a decomposição fechando, com a cobertura em % do mercado BT de todas as válidas ao lado; variação anual só nas mesmas distribuidoras e tendência na série de universo fixo.",
   "versao_formula": "2",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano",
    "universo"
   ],
   "regras_comparabilidade": [
    "Pode passar de 100% em áreas com perda muito alta (a base é só o mercado BT).",
    "Pode ser negativa quando a estimativa técnica supera a perda total medida (pequenas distribuidoras).",
    "Quebra em 2024: leiaute da REN 1.003/2022; a injetada publicada deixa de fechar o balanço com a perda da própria fonte (o denominador passa a ser a energia implícita no cálculo da fonte; a causa da diferença não é atribuída) e a separação técnica e não técnica passa a ser publicada só para parte das distribuidoras (contagem por ano na série nacional da gold).",
    "Universo variável: o conjunto de distribuidoras somadas muda de um ano para outro (ano incompleto, alerta, início e fim de série, separação não publicada). A variação anual só se lê nas mesmas distribuidoras dos dois anos, sem mudança de escala entre eles (bloco mesmas_ano_anterior), e a tendência recente na série de universo fixo.",
    "Série nacional de 2023 a 2025: 46, 31 e 18 concessionárias; a queda aparente da taxa é composição. Nas mesmas 16 concessionárias: 14,35%, 14,30% e 15,01% (conferência de 30/09/2026)."
   ],
   "regra_cobertura": "Mercado BT por nível de tensão existe a partir de 2010; separação publicada só para parte das distribuidoras a partir de 2024 (contagem por ano na série nacional da gold).",
   "politica_ausencia": "Soma anual só existe quando a linha está publicada nos 12 meses do ano civil; um mês ausente deixa o ano ausente (nunca vira zero nem é completado). Ano corrente é parcial e fica fora de comparações.",
   "validacoes": [
    "Identidade total = técnica + não técnica conferida mês a mês nas linhas medidas: tolerância de 2 kWh por mês (arredondamento de cada linha ao kWh) e, no ano, 0,1% da perda total; 39 agentes-ano completos não fecham (ERO, jul/2014: 327.121.858 − 41.675.325 ≠ 53.290.776 kWh) e ficam fora dos agregados de técnica e não técnica, com o resíduo da decomposição publicado (conferência de 30/09/2026)."
   ],
   "limitacoes": [
    "Não resumir a furto: a definição da fonte inclui erros de medição e faturamento.",
    "Não atribuir às famílias de uma área a responsabilidade pelas perdas não técnicas."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_nao_tecnicas_injetada",
   "titulo": "Perdas não técnicas sobre a energia injetada",
   "pergunta": "Que fração da energia injetada corresponde às perdas não técnicas?",
   "definicao": "Linha 'Perdas Não-Técnicas' (valor medido) dividida pela energia injetada de referência, a mesma base da taxa total e da taxa técnica: taxa técnica + taxa não técnica = taxa total só onde a decomposição fecha (classe fecha ou diferenca_pequena); onde não fecha, o resíduo da decomposição fica publicado.",
   "unidade": "% da energia injetada",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_samp_balanco"
   ],
   "numerador": "Σ perdas não técnicas medidas (MWh)",
   "denominador": "Σ energia injetada de referência (MWh)",
   "formula": "100 × Σ pnt_medidas ÷ Σ injetada_referência",
   "regra_agregacao": "100 × Σ numeradores ÷ Σ denominadores, só com a decomposição fechando.",
   "versao_formula": "2",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano"
   ],
   "regras_comparabilidade": [
    "Só se soma à taxa técnica sobre a injetada de referência (mesmo denominador) e só onde a decomposição fecha; nunca somar com a taxa sobre BT nem com a técnica sobre a injetada publicada."
   ],
   "regra_cobertura": "Como a técnica.",
   "politica_ausencia": "Soma anual só existe quando a linha está publicada nos 12 meses do ano civil; um mês ausente deixa o ano ausente (nunca vira zero nem é completado). Ano corrente é parcial e fica fora de comparações.",
   "validacoes": [
    "Identidade total = técnica + não técnica conferida mês a mês nas linhas medidas: tolerância de 2 kWh por mês (arredondamento de cada linha ao kWh) e, no ano, 0,1% da perda total; 39 agentes-ano completos não fecham (ERO, jul/2014: 327.121.858 − 41.675.325 ≠ 53.290.776 kWh) e ficam fora dos agregados de técnica e não técnica, com o resíduo da decomposição publicado (conferência de 30/09/2026)."
   ],
   "limitacoes": [
    "A parcela técnica publicada no SAMP é o percentual regulatório do processo tarifário aplicado à energia injetada publicada (estimativa), não medição."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_residuo_balanco",
   "titulo": "Resíduo do balanço energético",
   "pergunta": "A perda publicada é explicada pelas linhas de energia publicadas?",
   "definicao": "Energia injetada publicada menos energia fornecida medida, energia cobrada por procedimento irregular e perdas totais. Zero quando a conta fecha; diferente de zero mostra o que a fonte não explica. Não é outra perda e não é atribuído a nenhuma causa.",
   "unidade": "MWh e % da energia injetada publicada",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "mês e ano civil",
   "fontes": [
    "aneel_samp_balanco"
   ],
   "numerador": "injetada publicada − fornecida − irregular − perdas totais (MWh)",
   "denominador": "injetada publicada (MWh)",
   "formula": "resíduo = I − F − R − P; classe: |resíduo| ≤ 1 kWh por linha (fecha), ≤ 0,1% de I (pequeno), acima (relevante)",
   "regra_agregacao": "Soma dos meses do ano.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês",
    "ano"
   ],
   "regras_comparabilidade": [
    "No leiaute de 2024 a injetada publicada deixou de fechar o balanço com a perda calculada pela fonte (resíduo positivo na maior parte das distribuidoras); a fonte não explica a diferença e o resíduo não é atribuído a causa."
   ],
   "regra_cobertura": "Meses com injetada, fornecida medida e perda total publicadas.",
   "politica_ausencia": "Sem as linhas de fornecimento medido o resíduo é ausente e a classe é 'sem_componentes'.",
   "validacoes": [
    "Representação de cada grandeza escolhida pela concordância com a soma dos níveis de tensão do mês.",
    "Resíduo acima de 5% da injetada no leiaute antigo, ou fornecida acima da injetada, tira o agente-ano de agregados e comparações (Manaus Energia 2004: −201%). Sensibilidade: limite de 10% muda a taxa nacional anual das concessionárias em até 0,14 p.p.; limite de 1% muda em até 1,05 p.p."
   ],
   "limitacoes": [
    "Tolerância de 0,1% da injetada para a classe residuo_pequeno: abaixo disso a taxa não muda na primeira casa decimal.",
    "Causas observadas no leiaute antigo, sem generalização: linha de fornecimento repetida (COCEL, 'Uso Distribuidoras' igual ao cativo), linhas de fornecimento ausentes (COELBA 2008 e 2009) e injetada inconsistente com as demais linhas (Manaus Energia 2003 a 2008)."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_taxa_total_acumulada",
   "titulo": "Taxa de perdas totais acumulada no ano aberto",
   "pergunta": "Como estão as perdas no ano corrente, comparadas ao mesmo período do ano anterior?",
   "definicao": "Perdas totais medidas de janeiro até o último mês publicado por ao menos 90% das distribuidoras válidas no ano de referência, divididas pela energia injetada de referência do mesmo recorte; ao lado, o mesmo recorte do ano anterior, sobre as mesmas distribuidoras.",
   "unidade": "% da energia injetada",
   "grao_geografico": "distribuidora (CNPJ); Brasil por universo",
   "grao_temporal": "janeiro a mes_fim do ano aberto",
   "fontes": [
    "aneel_samp_balanco"
   ],
   "numerador": "Σ perdas totais medidas de janeiro a mes_fim (MWh)",
   "denominador": "Σ energia injetada de referência de janeiro a mes_fim (MWh)",
   "formula": "100 × Σ perdas_totais[1..mes_fim] ÷ Σ injetada_referência[1..mes_fim]",
   "regra_agregacao": "Razão de somas sobre as distribuidoras completas e sem alerta nos dois recortes, sem quebra de escala nem absorção entre eles (mesmo conjunto nos dois anos).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "universo"
   ],
   "regras_comparabilidade": [
    "Compara só com o mesmo período do ano anterior; nunca com anos completos.",
    "Sazonalidade e calendário de leitura pesam mais em recortes curtos."
   ],
   "regra_cobertura": "Distribuidoras com todos os meses de janeiro a mes_fim nos dois anos.",
   "politica_ausencia": "Mês ausente no recorte deixa a distribuidora fora (comparavel = 0); nada é completado.",
   "validacoes": [
    "Agente-ano com perda total anual negativa ou maior que a injetada, fornecida maior que a injetada ou balanço que não fecha (resíduo acima de 5% da injetada no leiaute antigo; fornecida + perdas acima da injetada publicada no de 2024) recebe alerta e fica fora de agregados e comparações (o valor da fonte segue no CSV). Manaus Energia 2003 a 2008: fornecida maior que a injetada, taxa de 65% a 111%, fora; taxa nacional das concessionárias em 2004 = 15,09% (55 distribuidoras), conferida por releitura independente do CSV oficial.",
    "Recorte mes_fim único para todas as distribuidoras."
   ],
   "limitacoes": [
    "A separação técnica e não técnica quase não é publicada no ano aberto (2026)."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_taxa_total_injetada",
   "titulo": "Taxa de perdas totais sobre a energia injetada",
   "pergunta": "Que fração da energia injetada na rede se perdeu?",
   "definicao": "Perdas totais medidas divididas pela energia injetada de referência do mesmo ano. Energia injetada de referência: a linha publicada no leiaute antigo do SAMP; no leiaute de 2024, a energia implícita no cálculo da própria fonte (fornecida + irregular + perdas), porque a linha publicada deixou de fechar o balanço com a perda da fonte; em 2024 essa energia (605,2 TWh nas concessionárias) cai no intervalo implícito no relatório da ANEEL, e a publicada (620,7 TWh) não. A causa da diferença não é atribuída.",
   "unidade": "% da energia injetada",
   "grao_geografico": "distribuidora (CNPJ); Brasil por universo",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_samp_balanco"
   ],
   "numerador": "Σ perdas totais medidas do ano (MWh)",
   "denominador": "Σ energia injetada de referência do ano (MWh)",
   "formula": "100 × Σ perdas_totais ÷ Σ injetada_referência",
   "regra_agregacao": "Agregado = 100 × Σ numeradores ÷ Σ denominadores das distribuidoras válidas; nunca média de taxas.",
   "versao_formula": "1",
   "natureza_fonte": "CALCULADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano",
    "universo"
   ],
   "regras_comparabilidade": [
    "Quebra em 2024: leiaute da REN 1.003/2022; a injetada publicada deixa de fechar o balanço com a perda da própria fonte (o denominador passa a ser a energia implícita no cálculo da fonte; a causa da diferença não é atribuída) e a separação técnica e não técnica passa a ser publicada só para parte das distribuidoras (contagem por ano na série nacional da gold).",
    "Não comparar ano parcial com ano completo.",
    "Mudança de universo da própria distribuidora (injetada mais de 30% maior ou menor entre anos completos, ou absorção provável observada no SAMP) marca o par de anos, que não entra em variação anual.",
    "Universo variável: o conjunto de distribuidoras somadas muda de um ano para outro (ano incompleto, alerta, início e fim de série, separação não publicada). A variação anual só se lê nas mesmas distribuidoras dos dois anos, sem mudança de escala entre eles (bloco mesmas_ano_anterior), e a tendência recente na série de universo fixo."
   ],
   "regra_cobertura": "Ano civil com os 12 meses de perdas e de injetada de referência publicados.",
   "politica_ausencia": "Soma anual só existe quando a linha está publicada nos 12 meses do ano civil; um mês ausente deixa o ano ausente (nunca vira zero nem é completado). Ano corrente é parcial e fica fora de comparações.",
   "validacoes": [
    "Identidade do balanço conferida mês a mês: injetada − fornecida − irregular − perdas; o resíduo é publicado e classificado (fecha, residuo_pequeno, residuo_relevante, sem_componentes).",
    "Agente-ano com perda total anual negativa ou maior que a injetada, fornecida maior que a injetada ou balanço que não fecha (resíduo acima de 5% da injetada no leiaute antigo; fornecida + perdas acima da injetada publicada no de 2024) recebe alerta e fica fora de agregados e comparações (o valor da fonte segue no CSV). Manaus Energia 2003 a 2008: fornecida maior que a injetada, taxa de 65% a 111%, fora; taxa nacional das concessionárias em 2004 = 15,09% (55 distribuidoras), conferida por releitura independente do CSV oficial.",
    "Taxa nacional das concessionárias entre 5% e 30% (fora disso a gold não é publicada).",
    "2024: injetada de referência das concessionárias dentro do intervalo implícito nos números do relatório da ANEEL."
   ],
   "limitacoes": [
    "Base medida: difere da taxa sobre o mercado faturado usada pela ANEEL até 2024.",
    "A parcela técnica publicada no SAMP é o percentual regulatório do processo tarifário aplicado à energia injetada publicada (estimativa), não medição."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_tecnica_regulatoria_implicita",
   "titulo": "Percentual regulatório de perdas técnicas (implícito no SAMP)",
   "pergunta": "Qual percentual técnico a regulação reconhece para a distribuidora em cada período tarifário?",
   "definicao": "Razão entre perdas técnicas e energia injetada publicada no SAMP quando ela fica constante por 6 meses seguidos ou mais: inferência do observatório sobre o percentual regulatório aplicado pela fonte, não leitura do ato. Trechos de 2 a 5 meses ficam no CSV com a classe 'curto' (possível coincidência de arredondamento). O mês de troca mistura as duas taxas pró-rata dos dias. A resolução homologatória é associada ao trecho só quando o percentual muda ao menos 0,02 p.p. e o início de vigência dela (componentes tarifárias) cai no mês da troca; o dia reconstituído da média pró-rata fica só no CSV, como diagnóstico.",
   "unidade": "% da energia injetada",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "trecho de vigência (meses)",
   "fontes": [
    "aneel_samp_balanco",
    "aneel_componentes_tarifarias_b1"
   ],
   "numerador": "perdas técnicas do mês (kWh)",
   "denominador": "energia injetada publicada do mês (kWh)",
   "formula": "pct = round(100 × PT ÷ I_publicada, 3); trecho = meses consecutivos com o mesmo pct; referência = trecho de 6 meses ou mais; troca = variação de ao menos 0,02 p.p. contra o trecho anterior",
   "regra_agregacao": "Não se agrega entre distribuidoras.",
   "versao_formula": "2",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "distribuidora",
    "vigência"
   ],
   "regras_comparabilidade": [
    "É parâmetro regulatório, não perda realizada nem meta de perda zero."
   ],
   "regra_cobertura": "Distribuidoras e períodos em que a razão fica constante por 6 meses ou mais: 169 trechos de referência em 49 distribuidoras, de jan/2003 a mar/2026 (conferência de 30/09/2026).",
   "politica_ausencia": "Onde a razão varia mês a mês não há trecho: o percentual regulatório fica ausente (não é estimado).",
   "validacoes": [
    "CEMIG-D: 8,766% de jun/2018 a abr/2023; maio/2018 = 7,959% = média pró-rata com início em 28/05/2018, a vigência da REH 2.396/2018 (o mesmo em maio/2023 com a REH 3.202/2023).",
    "Conferência de 30/09/2026: 331 trechos de 2 meses ou mais, 169 de referência; REH associada a 55 trechos (39 de referência), todos com troca de ao menos 0,02 p.p.; o dia reconstituído coincide com o da REH só nos dois casos da CEMIG-D, por isso não é publicado como vigência."
   ],
   "limitacoes": [
    "A referência regulatória não técnica não está em base aberta acessível."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_tecnicas_energia",
   "titulo": "Perdas técnicas (estimativa regulatória publicada)",
   "pergunta": "Quanto das perdas se atribui às características físicas da rede?",
   "definicao": "Linha 'Perdas Técnicas' do SAMP Balanço, valor medido (a do valor faturado é outra linha e nunca a substitui). A parcela técnica publicada no SAMP é o percentual regulatório do processo tarifário aplicado à energia injetada publicada (estimativa), não medição. Taxa técnica = perdas técnicas ÷ energia injetada de referência (mesma base da taxa total); ao lado, técnica ÷ energia injetada publicada, a base sobre a qual a fonte aplica o percentual e a que se compara com ele (as duas coincidem até 2023; no leiaute de 2024 a publicada é maior: ÂMBAR ENERGIA RR 2024, 7,620% sobre a publicada e 7,555% sobre a de referência).",
   "unidade": "MWh e % da energia injetada",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_samp_balanco"
   ],
   "numerador": "Σ perdas técnicas do ano (MWh)",
   "denominador": "Σ energia injetada de referência do ano (MWh), só das distribuidoras com a técnica publicada nos 12 meses",
   "formula": "taxa_tecnica = 100 × Σ perdas_tecnicas ÷ Σ injetada_referência",
   "regra_agregacao": "Agregado só sobre o subconjunto com a técnica publicada nos 12 meses e decomposição que não a contradiz, com a cobertura (em % da injetada) ao lado; variação anual só nas mesmas distribuidoras.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano"
   ],
   "regras_comparabilidade": [
    "Quebra em 2024: leiaute da REN 1.003/2022; a injetada publicada deixa de fechar o balanço com a perda da própria fonte (o denominador passa a ser a energia implícita no cálculo da fonte; a causa da diferença não é atribuída) e a separação técnica e não técnica passa a ser publicada só para parte das distribuidoras (contagem por ano na série nacional da gold).",
    "Universo variável: o conjunto de distribuidoras somadas muda de um ano para outro (ano incompleto, alerta, início e fim de série, separação não publicada). A variação anual só se lê nas mesmas distribuidoras dos dois anos, sem mudança de escala entre eles (bloco mesmas_ano_anterior), e a tendência recente na série de universo fixo.",
    "A técnica não mede desempenho: segue o percentual regulatório por construção."
   ],
   "regra_cobertura": "Publicada para a maioria das distribuidoras até 2023 (48 de 50 concessionárias válidas); 32 de 51 em 2024 e 18 de 51 em 2025 (32,6% da injetada).",
   "politica_ausencia": "Soma anual só existe quando a linha está publicada nos 12 meses do ano civil; um mês ausente deixa o ano ausente (nunca vira zero nem é completado). Ano corrente é parcial e fica fora de comparações. Distribuidora sem a técnica em algum mês não tem técnica nem não técnica no ano.",
   "validacoes": [
    "Técnica medida e faturada são linhas diferentes: diferem em 2.419 de 18.755 meses com as duas (Sulgipe, mar/2024: 5.269.964 contra 3.779.373 kWh); em 317 meses só há a faturada, e esses meses ficam sem técnica (conferido no arquivo em 30/09/2026).",
    "Identidade total = técnica + não técnica conferida mês a mês nas linhas medidas: tolerância de 2 kWh por mês (arredondamento de cada linha ao kWh) e, no ano, 0,1% da perda total; 39 agentes-ano completos não fecham (ERO, jul/2014: 327.121.858 − 41.675.325 ≠ 53.290.776 kWh) e ficam fora dos agregados de técnica e não técnica, com o resíduo da decomposição publicado (conferência de 30/09/2026)."
   ],
   "limitacoes": [
    "Não se pode concluir que toda perda técnica é evitável nem que é eliminável a custo zero."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "id": "perdas_totais_energia",
   "titulo": "Perdas totais de energia na distribuição",
   "pergunta": "Quanta energia injetada na rede da distribuidora não chegou a ser entregue como consumo medido?",
   "definicao": "Linha 'Perdas Totais' do SAMP Balanço da ANEEL, valor medido: energia injetada menos energia fornecida medida (cativos, consumo próprio, suprimento, livres, uso por outras distribuidoras) e menos a energia cobrada por procedimento irregular. Soma dos 12 meses do ano civil, convertida de kWh para MWh.",
   "unidade": "MWh",
   "grao_geografico": "distribuidora (CNPJ); agregados nacionais por universo (concessionárias, permissionárias, todas)",
   "grao_temporal": "mês (fonte); ano civil (publicação)",
   "fontes": [
    "aneel_samp_balanco"
   ],
   "formula": "perdas_totais(d, ano) = Σ_m perdas_totais_medidas(d, m) ÷ 1.000",
   "regra_agregacao": "Soma simples de volumes do mesmo ano e do mesmo subconjunto de distribuidoras válidas.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano",
    "universo"
   ],
   "regras_comparabilidade": [
    "Volume depende do tamanho do mercado: comparar distribuidoras pela taxa, não pelo volume.",
    "Mudança de universo da própria distribuidora (injetada mais de 30% maior ou menor entre anos completos, ou absorção provável observada no SAMP) marca o par de anos, que não entra em variação anual.",
    "Universo variável: o conjunto de distribuidoras somadas muda de um ano para outro (ano incompleto, alerta, início e fim de série, separação não publicada). A variação anual só se lê nas mesmas distribuidoras dos dois anos, sem mudança de escala entre eles (bloco mesmas_ano_anterior), e a tendência recente na série de universo fixo.",
    "Quebra em 2024: leiaute da REN 1.003/2022; a injetada publicada deixa de fechar o balanço com a perda da própria fonte (o denominador passa a ser a energia implícita no cálculo da fonte; a causa da diferença não é atribuída) e a separação técnica e não técnica passa a ser publicada só para parte das distribuidoras (contagem por ano na série nacional da gold)."
   ],
   "regra_cobertura": "Agentes com balanço de distribuição no SAMP Balanço de jan/2003 até a última competência publicada.",
   "politica_ausencia": "Soma anual só existe quando a linha está publicada nos 12 meses do ano civil; um mês ausente deixa o ano ausente (nunca vira zero nem é completado). Ano corrente é parcial e fica fora de comparações.",
   "validacoes": [
    "Identidade do balanço conferida mês a mês: injetada − fornecida − irregular − perdas; o resíduo é publicado e classificado (fecha, residuo_pequeno, residuo_relevante, sem_componentes).",
    "Agente-ano com perda total anual negativa ou maior que a injetada, fornecida maior que a injetada ou balanço que não fecha (resíduo acima de 5% da injetada no leiaute antigo; fornecida + perdas acima da injetada publicada no de 2024) recebe alerta e fica fora de agregados e comparações (o valor da fonte segue no CSV). Manaus Energia 2003 a 2008: fornecida maior que a injetada, taxa de 65% a 111%, fora; taxa nacional das concessionárias em 2004 = 15,09% (55 distribuidoras), conferida por releitura independente do CSV oficial.",
    "Parquet e CSV oficiais de 15/09/2026 conferidos por código independente: 549.552 linhas nos dois e as 2.146 somas anuais completas de perdas totais idênticas ao kWh."
   ],
   "limitacoes": [
    "Valores mensais oscilam com o calendário de leitura; só o ano civil completo é comparado.",
    "Perda medida difere da faturada (custo de disponibilidade e compensação da MMGD)."
   ],
   "gold": "perdas.json",
   "paginas": [
    "/setor-eletrico/perdas"
   ],
   "arquivo": "pipeline/energia/metricas/perdas.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_amplitude_horaria",
   "titulo": "Amplitude horária entre submercados",
   "pergunta": "Quanto o maior PLD se afastou do menor na mesma hora?",
   "definicao": "Maior PLD menos menor PLD entre os quatro submercados na mesma hora; resumida por período.",
   "unidade": "R$/MWh",
   "grao_geografico": "sistema",
   "grao_temporal": "hora; resumo por ano, 12 meses e 30 dias",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "amplitude_h = max_s PLD_h(s) − min_s PLD_h(s)",
   "regra_agregacao": "média, quantis e máximo das horas",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "período",
    "hora"
   ],
   "regras_comparabilidade": [
    "Sempre na mesma hora e na mesma publicação da CCEE."
   ],
   "regra_cobertura": "Horas com os quatro submercados.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "amplitude ≥ 0",
    "horas acima de R$ 1,00/MWh iguais às de pld.json nas mesmas janelas"
   ],
   "limitacoes": [
    "Estatística descritiva: não identifica causa.",
    "horas_com_separacao usa R$ 0,01/MWh; horas_acima_1 (R$ 1,00/MWh) é o limiar de pld.json. As duas contagens medem coisas diferentes e não devem aparecer lado a lado sem o limiar."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_cmo_dessem_hora",
   "titulo": "CMO do DESSEM na hora",
   "pergunta": "Qual foi o custo marginal de operação calculado pelo ONS em cada hora?",
   "definicao": "Média das duas meias horas do CMO semi-horário do DESSEM publicado pelo ONS que começam em h:00 e h:30.",
   "unidade": "R$/MWh",
   "grao_geografico": "subsistema do ONS",
   "grao_temporal": "hora",
   "fontes": [
    "ons_cmo_semihorario"
   ],
   "formula": "CMO_h = (CMO_{h:00} + CMO_{h:30}) ÷ 2",
   "regra_agregacao": "média por duração (as duas meias horas têm 30 minutos)",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "hora"
   ],
   "regras_comparabilidade": [
    "Comparável com o PLD da mesma hora, mas não equivalente: o PLD é calculado pela CCEE e tem limites."
   ],
   "regra_cobertura": "Só horas com as duas meias horas publicadas.",
   "politica_ausencia": "Hora com meia hora ausente fica sem valor (não é completada).",
   "validacoes": [
    "esquema do CSV (subsistema, grade de 30 minutos, número com ponto decimal)",
    "sem duplicidade de (subsistema, instante)",
    "convenção do instante (início da meia hora) conferida contra o PLD"
   ],
   "limitacoes": [
    "Resultado de modelo do ONS, não medição.",
    "O conjunto não identifica deck, versão ou revisão do modelo."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_cmo_dessem_semana",
   "titulo": "CMO médio do DESSEM na semana operativa",
   "pergunta": "Qual foi o CMO médio do DESSEM na mesma semana do CMO semanal do DECOMP?",
   "definicao": "Média das 336 meias horas do CMO do DESSEM da semana operativa (sábado a sexta).",
   "unidade": "R$/MWh",
   "grao_geografico": "subsistema do ONS",
   "grao_temporal": "semana operativa",
   "fontes": [
    "ons_cmo_semihorario"
   ],
   "formula": "DESSEM_semana = Σ CMO_meia ÷ 336",
   "regra_agregacao": "média por duração",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "semana operativa"
   ],
   "regras_comparabilidade": [
    "Comparado com o CMO semanal do DECOMP e com o PLD da mesma semana, em diferença absoluta; nunca em razão."
   ],
   "regra_cobertura": "Semana com as 336 meias horas.",
   "politica_ausencia": "Semana incompleta fica sem média; a contagem de meias horas é publicada no CSV.",
   "validacoes": [
    "contagem de meias horas por semana",
    "convenção de data do CMO semanal (sexta que encerra a semana) conferida por correlação"
   ],
   "limitacoes": [
    "O CMO semanal do DECOMP é um valor da semana inteira, por patamar e em média semanal; a média do DESSEM não é o mesmo produto."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_dias_teto_estrutural",
   "titulo": "Dias com a média do PLD no teto estrutural",
   "pergunta": "Em quantos dias a média diária do PLD ficou no máximo estrutural?",
   "definicao": "Dias com |média das 24 horas − máximo estrutural vigente| ≤ R$ 0,01/MWh.",
   "unidade": "dias",
   "grao_geografico": "submercado",
   "grao_temporal": "dia; total por ano",
   "fontes": [
    "ccee_pld_horario",
    "regulatorio:limites_pld"
   ],
   "formula": "|Σ PLD_h ÷ 24 − máximo estrutural| ≤ 0,01",
   "regra_agregacao": "contagem de dias completos",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "ano",
    "dia"
   ],
   "regras_comparabilidade": [
    "A média de 24 valores arredondados ao centavo erra no máximo R$ 0,005/MWh."
   ],
   "regra_cobertura": "Dias com as 24 horas.",
   "politica_ausencia": "Dia incompleto não recebe média.",
   "validacoes": [
    "nenhum dia com média acima do teto estrutural"
   ],
   "limitacoes": [
    "A verificação é sobre a média diária publicada; a regra de aplicação está nos atos da ANEEL."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_diferenca_media_par",
   "titulo": "Diferença média entre submercados",
   "pergunta": "Em média, quanto um submercado ficou acima ou abaixo de outro?",
   "definicao": "Média de PLD_A − PLD_B nas mesmas horas; matriz para os últimos 12 meses.",
   "unidade": "R$/MWh",
   "grao_geografico": "par ordenado de submercados",
   "grao_temporal": "período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "média de (PLD_A − PLD_B)",
   "regra_agregacao": "média temporal das diferenças",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "par",
    "período"
   ],
   "regras_comparabilidade": [
    "Matriz antissimétrica: dif(A,B) = −dif(B,A)."
   ],
   "regra_cobertura": "Horas com os quatro submercados.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "antissimetria da matriz"
   ],
   "limitacoes": [
    "Estatística descritiva: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_diferenca_pld_cmo",
   "titulo": "Diferença entre PLD e CMO no mesmo intervalo",
   "pergunta": "Quanto o PLD se afastou do CMO publicado pelo ONS no mesmo intervalo?",
   "definicao": "PLD menos CMO na mesma hora (DESSEM) ou na mesma semana operativa (DECOMP e média do DESSEM), em R$/MWh. Resumida por ano e submercado nas horas com o PLD entre os limites (fora de dias com a média no teto estrutural) e nas horas no piso.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado e subsistema de mesmo nome",
   "grao_temporal": "hora e semana operativa",
   "fontes": [
    "ccee_pld_horario",
    "ons_cmo_semihorario",
    "cmo_se",
    "regulatorio:limites_pld"
   ],
   "formula": "Δ = PLD − CMO do mesmo intervalo; média, média do módulo e mediana do módulo por ano",
   "regra_agregacao": "média simples das diferenças horárias",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "ano",
    "situação do PLD frente aos limites"
   ],
   "regras_comparabilidade": [
    "Só entre o mesmo intervalo de tempo.",
    "Diferença absoluta; nenhuma razão ou multiplicador (achado A01)."
   ],
   "regra_cobertura": "Horas com PLD e CMO do DESSEM na hora.",
   "politica_ausencia": "Hora sem um dos dois fica fora e é contada em horas_sem_cmo.",
   "validacoes": [
    "situação frente aos limites só quando os atos estão disponíveis"
   ],
   "limitacoes": [
    "Um dos termos (o CMO) é estimado por modelo pelo ONS; o PLD é o preço publicado pela CCEE.",
    "CMO e PLD não são automaticamente equivalentes: modelo, configuração e limites diferem.",
    "Estatística descritiva: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_empates_piso",
   "titulo": "Horas com os quatro submercados no piso",
   "pergunta": "Quando o piso vale para todo o sistema ao mesmo tempo?",
   "definicao": "Número de horas do ano em que 0, 1, 2, 3 ou 4 submercados estavam no piso; empate no piso = os quatro no piso.",
   "unidade": "horas",
   "grao_geografico": "sistema (quatro submercados)",
   "grao_temporal": "ano",
   "fontes": [
    "ccee_pld_horario",
    "regulatorio:limites_pld"
   ],
   "formula": "k_h = nº de submercados com |PLD − mínimo| ≤ 0,005 na hora h",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "quantidade de submercados no piso"
   ],
   "regras_comparabilidade": [
    "Horas empatadas no piso têm diferença de preço zero por construção dos limites.",
    "Ano parcial marcado (parcial = true); não compete com ano completo sem aviso."
   ],
   "regra_cobertura": "Horas com os quatro submercados.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "soma das classes igual às horas do ano"
   ],
   "limitacoes": [
    "Depende dos atos integrados pelo módulo Regulação."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_folga_lat1d",
   "titulo": "Folga da hipótese LAT1D para o PLD",
   "pergunta": "A regra de defasagem dos backtests antecipa informação do PLD?",
   "definicao": "Horas entre a primeira captura completa de um dia do PLD e o instante em que LAT1D permite usar aquele dia (D+2 às 00h de Brasília).",
   "unidade": "horas",
   "grao_geografico": "sistema",
   "grao_temporal": "dia",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "folga = (início do dia D + 2 dias) − primeira captura completa",
   "regra_agregacao": "mínimo entre os dias observados",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia"
   ],
   "regras_comparabilidade": [
    "Só dias com captura direta; a captura versionada não informa publicação."
   ],
   "regra_cobertura": "Dias com captura direta.",
   "politica_ausencia": "Sem captura direta, sem folga.",
   "validacoes": [
    "primeira captura calculada da vintage mais antiga que contém a hora"
   ],
   "limitacoes": [
    "Primeira captura não é publicação; a CCEE não informa a data de publicação."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_horas_piso",
   "titulo": "Horas com o PLD no piso",
   "pergunta": "Com que frequência o PLD ficou no limite mínimo?",
   "definicao": "Fração das horas do ano em que o PLD foi igual ao mínimo vigente no dia, ao centavo (|PLD − mínimo| ≤ R$ 0,005/MWh), segundo os atos anuais da ANEEL. Horas exatamente um centavo acima do piso ficam numa classe à parte.",
   "unidade": "fração das horas (a ficha de evidência exibe em % das horas)",
   "grao_geografico": "submercado",
   "grao_temporal": "ano civil (parcial marcado)",
   "fontes": [
    "ccee_pld_horario",
    "regulatorio:limites_pld"
   ],
   "numerador": "horas com |PLD − mínimo vigente| ≤ 0,005",
   "denominador": "horas com limites vigentes conhecidos",
   "formula": "frac_piso = horas_piso ÷ horas_com_limite",
   "regra_agregacao": "contagem de horas",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "ano",
    "dia (calendário)"
   ],
   "regras_comparabilidade": [
    "Cada ano tem o seu piso; frações de anos diferentes comparam regimes diferentes.",
    "Ano parcial marcado."
   ],
   "regra_cobertura": "Horas com PLD e com ato vigente no dia.",
   "politica_ausencia": "Dia sem ato vigente conta como sem limite e sai do denominador.",
   "validacoes": [
    "nenhuma hora abaixo do piso",
    "sensibilidade com R$ 0,01/MWh na hora e classe à parte para o centavo vizinho",
    "menor valor observado conferido com o piso do ato (sem substituí-lo)",
    "limites vigentes de cada dia iguais aos de limites_em do módulo Regulação (mesma regra em outro módulo)",
    "trecho e valor do ato vigente conferidos no PDF do ato",
    "recontagem por releitura do arquivo original da CCEE"
   ],
   "limitacoes": [
    "O menor valor observado nunca substitui o piso regulatório.",
    "Depende dos atos integrados pelo módulo Regulação; três atos (2021 e 2023) têm os valores lidos em voto ou nota técnica do processo, não no texto do ato."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_horas_teto_horario",
   "titulo": "Horas com o PLD no teto horário",
   "pergunta": "Com que frequência o PLD encostou no máximo horário?",
   "definicao": "Fração das horas do ano com o PLD igual ao máximo horário vigente ao centavo (|PLD − máximo horário| ≤ R$ 0,005/MWh).",
   "unidade": "fração das horas",
   "grao_geografico": "submercado",
   "grao_temporal": "ano civil",
   "fontes": [
    "ccee_pld_horario",
    "regulatorio:limites_pld"
   ],
   "numerador": "horas no teto horário",
   "denominador": "horas com limites vigentes conhecidos",
   "formula": "frac_teto = horas_teto ÷ horas_com_limite",
   "regra_agregacao": "contagem de horas",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "ano"
   ],
   "regras_comparabilidade": [
    "Cada ano tem o seu teto."
   ],
   "regra_cobertura": "Horas com ato vigente.",
   "politica_ausencia": "Dia sem ato vigente sai do denominador.",
   "validacoes": [
    "nenhuma hora acima do teto horário"
   ],
   "limitacoes": [
    "Depende dos atos integrados pelo módulo Regulação."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_media_mensal_ponderada_carga",
   "titulo": "PLD médio mensal ponderado pela carga do balanço do ONS",
   "pergunta": "Qual foi o PLD médio do mês pesando cada hora pela carga do subsistema no balanço do ONS?",
   "definicao": "Soma do PLD vezes a carga do subsistema no Balanço de Energia nos Subsistemas do ONS na mesma hora, dividida pela soma da carga, nas horas com carga publicada e positiva. O perímetro dessa carga muda dentro da série: até 02/2021, carga atendida por usinas despachadas ou programadas pelo ONS (P1); de 03/2021 a 04/2023, mais a previsão de geração de usinas não despachadas (P2); desde 29/04/2023, mais a MMGD estimada pelo ONS com base em dados meteorológicos previstos (P3; no dado horário do balanço, desde 01/05/2023).",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado (peso: subsistema de mesmo nome)",
   "grao_temporal": "mês (perímetro do peso marcado)",
   "fontes": [
    "ccee_pld_horario",
    "balanco_energia_subsistema_ho",
    "ons_carga_verificada_ho"
   ],
   "numerador": "Σ PLD_h × carga_h (carga_h > 0)",
   "denominador": "Σ carga_h (carga_h > 0)",
   "formula": "Σ PLD_h × carga_h ÷ Σ carga_h nas horas com carga_h > 0",
   "regra_agregacao": "média ponderada pela energia (MWmed numa hora = MWh)",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês",
    "perímetro da carga"
   ],
   "regras_comparabilidade": [
    "Só é comparada com a média temporal quando as duas usam as mesmas horas (campo mesmas_horas).",
    "Só é comparável entre meses do mesmo perímetro da carga (perimetro_carga): as mudanças de 03/2021 e de 29/04/2023 mudam o peso, e a MMGD estimada desloca o peso para as horas de sol. Para comparar meses de perímetros diferentes, use pld_media_mensal_ponderada_carga_sem_mmgd."
   ],
   "regra_cobertura": "Horas com PLD e carga positiva.",
   "politica_ausencia": "Hora sem carga fica fora da ponderada; hora com carga ≤ 0 (valor fisicamente impossível) também sai do peso e é listada como ressalva; mesmas_horas indica a diferença de cobertura.",
   "validacoes": [
    "controle físico: carga > 0 em toda hora usada como peso",
    "numerador e denominador publicados na evidência",
    "magnitude e alcance das revisões da carga por mês, com o efeito na ponderada",
    "perímetro da carga conferido mês a mês contra a API de carga verificada (erro absoluto médio e coeficiente da MMGD)",
    "reconciliação por releitura dos arquivos originais da CCEE e do ONS"
   ],
   "limitacoes": [
    "Carga do subsistema do ONS, não consumo contabilizado na CCEE; correspondência subsistema e submercado pelo nome.",
    "Natureza da fonte ESTIMADO: publicada como carga verificada, a carga do balanço tem componentes estimados desde 03/2021 (previsão de geração de usinas não despachadas) e desde 29/04/2023 (MMGD estimada com dados meteorológicos previstos).",
    "A escolha do peso muda o resultado: nos meses recentes, a diferença entre a ponderada pelo balanço (com MMGD) e a ponderada sem MMGD é maior que a distância entre a ponderada e a média temporal (valores de cada construção em historico.ponderacao.sensibilidade_peso).",
    "A carga é revista pelo ONS depois de publicada; a ponderada dos meses recentes pode mudar."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_media_mensal_ponderada_carga_sem_mmgd",
   "titulo": "PLD médio mensal ponderado pela carga sem MMGD",
   "pergunta": "Qual foi o PLD médio do mês pesando cada hora pela carga medida do subsistema, sem a MMGD estimada?",
   "definicao": "Soma do PLD vezes a carga global líquida de MMGD do subsistema na mesma hora (carga global menos MMGD da API de carga verificada do ONS: parcela supervisionada mais a não supervisionada da medição para faturamento da CCEE), dividida pela soma dessa carga, nas horas com o valor publicado e positivo. Perímetro homogêneo em toda a série.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado (peso: área de carga de mesmo nome na API)",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_pld_horario",
    "ons_carga_verificada_ho"
   ],
   "numerador": "Σ PLD_h × (global_h − MMGD_h) (global_h − MMGD_h > 0)",
   "denominador": "Σ (global_h − MMGD_h) (global_h − MMGD_h > 0)",
   "formula": "Σ PLD_h × (global_h − MMGD_h) ÷ Σ (global_h − MMGD_h) nas horas com global_h − MMGD_h > 0",
   "regra_agregacao": "média ponderada pela energia (MWmed numa hora = MWh; hora = soma das duas meias horas da API)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês"
   ],
   "regras_comparabilidade": [
    "Só é comparada com a média temporal quando as duas usam as mesmas horas (campo mesmas_horas_sem_mmgd).",
    "Mesmo perímetro em todos os meses: é a ponderada para comparar meses antes e depois de 2023."
   ],
   "regra_cobertura": "Horas com PLD e com as duas meias horas de carga global e de MMGD publicadas na API.",
   "politica_ausencia": "Hora sem as duas meias horas fica fora da ponderada; hora com carga líquida ≤ 0 também sai do peso e é listada (horas_retiradas_sem_mmgd); mesmas_horas_sem_mmgd indica a diferença de cobertura.",
   "validacoes": [
    "controle físico: carga líquida > 0 em toda hora usada como peso",
    "numerador e denominador publicados na evidência",
    "reconciliação por releitura do arquivo da CCEE e da resposta da API do ONS"
   ],
   "limitacoes": [
    "Carga do sistema medida pelo ONS, não consumo contabilizado na CCEE; correspondência área de carga e submercado pelo nome.",
    "A MMGD (estimada pelo ONS) fica fora do peso: a média descreve o preço pesado pela carga atendida pelo sistema medido.",
    "Lida do silver do módulo Carga; a cobertura acompanha a coleta daquele módulo.",
    "A carga é revista pelo ONS depois de publicada; a ponderada dos meses recentes pode mudar."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_media_mensal_real",
   "titulo": "PLD médio mensal em moeda constante",
   "pergunta": "Quanto valeria o PLD médio de cada mês em reais de hoje?",
   "definicao": "Média temporal do mês multiplicada pelo IPCA do mês-base e dividida pelo IPCA do mês.",
   "unidade": "R$/MWh do mês-base",
   "grao_geografico": "submercado",
   "grao_temporal": "mês",
   "fontes": [
    "ccee_pld_horario",
    "ibge_ipca_1737"
   ],
   "formula": "real = temporal × IPCA(base) ÷ IPCA(mês)",
   "regra_agregacao": "deflação mensal",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês"
   ],
   "regras_comparabilidade": [
    "Perspectiva adicional; o valor nominal é o dado principal."
   ],
   "regra_cobertura": "Meses com IPCA publicado.",
   "politica_ausencia": "Mês sem índice fica sem valor real.",
   "validacoes": [
    "mês-base = último mês do IPCA não posterior ao dia de referência"
   ],
   "limitacoes": [
    "O IPCA mede preços ao consumidor, não custos de energia."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_media_mensal_temporal",
   "titulo": "PLD médio mensal (média temporal)",
   "pergunta": "Qual foi o PLD médio do mês?",
   "definicao": "Média simples das horas do mês com PLD publicado.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado",
   "grao_temporal": "mês (parcial marcado)",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "Σ PLD_h do mês",
   "denominador": "horas do mês com PLD",
   "formula": "Σ PLD_h ÷ n",
   "regra_agregacao": "média temporal",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês"
   ],
   "regras_comparabilidade": [
    "Não é preço ponderado pelo consumo.",
    "Mês parcial não compete com mês completo sem aviso."
   ],
   "regra_cobertura": "Todas as horas publicadas do mês.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "horas por mês publicadas"
   ],
   "limitacoes": [
    "Valores nominais."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_percentil_sazonal",
   "titulo": "Posição sazonal do PLD",
   "pergunta": "O preço está alto para esta época do ano?",
   "definicao": "Percentil da média diária do dia de referência na distribuição das médias diárias do mesmo mês (e da mesma semana ISO) nos anos anteriores; quantis P10 a P90 por mês.",
   "unidade": "percentil (0 a 100); R$/MWh nos quantis",
   "grao_geografico": "submercado",
   "grao_temporal": "dia; mês do ano",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "percentil = 100 × (menores + 0,5 × iguais) ÷ n; quantis tipo 7",
   "regra_agregacao": "distribuição empírica dos dias completos",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês do ano",
    "semana ISO"
   ],
   "regras_comparabilidade": [
    "Anos anteriores têm limites diferentes; ver a distribuição por regime.",
    "n publicado ao lado."
   ],
   "regra_cobertura": "Dias completos de anos anteriores ao ano de referência.",
   "politica_ausencia": "Dia incompleto não entra.",
   "validacoes": [
    "empates contados pelo rank médio"
   ],
   "limitacoes": [
    "Série horária desde 2021: no máximo cinco anos anteriores."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_perfil_hora_mes",
   "titulo": "Perfil hora a hora por mês",
   "pergunta": "Em que horas do dia o PLD costuma ser mais alto em cada mês?",
   "definicao": "Média do PLD em cada hora do dia (0 a 23) dentro de cada um dos últimos 12 meses; o detalhe hora × dia dos últimos 90 dias vai em arquivo próprio (pld_hora_dia.json).",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado",
   "grao_temporal": "hora do dia × mês",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "média de PLD_h com hora do dia = k no mês m",
   "regra_agregacao": "média temporal",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "mês",
    "hora do dia"
   ],
   "regras_comparabilidade": [
    "Mês parcial marcado."
   ],
   "regra_cobertura": "Horas publicadas.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "24 colunas por mês"
   ],
   "limitacoes": [
    "Estatística descritiva: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_pld_semana",
   "titulo": "PLD médio da semana operativa",
   "pergunta": "Qual foi o PLD médio na semana operativa?",
   "definicao": "Média simples das 168 horas do PLD da semana operativa (sábado a sexta).",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado",
   "grao_temporal": "semana operativa",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "Σ PLD_h nas 168 horas",
   "denominador": "168",
   "formula": "PLD_semana = Σ PLD_h ÷ 168",
   "regra_agregacao": "média temporal",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "semana operativa"
   ],
   "regras_comparabilidade": [
    "Média temporal: não é preço ponderado pela carga."
   ],
   "regra_cobertura": "Semana com as 168 horas.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "168 horas de sábado 00h a sexta 23h",
    "reconciliação por releitura do arquivo original da CCEE com leitor independente"
   ],
   "limitacoes": [
    "Valores nominais."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_quantis_regime",
   "titulo": "Distribuição do PLD por regime de limites",
   "pergunta": "Como o PLD se distribuiu em cada regime anual de limites?",
   "definicao": "Quantis P10 a P90 dos valores horários de cada ano, com os limites vigentes e as frações no piso e no teto.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado",
   "grao_temporal": "ano (regime)",
   "fontes": [
    "ccee_pld_horario",
    "regulatorio:limites_pld"
   ],
   "formula": "quantis tipo 7 dos valores horários",
   "regra_agregacao": "distribuição horária",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "ano"
   ],
   "regras_comparabilidade": [
    "Ano parcial marcado."
   ],
   "regra_cobertura": "Horas publicadas.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "limites do regime listados com o ato"
   ],
   "limitacoes": [
    "Valores nominais."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_sentido_fluxo_separacao",
   "titulo": "Sentido do fluxo nas horas de preços separados",
   "pergunta": "Quando os preços se separam, para que lado a energia está fluindo na fronteira?",
   "definicao": "Nas horas com preços separados entre as pontas de uma fronteira monitorada pelo ONS, contagem das horas em que o fluxo verificado ia do submercado de menor para o de maior preço, no sentido oposto ou era nulo (até 1 MWmed).",
   "unidade": "horas; fração das horas separadas",
   "grao_geografico": "fronteira (N e NE, N e SE/CO, NE e SE/CO, S e SE/CO)",
   "grao_temporal": "período",
   "fontes": [
    "ccee_pld_horario",
    "intercambio_nacional_ho"
   ],
   "numerador": "horas do menor para o maior preço",
   "denominador": "horas separadas com fluxo",
   "formula": "sentido = sinal do fluxo na orientação canônica comparado com o lado de menor preço",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fronteira",
    "período"
   ],
   "regras_comparabilidade": [
    "Mesma hora; fluxo publicado até a última hora do balanço de intercâmbio."
   ],
   "regra_cobertura": "Horas com PLD nas duas pontas e fluxo publicado.",
   "politica_ausencia": "Hora sem fluxo fica fora.",
   "validacoes": [
    "classes somam as horas com fluxo"
   ],
   "limitacoes": [
    "Limites de intercâmbio não integrados: nenhuma hora é classificada como congestionada.",
    "Estatística descritiva: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_separacao_par",
   "titulo": "Frequência de separação de preços por par",
   "pergunta": "Com que frequência dois submercados tiveram preços diferentes?",
   "definicao": "Fração das horas em que |PLD_A − PLD_B| > R$ 0,01/MWh; com contagens acima de R$ 1 e R$ 10 como sensibilidade.",
   "unidade": "fração das horas (a ficha de evidência exibe em % das horas)",
   "grao_geografico": "par de submercados",
   "grao_temporal": "período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "horas separadas",
   "denominador": "horas com os quatro submercados",
   "formula": "horas com |Δ| > 0,01 ÷ horas",
   "regra_agregacao": "contagem de horas",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "par",
    "período",
    "hora do dia"
   ],
   "regras_comparabilidade": [
    "Limiar diferente do usado em pld.json (R$ 1,00/MWh); cada medida declara o seu."
   ],
   "regra_cobertura": "Horas com os quatro submercados.",
   "politica_ausencia": "Hora sem PLD publicado não entra no cálculo nem vira zero; o número de horas usadas acompanha cada valor.",
   "validacoes": [
    "matriz 12 meses reconciliada com a tabela por par",
    "recontagem pelas diferenças arredondadas ao centavo"
   ],
   "limitacoes": [
    "Estatística descritiva: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "pld_detalhe.json",
   "paginas": [
    "/setor-eletrico/pld"
   ],
   "versao_formula": "1.0",
   "id": "pld_sequencia_zero_cmo_semanal",
   "titulo": "Sequência de CMO semanal igual a zero",
   "pergunta": "Os zeros do CMO semanal existem no arquivo original do ONS?",
   "definicao": "Semanas operativas consecutivas com CMO semanal exatamente zero, e conferência no CSV e no Parquet originais.",
   "unidade": "semanas",
   "grao_geografico": "subsistema",
   "grao_temporal": "semana operativa",
   "fontes": [
    "cmo_se",
    "ons_cmo_semanal_a02"
   ],
   "formula": "semanas consecutivas (passo de 7 dias) com média semanal = 0; mínimo de 4",
   "regra_agregacao": "contagem",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema"
   ],
   "regras_comparabilidade": [
    "Zero é valor publicado; ausência interrompe a sequência."
   ],
   "regra_cobertura": "Todos os arquivos anuais.",
   "politica_ausencia": "Semana ausente interrompe a sequência.",
   "validacoes": [
    "CSV contra Parquet célula a célula",
    "silver principal contra releitura independente"
   ],
   "limitacoes": [
    "O ONS não informa a razão dos zeros."
   ],
   "arquivo": "pipeline/energia/metricas/pld.py"
  },
  {
   "gold": "previsoes_desempenho.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_atraso_emissao",
   "titulo": "Atraso da emissão",
   "pergunta": "A rodada saiu até as 08h00 de Brasília?",
   "definicao": "Minutos entre o prazo (08h00 de Brasília do dia de origem) e o horário real em que a rodada foi calculada e registrada; zero quando saiu no prazo. Rodada ausente em dia de operação agendada é contada à parte.",
   "unidade": "minutos",
   "grao_geografico": "não se aplica",
   "grao_temporal": "rodada diária",
   "fontes": [
    "previsoes:arquivo_de_emissoes"
   ],
   "formula": "atraso = máx(0, emitido_em − prazo)",
   "regra_agregacao": "por rodada; contagens de rodadas no prazo, atrasadas e faltantes",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "rodada",
    "modo (agendada ou manual)"
   ],
   "regras_comparabilidade": [
    "Rodada manual não comprova a rotina agendada."
   ],
   "regra_cobertura": "Todas as rodadas do arquivo.",
   "politica_ausencia": "Dia sem rodada aparece como faltante, nunca como atraso zero.",
   "validacoes": [
    "emitido_em com fuso",
    "prazo calculado pelo fuso America/Sao_Paulo"
   ],
   "limitacoes": [
    "O horário é o do cálculo; a publicação no site depende do commit, poucos minutos depois."
   ],
   "publicacao": {
    "estado": "PUBLICADA",
    "gold": "previsoes_desempenho.json"
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_brutas_fora_da_faixa",
   "titulo": "Previsões brutas fora da faixa de preço (G23-R1)",
   "pergunta": "Quantas previsões do C2 sairiam abaixo do piso, acima do teto ou negativas sem a restrição de preço?",
   "definicao": "Por modelo e frequência: previsões brutas (antes da restrição à faixa [piso, teto estrutural] médios dos atos publicados até a origem) abaixo do piso ou acima do teto por mais de 1e-6 R$/MWh, e negativas. O total é o número de previsões brutas calculadas.",
   "unidade": "contagem de células",
   "grao_geografico": "os quatro submercados juntos",
   "grao_temporal": "frequência (semanal, mensal)",
   "fontes": [
    "ccee_pld_horario",
    "ear_subsistema_di",
    "ena_subsistema_di",
    "regulatorio:limites_pld"
   ],
   "numerador": "previsões brutas fora da faixa",
   "denominador": "previsões brutas calculadas",
   "formula": "n(bruta < piso − ε), n(bruta > teto + ε), n(bruta < −ε), ε = 1e-6 R$/MWh",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "frequência"
   ],
   "regras_comparabilidade": [
    "A previsão publicada é sempre a restrita; a bruta só documenta o comportamento do modelo."
   ],
   "regra_cobertura": "Todas as células com previsão bruta do C2.",
   "politica_ausencia": "Célula sem previsão bruta não entra.",
   "validacoes": [
    "mesma tolerância da cobertura: B0 no piso com λ = ZERO não conta como abaixo do piso"
   ],
   "limitacoes": [
    "Faixa provisória (ato do ano seguinte ainda não publicado) usa os limites vigentes na origem."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_cobertura_p05_p95",
   "titulo": "Cobertura da faixa P5 a P95",
   "pergunta": "A faixa que deveria conter o realizado em 90% dos casos conteve quantas vezes?",
   "definicao": "Fração das células em que o realizado ficou entre o quantil de 5% e o de 95% (inclusive), com a mesma tolerância de 1e-6 R$/MWh da faixa P10 a P90.",
   "unidade": "fração de 0 a 1",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "células com P5 − 1e-6 ≤ realizado ≤ P95 + 1e-6",
   "denominador": "células com quantis",
   "formula": "cobertura90 = n(P5 − ε ≤ y ≤ P95 + ε) ÷ n, ε = 1e-6 R$/MWh",
   "regra_agregacao": "razão de contagens",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Nominal 90%; não entra na regra de calibração, que usa a faixa P10 a P90."
   ],
   "regra_cobertura": "Células com quantis.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "P5 ≤ P10 ≤ P90 ≤ P95 em toda célula"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_cobertura_p10_p90",
   "titulo": "Cobertura da faixa P10 a P90",
   "pergunta": "A faixa que deveria conter o realizado em 80% dos casos conteve quantas vezes?",
   "definicao": "Fração das células em que o realizado ficou entre o quantil de 10% e o de 90% (inclusive). O estado de calibração usa entregas distintas como tamanho de amostra (regra da governança: 75% a 85% com n ≥ 100). A comparação usa tolerância de 1e-6 R$/MWh: realizado igual ao piso que limitou o P10 conta como coberto (as duas contas diferem só por ruído de ponto flutuante, da ordem de 1e-10).",
   "unidade": "fração de 0 a 1",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "células com P10 − 1e-6 ≤ realizado ≤ P90 + 1e-6",
   "denominador": "células com quantis",
   "formula": "cobertura = n(P10 − ε ≤ y ≤ P90 + ε) ÷ n, ε = 1e-6 R$/MWh",
   "regra_agregacao": "razão de contagens",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Cobertura sozinha não basta: ver largura e perda quantílica."
   ],
   "regra_cobertura": "Células com quantis.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "calibração só com n ≥ 100 entregas distintas",
    "cobertura refeita por outro leitor a partir do CSV do teste retrospectivo (células cobertas iguais a menos das ambíguas pelo arredondamento a 2 casas)",
    "realizado no piso com P10 limitado ao piso conta como coberto: semana real de 04/01/2025 (as 168 horas a R$ 58,60/MWh nos quatro submercados), média por somas acumuladas 58,59999999997672 contra P10 no piso de 58,60000000000001 (pipeline/tests/test_energia_previsoes.py, CoberturaNoPiso.test_semana_de_04_01_2025_no_piso_conta_como_coberta)"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado.",
    "Faixa não calibrada não é publicada na previsão atual.",
    "Registros do arquivo emitidos antes de 01/10/2026 gravaram a cobertura com comparação estrita e nunca são reescritos. Enquanto os números de desempenho estiverem retidos, a partição pública do arquivo omite essa cobertura e as rodadas novas não a gravam; depois da liberação, a gold publica ao lado o valor refeito com a regra corrigida (prospectivo.calibracao_regra_antiga)."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_coeficiente_d7_acima_de_1",
   "titulo": "Ajustes do C2 com coeficiente de d7 − B0 acima de 1 (G23-R1)",
   "pergunta": "Com que frequência o C2 amplifica o sinal dos últimos 7 dias?",
   "definicao": "Por segmento (modelo × horizonte × submercado): ajustes semanais concluídos em que o coeficiente da variável média dos 7 últimos dias − B0, na unidade original, passou de 1; fração sobre os ajustes concluídos; também o maior coeficiente e quantos ajustes escolheram λ = ZERO (correção desligada).",
   "unidade": "contagem e fração de 0 a 1",
   "grao_geografico": "submercado",
   "grao_temporal": "origem de ajuste (domingo)",
   "fontes": [
    "ccee_pld_horario",
    "ear_subsistema_di",
    "ena_subsistema_di"
   ],
   "numerador": "ajustes com coeficiente de d7 − B0 > 1",
   "denominador": "ajustes concluídos (ok)",
   "formula": "fração = n(coef_d7 > 1) ÷ n(ajustes ok)",
   "regra_agregacao": "contagem por segmento; total = soma das contagens",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte",
    "submercado"
   ],
   "regras_comparabilidade": [
    "Ajustes de domingos vizinhos compartilham quase todo o treino: não são casos independentes."
   ],
   "regra_cobertura": "Ajustes com treino suficiente (52 semanas ou 24 meses).",
   "politica_ausencia": "Segmento sem ajuste concluído: fração nula (null), nunca zero.",
   "validacoes": [
    "coeficientes por origem publicados em previsoes_ajustes_c2.csv"
   ],
   "limitacoes": [
    "Coeficiente acima de 1 indica amplificação possível, não erro por si só."
   ],
   "publicacao": {
    "estado": "PUBLICADA",
    "gold": "previsoes_desempenho.json"
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_erro_absoluto_medio",
   "titulo": "Erro médio absoluto (MAE)",
   "pergunta": "Quanto, em média, a previsão errou para mais ou para menos?",
   "definicao": "Média de |previsão − realizado| sobre as células avaliadas (origem × submercado) do recorte.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "Σ |previsão − realizado|",
   "denominador": "células avaliadas",
   "formula": "MAE = Σ |ŷ − y| ÷ n",
   "regra_agregacao": "média simples das células (cada origem pesa igual)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Comparar modelos só nas mesmas células (MAE pareado com o B0).",
    "Desenvolvimento e teste têm níveis de preço diferentes: não compare MAE entre períodos como melhora."
   ],
   "regra_cobertura": "Células com previsão e realizado completo.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "B0 refeito por outro caminho",
    "contagem de 28 células por origem"
   ],
   "limitacoes": [
    "O teste retrospectivo é reconstrução sob a hipótese LAT1D (período usado só depois de terminado há 1 dia); a CCEE não informa quando publicou cada hora do passado (achado A09).",
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_fracao_abaixo_p10",
   "titulo": "Fração do realizado abaixo do P10",
   "pergunta": "Quantas vezes o preço ficou abaixo da ponta inferior da faixa?",
   "definicao": "Fração das células com quantis em que o realizado ficou abaixo do P10 por mais de 1e-6 R$/MWh. Nominal 10%; com a cobertura e a fração acima do P90 soma 1.",
   "unidade": "fração de 0 a 1",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "células com realizado < P10 − 1e-6",
   "denominador": "células com quantis",
   "formula": "abaixo_p10 = n(y < P10 − ε) ÷ n",
   "regra_agregacao": "razão de contagens",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Assimetria entre abaixo do P10 e acima do P90 indica faixa deslocada, não só estreita."
   ],
   "regra_cobertura": "Células com quantis.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "abaixo_p10 + cobertura_p10_p90 + acima_p90 = 1"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_fracao_acima_p90",
   "titulo": "Fração do realizado acima do P90",
   "pergunta": "Quantas vezes o preço ficou acima da ponta superior da faixa?",
   "definicao": "Fração das células com quantis em que o realizado ficou acima do P90 por mais de 1e-6 R$/MWh. Nominal 10%.",
   "unidade": "fração de 0 a 1",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "células com realizado > P90 + 1e-6",
   "denominador": "células com quantis",
   "formula": "acima_p90 = n(y > P90 + ε) ÷ n",
   "regra_agregacao": "razão de contagens",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Ver a fração abaixo do P10 junto."
   ],
   "regra_cobertura": "Células com quantis.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "abaixo_p10 + cobertura_p10_p90 + acima_p90 = 1"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_ganho_sobre_b0",
   "titulo": "Ganho de MAE sobre a persistência (B0)",
   "pergunta": "O modelo erra menos que repetir o último período?",
   "definicao": "MAE do B0 menos MAE do modelo nas mesmas células; positivo = melhor que o B0. Intervalo de 90% por bootstrap de blocos de calendário das origens (28 dias no semanal, 91 no mensal), 1.000 réplicas, semente fixa.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte, frequência e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "ganho = Σ(|ŷ_B0 − y| − |ŷ_m − y|) ÷ n pareadas; IC = percentis 5 e 95 das médias reamostradas por bloco",
   "regra_agregacao": "média das diferenças pareadas; blocos mantêm juntas todas as células das mesmas origens",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Só diz se o modelo supera a persistência; não aprova o modelo.",
    "Ganho no desenvolvimento é exploratório (período já examinado pela pesquisa)."
   ],
   "regra_cobertura": "Intervalo só com pelo menos 5 blocos.",
   "politica_ausencia": "Menos de 5 blocos: intervalo nulo, declarado.",
   "validacoes": [
    "mesmas células para os dois modelos"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado.",
    "Blocos de calendário aproximam, não eliminam, a dependência."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_largura_p10_p90",
   "titulo": "Largura média da faixa P10 a P90",
   "pergunta": "Quão larga é a faixa de incerteza?",
   "definicao": "Média de (P90 − P10) nas células com quantis.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "largura = Σ (P90 − P10) ÷ n",
   "regra_agregacao": "média simples",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Faixa estreita só é boa se a cobertura estiver perto da nominal."
   ],
   "regra_cobertura": "Células com quantis.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "P90 ≥ P10 em toda célula"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_limiares_de_regime",
   "titulo": "Limiares dos regimes de preço, armazenamento e extremo",
   "pergunta": "Onde termina o preço intermediário e começa o alto, e o armazenamento baixo ou alto?",
   "definicao": "Fixados no período de desenvolvimento, por submercado e frequência, e aplicados sem mudança ao teste: percentil 75 do B0 (preço alto acima dele), percentil 90 do realizado (extremo acima dele), percentis 33 e 67 da EAR do último dia elegível (armazenamento baixo, médio e alto). Percentil tipo 7 (interpolação linear).",
   "unidade": "R$/MWh (B0 e realizado); % da capacidade (EAR)",
   "grao_geografico": "submercado",
   "grao_temporal": "frequência",
   "fontes": [
    "ccee_pld_horario",
    "ear_subsistema_di"
   ],
   "formula": "limiar = quantil tipo 7 dos valores do desenvolvimento no submercado e frequência",
   "regra_agregacao": "percentil empírico",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "frequência"
   ],
   "regras_comparabilidade": [
    "O nível de preço subiu depois de 2024: no teste, a maior parte das células cai em preço alto."
   ],
   "regra_cobertura": "Células do desenvolvimento com o valor presente.",
   "politica_ausencia": "Sem valores no desenvolvimento: limiar nulo e regime não atribuído.",
   "validacoes": [
    "limiares calculados só com o desenvolvimento"
   ],
   "limitacoes": [
    "Grupos com menos de 10 entregas são marcados."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_perda_quantilica",
   "titulo": "Perda quantílica média",
   "pergunta": "Quão boa é a distribuição prevista, e não só o ponto?",
   "definicao": "Média, nos níveis 5, 10, 25, 50, 75, 90 e 95%, da perda de cada quantil: τ·(y − q) se y ≥ q, (1 − τ)·(q − y) se y < q; média sobre as células com quantis.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "PQ = média_células( média_τ( máx(τ(y − q_τ), (τ − 1)(y − q_τ)) ) )",
   "regra_agregacao": "média simples",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Com sete níveis, não é o CRPS; serve para comparar modelos nas mesmas células."
   ],
   "regra_cobertura": "Células com quantis (24 entregas de resíduos no segmento).",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "quantis ordenados em toda célula"
   ],
   "limitacoes": [
    "O teste retrospectivo é reconstrução sob a hipótese LAT1D (período usado só depois de terminado há 1 dia); a CCEE não informa quando publicou cada hora do passado (achado A09).",
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_pld_realizado_entrega",
   "titulo": "PLD médio realizado da entrega",
   "pergunta": "Qual foi o PLD médio da semana (ou do mês) que se queria prever?",
   "definicao": "Média aritmética simples de todas as horas do PLD horário da CCEE na entrega: 168 horas na semana de sábado a sábado; 24 × dias no mês civil. É média temporal, não ponderada pela carga.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado",
   "grao_temporal": "semana operativa ou mês civil",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "Σ PLD_h nas horas da entrega",
   "denominador": "número de horas da entrega",
   "formula": "realizado = Σ PLD_h ÷ horas da entrega",
   "regra_agregacao": "média por duração (todas as horas têm 1 hora)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "submercado",
    "entrega"
   ],
   "regras_comparabilidade": [
    "Não é o preço médio ponderado pela carga nem o PLD de uma hora."
   ],
   "regra_cobertura": "Só entregas com todas as horas publicadas.",
   "politica_ausencia": "Entrega com hora ausente não tem realizado (fica fora da avaliação, nunca completada).",
   "validacoes": [
    "realizado dentro de [piso, teto estrutural] médios vigentes (tolerância R$ 0,01/MWh)",
    "contagem de horas igual à duração da entrega"
   ],
   "limitacoes": [
    "O PLD pode ser republicado pela CCEE; a avaliação usa a versão vigente no silver (nenhuma revisão detectada até 30/09/2026)."
   ],
   "publicacao": {
    "estado": "PUBLICADA",
    "gold": "previsoes_desempenho.json"
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_pld_referencia_b0",
   "titulo": "Referência experimental B0 (persistência)",
   "pergunta": "Se o PLD médio repetisse o do último período completo, quanto seria em cada entrega?",
   "definicao": "Média das horas do último período completo da mesma frequência (semana de sábado a sábado ou mês civil) que terminou até 1 dia antes do corte das 07h00 e que já estava capturado no corte, limitada à faixa [piso, teto estrutural] dos atos da ANEEL publicados até a origem. Emitida diariamente como referência experimental identificada (seção 12.4), não como previsão aprovada.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado",
   "grao_temporal": "entrega (W1 a W4, M1 a M3) por rodada diária",
   "fontes": [
    "ccee_pld_horario",
    "regulatorio:limites_pld"
   ],
   "formula": "B0 = mín(máx(Σ PLD_h do último período elegível ÷ horas; piso), teto)",
   "regra_agregacao": "média por duração; restrição à faixa média diária de limites da entrega",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "PREVISTO",
   "dimensoes": [
    "submercado",
    "horizonte",
    "rodada"
   ],
   "regras_comparabilidade": [
    "Mesmo valor para W1 a W4 (e para M1 a M3) de uma rodada: é persistência.",
    "Comparar com o realizado da mesma entrega, nunca com o PLD de um dia."
   ],
   "regra_cobertura": "Rodada com o período elegível completo e capturado até o corte.",
   "politica_ausencia": "Sem período elegível capturado, a célula fica sem número com o motivo (ex.: SEM_PERIODO_ELEGIVEL_CAPTURADO_ATE_O_CORTE).",
   "validacoes": [
    "recálculo independente hora a hora em cada emissão (tolerância 1e-6 R$/MWh)",
    "capturado_em de cada dado usado anterior ao corte",
    "reexecução do arquivo (tolerância R$ 0,005/MWh)"
   ],
   "limitacoes": [
    "Não usa chuva, reservatórios nem vazões.",
    "Sem faixa de incerteza enquanto o segmento não estiver calibrado.",
    "Modelo em pesquisa: não alimenta a previsão principal."
   ],
   "publicacao": {
    "estado": "PUBLICADA",
    "gold": "previsoes_desempenho.json"
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_pld_retrospectiva",
   "titulo": "Previsão do teste retrospectivo",
   "pergunta": "O que cada modelo teria previsto em cada dia do passado, com o dado disponível sob LAT1D?",
   "definicao": "Previsão de B0, S0 (mesmo período um ano antes), C2-P e C2-H para cada origem diária desde 01/01/2022, com treino e quantis só com entregas encerradas antes do corte; restrita à faixa de preço.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado",
   "grao_temporal": "origem diária × entrega",
   "fontes": [
    "ccee_pld_horario",
    "ear_subsistema_di",
    "ena_subsistema_di",
    "regulatorio:limites_pld"
   ],
   "formula": "C2 = B0 + Σ_j (x_j ÷ escala_j) · β_j, sem intercepto, β por mínimos quadrados penalizados (λ por validação interna)",
   "regra_agregacao": "não agregada (uma linha por célula no CSV)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "PREVISTO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Reconstrução sob hipótese: não é previsão emitida nem registrada antes do realizado."
   ],
   "regra_cobertura": "C2 só com 52 entregas semanais (ou 24 meses) de treino; quantis com 24 entregas de resíduos.",
   "politica_ausencia": "Sem treino suficiente ou com variável ausente, a célula fica sem previsão (nunca vira B0).",
   "validacoes": [
    "treino só com entregas terminadas até o domingo de ajuste menos 1 dia",
    "quantis não cruzados",
    "previsões dentro da faixa de preço"
   ],
   "limitacoes": [
    "O teste retrospectivo é reconstrução sob a hipótese LAT1D (período usado só depois de terminado há 1 dia); a CCEE não informa quando publicou cada hora do passado (achado A09).",
    "EAR e ENA do ONS são revisadas (consistência recorrente); o teste do C2-H usa o valor revisado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_rmse",
   "titulo": "Raiz do erro quadrático médio (RMSE)",
   "pergunta": "Quanto a previsão errou, pesando mais os erros grandes?",
   "definicao": "Raiz quadrada da média de (previsão − realizado)² sobre as células avaliadas do recorte.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "Σ (previsão − realizado)²",
   "denominador": "células avaliadas",
   "formula": "RMSE = √(Σ (ŷ − y)² ÷ n)",
   "regra_agregacao": "média simples dos quadrados das células, depois a raiz",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "RMSE ≥ MAE sempre; a distância entre os dois indica erros grandes concentrados (extremos)."
   ],
   "regra_cobertura": "Células com previsão e realizado completo.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "mesmas células do MAE"
   ],
   "limitacoes": [
    "O teste retrospectivo é reconstrução sob a hipótese LAT1D (período usado só depois de terminado há 1 dia); a CCEE não informa quando publicou cada hora do passado (achado A09).",
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_skill_mae_sobre_b0",
   "titulo": "Habilidade relativa ao B0 (skill de MAE)",
   "pergunta": "Que fração do erro da persistência o modelo elimina?",
   "definicao": "1 − MAE do modelo ÷ MAE do B0, nas mesmas células: 0 = igual à persistência, positivo = melhor, negativo = pior. Sem valor quando o MAE do B0 é zero.",
   "unidade": "fração (adimensional)",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "MAE do modelo nas células pareadas",
   "denominador": "MAE do B0 nas mesmas células",
   "formula": "skill = 1 − MAE_m ÷ MAE_B0",
   "regra_agregacao": "razão de médias nas mesmas células (não é média de razões)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Só compara com o B0 nas mesmas células; não aprova o modelo."
   ],
   "regra_cobertura": "Células com previsão do modelo e do B0 e realizado completo.",
   "politica_ausencia": "MAE do B0 zero ou nenhuma célula pareada: sem valor (null), nunca zero.",
   "validacoes": [
    "mesmas células do ganho sobre o B0"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_tamanho_amostra",
   "titulo": "Tamanho da amostra da avaliação",
   "pergunta": "Sobre quantos casos cada métrica foi calculada?",
   "definicao": "Contagens publicadas ao lado de cada métrica: células avaliadas (origem × submercado), entregas distintas (tamanho efetivo, usado na calibração), origens, células e entregas com quantis, células pareadas com o B0.",
   "unidade": "contagem",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "contagem de células, de entregas distintas e de origens distintas no recorte",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Células não são casos independentes: compare amostras pelo número de entregas distintas."
   ],
   "regra_cobertura": "Todas as células do recorte com previsão e realizado completo.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "28 células por origem"
   ],
   "limitacoes": [
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "PUBLICADA",
    "gold": "previsoes_desempenho.json"
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "gold": "previsoes_desempenho_interno.json",
   "paginas": [
    "/setor-eletrico/pld/previsoes",
    "/setor-eletrico/pld/modelos"
   ],
   "versao_formula": "1.0",
   "id": "previsao_vies",
   "titulo": "Viés da previsão",
   "pergunta": "A previsão tende a ficar acima ou abaixo do realizado?",
   "definicao": "Média de (previsão − realizado): positivo = superestima o PLD em média.",
   "unidade": "R$/MWh",
   "grao_geografico": "submercado ou os quatro juntos",
   "grao_temporal": "horizonte e período",
   "fontes": [
    "ccee_pld_horario"
   ],
   "numerador": "Σ (previsão − realizado)",
   "denominador": "células avaliadas",
   "formula": "viés = Σ (ŷ − y) ÷ n",
   "regra_agregacao": "média simples das células",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modelo",
    "horizonte (W1 a W4, M1 a M3)",
    "submercado",
    "período (desenvolvimento, teste)"
   ],
   "regras_comparabilidade": [
    "Viés perto de zero não significa erro pequeno (erros de sinais opostos se compensam)."
   ],
   "regra_cobertura": "Células com previsão e realizado completo.",
   "politica_ausencia": "Célula sem previsão ou sem realizado completo fica fora do cálculo; ausência nunca vira zero.",
   "validacoes": [
    "mesmas células do MAE"
   ],
   "limitacoes": [
    "O teste retrospectivo é reconstrução sob a hipótese LAT1D (período usado só depois de terminado há 1 dia); a CCEE não informa quando publicou cada hora do passado (achado A09).",
    "Origens diárias vizinhas preveem a mesma entrega: o tamanho efetivo é o número de entregas distintas, publicado ao lado."
   ],
   "publicacao": {
    "estado": "RETIDA",
    "gold": null,
    "gold_quando_liberada": "previsoes_desempenho.json",
    "local": "data/energia/previsoes/validacao_interna (fora do portal)",
    "motivo": "Número de desempenho do teste retrospectivo: só entra no portal depois da liberação formal pelo responsável pela plataforma (registro de modelos); até lá é calculado e validado, sem publicação."
   },
   "arquivo": "pipeline/energia/metricas/previsoes.py"
  },
  {
   "id": "qualidade_atendimento_telefonico",
   "titulo": "Qualidade do atendimento telefônico (INS, IAb, ICO)",
   "pergunta": "A central telefônica da distribuidora atende as ligações dentro do padrão regulatório?",
   "definicao": "Indicadores mensais publicados pela ANEEL para as distribuidoras obrigadas a manter central de teleatendimento: INS (chamadas atendidas em até 30 s ÷ chamadas recebidas menos as abandonadas em até 30 s; padrão ≥ 85%), IAb (abandonadas depois de 30 s ÷ o mesmo denominador; padrão ≤ 4%) e ICO (chamadas ocupadas ÷ oferecidas; padrão ≤ 2%), só com os períodos típicos; os valores cheios incluem os atípicos.",
   "unidade": "% e chamadas",
   "grao_geografico": "distribuidora (CNPJ) e Brasil (só as obrigadas)",
   "grao_temporal": "mês; ano (contagem de meses no padrão e ICO anual)",
   "fontes": [
    "aneel_atendimento_telefonico",
    "aneel_continuidade"
   ],
   "formula": "ICO(g, ano) = 100 × Σ_m chamadas ocupadas ÷ Σ_m chamadas oferecidas; meses no padrão = #(meses com o indicador dentro do padrão)",
   "numerador": "chamadas ocupadas (ICO); meses dentro do padrão (INS, IAb)",
   "denominador": "chamadas oferecidas (ICO); meses publicados (INS, IAb)",
   "regra_agregacao": "INS e IAb não são agregados (a fonte não publica os numeradores em até 30 s): o resumo anual e nacional conta os distribuidora-meses dentro do padrão. ICO agregado por soma das contagens. Chamadas por mil UCs com as UCs médias do ano.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês",
    "ano",
    "indicador"
   ],
   "regras_comparabilidade": [
    "Só as 40 distribuidoras com mais de 60 mil UCs (39 em 2014 e 2015); as menores não publicam.",
    "Regulado (períodos típicos) e cheio (todos os períodos) não se misturam.",
    "Ano corrente marcado como incompleto."
   ],
   "regra_cobertura": "Distribuidoras obrigadas, de 2014 em diante; cobertura em UCs publicada por ano.",
   "politica_ausencia": "Mês não publicado fica ausente; percentual com denominador zero na fonte é publicado como a fonte o traz.",
   "validacoes": [
    "Chave (CNPJ, ano, mês) única no arquivo; repetição com valor diferente é contada.",
    "ICO publicado = chamadas ocupadas ÷ oferecidas em todas as linhas (conferido); ICO acima de 100% (mais ocupadas que oferecidas) contado como ressalva em validacao."
   ],
   "limitacoes": [
    "Indicador sobre a central telefônica: não mede o atendimento presencial, digital nem a solução do problema.",
    "A fonte publica fração (0 a 1) em campos chamados Pct; o valor é multiplicado por 100."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_compensacoes",
   "titulo": "Compensações pagas por violação dos limites individuais de continuidade",
   "pergunta": "Quanto as distribuidoras pagaram em compensações por interrupções acima dos limites individuais?",
   "definicao": "Soma dos valores pagos e das quantidades de compensação publicadas pela ANEEL por conjunto, tipo (mensal, trimestral, anual, DICRI, DISE), tensão e competência, com unidades consumidoras (UC) e unidades geradoras (UG) separadas; o total de UC é o universo do número que a ANEEL divulga.",
   "unidade": "R$ nominais; ocorrências de compensação",
   "grao_geografico": "distribuidora (CNPJ) e Brasil",
   "grao_temporal": "competência mensal (trimestre e ano para os tipos trimestral e anual)",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "valor(g, competência) = Σ_c Σ_tensão valor pago(c, tensão, tipo, competência)",
   "numerador": "valor pago (R$) ou quantidade",
   "regra_agregacao": "Soma simples (grandezas aditivas); valor por UC = valor anual ÷ UCs médias do ano, só como normalização.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "competência",
    "tipo",
    "unidade consumidora ou geradora",
    "tensão"
   ],
   "regras_comparabilidade": [
    "Reais correntes, sem correção pela inflação.",
    "Desde 2022 (mudança do PRODIST, REN 956/2021) as compensações trimestrais e anuais de unidades consumidoras não são publicadas (ausência, não zero); as de unidades geradoras vêm com valor zero. DISE só desde 2026.",
    "O total divulgado pela ANEEL é só de unidades consumidoras: comparar com valor_uc, não com o total que inclui unidades geradoras.",
    "Mês ou ano sem todas as distribuidoras fica marcado como incompleto."
   ],
   "regra_cobertura": "Compensações publicadas desde 2011.",
   "politica_ausencia": "Distribuidora sem linha na competência fica sem valor; zero só quando a fonte publica zero.",
   "validacoes": [
    "Sigla fora do padrão PG/QT de continuidade é contada e não somada.",
    "Soma relida do Parquet por outro código no teste.",
    "Total de UC conferido com o total da notícia anual da ANEEL (tolerância R$ 0,5 milhão e 50 mil compensações, a precisão divulgada): 2024 dentro; 2023 e 2025 fora, sem explicação verificada (ressalva na evidência)."
   ],
   "limitacoes": [
    "Quantidade é de ocorrências, não de consumidores distintos.",
    "A fonte não informa a data do crédito, só a competência.",
    "O crédito individual não pode ser estimado a partir do DEC ou FEC do conjunto."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_dec_conjunto",
   "titulo": "DEC do conjunto de unidades consumidoras",
   "pergunta": "Por quanto tempo, em média, cada unidade consumidora do conjunto ficou sem energia?",
   "definicao": "Duração Equivalente de Interrupção por Unidade Consumidora apurada pela distribuidora para o conjunto (PRODIST, Módulo 8): soma das durações das interrupções de mais de 3 minutos de cada UC dividida pelo número de UCs. Valor mensal publicado pela ANEEL; o anual é a soma dos 12 meses. O apurado exclui interrupções em situação de emergência, dia crítico, de origem externa e por ação do ONS; elas aparecem nas parcelas.",
   "unidade": "horas e centésimos de hora por unidade consumidora (10,50 h = 10 h 30 min)",
   "grao_geografico": "conjunto de unidades consumidoras (IdeConjUndConsumidoras)",
   "grao_temporal": "mês; ano civil (soma dos meses)",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "DEC(c, ano) = Σ_m DEC(c, m), só com os 12 meses publicados; soma em centésimos exatos (cada mês é publicado com duas casas)",
   "regra_agregacao": "Anual = soma dos meses do conjunto, arredondada ao centésimo para tirar o resíduo do ponto flutuante (a soma de valores com duas casas tem duas casas). Não se faz média simples entre conjuntos: agregados usam qualidade_dec_distribuidora.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "conjunto",
    "distribuidora (CNPJ)",
    "mês",
    "ano",
    "parcela"
   ],
   "regras_comparabilidade": [
    "Comparar com o limite do mesmo conjunto e do mesmo ano.",
    "Ano parcial não é comparado com ano completo."
   ],
   "regra_cobertura": "Conjuntos publicados nos Parquets de continuidade de 2000 em diante (2000 a 2009 sem as parcelas atuais).",
   "politica_ausencia": "Conjunto sem valor ou sem número de UCs no mês fica fora do numerador e do denominador daquele mês (nunca vira zero); ano com menos de 12 meses não tem valor anual; mês nacional em que as UCs com DEC ficam abaixo de 99% do máximo das UCs com NumCon nos 12 meses anteriores fica marcado como incompleto (UCs e não número de conjuntos: redefinições de conjuntos mudam a contagem sem mudar o universo); distribuidora-mês com NumCon implausível fica fora do Brasil e, com mais de um conjunto, sem DEC e FEC.",
   "validacoes": [
    "Chave (CNPJ, conjunto, ano, mês, sigla) única; duplicata com valor diferente é contada.",
    "Desde 2022, DEC = DECIP + DECIND em todos os conjunto-meses (tolerância 0,01 h de arredondamento).",
    "Teste relê o Parquet por outro código e confere valores concretos."
   ],
   "limitacoes": [
    "Média por unidade consumidora: não descreve o tempo sem energia de cada pessoa nem de cada município.",
    "Apurado e enviado pela distribuidora; sujeito a revisão e fiscalização da ANEEL."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_dec_distribuidora",
   "titulo": "DEC da distribuidora e do Brasil",
   "pergunta": "Por quanto tempo, em média, os consumidores da distribuidora (ou do país) ficaram sem energia no ano?",
   "definicao": "Média mensal do DEC dos conjuntos ponderada pelo número de unidades consumidoras de cada conjunto no mês, somada nos 12 meses. É o DEC da união dos conjuntos (Σ DIC ÷ UCs), a regra usada pela ANEEL no DGC do ranking da continuidade.",
   "unidade": "horas e centésimos de hora por unidade consumidora (10,50 h = 10 h 30 min)",
   "grao_geografico": "distribuidora (CNPJ de 14 dígitos) e Brasil",
   "grao_temporal": "mês e ano civil",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "DEC(g, m) = Σ_c DEC(c, m) × UC(c, m) ÷ Σ_c UC(c, m); DEC(g, ano) = Σ_m DEC(g, m)",
   "numerador": "Σ_c DEC(c, m) × UC(c, m), em horas × UC",
   "denominador": "Σ_c UC(c, m) dos conjuntos com DEC e número de UCs no mês",
   "regra_agregacao": "Ponderação por UCs no mês; soma dos meses no ano. Nunca média simples de conjuntos ou de distribuidoras.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês",
    "ano",
    "parcela"
   ],
   "regras_comparabilidade": [
    "Comparar com o limite agregado do mesmo ano.",
    "Ano corrente só contra os mesmos meses do ano anterior, e só com os meses nacionais completos nos dois anos.",
    "Comparar o Brasil com o número divulgado pela ANEEL exige o mesmo universo (concessionárias).",
    "Ano com quebra de perímetro da distribuidora não é comparável com o anterior sem a ressalva.",
    "2010 a 2021: parte dos conjuntos incluía as parcelas externas XN e XP no apurado (identidade publicada por ano; em 2021, todos os 1.482 conjunto-meses divergentes têm DEC = IP + IND + XN + XP).",
    "2000 a 2009: outra desagregação e outros critérios de expurgo na fonte; comparação de nível com ressalva."
   ],
   "regra_cobertura": "Distribuidoras com conjuntos no Parquet de continuidade; cobertura mensal (UCs com DEC ÷ UCs com número de UCs) publicada.",
   "politica_ausencia": "Conjunto sem valor ou sem número de UCs no mês fica fora do numerador e do denominador daquele mês (nunca vira zero); ano com menos de 12 meses não tem valor anual; mês nacional em que as UCs com DEC ficam abaixo de 99% do máximo das UCs com NumCon nos 12 meses anteriores fica marcado como incompleto (UCs e não número de conjuntos: redefinições de conjuntos mudam a contagem sem mudar o universo); distribuidora-mês com NumCon implausível fica fora do Brasil e, com mais de um conjunto, sem DEC e FEC.",
   "validacoes": [
    "Reconciliação: DGC calculado com esta regra contra o DGC publicado pela ANEEL no ranking (tolerância 0,01, a precisão publicada).",
    "Reconciliação externa do Brasil: DEC e FEC só das concessionárias contra o número da notícia anual da ANEEL de 2023 a 2025 (tolerância 0,005, a precisão divulgada).",
    "Identidade executada em cada construção: Brasil refeito a partir das distribuidoras (Σ DEC × UC ÷ Σ UC) = agregado direto dos conjuntos calculado na importação (tolerância 1e-6); reprovação derruba a publicação.",
    "Controle de NumCon por distribuidora e mês: média de até 1 UC por conjunto, ou queda ou pico isolado de mais da metade contra os meses vizinhos, tira o mês do Brasil e, com mais de um conjunto, do DEC e do FEC da distribuidora (ressalva em validacao).",
    "Quebra de perímetro (incorporação ou cessão de área) detectada por variação de mais de 10% nas UCs com continuidade territorial com outra distribuidora que perde UCs no mesmo ano; marcada na série."
   ],
   "limitacoes": [
    "Média por unidade consumidora: não descreve o tempo sem energia de cada pessoa nem de cada município.",
    "Distribuidora sem conjuntos no conjunto de dados (algumas permissionárias pequenas) não aparece.",
    "O Brasil publicado cobre todas as distribuidoras, inclusive permissionárias; o número divulgado pela ANEEL cobre só as concessionárias e vai em dec_concessionarias (só a partir de 2019, porque distribuidoras encerradas antes não têm classificação publicada nas manifestações nem no IASC)."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_dgc",
   "titulo": "DGC: desempenho global de continuidade",
   "pergunta": "Quão longe dos limites regulatórios, somando duração e frequência, ficou a distribuidora no ano?",
   "definicao": "Indicador de desempenho global de continuidade da ANEEL: média aritmética simples das razões apurado ÷ limite anual de DEC e de FEC da distribuidora. Abaixo de 1, dentro dos limites na média; acima de 1, acima.",
   "unidade": "razão adimensional",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_continuidade",
    "aneel_ranking_continuidade"
   ],
   "formula": "DGC(g, ano) = [DEC(g, ano) ÷ L_DEC(g, ano) + FEC(g, ano) ÷ L_FEC(g, ano)] ÷ 2",
   "regra_agregacao": "Calculado depois da agregação ponderada de apurado e limite; nunca média de DGC de conjuntos.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano"
   ],
   "regras_comparabilidade": [
    "A ANEEL ranqueia separadamente distribuidoras com mais e com até 400 mil UCs.",
    "Distribuidoras em regime de designação ou em carência de contrato novo ficaram fora de rankings de alguns anos."
   ],
   "regra_cobertura": "Distribuidoras com 12 meses e limite de DEC e FEC no ano.",
   "politica_ausencia": "Sem limite no ano: DGC ausente.",
   "validacoes": [
    "Reconciliado com o DGC publicado nas páginas do ranking da continuidade de 2021 a 2025 (tolerância 0,01, a precisão publicada); divergências listadas na gold."
   ],
   "limitacoes": [
    "As divergências com o ranking não foram explicadas: revisão posterior dos indicadores, decisão judicial ou limite diferente na nota técnica são hipóteses não verificadas."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_eventos_emergencia",
   "titulo": "Eventos em situação de emergência",
   "pergunta": "Quais eventos extremos a distribuidora declarou e quanto eles superaram o critério de emergência?",
   "definicao": "Eventos declarados pelas distribuidoras como situação de emergência, com início, fim, CHI do evento (consumidor × hora interrompido) e CHI limite da distribuidora; a razão CHI do evento ÷ CHI limite mostra quantas vezes o evento superou o critério.",
   "unidade": "eventos; horas; consumidor × hora; razão",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "evento",
   "fontes": [
    "aneel_eventos_emergencia"
   ],
   "formula": "duração = fim − início (horas); razão CHI = CHI do evento ÷ CHI limite",
   "regra_agregacao": "Não agregado: publicado por evento; contagem e duração mediana como resumo.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "evento",
    "origem"
   ],
   "regras_comparabilidade": [
    "Base publicada a partir de 2026; não há série anterior no mesmo formato."
   ],
   "regra_cobertura": "Eventos publicados no arquivo de 2026.",
   "politica_ausencia": "CHI limite vazio na fonte fica ausente e a razão não é calculada.",
   "validacoes": [
    "Datas lidas como publicadas; duração negativa ou extrema conferida no arquivo original antes de publicar."
   ],
   "limitacoes": [
    "Evento declarado pela distribuidora e verificado pela ANEEL; a interrupção expurgada entra na parcela de emergência do DEC."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_fec_conjunto",
   "titulo": "FEC do conjunto de unidades consumidoras",
   "pergunta": "Quantas vezes, em média, cada unidade consumidora do conjunto ficou sem energia?",
   "definicao": "Frequência Equivalente de Interrupção por Unidade Consumidora: número de interrupções de mais de 3 minutos de cada UC somado e dividido pelo número de UCs do conjunto. Valor mensal; anual = soma dos meses. O apurado exclui interrupções em situação de emergência, dia crítico, de origem externa e por ação do ONS; elas aparecem nas parcelas.",
   "unidade": "interrupções e centésimos de interrupção por unidade consumidora",
   "grao_geografico": "conjunto de unidades consumidoras",
   "grao_temporal": "mês; ano civil",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "FEC(c, ano) = Σ_m FEC(c, m), só com os 12 meses publicados",
   "regra_agregacao": "Como o DEC do conjunto.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "conjunto",
    "distribuidora (CNPJ)",
    "mês",
    "ano",
    "parcela"
   ],
   "regras_comparabilidade": [
    "Comparar com o limite de FEC do mesmo conjunto e ano."
   ],
   "regra_cobertura": "Conjuntos publicados de 2000 em diante.",
   "politica_ausencia": "Conjunto sem valor ou sem número de UCs no mês fica fora do numerador e do denominador daquele mês (nunca vira zero); ano com menos de 12 meses não tem valor anual; mês nacional em que as UCs com DEC ficam abaixo de 99% do máximo das UCs com NumCon nos 12 meses anteriores fica marcado como incompleto (UCs e não número de conjuntos: redefinições de conjuntos mudam a contagem sem mudar o universo); distribuidora-mês com NumCon implausível fica fora do Brasil e, com mais de um conjunto, sem DEC e FEC.",
   "validacoes": [
    "Desde 2022, FEC = FECIP + FECIND em todos os conjunto-meses (tolerância 0,01)."
   ],
   "limitacoes": [
    "Média por unidade consumidora: não descreve o tempo sem energia de cada pessoa nem de cada município."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_fec_distribuidora",
   "titulo": "FEC da distribuidora e do Brasil",
   "pergunta": "Quantas vezes, em média, os consumidores da distribuidora (ou do país) ficaram sem energia no ano?",
   "definicao": "Média mensal do FEC dos conjuntos ponderada pelo número de UCs de cada conjunto no mês, somada nos 12 meses.",
   "unidade": "interrupções e centésimos de interrupção por unidade consumidora",
   "grao_geografico": "distribuidora (CNPJ) e Brasil",
   "grao_temporal": "mês e ano civil",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "FEC(g, m) = Σ_c FEC(c, m) × UC(c, m) ÷ Σ_c UC(c, m); FEC(g, ano) = Σ_m FEC(g, m)",
   "numerador": "Σ_c FEC(c, m) × UC(c, m)",
   "denominador": "Σ_c UC(c, m) dos conjuntos com FEC no mês",
   "regra_agregacao": "Como o DEC da distribuidora.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês",
    "ano",
    "parcela"
   ],
   "regras_comparabilidade": [
    "Como o DEC da distribuidora."
   ],
   "regra_cobertura": "Como o DEC da distribuidora.",
   "politica_ausencia": "Conjunto sem valor ou sem número de UCs no mês fica fora do numerador e do denominador daquele mês (nunca vira zero); ano com menos de 12 meses não tem valor anual; mês nacional em que as UCs com DEC ficam abaixo de 99% do máximo das UCs com NumCon nos 12 meses anteriores fica marcado como incompleto (UCs e não número de conjuntos: redefinições de conjuntos mudam a contagem sem mudar o universo); distribuidora-mês com NumCon implausível fica fora do Brasil e, com mais de um conjunto, sem DEC e FEC.",
   "validacoes": [
    "Reconciliação com o DGC publicado (inclui a razão de FEC)."
   ],
   "limitacoes": [
    "Média por unidade consumidora: não descreve o tempo sem energia de cada pessoa nem de cada município."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_iasc",
   "titulo": "Índice ANEEL de Satisfação do Consumidor (IASC)",
   "pergunta": "Quão satisfeitos os consumidores residenciais dizem estar com a distribuidora?",
   "definicao": "Índice de 0 a 100 estimado pela ANEEL a partir de pesquisa amostral anual com consumidores residenciais de cada distribuidora (construto de satisfação), publicado com a ordem na categoria e com as contagens de entrevistados.",
   "unidade": "índice de 0 a 100; entrevistas",
   "grao_geografico": "distribuidora (CNPJ)",
   "grao_temporal": "ano da pesquisa",
   "fontes": [
    "aneel_iasc"
   ],
   "regra_agregacao": "Não é agregado: publicado por distribuidora; resumo nacional apenas por quantis entre distribuidoras.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "ESTIMADO",
   "dimensoes": [
    "distribuidora",
    "ano",
    "categoria da pesquisa"
   ],
   "regras_comparabilidade": [
    "A ANEEL compara distribuidoras dentro de categorias de porte e região.",
    "Em 2020 o construto de fidelidade não se formou (ausência publicada)."
   ],
   "regra_cobertura": "Distribuidoras pesquisadas no ano (concessionárias e permissionárias).",
   "politica_ausencia": "Construto não publicado fica ausente.",
   "validacoes": [
    "Escala de 0 a 100 conferida em cada construção (reprovação derruba a publicação).",
    "Conferência documental (não automática): a soma das amostras por distribuidora de 2025, 29.624 entrevistas em 103 distribuidoras, é coerente com as cerca de 30 mil que a ANEEL declara no conjunto de dados."
   ],
   "limitacoes": [
    "Estimativa amostral sem intervalo de confiança publicado por distribuidora.",
    "Só consumidores residenciais."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_limite_e_razao",
   "titulo": "Limite anual e distância ao limite (razão apurado ÷ limite)",
   "pergunta": "O serviço cumpriu o padrão regulatório no ano?",
   "definicao": "Limite anual de DEC e FEC fixado pela ANEEL para cada conjunto e ano. Para a distribuidora e o Brasil, média dos limites dos conjuntos ponderada pelas UCs médias do ano. Razão = apurado anual ÷ limite do mesmo ano; acima de 1 = transgressão.",
   "unidade": "horas, interrupções e razão adimensional",
   "grao_geografico": "conjunto, distribuidora e Brasil",
   "grao_temporal": "ano civil (vigência do limite)",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "L(g, ano) = Σ_c L(c, ano) × UCmédia(c, ano) ÷ Σ_c UCmédia(c, ano); razão = DEC(g, ano) ÷ L(g, ano)",
   "numerador": "DEC ou FEC apurado no ano",
   "denominador": "limite do mesmo ano e do mesmo universo de conjuntos",
   "regra_agregacao": "Limite ponderado pelas UCs; razão calculada depois da agregação (nunca média de razões de conjuntos).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "conjunto",
    "distribuidora",
    "ano"
   ],
   "regras_comparabilidade": [
    "Realizado e limite sempre do mesmo ano e da mesma cobertura.",
    "Conjunto sem limite no ano fica fora da razão."
   ],
   "regra_cobertura": "Conjuntos com 12 meses e limite publicado no ano; cobertura do limite (fração de UCs) publicada por distribuidora.",
   "politica_ausencia": "Sem limite publicado para o conjunto e ano: razão ausente; distribuidora em carência de contrato novo fica sem razão.",
   "validacoes": [
    "DGC = (razão DEC + razão FEC) ÷ 2 reconciliado com o ranking da ANEEL de 2021 em diante."
   ],
   "limitacoes": [
    "A distribuição dos conjuntos (quantis e caudas) é publicada ao lado da média para não esconder conjuntos muito acima do limite."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_mapa_intervalo_municipal",
   "titulo": "Intervalo de DEC e FEC dos conjuntos que atendem o município",
   "pergunta": "Que valores de continuidade têm os conjuntos que atendem este município?",
   "definicao": "Para cada município, o menor e o maior DEC (e FEC) anual entre os conjuntos ativos no ano que o atendem segundo a base IndQual Município, com a classificação da relação (conjunto exclusivo, conjunto compartilhado com outros municípios, vários conjuntos).",
   "unidade": "horas e centésimos de hora por unidade consumidora (10,50 h = 10 h 30 min); interrupções e centésimos de interrupção por unidade consumidora",
   "grao_geografico": "município (atribuição por conjunto, não medição municipal)",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_continuidade",
    "aneel_indqual_municipio"
   ],
   "formula": "dec_min(mun) = min_c DEC(c, ano); dec_max(mun) = max_c DEC(c, ano), c nos conjuntos ativos ligados ao município",
   "regra_agregacao": "Sem média municipal: a base não informa quantas UCs de cada conjunto estão no município.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "município",
    "ano",
    "relação conjunto × município"
   ],
   "regras_comparabilidade": [
    "Nunca ler o valor como DEC medido no município: quando o conjunto cobre vários municípios, todos recebem o mesmo intervalo."
   ],
   "regra_cobertura": "Municípios da base IndQual Município com ao menos um conjunto com DEC no ano.",
   "politica_ausencia": "Município sem conjunto ativo no ano fica sem valor (sem_conjunto_ativo).",
   "validacoes": [
    "Só conjuntos com DEC publicado no ano entram (a base acumula conjuntos antigos sem vigência).",
    "Códigos conferidos com o cadastro de municípios do IBGE (API de localidades) e com a malha do mapa: código sem município fica fora do mapa e listado; município sem relação publicada fica no mapa sem valor."
   ],
   "limitacoes": [
    "A base não traz vigência da relação nem o número de UCs por município e conjunto."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_parcelas",
   "titulo": "Parcelas do DEC e do FEC por origem e expurgo",
   "pergunta": "Quanto do tempo sem energia foi expurgado do apurado e por quê?",
   "definicao": "Parcelas publicadas pela ANEEL: interna programada (IP) e não programada não expurgável (IND), que formam o apurado; situação de emergência (INE); dia crítico (INC, IPC); origem externa (XN, XP, XNC, XPC); racionamento ou alívio de carga pelo ONS (INO). O total de todas as parcelas é o DEC de todas as origens publicadas.",
   "unidade": "horas e centésimos de hora por unidade consumidora (10,50 h = 10 h 30 min); interrupções e centésimos de interrupção por unidade consumidora",
   "grao_geografico": "distribuidora (CNPJ) e Brasil",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "P(g, ano) = Σ_m [Σ_c P(c, m) × UC(c, m) ÷ Σ_c UC(c, m)], só conjuntos que informaram a parcela no mês",
   "numerador": "Σ_c P(c, m) × UC(c, m)",
   "denominador": "Σ_c UC(c, m) dos conjuntos que informaram a parcela",
   "regra_agregacao": "Ponderação por UCs no mês, soma no ano; a cobertura da parcela (fração das UC-mês com a parcela informada) é guardada no silver.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano",
    "grupo de parcela"
   ],
   "regras_comparabilidade": [
    "Desde 2022 as parcelas externas em dia crítico (XNC, XPC) deixaram de ser informadas pela maioria dos conjuntos: o grupo externa antes e depois de 2022 não é homogêneo."
   ],
   "regra_cobertura": "Conjuntos com as parcelas IP e IND informadas entram no total.",
   "politica_ausencia": "Parcela não informada não é zero: fica fora do numerador e do denominador daquela parcela.",
   "validacoes": [
    "Soma dos grupos = total de todas as parcelas publicadas.",
    "Apurado = IP + IND desde 2022."
   ],
   "limitacoes": [
    "Interrupções de menos de 3 minutos e as de responsabilidade do consumidor não são publicadas em nenhuma parcela."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_pct_conjuntos_acima",
   "titulo": "Conjuntos acima do limite de DEC",
   "pergunta": "Quantos conjuntos, e quantas unidades consumidoras, ficaram acima do limite de DEC no ano?",
   "definicao": "Número e percentual de conjuntos com 12 meses publicados e limite de DEC no ano cujo DEC anual é maior que o limite; também a fração das UCs (médias do ano) nesses conjuntos.",
   "unidade": "% dos conjuntos e % das UCs",
   "grao_geografico": "Brasil",
   "grao_temporal": "ano civil",
   "fontes": [
    "aneel_continuidade"
   ],
   "formula": "100 × #(DEC(c, ano) > L(c, ano)) ÷ #(conjuntos com limite)",
   "numerador": "conjuntos com DEC anual acima do limite",
   "denominador": "conjuntos com 12 meses e limite",
   "regra_agregacao": "Contagem simples de conjuntos; versão ponderada por UCs publicada ao lado.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano"
   ],
   "regras_comparabilidade": [
    "Conjuntos têm tamanhos muito diferentes: a contagem e a fração de UCs respondem perguntas diferentes."
   ],
   "regra_cobertura": "Conjuntos com 12 meses e limite de DEC publicado no ano.",
   "politica_ausencia": "Sem limite ou com menos de 12 meses: fora do denominador.",
   "validacoes": [
    "Comparação estrita em centésimos inteiros (DEC anual e limite como a ANEEL publica, com duas casas): igual ao limite não conta como acima.",
    "Recontagem independente nas linhas do CSV por década em cada construção, com o resultado na evidência."
   ],
   "limitacoes": [
    "Estar acima do limite coletivo não implica que cada UC do conjunto tenha recebido compensação."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_reclamacoes_por_uc",
   "titulo": "Reclamações por mil unidades consumidoras",
   "pergunta": "Quantas reclamações os consumidores registram na distribuidora e na ANEEL, considerando o tamanho de cada uma?",
   "definicao": "Reclamações recebidas no ano no 1º nível (SAC) e no 2º nível (ouvidoria) da distribuidora, pela tipologia da REN 1.000/2021 (grupo 102; em 2023 a tipologia vem do IdeTipoRCA traduzido por tabela explícita, porque o arquivo ainda usa códigos antigos), e reclamações registradas na Ouvidoria Setorial da ANEEL, divididas pelas UCs médias da mesma distribuidora no mesmo ano.",
   "unidade": "reclamações por mil UCs (distribuidora) e por 100 mil UCs (ANEEL)",
   "grao_geografico": "distribuidora (CNPJ) e Brasil",
   "grao_temporal": "ano civil (meses publicados informados)",
   "fontes": [
    "aneel_manifestacoes",
    "aneel_ouvidoria",
    "aneel_continuidade"
   ],
   "formula": "taxa = fator × Σ reclamações(g, ano) ÷ UCs médias(g, ano)",
   "numerador": "reclamações recebidas no ano",
   "denominador": "UCs médias da distribuidora no mesmo ano (indicadores de continuidade)",
   "regra_agregacao": "Brasil = Σ reclamações ÷ Σ UCs das distribuidoras com os dois dados (mesmo universo no numerador e no denominador).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "ano",
    "nível",
    "tipo de reclamação"
   ],
   "regras_comparabilidade": [
    "Nunca comparar números absolutos sem a população exposta.",
    "Ano parcial não é comparado com ano completo.",
    "Série de 2010 a 2022 usa outra tipologia e não é somada."
   ],
   "regra_cobertura": "Distribuidoras com manifestações e com UCs nos indicadores de continuidade.",
   "politica_ausencia": "Sem UCs no ano: taxa ausente. Manifestações: distribuidora sem os 12 meses enviados fica sem taxa e fora do agregado nacional (mês não enviado é ausência). Ouvidoria ANEEL: registro de solicitações; mês sem solicitação da distribuidora é zero registrado, mas distribuidora sem nenhuma solicitação no ano fica fora do agregado (zero e CNPJ não vinculado não se distinguem), com a cobertura em UCs publicada.",
   "validacoes": [
    "Reclamação identificada pelo grupo 102 da tipologia; linhas sem tipologia reconhecida contadas à parte (sem_grupo).",
    "2023: reclamações de falta de energia pelo IdeTipoRCA conferidas com a soma pela descrição publicada (DscManifestacao) no teste.",
    "Arquivo da Ouvidoria de 2023 em Parquet conferido com o CSV do mesmo ano: 603.640 linhas e as mesmas somas por categoria."
   ],
   "limitacoes": [
    "Registro depende dos canais e da prática de cada distribuidora."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "qualidade_tmae",
   "titulo": "Tempo médio de atendimento a emergências (TMAE)",
   "pergunta": "Quanto tempo, em média, a distribuidora leva para atender uma ocorrência emergencial?",
   "definicao": "TMAE = TMP (preparação) + TMD (deslocamento) + TME (execução), em minutos, apurado por conjunto e mês; agregado pela média ponderada pelo número de ocorrências emergenciais.",
   "unidade": "minutos",
   "grao_geografico": "distribuidora (CNPJ) e Brasil",
   "grao_temporal": "mês; ano",
   "fontes": [
    "aneel_atendimento_emergencial"
   ],
   "formula": "TMAE(g, período) = Σ (TMP + TMD + TME)(c, m) × ocorrências(c, m) ÷ Σ ocorrências(c, m)",
   "numerador": "Σ tempo médio × ocorrências",
   "denominador": "Σ ocorrências com os três tempos informados",
   "regra_agregacao": "Ponderação pelo número de ocorrências.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "distribuidora",
    "mês",
    "ano"
   ],
   "regras_comparabilidade": [
    "Distribuidoras com redes rurais extensas têm deslocamentos maiores."
   ],
   "regra_cobertura": "Conjuntos com ocorrências e os três tempos informados, de 2015 em diante.",
   "politica_ausencia": "Conjunto-mês sem algum dos três tempos fica fora da média.",
   "validacoes": [
    "Controle: conjunto-meses com ocorrências com interrupção (Nie) maiores que o total de ocorrências (NumOcorr) são contados em cada construção e publicados como ressalva em validacao; a fonte publica esses casos e eles não são corrigidos. Nie não entra no TMAE.",
    "TMAE do ano corrente marcado como parcial (meses publicados e período)."
   ],
   "limitacoes": [
    "Média: não mostra os atendimentos muito longos."
   ],
   "gold": "qualidade.json",
   "paginas": [
    "/setor-eletrico/qualidade"
   ],
   "arquivo": "pipeline/energia/metricas/qualidade.py"
  },
  {
   "id": "razao_mmgd_ons_capacidade_aneel",
   "titulo": "Razão entre a MMGD estimada pelo ONS e a capacidade cadastrada na ANEEL",
   "pergunta": "A estimativa operacional do ONS é coerente com o tamanho do parque cadastrado?",
   "definicao": "MMGD estimada no SIN (MWmed) dividida pela capacidade cadastrada no Brasil (MW), média do estoque no início e no fim do mês. Comparação de coerência entre duas fontes, não fator de capacidade medido.",
   "unidade": "%",
   "grao_geografico": "SIN (numerador) e Brasil (denominador)",
   "grao_temporal": "mês",
   "fontes": [
    "ons_carga_verificada_mmgd",
    "aneel_mmgd_empreendimentos"
   ],
   "formula": "100 × MWmed estimado (SIN) ÷ ((estoque no início do mês + estoque no fim do mês) ÷ 2)",
   "numerador": "MMGD estimada pelo ONS no SIN (MWmed)",
   "denominador": "capacidade de MMGD cadastrada na ANEEL (MW), Brasil",
   "regra_agregacao": "Mensal; sem agregação anual.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "Perímetros diferentes (SIN × Brasil); conexões ainda não cadastradas nos meses recentes inflariam a razão."
   ],
   "regra_cobertura": "Meses completos da estimativa do ONS e não provisórios no cadastro da ANEEL (anteriores aos 6 meses que precedem a data do cadastro).",
   "politica_ausencia": "Mês incompleto no ONS ou provisório no cadastro: razão ausente (o denominador ainda pode crescer em capturas seguintes).",
   "validacoes": [
    "Identidade de estoque: estoque mensal acumulado até a data do cadastro + unidades sem data de conexão = total cadastrado (unidades exatas; 0,01 kW). O denominador usa o estoque com data, que não inclui as unidades de data sentinela."
   ],
   "limitacoes": [
    "Não é fator de capacidade e não deve ser usado para estimar geração municipal."
   ],
   "gold": "transicao.json",
   "paginas": [
    "/setor-eletrico/transicao"
   ],
   "arquivo": "pipeline/energia/metricas/transicao.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_atls_horas_violacao",
   "titulo": "Horas acima do limite sistêmico (ATLS)",
   "pergunta": "Quando há evidência publicada de fluxo acima do limite de segurança?",
   "definicao": "Tempo em que cada fluxo sistêmico monitorado pelo ONS ficou acima do limite estabelecido pelos estudos elétricos, como publicado no indicador ATLS (Submódulo 9.1).",
   "unidade": "horas",
   "grao_geografico": "fluxo sistêmico do ONS",
   "grao_temporal": "mês e 12 meses",
   "fontes": [
    "ons_rede_atls"
   ],
   "formula": "horas_12m = Σ num_horasviolacao mensal dos 12 últimos meses publicados (soma feita pelo observatório)",
   "regra_agregacao": "valores mensais como publicados; somas de 12 meses e do histórico calculadas pelo observatório",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fluxo",
    "mês"
   ],
   "regras_comparabilidade": [
    "Fluxos mudam ao longo do tempo; compare só meses em que o fluxo é publicado."
   ],
   "regra_cobertura": "Meses publicados.",
   "politica_ausencia": "Mês não publicado fica fora (não vira zero).",
   "validacoes": [
    "acumulado no ano publicado = soma dos meses",
    "ATLS publicado = 1 − horas ÷ período (o valor vem em fração, não em %)"
   ],
   "limitacoes": [
    "O valor do limite não é publicado; o indicador não mede quanto da capacidade foi usada.",
    "Violações de menos de 10 minutos e dentro da banda morta (50 MW ou 5% do limite) não entram."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_desvio_programado",
   "titulo": "Desvio entre intercâmbio verificado e programado",
   "pergunta": "Quanto o fluxo divergiu do programa?",
   "definicao": "Verificado menos programado, hora a hora, na mesma orientação; desvio material quando o módulo chega a 1.000 MWmed.",
   "unidade": "MWmed por hora; MWh por dia; horas",
   "grao_geografico": "fronteira e país",
   "grao_temporal": "hora, dia e mês",
   "fontes": [
    "ons_rede_intercambio_nacional",
    "ons_rede_intercambio_internacional",
    "ons_rede_pdo_conversoras"
   ],
   "formula": "desvio_h = verificado_h − programado_h; material = |desvio_h| ≥ 1.000 MWmed",
   "numerador": "Σ |desvio_h|",
   "denominador": "horas com os dois valores",
   "regra_agregacao": "média do desvio absoluto; contagem de horas materiais e de inversões de sentido",
   "natureza_fonte": "OBSERVADO e PREVISTO",
   "natureza_componentes": [
    {
     "componente": "intercâmbio verificado",
     "natureza": "OBSERVADO"
    },
    {
     "componente": "intercâmbio programado (programa do dia anterior)",
     "natureza": "PREVISTO"
    }
   ],
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "par",
    "hora",
    "dia",
    "mês"
   ],
   "regras_comparabilidade": [
    "Limiar único para todas as fronteiras; sensibilidade publicada em 500 e 2.000 MWmed.",
    "Dias com programado repetido por 6 horas ou mais numa fronteira entre subsistemas (22/08/2026: NE→SE/CO exatamente 0 nas 24 horas) são rotulados; a distribuição sai com e sem eles."
   ],
   "regra_cobertura": "Horas desde janeiro de 2026 (o programado não existe nos arquivos anteriores).",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "programado internacional igual ao PDO das conversoras em todas as horas da amostra conferida"
   ],
   "limitacoes": [
    "Desvio não é falha: a operação em tempo real corrige o programa.",
    "A fonte não identifica a revisão do programa das fronteiras entre subsistemas."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_exterior",
   "titulo": "Intercâmbio internacional por país",
   "pergunta": "Quanta energia o Brasil exportou e importou de cada país vizinho?",
   "definicao": "Soma mensal dos valores horários positivos (exportação) e do módulo dos negativos (importação) do intercâmbio verificado nas conversoras de fronteira.",
   "unidade": "MWh",
   "grao_geografico": "país",
   "grao_temporal": "mês e 12 meses",
   "fontes": [
    "ons_rede_intercambio_internacional"
   ],
   "formula": "exportação = Σ max(v_h, 0); importação = Σ max(−v_h, 0)",
   "regra_agregacao": "soma de energia horária",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "país",
    "mês"
   ],
   "regras_comparabilidade": [
    "Meses com horas ausentes trazem a contagem de horas."
   ],
   "regra_cobertura": "Horas publicadas.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido. País sem nenhuma hora publicada no período (Paraguai desde 21/02/2024) fica com exportação e importação nulas, não zero.",
   "validacoes": [
    "saldo de 12 meses igual ao intercâmbio do SIN no balanço nas horas comuns (tolerância 0,1 MWmed por hora)"
   ],
   "limitacoes": [
    "Itaipu é geração no conjunto do ONS, não intercâmbio.",
    "Paraguai (Acaray) aparece no arquivo até fevereiro de 2024, sempre com fluxo nulo."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_fluxo_contra_saldo",
   "titulo": "Energia contra o saldo",
   "pergunta": "Quanto do fluxo o saldo líquido esconde?",
   "definicao": "O menor dos dois sentidos no período: energia que circulou no sentido oposto ao saldo e que o saldo anula.",
   "unidade": "MWh",
   "grao_geografico": "fronteira entre subsistemas",
   "grao_temporal": "dia e janela de 30 dias",
   "fontes": [
    "ons_rede_intercambio_nacional"
   ],
   "formula": "contra_saldo = min(canônico, inverso)",
   "regra_agregacao": "calculada sobre as somas do período (a soma dos valores diários também é publicada)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fronteira",
    "dia"
   ],
   "regras_comparabilidade": [
    "A soma dos valores diários é menor ou igual ao valor da janela de 30 dias: a janela também conta dias inteiros no sentido oposto ao saldo do período."
   ],
   "regra_cobertura": "Horas publicadas.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "mesma conta pelo silver principal nas horas comuns (tolerância 0,001 MWh por hora)"
   ],
   "limitacoes": [
    "Reversão de fluxo não é, por si, sinal de problema: resulta do despacho e da geração variável.",
    "Não diz se a fronteira estava no limite: os limites operativos de intercâmbio não são públicos em formato estruturado."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_fluxo_liquido",
   "titulo": "Saldo líquido de energia na fronteira",
   "pergunta": "Quanta energia passou, no saldo, de uma região para a outra?",
   "definicao": "Energia no sentido canônico menos energia no sentido inverso, somando os valores horários do intercâmbio verificado.",
   "unidade": "MWh",
   "grao_geografico": "fronteira entre subsistemas",
   "grao_temporal": "dia, mês e janela de 30 dias",
   "fontes": [
    "ons_rede_intercambio_nacional"
   ],
   "formula": "líquido = Σ_h fluxo_h (MWmed × 1 h), com sinal da orientação canônica",
   "regra_agregacao": "soma de energia horária",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fronteira",
    "dia",
    "mês"
   ],
   "regras_comparabilidade": [
    "Meses e dias com horas faltantes são comparáveis só com o número de horas ao lado (coluna horas)."
   ],
   "regra_cobertura": "Todas as horas publicadas; dia com menos de 24 horas é marcado pela contagem.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "orientação de cada linha do arquivo convertida para a canônica (verificado e programado com o mesmo sinal)",
    "releitura igual à do silver principal nos arquivos idênticos (resultado em conferencia_silver_principal)",
    "sem duas linhas da mesma fronteira na mesma hora"
   ],
   "limitacoes": [
    "O saldo esconde a energia que circulou no sentido oposto (ver rede_fluxo_contra_saldo).",
    "Não diz se a fronteira estava no limite: os limites operativos de intercâmbio não são públicos em formato estruturado.",
    "Dados em consistência recorrente do ONS: valores recentes podem ser revisados."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_fluxo_por_sentido",
   "titulo": "Energia em cada sentido da fronteira",
   "pergunta": "Quanta energia foi de uma região para a outra, e quanta voltou?",
   "definicao": "Soma dos valores horários positivos (sentido canônico) e soma do módulo dos negativos (sentido inverso).",
   "unidade": "MWh",
   "grao_geografico": "fronteira entre subsistemas",
   "grao_temporal": "dia, mês e janela de 30 dias",
   "fontes": [
    "ons_rede_intercambio_nacional"
   ],
   "formula": "canônico = Σ max(f_h, 0); inverso = Σ max(−f_h, 0)",
   "regra_agregacao": "soma de energia horária por sentido",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fronteira",
    "sentido",
    "dia",
    "mês"
   ],
   "regras_comparabilidade": [
    "É bruto entre horas: dentro da hora, o valor publicado já é o saldo médio das linhas da fronteira."
   ],
   "regra_cobertura": "Horas publicadas.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "canônico − inverso = líquido",
    "reconferido contra o arquivo original do ONS por outro código (documento do módulo)"
   ],
   "limitacoes": [
    "A fonte não publica o fluxo de cada linha: sentidos opostos em linhas diferentes na mesma hora não aparecem.",
    "Não diz se a fronteira estava no limite: os limites operativos de intercâmbio não são públicos em formato estruturado."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_interrupcao_ens",
   "titulo": "Energia não suprida em interrupções de carga",
   "pergunta": "Quanta carga ficou sem energia por perturbações na rede?",
   "definicao": "Soma da energia não suprida dos registros de interrupção de carga publicados pelo ONS.",
   "unidade": "MWh",
   "grao_geografico": "SIN e subsistema",
   "grao_temporal": "ano e 12 meses",
   "fontes": [
    "ons_rede_interrupcao_carga"
   ],
   "formula": "Σ val_energianaosuprida_mwh",
   "regra_agregacao": "soma de registros",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "ano",
    "rede básica"
   ],
   "regras_comparabilidade": [
    "Ano corrente é parcial."
   ],
   "regra_cobertura": "Registros publicados desde 2007.",
   "politica_ausencia": "Registro sem energia informada fica fora da soma.",
   "validacoes": [
    "energia = carga interrompida × tempo médio ÷ 60 em todos os registros da janela"
   ],
   "limitacoes": [
    "Interrupção de carga é perturbação, não prova de limite de intercâmbio atingido.",
    "A descrição do conjunto cita cortes acima de 100 MW, mas o arquivo traz registros menores (contados à parte)."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_itaipu_nao_brasil",
   "titulo": "Geração de Itaipu não destinada ao Brasil",
   "pergunta": "Quanto da geração de Itaipu não foi destinada ao Brasil?",
   "definicao": "Geração total da usina menos a parcela destinada ao Brasil (setor de 60 Hz mais a parte do setor de 50 Hz medida nos conversores de Foz do Iguaçu).",
   "unidade": "MWh",
   "grao_geografico": "usina",
   "grao_temporal": "mês",
   "fontes": [
    "ons_rede_itaipu"
   ],
   "formula": "não Brasil = Σ_h (total_h − Brasil_h)",
   "regra_agregacao": "soma de energia horária",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "mês"
   ],
   "regras_comparabilidade": [
    "Não é intercâmbio internacional nem consumo do Paraguai medido: é uma diferença entre duas medidas."
   ],
   "regra_cobertura": "Horas com total e parcela do Brasil.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "total = 60 Hz + 50 Hz e Brasil = 60 Hz + 50 Hz do Brasil em todas as linhas (tolerância 0,5 MWmed)"
   ],
   "limitacoes": [
    "O ONS removeu em 30/07/2026 o campo com a parcela destinada ao Paraguai; a diferença inclui o que não é medido separadamente."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_pld_mesma_hora",
   "titulo": "Preço nas pontas da fronteira na mesma hora",
   "pergunta": "Os preços das duas regiões se separaram nas horas em que a energia circulou?",
   "definicao": "Contagem de horas com PLD das duas pontas diferente em mais de R$ 0,01/MWh e, nessas horas, do sentido do fluxo verificado em relação ao preço.",
   "unidade": "horas",
   "grao_geografico": "fronteira entre subsistemas",
   "grao_temporal": "dia, mês e janela de 30 dias",
   "fontes": [
    "ons_rede_intercambio_nacional",
    "ccee_pld_horario"
   ],
   "formula": "separada(h) = |PLD_para − PLD_de| > 0,01; para o mais caro = sinal(fluxo_h) = sinal(ΔPLD_h)",
   "regra_agregacao": "contagem de horas",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fronteira",
    "dia"
   ],
   "regras_comparabilidade": [
    "PLD e fluxo na mesma hora local; horas sem PLD (depois da última captura da CCEE) ficam fora."
   ],
   "regra_cobertura": "Horas com fluxo e PLD nas duas pontas.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "mesma tolerância de centavo do módulo PLD"
   ],
   "limitacoes": [
    "Diferença de preço não demonstra fronteira congestionada; o PLD sai de modelo com restrições não publicadas.",
    "Associação descritiva: não identifica causa."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_residuo_balanco",
   "titulo": "Resíduo do balanço de energia",
   "pergunta": "Geração menos carga fecha com o intercâmbio publicado no mesmo balanço?",
   "definicao": "Geração hidráulica + térmica + eólica + solar − carga − intercâmbio, hora a hora, no Balanço de Energia nos Subsistemas.",
   "unidade": "MWmed por hora; MWh por mês; horas",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "hora e mês",
   "fontes": [
    "ons_rede_balanco"
   ],
   "formula": "r_h = hid + ter + eol + sol − carga − intercâmbio; hora com resíduo quando |r_h| > 0,1 MWmed",
   "regra_agregacao": "contagem de horas e soma mensal do resíduo, geração, carga e intercâmbio sobre as mesmas horas completas",
   "natureza_fonte": "OBSERVADO e ESTIMADO",
   "natureza_componentes": [
    {
     "componente": "geração das usinas, carga e intercâmbio verificados",
     "natureza": "OBSERVADO",
     "desde": null
    },
    {
     "componente": "parcela da MMGD estimada pelo ONS na geração solar e na carga",
     "natureza": "ESTIMADO",
     "desde": "2023-04-29"
    }
   ],
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "hora",
    "mês"
   ],
   "regras_comparabilidade": [
    "Contagens também acima de 1, 10 e 100 MWmed, para separar arredondamento de diferença material.",
    "Geração e carga mensais de antes e de depois de 29/04/2023 não são comparáveis diretamente (marcação mmgd_estimada: sem, parcial em abril de 2023, com)."
   ],
   "regra_cobertura": "Horas com as seis parcelas publicadas.",
   "politica_ausencia": "Hora com parcela ausente fica fora (não vira zero).",
   "validacoes": [
    "tolerância de 0,1 MWmed justificada pela precisão de três casas dos arquivos",
    "em cada linha mensal, geração − carga − intercâmbio = resíduo do balanço (mesmas horas)",
    "degrau da solar em 29/04/2023 conferido no arquivo original do balanço, com o balanço fechando nas 24 horas do dia"
   ],
   "limitacoes": [
    "Resíduo não é atribuído a perdas nem ao exterior: a fonte não informa a causa.",
    "Desde 29/04/2023 a geração solar e a carga do balanço incluem a estimativa da MMGD feita pelo ONS, somada sem separação; o conjunto do balanço não declara a mudança (data declarada para o conjunto Carga de Energia e degrau conferido no arquivo). O resíduo e o intercâmbio não são afetados.",
    "Dados em consistência recorrente do ONS: valores recentes podem ser revisados."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_residuo_perimetro",
   "titulo": "Resíduo de perímetro do intercâmbio",
   "pergunta": "O intercâmbio do balanço é a soma das fronteiras e do exterior?",
   "definicao": "Intercâmbio do subsistema no balanço menos a soma das suas fronteiras no conjunto de intercâmbio (no Sul, mais Argentina e Uruguai; no SIN, o intercâmbio internacional).",
   "unidade": "MWmed por hora; horas",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "hora e mês",
   "fontes": [
    "ons_rede_balanco",
    "ons_rede_intercambio_nacional",
    "ons_rede_intercambio_internacional"
   ],
   "formula": "r_h = intercâmbio_balanço − Σ fronteiras (− exterior)",
   "regra_agregacao": "contagem de horas e soma mensal; intercâmbio do perímetro, fronteiras e exterior e resíduo somados nas mesmas horas (horas_perimetro)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "hora",
    "mês"
   ],
   "regras_comparabilidade": [
    "Compara três conjuntos do ONS publicados separadamente.",
    "O intercâmbio do perímetro pode ser menor que o intercâmbio do balanço do mesmo mês: dia sem exterior no conjunto internacional entra no balanço e não no perímetro (ver horas_perimetro)."
   ],
   "regra_cobertura": "Horas com balanço, fronteiras e exterior publicados.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "diagnóstico das horas com resíduo: coerência interna do balanço (SIN = Sul − fronteira S→SE)",
    "em cada linha mensal, intercâmbio do perímetro − fronteiras e exterior = resíduo do perímetro (mesmas horas)"
   ],
   "limitacoes": [
    "O sinal do intercâmbio do balanço não está no dicionário; foi conferido por esta identidade."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_reversoes",
   "titulo": "Reversões de sentido na fronteira",
   "pergunta": "Quantas vezes o fluxo trocou de sentido?",
   "definicao": "Número de trocas de sentido entre horas consecutivas com fluxo acima de 1 MWmed em módulo.",
   "unidade": "trocas",
   "grao_geografico": "fronteira entre subsistemas",
   "grao_temporal": "dia",
   "fontes": [
    "ons_rede_intercambio_nacional"
   ],
   "formula": "Σ_h 1[sentido(h) ≠ sentido(h anterior com fluxo)]",
   "regra_agregacao": "contagem por dia (horas nulas não interrompem a sequência; hora ausente interrompe)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "fronteira",
    "dia"
   ],
   "regras_comparabilidade": [
    "A faixa de 1 MWmed é a mesma do módulo PLD."
   ],
   "regra_cobertura": "Horas publicadas.",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "casos de teste com sequências reais recortadas do arquivo de 2026"
   ],
   "limitacoes": [
    "Contagem horária: oscilações dentro da hora não aparecem."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "rede_detalhe.json",
   "paginas": [
    "/setor-eletrico/rede"
   ],
   "versao_formula": "1.0",
   "id": "rede_subsistema_bruto",
   "titulo": "Exportação e importação brutas do subsistema",
   "pergunta": "Quanto cada região exportou e importou ao mesmo tempo?",
   "definicao": "Soma, hora a hora, das fronteiras em que o subsistema exporta (exportação bruta) e das em que importa (importação bruta); no Sul, Argentina e Uruguai entram como fronteiras.",
   "unidade": "MWh",
   "grao_geografico": "subsistema",
   "grao_temporal": "dia e mês",
   "fontes": [
    "ons_rede_intercambio_nacional",
    "ons_rede_intercambio_internacional"
   ],
   "formula": "exp = Σ_h Σ_f max(p_f,h, 0); imp = Σ_h Σ_f max(−p_f,h, 0); líquido = exp − imp",
   "regra_agregacao": "soma de energia horária",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "dia",
    "mês"
   ],
   "regras_comparabilidade": [
    "O líquido é igual ao intercâmbio do balanço do ONS (identidade conferida hora a hora, achado A05)."
   ],
   "regra_cobertura": "Hora com todas as fronteiras do subsistema (e o exterior, no Sul).",
   "politica_ausencia": "Hora sem valor publicado fica fora das somas e das contagens; nada é preenchido, interpolado ou repetido.",
   "validacoes": [
    "identidade com o intercâmbio do balanço de energia"
   ],
   "limitacoes": [
    "Horas de trânsito (exporta por uma fronteira e importa por outra) não dizem de onde vem a energia consumida."
   ],
   "arquivo": "pipeline/energia/metricas/rede.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_adicional_bandeira",
   "titulo": "Adicional da bandeira tarifária por patamar",
   "pergunta": "Quanto cada bandeira acrescenta à tarifa em cada período?",
   "definicao": "Valor adicional, em R$/MWh, cobrado quando o patamar está acionado, conforme a resolução e a data de vigência informadas pela ANEEL.",
   "unidade": "R$/MWh",
   "grao_geografico": "consumidores do Sistema Interligado Nacional",
   "grao_temporal": "vigência da resolução",
   "fontes": [
    "aneel_bandeiras_adicional"
   ],
   "regra_agregacao": "não se aplica",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "patamar",
    "vigência"
   ],
   "regras_comparabilidade": [
    "Valores nominais.",
    "Adicional por MWh consumido; não é o valor médio da conta."
   ],
   "regra_cobertura": "Desde março de 2015, como publicado no recurso 'Bandeira Tarifária - Adicional'.",
   "politica_ausencia": "Valor vazio na fonte fica vazio; a bandeira verde não tem adicional e não consta do recurso.",
   "validacoes": [
    "fim de vigência = véspera do valor seguinte do mesmo patamar (grão diário)",
    "patamar extinto (ausente da resolução seguinte e sem acionamento depois) termina no último mês com acionamento no recurso 'Bandeira Tarifária - Acionamento' (grão mensal, dia vazio), conferido com a vigência escrita no dicionário desse recurso",
    "cada mês acionado dentro da vigência traz o mesmo valor no recurso Acionamento; mês com outro valor encerra a vigência no último mês coerente (grão mensal) e é publicado como valor sem resolução no recurso Adicional",
    "valor positivo: adicional zero ou negativo reprova a validação da gold (vazio é ausência)"
   ],
   "limitacoes": [
    "A data de publicação das resoluções não é informada pela fonte.",
    "O recurso Adicional é incompleto (faltam as resoluções que fixaram Vermelha P1 a R$ 45,00 em 2015 e Vermelha P2 a R$ 50,00 em 2017, valores vistos só no recurso Acionamento).",
    "Fim de patamar extinto e fim contrariado pelo Acionamento têm grão mensal (o recurso Acionamento é mensal)."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_atividades_agenda",
   "titulo": "Atividades da Agenda Regulatória por ano previsto",
   "pergunta": "Quais normas a ANEEL prevê editar em 2026 e 2027?",
   "definicao": "Atividades do Anexo I da Portaria ANEEL nº 7.030/2025 (Agenda Regulatória 2026-2027), com código e ano previsto para edição da norma.",
   "unidade": "atividades",
   "grao_geografico": "ANEEL",
   "grao_temporal": "ano previsto",
   "fontes": [
    "regulacao_documentos",
    "aneel_paginas_regulatorias"
   ],
   "regra_agregacao": "contagem por ano previsto",
   "natureza_fonte": "PREVISTO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "ano previsto",
    "painel relacionado"
   ],
   "regras_comparabilidade": [
    "Ano previsto é reprogramável; não é data de decisão."
   ],
   "regra_cobertura": "Versão aprovada em 02/12/2025.",
   "politica_ausencia": "Atividade cujo texto não cai em nenhuma regra de palavra-chave fica sem painel relacionado.",
   "validacoes": [
    "contagem de códigos igual à de atividades lidas no Anexo I",
    "códigos únicos"
   ],
   "limitacoes": [
    "A revisão de 08/09/2026 (Portaria nº 7.157/2026) não pôde ser lida."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_cobertura_consultas",
   "titulo": "Cobertura das consultas e audiências reconstituídas das atas",
   "pergunta": "Que parte das consultas e das audiências públicas do ano aparece nas atas da Diretoria?",
   "definicao": "Por modalidade: consultas públicas com abertura deliberada nas atas do ano frente ao total anual de consultas públicas, e audiências públicas com abertura deliberada nas atas frente ao total anual de audiências, ambos publicados pela ANEEL no conjunto 'Audiências e Consultas Públicas'. As duas razões são publicadas separadas (cobertura e cobertura_faixa na gold).",
   "unidade": "% (aberturas da modalidade nas atas ÷ total anual da modalidade publicado pela ANEEL)",
   "grao_geografico": "ANEEL",
   "grao_temporal": "ano",
   "fontes": [
    "aneel_pautas_atas_diretoria",
    "aneel_audiencias_consultas"
   ],
   "formula": "cobertura = 100 × aberturas da modalidade nas atas do ano ÷ total anual da modalidade publicado pela ANEEL; a gold publica também as duas contagens",
   "numerador": "aberturas da modalidade nas atas do ano",
   "denominador": "total anual da modalidade publicado pela ANEEL",
   "regra_agregacao": "contagem por ano",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "modalidade"
   ],
   "regras_comparabilidade": [
    "O ano em curso é parcial e o total anual foi gerado pela fonte em data anterior à das atas.",
    "A cobertura das audiências é menor que a das consultas (faixas anuais em consultas.cobertura_faixa da gold): a contagem de abertas mistura as duas modalidades e herda a cobertura de cada uma."
   ],
   "regra_cobertura": "2018 em diante.",
   "politica_ausencia": "Ano sem total publicado fica fora.",
   "validacoes": [
    "as duas contagens são publicadas lado a lado, sem ajuste"
   ],
   "limitacoes": [
    "Diferenças podem vir de consultas abertas por circuito deliberativo ou superintendência, ou de numeração repetida na fonte."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_conferencia_ipca_teto",
   "titulo": "Teto publicado no ano anterior encadeado pela variação do IPCA",
   "pergunta": "O teto publicado bate com o encadeamento anual pelo IPCA que os atos da ANEEL praticam?",
   "definicao": "Teto publicado no ano anterior multiplicado pela razão entre o número-índice do IPCA de novembro do ano anterior e o de novembro de dois anos antes; comparado ao teto publicado. É a prática dos atos, não o texto literal do art. 23, § 1º, da REN nº 1.032/2022, que manda atualizar a partir dos valores de setembro de 2019; a aplicação literal é calculada à parte (conferência informativa art23_literal) e difere dos valores publicados.",
   "unidade": "R$/MWh",
   "grao_geografico": "Sistema Interligado Nacional",
   "grao_temporal": "ano",
   "fontes": [
    "regulacao_curadoria",
    "ibge_ipca_1737"
   ],
   "formula": "esperado_ano = teto_{ano−1} × IPCA_nov(ano−1) ÷ IPCA_nov(ano−2); diferença = teto_ano − esperado_ano",
   "numerador": "IPCA número-índice de novembro do ano anterior",
   "denominador": "IPCA número-índice de novembro de dois anos antes",
   "regra_agregacao": "não se aplica",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "ano",
    "tipo de teto"
   ],
   "regras_comparabilidade": [
    "Conferência de consistência; não substitui o valor do ato."
   ],
   "regra_cobertura": "Pares de anos consecutivos com os dois tetos e os dois índices.",
   "politica_ausencia": "Índice ausente: conferência registrada como não executada.",
   "validacoes": [
    "tolerância de R$ 0,011/MWh: dois arredondamentos a centavos (valor anterior multiplicado pelo fator anual e valor atual)",
    "aplicação literal do art. 23, § 1º, calculada e publicada como ressalva informativa, sem ser critério de aprovação"
   ],
   "limitacoes": [
    "O encadeamento reproduz os atos de 2022 a 2026; o ponto de partida de 2021 depende do valor de 2020, não integrado.",
    "O texto do art. 23, § 1º, não enuncia o encadeamento: a conta literal (base de setembro de 2019) difere dos atos em dezenas de centavos por MWh."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_consultas_abertas",
   "titulo": "Consultas e audiências públicas recebendo contribuições",
   "pergunta": "Quantas consultas públicas da ANEEL estão abertas hoje?",
   "definicao": "Número de avisos de consulta ou audiência pública cuja abertura foi deliberada em reunião pública da Diretoria e cuja fase deliberada por último tem início ≤ data de referência ≤ fim, sem resultado deliberado.",
   "unidade": "consultas",
   "grao_geografico": "ANEEL",
   "grao_temporal": "dia (data de referência, horário de Brasília)",
   "fontes": [
    "aneel_pautas_atas_diretoria"
   ],
   "formula": "contagem de avisos com situação 'aberta' pela regra de situação publicada na gold",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "modalidade",
    "situação"
   ],
   "regras_comparabilidade": [
    "Depende das atas publicadas; a contagem de um dia não se compara com totais anuais."
   ],
   "regra_cobertura": "Avisos deliberados em reunião pública registrada no conjunto de pautas e atas (desde set/2017).",
   "politica_ausencia": "Fase sem janela na ata (só duração, só sessão de audiência ou nada) não entra na contagem de abertas; fase com início e duração escritos tem o fim calculado (contando o dia do início) e rotulado. Decisão de abertura escrita na pauta com resultado formal vazio (sem número de aviso) não entra; fica declarada com a situação que teria se confirmada.",
   "validacoes": [
    "nenhuma consulta com fim anterior à data de referência aparece como aberta",
    "período lido por expressões regulares testadas em frases reais das atas (por extenso, numéricas, 'entre os dias', 'com início em ... até')",
    "datas da janela das abertas reencontradas no texto integral da decisão por regra independente",
    "nenhuma linha posterior do mesmo processo leva resultado, encerramento ou decisão que consolida o documento da consulta (edital 'consolidado após avaliação das contribuições', 'aprimoramentos decorrentes'), nem aprova o módulo de procedimento do tema"
   ],
   "limitacoes": [
    "Prorrogação decidida fora da reunião pública não aparece.",
    "Tomadas de subsídios e consultas abertas por ato de superintendência ficam de fora."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_consultas_por_situacao",
   "titulo": "Consultas e audiências públicas por situação",
   "pergunta": "Das consultas e audiências reconstituídas das atas, quantas estão decididas, encerradas sem resultado, em pauta ou abertas?",
   "definicao": "Contagem do histórico de avisos de consulta e audiência pública com abertura deliberada em reunião pública (desde set/2017), por situação na data de referência, pela regra de situação publicada na gold. Resultado é a deliberação que cita a consulta (\"Resultado da Consulta Pública nº N\", encerramento, decisão que consolida o edital ou a norma \"após avaliação das contribuições apresentadas\" ou \"com os aprimoramentos decorrentes\" dela, extinção do processo) ou, sem número, a decisão do mesmo processo que aprova o módulo de procedimento do tema.",
   "unidade": "consultas",
   "grao_geografico": "ANEEL",
   "grao_temporal": "dia (data de referência, horário de Brasília)",
   "fontes": [
    "aneel_pautas_atas_diretoria"
   ],
   "formula": "contagem do histórico por situação (contagem_por_situacao na gold); forma do resultado em contagem_por_forma_resultado",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "situação",
    "modalidade",
    "forma do resultado"
   ],
   "regras_comparabilidade": [
    "Depende das atas publicadas e da cobertura anual das atas (cobertura_faixa); decisões fora de reunião pública não aparecem."
   ],
   "regra_cobertura": "Avisos deliberados em reunião pública registrada no conjunto de pautas e atas (desde set/2017).",
   "politica_ausencia": "Consulta sem resultado deliberado nas atas fica encerrada aguardando, resultado em pauta ou com situação não derivável; nunca decidida por suposição.",
   "validacoes": [
    "decidida exige resultado deliberado",
    "resultado de outro processo só liga pela citação explícita e, na decisão que consolida o documento, só no mesmo processo",
    "linhas reais das atas nos testes (Despacho nº 2.266/2026 para a CP 6/2026; Despacho nº 3.323/2025 para a CP 28/2025; decisão de 16/06/2026 para a CP 3/2026)"
   ],
   "limitacoes": [
    "Resultado que cita número de outro processo, num processo com mais de uma consulta, não é ligado.",
    "Número de ato fora da faixa do tipo nas atas fica marcado como suspeito e não é exibido."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_pld_max_estrutural",
   "titulo": "Teto estrutural do PLD vigente",
   "pergunta": "Qual é o maior valor que a média diária do PLD pode assumir?",
   "definicao": "Limite máximo estrutural (PLDmax_estrutural): se a média diária dos PLDs horários o ultrapassa, a CCEE ajusta a série do dia até a média igualar o teto (REN nº 1.032/2022, art. 23, § 3º).",
   "unidade": "R$/MWh",
   "grao_geografico": "Sistema Interligado Nacional (todos os submercados)",
   "grao_temporal": "ano civil (vigência do ato)",
   "fontes": [
    "regulacao_documentos",
    "regulacao_curadoria",
    "ibge_ipca_1737"
   ],
   "regra_agregacao": "não se aplica (valor do ato)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "ano",
    "ato"
   ],
   "regras_comparabilidade": [
    "Aplica-se à média diária, não à hora."
   ],
   "regra_cobertura": "2021 a 2026.",
   "politica_ausencia": "Sem ato em vigor, vazio.",
   "validacoes": [
    "Valor transcrito do ato com trecho literal, conferido automaticamente no texto extraído do PDF guardado no bronze.",
    "teto refeito pela variação do IPCA de novembro, tolerância R$ 0,011/MWh"
   ],
   "limitacoes": [
    "Mesma retificação de 2023 do teto horário."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_pld_max_horario",
   "titulo": "Teto horário do PLD vigente",
   "pergunta": "Qual é o maior valor que o PLD pode assumir numa hora?",
   "definicao": "Limite máximo do PLD em cada hora (PLDmax_horário), fixado pela ANEEL para o ano e atualizado pela variação do IPCA (REN nº 1.032/2022, art. 23).",
   "unidade": "R$/MWh",
   "grao_geografico": "Sistema Interligado Nacional (todos os submercados)",
   "grao_temporal": "ano civil (vigência do ato)",
   "fontes": [
    "regulacao_documentos",
    "regulacao_curadoria",
    "ibge_ipca_1737"
   ],
   "regra_agregacao": "não se aplica (valor do ato)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "ano",
    "ato"
   ],
   "regras_comparabilidade": [
    "Vale hora a hora; não se compara com a média diária, que tem o teto estrutural."
   ],
   "regra_cobertura": "2021 a 2026.",
   "politica_ausencia": "Sem ato em vigor, vazio.",
   "validacoes": [
    "Valor transcrito do ato com trecho literal, conferido automaticamente no texto extraído do PDF guardado no bronze.",
    "teto do ano refeito a partir do teto do ano anterior pela razão IPCA nov/(ano−1) ÷ IPCA nov/(ano−2), tolerância R$ 0,011/MWh"
   ],
   "limitacoes": [
    "Em 2023 vale o valor retificado no DOU de 06/01/2023 para o ano inteiro (erro material na resolução original)."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "gold": "regulacao.json",
   "paginas": [
    "/setor-eletrico/regulacao"
   ],
   "versao_formula": "1.0",
   "id": "regulacao_pld_min",
   "titulo": "Piso do PLD (PLD mínimo) vigente",
   "pergunta": "Qual é o menor valor que o PLD pode assumir em cada período?",
   "definicao": "Limite mínimo do Preço de Liquidação de Diferenças fixado pela ANEEL para o ano, igual ao maior valor entre a TEO e a TEO de Itaipu (REN nº 1.032/2022, art. 24). Vigente campo a campo: vale o ato em vigor que informa o piso, com a publicação mais recente.",
   "unidade": "R$/MWh",
   "grao_geografico": "Sistema Interligado Nacional (todos os submercados)",
   "grao_temporal": "ano civil (vigência do ato)",
   "fontes": [
    "regulacao_documentos",
    "regulacao_curadoria",
    "aneel_pautas_atas_diretoria"
   ],
   "regra_agregacao": "não se aplica (valor do ato)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "ano",
    "ato"
   ],
   "regras_comparabilidade": [
    "Valores nominais de anos diferentes não são comparáveis em termos reais sem deflator.",
    "O piso nunca é inferido do menor PLD observado (achado A04)."
   ],
   "regra_cobertura": "2021 a 2026 (PLD horário); anos sem ato ficam sem valor.",
   "politica_ausencia": "Sem ato em vigor que informe o piso, o campo fica vazio.",
   "validacoes": [
    "Valor transcrito do ato com trecho literal, conferido automaticamente no texto extraído do PDF guardado no bronze.",
    "piso igual ao maior entre TEO e TEO de Itaipu do mesmo ato",
    "número e data da deliberação conferidos nas atas da Diretoria quando o ato é resolução homologatória"
   ],
   "limitacoes": [
    "2021 e 2023: valores lidos em documento oficial do processo (voto), porque o texto do ato não estava acessível."
   ],
   "arquivo": "pipeline/energia/metricas/regulacao.py"
  },
  {
   "id": "temperatura_ponderada_subsistema",
   "titulo": "Temperatura diária ponderada pela população, por subsistema",
   "pergunta": "Qual foi a temperatura média do dia nas regiões de cada subsistema?",
   "definicao": "Média da temperatura do ar a 2 m (NASA POWER) nos centroides das capitais das UFs do subsistema, ponderada pela população residente estimada de cada UF (IBGE, SIDRA 6579).",
   "unidade": "°C",
   "grao_geografico": "subsistema e SIN",
   "grao_temporal": "diário",
   "fontes": [
    "nasa_power_temperatura",
    "ibge_populacao_uf_6579",
    "ibge_centroides_capitais"
   ],
   "formula": "T = Σ peso_UF × T_capital ÷ Σ pesos com valor (dia publicado com pelo menos 95% do peso)",
   "regra_agregacao": "Média ponderada por população.",
   "versao_formula": "1",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "subsistema",
    "dia"
   ],
   "regras_comparabilidade": [
    "MERRA-2 (histórico) e GEOS-IT (trecho recente) são produtos diferentes da NASA; a fonte de cada mês é publicada."
   ],
   "regra_cobertura": "Dia com pelo menos 95% do peso populacional com valor.",
   "politica_ausencia": "Valor -999 da fonte é ausência; dia sem cobertura mínima fica sem valor.",
   "validacoes": [
    "UFs por subsistema conferidas pela soma das áreas de carga da API do ONS em 20/09/2026."
   ],
   "limitacoes": [
    "Reanálise e análise de modelo, não observação de estação.",
    "A capital representa a UF; população não é distribuição da carga."
   ],
   "gold": "carga_detalhe.json",
   "paginas": [
    "/setor-eletrico/carga"
   ],
   "arquivo": "pipeline/energia/metricas/carga.py"
  },
  {
   "id": "territorio_ear_subsistema_pct",
   "titulo": "Energia armazenada do subsistema (% da EAR máxima), último dia",
   "pergunta": "Quanto os reservatórios do submercado da minha região guardam hoje?",
   "definicao": "EAR verificada do subsistema em % da EAR máxima e em MWmês, como o ONS publica no conjunto EAR Diário por Subsistema (ear_verif_subsistema_percentual, ear_verif_subsistema_mwmes, ear_max_subsistema), no último dia integrado pelo módulo Água e clima. Reapresentada no território no grão do submercado.",
   "unidade": "% da EAR máxima; MWmês",
   "grao_geografico": "subsistema (SE, S, NE, N)",
   "grao_temporal": "dia",
   "fontes": [
    "ear_subsistema_di"
   ],
   "regra_agregacao": "Não se agrega: o SIN tem métrica própria (agua_ear_sin_pct), ponderada pela EAR máxima.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "subsistema"
   ],
   "regras_comparabilidade": [
    "Nenhum valor desce de grão: o município guarda a referência à distribuidora, ao conjunto e ao submercado, nunca o valor deles.",
    "Percentual do subsistema inteiro: não é um valor do município, e percentuais de subsistemas diferentes não se somam nem se tira média simples."
   ],
   "regra_cobertura": "Quatro subsistemas no último dia publicado.",
   "politica_ausencia": "Sem o dia na gold de Água e clima, o bloco sai indisponível com o motivo.",
   "validacoes": [
    "Valor igual ao de agua_detalhe.json (armazenamento.subsistemas)."
   ],
   "limitacoes": [
    "O ONS consiste e revisa a EAR; o valor é o da última captura do módulo Água e clima."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_localidades_isoladas_municipio",
   "titulo": "Localidades do município atendidas por sistema isolado",
   "pergunta": "Há parte do meu município fora do Sistema Interligado Nacional?",
   "definicao": "Localidades da lista de sistemas isolados do PASI (EPE, ciclo mais recente integrado pelo módulo Inclusão) cujo município, pelo nome oficial do IBGE na UF, é o município; população declarada pela fonte.",
   "unidade": "localidades; habitantes",
   "grao_geografico": "município (soma de localidades)",
   "grao_temporal": "ciclo anual do PASI",
   "fontes": [
    "epe_pasi_localidades"
   ],
   "numerador": "Σ população das localidades do município",
   "regra_agregacao": "Contagem e soma da população declarada.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "isol_pop(m) = Σ população(l), l ∈ localidades isoladas com município(l) = m",
   "dimensoes": [
    "município",
    "UF"
   ],
   "regras_comparabilidade": [
    "A lista indica localidades fora do SIN e a população declarada de cada uma; a população do PASI e a estimada pelo IBGE têm bases diferentes, então a razão entre elas classifica o município (fora do SIN ou com localidade isolada), mas não mede a parte exata fora do SIN."
   ],
   "regra_cobertura": "160 localidades no ciclo 2025, todas ligadas a um município.",
   "politica_ausencia": "Município sem localidade na lista = zero localidades; população não informada pela fonte fica nula.",
   "validacoes": [
    "Todas as localidades ligadas a um município pela igualdade do nome na UF."
   ],
   "limitacoes": [
    "A interligação prevista muda a lista de um ciclo para outro."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_lpt_municipio",
   "titulo": "Domicílios atendidos pelo Luz para Todos no município (período inteiro)",
   "pergunta": "Quantas ligações o Luz para Todos registrou no meu município?",
   "definicao": "Soma, por município, dos domicílios atendidos em todos os anos e programas do arquivo do MME integrado pelo módulo Inclusão; linhas sem código IBGE ligadas pelo nome oficial do IBGE na UF ou por grafia antiga documentada na DTB.",
   "unidade": "domicílios",
   "grao_geografico": "município",
   "grao_temporal": "acumulado de 2004 até o último mês do arquivo",
   "fontes": [
    "mme_luz_para_todos"
   ],
   "numerador": "Σ domicílios atendidos (ano × programa)",
   "regra_agregacao": "Soma de contagens da mesma grandeza.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "LPT(m) = Σ_ano Σ_programa domicílios(m, ano, programa)",
   "dimensoes": [
    "município"
   ],
   "regras_comparabilidade": [
    "Ligação registrada no período, não situação atual de acesso; o ano corrente é parcial."
   ],
   "regra_cobertura": "Municípios com alguma linha no arquivo.",
   "politica_ausencia": "Município sem linha no arquivo = nulo (ausência de registro), não zero.",
   "validacoes": [
    "Nenhuma linha do arquivo fica sem município depois da ligação pelo nome (as restantes seriam listadas)."
   ],
   "limitacoes": [
    "Domicílio atendido é ligação nova; não é pessoa nem unidade consumidora com benefício."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_municipios_compartilhados",
   "titulo": "Municípios atendidos por mais de uma distribuidora",
   "pergunta": "Em quantos municípios mais de uma distribuidora atende?",
   "definicao": "Contagem de municípios com duas ou mais distribuidoras de vínculo 1 (confirmado) ou 2 (só pelo cadastro de MMGD).",
   "unidade": "municípios",
   "grao_geografico": "Brasil",
   "grao_temporal": "relação vigente do ano",
   "fontes": [
    "aneel_indqual_municipio",
    "aneel_continuidade_limites",
    "aneel_mmgd_municipio"
   ],
   "numerador": "municípios com 2 ou mais distribuidoras de vínculo 1 ou 2",
   "regra_agregacao": "Contagem simples de municípios.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "#{m : |{d : vínculo(m, d) ∈ {1, 2}}| ≥ 2}",
   "dimensoes": [
    "UF"
   ],
   "regras_comparabilidade": [
    "Vínculo 0 (sem confirmação) não conta: a relação oficial tem códigos de município evidentemente errados."
   ],
   "regra_cobertura": "Municípios da malha do IBGE.",
   "politica_ausencia": "Município sem vínculo válido fora da contagem.",
   "validacoes": [
    "Igual à contagem publicada na base publicada de Perdas (mapa.municipios_compartilhados)."
   ],
   "limitacoes": [
    "Compartilhar o município não diz que parte de cada distribuidora atende."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_registros_10kw_municipio",
   "titulo": "Registros do SIGA de até 10 kW em operação declarados só no município",
   "pergunta": "Quantos sistemas de geração de pequeno porte o SIGA registra no meu município?",
   "definicao": "Empreendimentos do SIGA com tipo de outorga 'Registro', em operação, potência fiscalizada de até 10 kW e um único município declarado: contagem e kW. Em 30/09/2026 são 16.035, quase todos UFV de 1 a 3 kW de propriedade da Equatorial Pará (13.100) e da Energisa MS (2.864), em nome de moradores, escolas e igrejas de Portel, Corumbá, Porto de Moz, Curralinho, Tucuruí, Melgaço e Prainha: sistemas individuais. Somados às usinas, dominariam a contagem municipal.",
   "unidade": "registros; kW",
   "grao_geografico": "município (soma de registros)",
   "grao_temporal": "cadastro do dia do SIGA",
   "fontes": [
    "aneel_siga"
   ],
   "numerador": "Σ potência fiscalizada dos registros de até 10 kW declarados só no município",
   "regra_agregacao": "Contagem e soma de potências da mesma grandeza (kW).",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "kW(m) = Σ potência fiscalizada dos empreendimentos com outorga = Registro, estágio = operação, potência ≤ 10 kW e municípios_declarados = {m}",
   "dimensoes": [
    "município"
   ],
   "regras_comparabilidade": [
    "Não se soma à contagem de usinas do município: um sistema individual de 1 kW não é comparável a uma usina.",
    "kW, não MW: a ordem de grandeza é a de uma residência."
   ],
   "regra_cobertura": "Todos os registros do CSV do SIGA publicado pelo módulo Expansão.",
   "politica_ausencia": "Município sem registro = zero (o SIGA é o cadastro completo); registro sem potência fiscalizada fica fora desta medida e conta como usina.",
   "validacoes": [
    "Contagem e kW de Portel (PA) conferidos contra o CSV original do SIGA por outro código."
   ],
   "limitacoes": [
    "O limite de 10 kW separa o grupo de sistemas individuais do SIGA (16.008 registros até 5 kW e 27 entre 5 e 10 kW, contra 262 entre 10 e 75 kW); não é uma categoria da fonte."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_residuo_area_carga",
   "titulo": "Resíduo do fechamento das áreas de carga",
   "pergunta": "As áreas de carga somam a carga do submercado?",
   "definicao": "Em cada meia hora, soma da carga das áreas geoelétricas atribuídas ao submercado mais a área de perdas do mesmo submercado, menos a carga do submercado; resumida pela mediana do valor absoluto no dia (e também pela média e pelo máximo).",
   "unidade": "MWmed",
   "grao_geografico": "submercado",
   "grao_temporal": "meia hora, resumida por dia",
   "fontes": [
    "territorio_ons_areas_carga"
   ],
   "numerador": "Σ carga das áreas do submercado + carga da área de perdas − carga do submercado (por meia hora)",
   "regra_agregacao": "Mediana do resíduo absoluto nas meias horas comuns a todas as áreas do submercado.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "resíduo(sm, h) = Σ_a∈sm carga(a, h) + carga(perdas_sm, h) − carga(sm, h); resumo(sm, dia) = mediana_h |resíduo(sm, h)|",
   "dimensoes": [
    "submercado",
    "dia"
   ],
   "regras_comparabilidade": [
    "Tolerância de 15 MWmed na mediana por meia hora, fixada pelos dados: ruído da hipótese até 7,9 MWmed e menor alternativa com 28,8 MWmed (13 e 16/09/2026); cada dia publica o seu ruído e a sua menor alternativa.",
    "O resíduo das médias do dia é publicado ao lado, para cada alternativa, mas não decide: ele deixa passar trocas de áreas de carga média quase igual no dia (Rondônia e Tocantins Norte em 16/09/2026: 7,9 MWmed) e é deslocado por uma única meia hora em consistência."
   ],
   "regra_cobertura": "Dia com as 34 áreas e ao menos 40 meias horas comuns por submercado.",
   "politica_ausencia": "Área sem resposta: dia incompleto, sem resíduo.",
   "validacoes": [
    "Dois dias (útil e domingo) fecham dentro da tolerância e nenhuma alternativa fecha."
   ],
   "limitacoes": [
    "A carga é consistida depois pelo ONS; resíduos de alguns MWmed (e meias horas isoladas maiores) são esperados e não alteram a pertença."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_submercado_municipio",
   "titulo": "Submercado do município (pela UF, pela camada oficial da EPE e pelas áreas de carga do ONS)",
   "pergunta": "A que submercado pertence o meu município?",
   "definicao": "Subsistema da UF do município na camada oficial da EPE (WebMap, Unidades da federação e Subsistemas do SIN). A pertença de cada área de carga do ONS ao submercado é provada pelo fechamento da carga verificada meia hora a meia hora em dois dias (soma das áreas geoelétricas mais a área de perdas igual à carga do submercado, e nenhuma alternativa, mover a área ou trocá-la com outra, fecha). Uma área vale como provada quando é provada em todo dia em que teve carga; com carga zero num dos dias, vale a prova do outro; com carga zero nos dois, fica indeterminada. Estados: provado; provado_com_area_sem_carga (UF com área sem carga nos dois dias, cuja pertença a soma não prova: TOCO, no Tocantins); fora_do_sin (a sede do município é localidade isolada do PASI da EPE, isto é, há localidade isolada com o nome do município, ou as localidades isoladas somam ao menos 50% da população estimada pelo IBGE: o submercado não se aplica e fica nulo); com_localidade_isolada (localidades isoladas menores num município cuja sede e maior parte da população estão no SIN: submercado da UF com aviso); nao_provado.",
   "unidade": "submercado (SE, S, NE, N), nulo quando não se aplica, e estado",
   "grao_geografico": "município, pela UF",
   "grao_temporal": "conferência a cada 30 dias (dois dias por conferência); ciclo anual do PASI",
   "fontes": [
    "territorio_epe_webmap",
    "territorio_ons_areas_carga",
    "epe_pasi_localidades"
   ],
   "regra_agregacao": "Não se agrega.",
   "versao_formula": "2",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "submercado(m) = nulo se sede(m) ∈ localidades isoladas ou Σ pop_isolada(m) ÷ pop(m) ≥ 0,5; senão, sm tal que todas as áreas de carga da UF de m são provadas em sm em todo dia conferido em que tiveram carga",
   "dimensoes": [
    "UF",
    "município"
   ],
   "regras_comparabilidade": [
    "Nenhum valor desce de grão: o município guarda a referência à distribuidora, ao conjunto e ao submercado, nunca o valor deles.",
    "PLD e EAR do submercado são do submercado inteiro; o município só aponta para ele.",
    "Município fora do SIN não recebe PLD, EAR nem MMGD estimada do submercado: o estado 'não se aplica' nunca vira valor."
   ],
   "regra_cobertura": "27 UFs; 34 áreas de carga do dicionário do ONS por dia conferido; 160 localidades isoladas do PASI.",
   "politica_ausencia": "Dia com área sem resposta não conta; sem conferência, o estado é nao_provado (nunca se adota o mapeamento sem prova).",
   "validacoes": [
    "Mediana do resíduo absoluto por meia hora de cada submercado até 15 MWmed, e nenhuma alternativa (mover uma área ou trocar duas de submercados diferentes) dentro da mesma tolerância.",
    "Subsistema provado pela soma igual ao da camada oficial da EPE e aos mapeamentos publicados pelos módulos Água e Carga.",
    "Localidades do PASI (módulo Inclusão) iguais às da camada 27 do WebMap da EPE."
   ],
   "limitacoes": [
    "Não há tabela oficial município → submercado: a divisa no mapa é a da UF.",
    "A população do PASI e a estimativa do IBGE têm bases diferentes (a do PASI passa a do IBGE em Uiramutã): a razão separa os municípios de sede isolada dos demais (84% ou mais contra 9% ou menos no ciclo 2025), não mede a parte exata fora do SIN."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_usinas_coordenada_concordancia",
   "titulo": "Coordenada da usina dentro do município declarado",
   "pergunta": "A coordenada do SIGA cai no município que ele declara?",
   "definicao": "Ponto em polígono da coordenada do SIGA (graus) contra os municípios declarados da usina, na malha municipal do IBGE em qualidade máxima (API de malhas v4, sem simplificação). Sem a malha máxima de alguma UF, a conferência usa a malha simplificada do mapa e o resultado é marcado como aproximado.",
   "unidade": "usinas",
   "grao_geografico": "usina",
   "grao_temporal": "cadastro do dia do SIGA",
   "fontes": [
    "aneel_siga",
    "territorio_ibge_malha_maxima"
   ],
   "numerador": "usinas com a coordenada dentro de um município declarado",
   "denominador": "usinas com coordenada e município reconhecido",
   "regra_agregacao": "Contagem simples.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "concordância = #{u : coordenada(u) ∈ ∪ polígonos(municípios_declarados(u))}",
   "dimensoes": [
    "tipo de usina"
   ],
   "regras_comparabilidade": [
    "Conferência, não correção: o município declarado prevalece."
   ],
   "regra_cobertura": "Usinas com coordenada (zero na fonte = sem coordenada).",
   "politica_ausencia": "Sem coordenada ou sem município reconhecido: fora da conferência (nulo).",
   "validacoes": [
    "Ao menos 90% dentro (abaixo disso, ressalva).",
    "Comparação com a malha simplificada do mapa publicada: quantas usinas ela daria como fora estando dentro (falsos positivos da simplificação)."
   ],
   "limitacoes": [
    "A coordenada do SIGA é aproximada (centróide do empreendimento): mesmo na malha máxima, ponto perto da divisa pode cair no vizinho.",
    "A malha do mapa (qualidade mínima do IBGE, simplificada a 400 m) não serve para esta conferência: numa amostra de 25 usinas que ela dava como fora, 7 estavam dentro na malha máxima."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_usinas_municipio",
   "titulo": "Usinas declaradas só no município (contagem e potência)",
   "pergunta": "Quantas usinas o SIGA registra no meu município?",
   "definicao": "Usinas do SIGA cujo único município declarado é o município (nome oficial do IBGE na UF, ou grafia antiga documentada na DTB do IBGE): contagem e potência fiscalizada das em operação, sem os registros de até 10 kW (medida própria); contagem e potência outorgada das em construção ou com construção não iniciada. Usina declarada em vários municípios é listada em cada um, sem potência somada.",
   "unidade": "usinas; MW",
   "grao_geografico": "município (soma de usinas)",
   "grao_temporal": "cadastro do dia do SIGA",
   "fontes": [
    "aneel_siga"
   ],
   "numerador": "Σ potência das usinas declaradas só no município",
   "regra_agregacao": "Soma de potências de usinas inteiras (mesma grandeza, kW ÷ 1.000); nunca repartição de usina entre municípios.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "formula": "MW(m) = Σ potência fiscalizada (operação, exceto outorga Registro com até 10 kW) das usinas com municípios_declarados = {m} ÷ 1.000",
   "dimensoes": [
    "município",
    "estágio"
   ],
   "regras_comparabilidade": [
    "MW é potência, não energia.",
    "Operação (fiscalizada) e carteira (outorgada) não se somam."
   ],
   "regra_cobertura": "Todas as usinas do CSV do SIGA publicado pelo módulo Expansão; nomes não reconhecidos listados.",
   "politica_ausencia": "Município sem usina declarada = zero (o SIGA é o cadastro completo das outorgas); usina sem potência fiscalizada conta e não soma.",
   "validacoes": [
    "Soma por UF principal das usinas em operação (com os registros) igual à da gold de Expansão (0,05 MW).",
    "Contagens e potências de municípios conferidas contra o CSV original do SIGA por outro código."
   ],
   "limitacoes": [
    "A potência de usina em vários municípios (grandes hidrelétricas, por exemplo) não aparece em nenhuma soma municipal.",
    "Micro e minigeração distribuída não está no SIGA: aparece na métrica de MMGD."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "id": "territorio_vinculo_municipio_distribuidora",
   "titulo": "Distribuidoras que atendem o município",
   "pergunta": "Que distribuidora atende o meu município?",
   "definicao": "Distribuidoras (CNPJ) ligadas ao município IBGE pela relação oficial conjunto elétrico × município da ANEEL (IndQual Município e limites de continuidade do ano), com o estado do vínculo publicado pelo módulo Perdas: 1 = confirmado por empreendimento de MMGD da distribuidora no município; 0 = relação sem confirmação; 2 = só pelo cadastro de MMGD: município que a relação não cobre, ligado à distribuidora que tem nele ao menos 10 empreendimentos de MMGD e ao menos 5% dos empreendimentos do município (regra do módulo Perdas, aneel_perdas.vinculos_so_mmgd). Município fora da relação sem distribuidora acima dos dois limiares fica sem vínculo (ex.: Porto Rico do Maranhão, com 5 empreendimentos da Equatorial Maranhão e cujo conjunto no IndQual não tem limite de 2026).",
   "unidade": "referências (índice da distribuidora e estado do vínculo)",
   "grao_geografico": "município (código IBGE) × distribuidora (CNPJ)",
   "grao_temporal": "relação vigente do ano (2026)",
   "fontes": [
    "aneel_indqual_municipio",
    "aneel_continuidade_limites",
    "aneel_mmgd_municipio"
   ],
   "regra_agregacao": "Não se agrega: é uma lista de vínculos por município.",
   "versao_formula": "1",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "OBSERVADO",
   "dimensoes": [
    "município",
    "distribuidora",
    "estado do vínculo"
   ],
   "regras_comparabilidade": [
    "Nenhum valor desce de grão: o município guarda a referência à distribuidora, ao conjunto e ao submercado, nunca o valor deles.",
    "Município com mais de uma distribuidora não tem divisão interna conhecida: nenhuma é escolhida por conta própria."
   ],
   "regra_cobertura": "Os 5.571 municípios da malha do IBGE (revisão 2025); código da relação fora da malha listado à parte.",
   "politica_ausencia": "Município sem vínculo fica com lista vazia e é listado; nunca recebe a distribuidora de um vizinho nem a de um cadastro de MMGD abaixo dos limiares.",
   "validacoes": [
    "Contagens de municípios compartilhados, vínculos e vínculos sem confirmação iguais às publicadas pelo módulo Perdas.",
    "Municípios por distribuidora (confirmados e só MMGD) iguais aos da base publicada de Perdas.",
    "Distribuidoras por município comparadas com os conjuntos do módulo Qualidade (diferenças listadas)."
   ],
   "limitacoes": [
    "Sem polígono oficial de concessão acessível: a área é a união de municípios inteiros.",
    "A relação de 2026 não descreve anos anteriores (absorções e trocas de concessão)."
   ],
   "gold": "territorio.json",
   "paginas": [
    "/setor-eletrico/territorio"
   ],
   "arquivo": "pipeline/energia/metricas/territorio.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_carga_diaria_sin",
   "titulo": "Carga diária do SIN (série da Visão geral)",
   "pergunta": "Quanto o sistema está consumindo, dia a dia?",
   "definicao": "Soma das cargas diárias dos quatro subsistemas publicadas pelo ONS, copiada de carga.json#serie; a referência é o mesmo dia da semana do ano anterior (364 dias antes) quando os dois dias estão no mesmo regime metodológico.",
   "unidade": "MWmed",
   "grao_geografico": "SIN",
   "grao_temporal": "dia",
   "fontes": [
    "carga_energia_di"
   ],
   "formula": "carga_SIN(d) = Σ_s carga(s, d), s ∈ {SE, S, NE, N}; referência(d) = carga_SIN(d − 364)",
   "regra_agregacao": "soma dos subsistemas no mesmo dia",
   "natureza_fonte": "OBSERVADO",
   "componentes_natureza": [
    {
     "natureza": "PREVISTO",
     "desde": "2021-03-01",
     "descricao": "previsão de geração das usinas não despachadas pelo ONS, somada pela fonte",
     "fonte": "carga.json#proveniencia.sin.natureza_por_regime"
    },
    {
     "natureza": "ESTIMADO",
     "desde": "2023-04-29",
     "descricao": "estimativa da MMGD somada pela fonte (observada nos dados desde 01/05/2023)",
     "fonte": "carga.json#proveniencia.sin.natureza_por_regime"
    }
   ],
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia"
   ],
   "regras_comparabilidade": [
    "Regimes do ONS: até 28/02/2021, de 01/03/2021 a 28/04/2023 e desde 29/04/2023 (MMGD estimada incluída); o ano anterior só aparece no mesmo regime."
   ],
   "regra_cobertura": "Dias aceitos pela validação física do módulo Carga.",
   "politica_ausencia": "Dia em quarentena ou ausente fica vazio.",
   "validacoes": [
    "cada célula igual à de carga.json#serie"
   ],
   "limitacoes": [
    "Temperatura e calendário não são ajustados; a referência de 364 dias mantém o dia da semana, mas feriados móveis mudam de data.",
    "Observado com componentes que não são medição: previsão de usinas não despachadas desde 01/03/2021 (PREVISTO) e estimativa de MMGD desde 29/04/2023 (ESTIMADO), declarados pela gold de Carga."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_defasagem_frase",
   "titulo": "Defasagem da frase em relação ao processamento",
   "pergunta": "Quantos dias separam o dado da data em que a página foi processada?",
   "definicao": "Data de processamento (civil de Brasília) menos a data de referência do dado usado na frase. Negativa quando a fonte publica o dado do dia seguinte na véspera (PLD).",
   "unidade": "dias",
   "grao_geografico": "frase",
   "grao_temporal": "processamento",
   "fontes": [
    "ear_subsistema_di",
    "ena_subsistema_di",
    "carga_energia_di",
    "balanco_energia_subsistema_ho",
    "intercambio_nacional_ho",
    "ccee_pld_horario"
   ],
   "formula": "defasagem = data_processamento_brasilia − data_referencia",
   "regra_agregacao": "não se aplica",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "frase"
   ],
   "regras_comparabilidade": [
    "A data de processamento é a civil de Brasília (comum.hoje_brasilia), não a UTC do servidor."
   ],
   "regra_cobertura": "Toda frase emitida.",
   "politica_ausencia": "Sem data de referência, a frase não é emitida.",
   "validacoes": [
    "texto sem '0 dias antes' quando a referência é posterior ao processamento"
   ],
   "limitacoes": [
    "Não substitui a situação de atualidade pela frequência declarada da fonte (publicacao.json), também publicada."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_fluxo_diario_fronteira",
   "titulo": "Fluxo médio diário entre subsistemas (série da Visão geral)",
   "pergunta": "Para onde a energia está fluindo entre as regiões?",
   "definicao": "Média das 24 horas do intercâmbio verificado em cada fronteira, com sinal (positivo da primeira para a segunda ponta), copiada de rede.json#serie_fluxos.",
   "unidade": "MWmed",
   "grao_geografico": "fronteira entre subsistemas",
   "grao_temporal": "dia",
   "fontes": [
    "intercambio_nacional_ho"
   ],
   "formula": "fluxo(par, d) = (1/24) × Σ_h sinal × intercâmbio_verificado(h)",
   "regra_agregacao": "média temporal das horas",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "fronteira"
   ],
   "regras_comparabilidade": [
    "Sentido convencionado por fronteira (N→NE, N→SE/CO, NE→SE/CO, S→SE/CO)."
   ],
   "regra_cobertura": "Dias com as 24 horas.",
   "politica_ausencia": "Dia incompleto fica vazio.",
   "validacoes": [
    "cada célula igual à de rede.json#serie_fluxos"
   ],
   "limitacoes": [
    "Sem limites de intercâmbio neste painel: fluxo alto não indica congestionamento."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_frequencia_conjunta_destaques",
   "titulo": "Frequência conjunta da caixa de destaques",
   "pergunta": "Em quantos dias a caixa de destaques da Visão geral teria ao menos um alerta?",
   "definicao": "Fração dos dias em que ao menos uma regra de sistema estaria na caixa de destaques (alerta exibido e confirmado há menos de 14 dias), no período em que todas as regras de sistema são avaliáveis e desde 01/01/2021, com a distribuição do número de regras simultâneas, a sensibilidade ao limite de novidade (7, 14, 21, 30 dias e sem limite) e a frequência da calibração anterior.",
   "unidade": "% dos dias",
   "grao_geografico": "caixa de destaques",
   "grao_temporal": "dia",
   "fontes": [
    "ear_subsistema_di",
    "ena_subsistema_di",
    "carga_energia_di",
    "balanco_energia_subsistema_ho",
    "ccee_pld_horario",
    "ons_coff_eolica",
    "ons_coff_fotovoltaica"
   ],
   "numerador": "dias com ao menos uma regra de sistema na caixa",
   "denominador": "dias do período",
   "formula": "pct = 100 × |{d : ∃ regra r, alerta(r, d) e d − confirmação(r, d) < 14}| ÷ dias do período",
   "regra_agregacao": "contagem sobre os estados diários das regras",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "período",
    "limite de novidade"
   ],
   "regras_comparabilidade": [
    "Antes do período comum algumas regras não são avaliáveis e não podem entrar na caixa: a frequência desde 2021 subestima a de hoje nesses anos."
   ],
   "regra_cobertura": "Dias de cada período; regra não avaliável no dia não entra.",
   "politica_ausencia": "Dia sem avaliação de uma regra conta como sem destaque daquela regra.",
   "validacoes": [
    "critério de materialidade: período comum com no máximo um terço dos dias com destaque (validação da gold)"
   ],
   "limitacoes": [
    "A meta de um terço é escolha documentada, não padrão externo; a tabela de sensibilidade mostra o efeito de outros limites.",
    "Reavaliação com os dados da data de processamento: não reproduz a caixa que o leitor via em cada data."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_frequencia_disparo",
   "titulo": "Frequência de disparo das regras no histórico",
   "pergunta": "Quantas vezes cada regra teria disparado desde 2021, e por quanto tempo?",
   "definicao": "Para cada regra: dias avaliados, dias com a condição, acionamentos brutos (sequências de dias com a condição), acionamentos curtos descartados pela duração mínima, episódios, duração mediana e máxima, dias com alerta exibido (da confirmação ao retorno) e sensibilidade a durações mínimas de 1, 3, 7 e 14 dias.",
   "unidade": "dias, episódios e % dos dias avaliados",
   "grao_geografico": "regra",
   "grao_temporal": "histórico desde 01/01/2021",
   "fontes": [
    "ear_subsistema_di",
    "ena_subsistema_di",
    "carga_energia_di",
    "balanco_energia_subsistema_ho",
    "ccee_pld_horario",
    "ons_coff_eolica",
    "ons_coff_fotovoltaica"
   ],
   "numerador": "dias com alerta exibido",
   "denominador": "dias avaliados",
   "formula": "pct_dias_exibidos = 100 × Σ dias exibidos ÷ dias avaliados; episódios por ano = episódios ÷ (dias avaliados ÷ 365,25), só com ao menos 365 dias",
   "regra_agregacao": "contagem sobre a série diária de condições",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "regra",
    "duração mínima"
   ],
   "regras_comparabilidade": [
    "Regras com histórico avaliável diferente (termica e restrição solar começam depois) não têm a mesma base."
   ],
   "regra_cobertura": "Dias avaliados de cada regra.",
   "politica_ausencia": "Dia não avaliado fica fora do denominador.",
   "validacoes": [
    "mesma máquina de estados que avalia o dia",
    "episódios publicados em sintese_episodios.csv"
   ],
   "limitacoes": [
    "Reavaliação com dados da data de processamento: não reproduz o que se via na época; os alertas publicados são registrados a partir da gold aceita.",
    "Cada regra tem o próprio início de histórico avaliável (primeiro_dia_avaliado); o texto do histórico usa esse dia, não o início comum.",
    "Sem verdade de referência, nenhum alerta é rotulado como falso; o registro das publicações mede os que deixaram de se confirmar após revisão."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_participacao_termica_7d",
   "titulo": "Participação térmica em janela de 7 dias (SIN)",
   "pergunta": "Quanto da geração do balanço do ONS veio de térmicas na última semana?",
   "definicao": "Geração térmica dividida pela soma da geração hidráulica, térmica, eólica e solar do balanço de energia do ONS (a solar inclui a MMGD estimada desde 29/04/2023), em janela móvel de 7 dias, copiada de geracao.json#serie_termica_7d.",
   "unidade": "% da geração do balanço",
   "grao_geografico": "SIN",
   "grao_temporal": "janela móvel de 7 dias",
   "fontes": [
    "balanco_energia_subsistema_ho"
   ],
   "numerador": "Σ geração térmica nos 7 dias (MWmed·dia)",
   "denominador": "Σ geração das quatro fontes do balanço nos 7 dias (MWmed·dia)",
   "formula": "100 × Σ térmica ÷ Σ (hidráulica + térmica + eólica + solar)",
   "regra_agregacao": "razão de somas",
   "natureza_fonte": "OBSERVADO",
   "componentes_natureza": [
    {
     "natureza": "ESTIMADO",
     "desde": "2023-04-29",
     "descricao": "estimativa da MMGD somada pelo ONS à geração solar do balanço",
     "fonte": "geracao.json#proveniencia.termica_7d.limitacoes"
    }
   ],
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia final da janela"
   ],
   "regras_comparabilidade": [
    "Desde 29/04/2023 a solar do balanço inclui a MMGD estimada; janelas antes e depois não se comparam."
   ],
   "regra_cobertura": "Janelas com os 7 dias completos.",
   "politica_ausencia": "Janela com dia ausente fica vazia.",
   "validacoes": [
    "cada célula igual à de geracao.json#serie_termica_7d"
   ],
   "limitacoes": [
    "O balanço não separa a térmica por combustível (painel Geração).",
    "O total do balanço inclui, na solar, a estimativa de MMGD do ONS desde 29/04/2023 (ESTIMADO): a participação não é toda de geração medida."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_pld_media_diaria",
   "titulo": "PLD médio diário por submercado (série da Visão geral)",
   "pergunta": "Em que nível está o preço de liquidação nos últimos 90 dias?",
   "definicao": "Média aritmética simples das 24 horas do PLD de cada dia e submercado, copiada de pld.json#diario sem recálculo.",
   "unidade": "R$/MWh (nominal)",
   "grao_geografico": "submercado",
   "grao_temporal": "dia (horário de Brasília)",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "PLD_dia(s) = (1/24) × Σ PLD_h(s), h = 0..23",
   "regra_agregacao": "média temporal simples das horas (não ponderada pela carga)",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "submercado"
   ],
   "regras_comparabilidade": [
    "Valores nominais; anos diferentes têm limites regulatórios diferentes.",
    "Não é o PLD ponderado pela carga (pld_media_mensal_ponderada_carga)."
   ],
   "regra_cobertura": "Dias com as 24 horas publicadas; últimos 90 dias até a data de referência do PLD.",
   "politica_ausencia": "Dia sem as 24 horas não tem média e fica vazio.",
   "validacoes": [
    "cada célula igual à de pld.json#diario (conferência a cada publicação)"
   ],
   "limitacoes": [
    "A CCEE publica o PLD do dia seguinte na véspera; a série termina depois das demais da Visão geral."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_atualidade_fontes",
   "titulo": "Regra: fonte da Visão geral com atualização atrasada",
   "pergunta": "Algum conjunto usado nesta página está atrasado em relação à frequência declarada?",
   "definicao": "Algum conjunto usado nas frases, nos determinantes, em energia e sociedade ou nas regras publicadas (inclusive restrições eólica e fotovoltaica e CMO semanal) com situação ATRASADO no painel de saúde dos dados (publicacao.json).",
   "unidade": "conjuntos",
   "grao_geografico": "conjuntos da Visão geral",
   "grao_temporal": "processamento",
   "fontes": [
    "ear_subsistema_di",
    "ena_subsistema_di",
    "carga_energia_di",
    "balanco_energia_subsistema_ho",
    "intercambio_nacional_ho",
    "ccee_pld_horario",
    "cmo_se",
    "ons_coff_eolica",
    "ons_coff_fotovoltaica",
    "aneel_tarifas_aplicacao",
    "aneel_continuidade",
    "aneel_samp_balanco",
    "aneel_scs"
   ],
   "formula": "ativo = ∃ conjunto com atualidade.situacao = ATRASADO",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "conjunto"
   ],
   "regras_comparabilidade": [
    "Tolerância pela cadência declarada (módulo Dados)."
   ],
   "regra_cobertura": "Conjuntos com situação publicada.",
   "politica_ausencia": "Conjunto sem situação publicada é listado à parte.",
   "validacoes": [
    "situação lida de publicacao.json#conjuntos[].atualidade",
    "lista de conjuntos derivada do que a página publica (conjuntos_avaliados)"
   ],
   "limitacoes": [
    "Atraso pode ser da fonte ou da integração; o painel Dados separa as causas."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_carga_extrema",
   "titulo": "Regra: carga diária entre as mais altas do ano",
   "pergunta": "A carga está entre os dias mais altos dos últimos 12 meses?",
   "definicao": "Carga do SIN acima do 95º percentil dos 364 dias anteriores, no mesmo regime metodológico e com pelo menos 330 dias publicados; alerta com 2 dias seguidos, retorno com 3 dias abaixo.",
   "unidade": "MWmed",
   "grao_geografico": "SIN",
   "grao_temporal": "dia",
   "fontes": [
    "carga_energia_di"
   ],
   "formula": "condição(d) = carga(d) > quantil_0,95{carga(d − i), i = 1..364}",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "componentes_natureza": [
    {
     "natureza": "PREVISTO",
     "desde": "2021-03-01",
     "descricao": "previsão de geração das usinas não despachadas pelo ONS, somada pela fonte",
     "fonte": "carga.json#proveniencia.sin.natureza_por_regime"
    },
    {
     "natureza": "ESTIMADO",
     "desde": "2023-04-29",
     "descricao": "estimativa da MMGD somada pela fonte (observada nos dados desde 01/05/2023)",
     "fonte": "carga.json#proveniencia.sin.natureza_por_regime"
    }
   ],
   "regras_comparabilidade": [
    "Base de 364 dias no mesmo regime do ONS, lida de carga_diaria.csv (mesmo builder de carga.json, série desde 2000, dias em quarentena vazios); a regra só é avaliada com os 364 dias anteriores no mesmo regime: de 01/01 a 28/02/2021, de 28/02/2022 a 28/04/2023 e desde 27/04/2024."
   ],
   "regra_cobertura": "Dias com base completa no mesmo regime.",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "Temperatura e calendário não são ajustados.",
    "Observado com componentes que não são medição: previsão de usinas não despachadas desde 01/03/2021 (PREVISTO) e estimativa de MMGD desde 29/04/2023 (ESTIMADO), declarados pela gold de Carga."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_descolamento",
   "titulo": "Regra: preços separados entre submercados",
   "pergunta": "Os submercados estão com preços diferentes de forma persistente?",
   "definicao": "Diferença entre o maior e o menor PLD médio diário dos quatro submercados de pelo menos max(R$ 5,00/MWh; 10% da média dos quatro); alerta com 3 dias seguidos, retorno com 3 dias abaixo.",
   "unidade": "R$/MWh",
   "grao_geografico": "quatro submercados",
   "grao_temporal": "dia",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "condição(d) = max_s PLD_d(s) − min_s PLD_d(s) ≥ max(5; 0,10 × média_s PLD_d(s))",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "regras_comparabilidade": [
    "Médias diárias arredondadas ao centavo (pld.json#diario); a amplitude do dia confere com pld.json#amplitude_dia em R$ 0,02/MWh."
   ],
   "regra_cobertura": "Dias com os quatro submercados (desde 01/01/2021).",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "Não identifica qual restrição de transmissão atuou."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_ear_faixa",
   "titulo": "Regra: EAR do SIN em nível extremo",
   "pergunta": "O armazenamento do SIN está em nível extremo para a data?",
   "definicao": "EAR do SIN abaixo do 5º ou acima do 95º percentil do mesmo dia do calendário nos anos completos de 2001 ao anterior; alerta com 7 dias seguidos, retorno com 7 dias seguidos entre os dois.",
   "unidade": "% da EAR máxima",
   "grao_geografico": "SIN",
   "grao_temporal": "dia",
   "fontes": [
    "ear_subsistema_di"
   ],
   "formula": "condição(d) = EAR_SIN(d) < P5(md) ou EAR_SIN(d) > P95(md); EAR_SIN = 100 × Σ EAR ÷ Σ EARmax",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "regras_comparabilidade": [
    "As variantes 'faixa usual do SIN (10º a 90º)' e 'algum dos quatro subsistemas' são publicadas como alternativas avaliadas e rejeitadas."
   ],
   "regra_cobertura": "Dias com os quatro subsistemas e faixa da data disponível (2021 em diante).",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "A capacidade de armazenamento mudou ao longo do tempo; a faixa compara percentuais de capacidades diferentes."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_ena_faixa",
   "titulo": "Regra: ENA de 30 dias do SIN em nível extremo",
   "pergunta": "A afluência do último mês está em nível extremo para o mesmo período do ano?",
   "definicao": "ENA bruta do SIN em 30 dias, em % da MLT, abaixo do 5º ou acima do 95º percentil da mesma janela nos anos de 2001 ao anterior; alerta com 7 dias seguidos, retorno com 7 dias seguidos entre os dois.",
   "unidade": "% da MLT",
   "grao_geografico": "SIN",
   "grao_temporal": "dia",
   "fontes": [
    "ena_subsistema_di"
   ],
   "formula": "condição(d) = ENA30(d) < P5 ou > P95 das janelas terminadas na mesma data dos anos anteriores; ENA30 = 100 × Σ ENA ÷ Σ MLT",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "regras_comparabilidade": [
    "A MLT do conjunto aberto muda com usinas novas e recálculos (agua_mlt_versao)."
   ],
   "regra_cobertura": "Janelas com os 30 dias.",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "Janela de 30 dias suaviza eventos curtos."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_pld_defasagem",
   "titulo": "Regra: PLD sem atualização recente",
   "pergunta": "A série de PLD está sendo integrada?",
   "definicao": "Último dia de PLD integrado mais de 2 dias antes da data de processamento (civil de Brasília).",
   "unidade": "dias",
   "grao_geografico": "quatro submercados",
   "grao_temporal": "processamento",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "ativo = data_processamento − dia_referencia_pld > 2",
   "regra_agregacao": "não se aplica",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "processamento"
   ],
   "regras_comparabilidade": [
    "A CCEE publica o PLD do dia seguinte na véspera: defasagem de −1 é o normal à noite."
   ],
   "regra_cobertura": "Cada processamento.",
   "politica_ausencia": "Sem pld.json íntegro, a regra não é listada.",
   "validacoes": [
    "data de Brasília, não UTC (defeito corrigido: '0 dias antes do processamento' às 23h20 de Brasília)"
   ],
   "limitacoes": [
    "Diz respeito à integração, não ao preço."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_pld_piso",
   "titulo": "Regra: PLD no piso o dia inteiro",
   "pergunta": "O piso regulatório determinou o preço em todas as horas?",
   "definicao": "Algum submercado com as 24 horas do dia no PLD mínimo vigente (igual ao centavo, contagem de pld_limites_diario.csv do módulo PLD); alerta com 3 dias seguidos, retorno com 3 dias sem dia inteiro no piso.",
   "unidade": "dias",
   "grao_geografico": "quatro submercados",
   "grao_temporal": "dia",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "condição(d) = ∃ s: horas_no_piso(s, d) = horas(s, d) = 24",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "regras_comparabilidade": [
    "Limites por ano conforme os atos da ANEEL (conferidos com regulacao.json)."
   ],
   "regra_cobertura": "Dias do PLD horário com limites vigentes (desde 01/01/2021).",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem",
    "limites do CSV do PLD iguais aos vigentes publicados pela Regulação (R$ 0,005/MWh)"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "Preço no piso não quer dizer energia sem custo."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_pld_teto",
   "titulo": "Regra: PLD no teto horário ou estrutural",
   "pergunta": "Algum limite máximo do PLD foi atingido?",
   "definicao": "Alguma hora no PLD máximo horário ou média diária no máximo estrutural em algum submercado; alerta no mesmo dia, retorno com 7 dias seguidos sem teto.",
   "unidade": "dias",
   "grao_geografico": "quatro submercados",
   "grao_temporal": "dia",
   "fontes": [
    "ccee_pld_horario"
   ],
   "formula": "condição(d) = ∃ s: horas_no_teto_horario(s, d) > 0 ou media_no_teto_estrutural(s, d) = 1",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "regras_comparabilidade": [
    "Teto horário vale hora a hora; teto estrutural vale para a média diária."
   ],
   "regra_cobertura": "Dias do PLD horário com limites vigentes.",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem",
    "limites do CSV do PLD iguais aos vigentes publicados pela Regulação (R$ 0,005/MWh)"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "Não identifica a causa nem indica risco de suprimento."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_restricao",
   "titulo": "Regra: restrição de eólicas ou fotovoltaicas entre as maiores do último ano",
   "pergunta": "O corte de geração renovável está entre os maiores do último ano?",
   "definicao": "Taxa de restrição do SIN em 7 dias (energia não gerada ÷ geração verificada mais não gerada, linhas TOTAL de geracao_restricao_diaria.csv somadas nas regiões) acima do 95º percentil das 365 janelas terminadas de 7 a 371 dias antes; alerta com 7 dias seguidos, retorno com 7.",
   "unidade": "% da geração possível",
   "grao_geografico": "SIN, por fonte (eólica, fotovoltaica)",
   "grao_temporal": "dia",
   "fontes": [
    "ons_coff_eolica",
    "ons_coff_fotovoltaica"
   ],
   "formula": "condição(d) = taxa7(d) > P95{taxa7(d − i), i = 7..371}; taxa7 = 100 × Σ não gerada ÷ Σ (verificada + não gerada)",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "ESTIMADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "regras_comparabilidade": [
    "Universo de usinas dos arquivos de restrição do ONS (muda com usinas novas); taxa de razão de somas."
   ],
   "regra_cobertura": "Eólica avaliável desde 13/10/2022 e fotovoltaica desde 13/04/2025 (registros desde out/2021 e abr/2024, mais 365 janelas anteriores completas).",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "Energia não gerada é estimativa do ONS da geração possível (natureza ESTIMADO, como em geracao_restricao_taxa); MMGD não entra."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_revisao_material",
   "titulo": "Regra: revisão material de dado já publicado",
   "pergunta": "A fonte mudou números que esta página usa?",
   "definicao": "Captura nos últimos 7 dias com ao menos uma revisão material de série da Visão geral: |Δ| ≥ 1% do valor anterior e ≥ piso da unidade (0,1 p.p.; 10 MWmed ou MWmês; R$ 0,01/MWh).",
   "unidade": "revisões",
   "grao_geografico": "séries usadas pela Visão geral",
   "grao_temporal": "dia de captura (Brasília)",
   "fontes": [
    "ear_subsistema_di",
    "ena_subsistema_di",
    "carga_energia_di",
    "balanco_energia_subsistema_ho",
    "intercambio_nacional_ho",
    "ccee_pld_horario",
    "cmo_se"
   ],
   "formula": "condição(d) = ∃ captura c, d − 6 ≤ dia(c) ≤ d, com revisão material",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "regras_comparabilidade": [
    "Revisão é comparação entre capturas consecutivas do mesmo arquivo; antes da primeira captura comparável o dia não é avaliado.",
    "Só contam séries que entram em algum número da página (sintese.json#revisoes.series_da_pagina)."
   ],
   "regra_cobertura": "Capturas versionadas do silver principal (desde 27/09/2026).",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "Histórico curto: frequência anual não estimável antes de um ano de capturas."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_regra_termica",
   "titulo": "Regra: participação térmica extrema",
   "pergunta": "As térmicas estão gerando muito mais ou muito menos que no último ano?",
   "definicao": "Participação térmica de 7 dias abaixo do 5º ou acima do 95º percentil das 365 janelas terminadas de 7 a 371 dias antes, todas no regime do balanço iniciado em 29/04/2023; alerta com 7 dias seguidos, retorno com 7.",
   "unidade": "% da geração do balanço",
   "grao_geografico": "SIN",
   "grao_temporal": "dia",
   "fontes": [
    "balanco_energia_subsistema_ho"
   ],
   "formula": "condição(d) = part7(d) < P5 ou > P95 de {part7(d − i), i = 7..371}",
   "regra_agregacao": "condição diária booleana; episódio = duração mínima de dias seguidos com a condição; fim = dias seguidos sem ela",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "dia",
    "regra"
   ],
   "componentes_natureza": [
    {
     "natureza": "ESTIMADO",
     "desde": "2023-04-29",
     "descricao": "estimativa da MMGD somada pelo ONS à geração solar do balanço",
     "fonte": "geracao.json#proveniencia.termica_7d.limitacoes"
    }
   ],
   "regras_comparabilidade": [
    "Só avaliada com 365 janelas inteiras no mesmo regime (a partir de maio de 2024)."
   ],
   "regra_cobertura": "Dias com as 365 janelas anteriores completas no regime atual.",
   "politica_ausencia": "Dia sem dado ou sem base completa não é avaliado: não confirma nem normaliza o alerta e interrompe a contagem de dias seguidos.",
   "validacoes": [
    "Frequência de disparo reavaliada em todos os dias desde 01/01/2021 com os dados vigentes na data de processamento (já revisados), pela mesma função que avalia o dia (gold/sintese.py: episodios e resumo_historico).",
    "estado do dia reavaliado e comparado com a classificação publicada pela base publicada de origem"
   ],
   "limitacoes": [
    "Alerta descreve condição medida; não implica causa nem é previsão.",
    "O balanço não separa a térmica por combustível nem por motivo de despacho.",
    "O total do balanço inclui, na solar, a estimativa de MMGD do ONS desde 29/04/2023 (ESTIMADO): a participação não é toda de geração medida."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  },
  {
   "gold": "sintese.json",
   "paginas": [
    "/setor-eletrico/visao-geral"
   ],
   "versao_formula": "1.0",
   "id": "visao_revisoes_janela_frase",
   "titulo": "Referências revisadas na janela da frase",
   "pergunta": "Algum dado usado nesta frase foi revisado pela fonte entre capturas?",
   "definicao": "Número de referências distintas (dias ou horas) dentro da janela da frase em que ao menos uma das séries que a frase usa (gold/sintese.py, SERIES_FRASE) mudou de valor entre capturas consecutivas no silver principal; acompanham o número de pares (série, referência) revisados e a maior variação relativa, com a série e a referência que a produziram.",
   "unidade": "referências",
   "grao_geografico": "frase",
   "grao_temporal": "janela da frase",
   "fontes": [
    "ear_subsistema_di",
    "ena_subsistema_di",
    "carga_energia_di",
    "balanco_energia_subsistema_ho",
    "intercambio_nacional_ho",
    "ccee_pld_horario"
   ],
   "formula": "referências = |{ref : ∃ série s ∈ séries da frase, ref na janela, valor(s, ref) mudou entre capturas consecutivas}|; pares = |{(s, ref)}| com a mesma condição; maior = max |Δ| ÷ |valor anterior| × 100",
   "regra_agregacao": "contagem",
   "natureza_fonte": "OBSERVADO",
   "natureza_transformacao": "CALCULADO",
   "dimensoes": [
    "frase"
   ],
   "regras_comparabilidade": [
    "Séries horárias contam horas; séries diárias contam dias.",
    "Revisões de séries do mesmo conjunto que a frase não usa (ENA armazenável, carga do balanço, linhas de subsistema do balanço) ficam de fora."
   ],
   "regra_cobertura": "Capturas versionadas do silver principal (desde 27/09/2026).",
   "politica_ausencia": "Referência ausente numa captura não é revisão.",
   "validacoes": [
    "mesma lista de revisões publicada em sintese_revisoes.csv"
   ],
   "limitacoes": [
    "Antes das capturas versionadas não há como medir revisão."
   ],
   "arquivo": "pipeline/energia/metricas/visao.py"
  }
 ]
}