{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://extrato.digital/schema/extrato.schema.json",
  "title": "Extrato de mandato ou cargo em exercício",
  "description": "Formato canônico da saída do método extrato.digital. Descreve ATOS de um mandato ou cargo em exercício, cada um com a URL da fonte oficial e a data da consulta. Por desenho, não existe campo de nota, score, ranking, comparação entre pessoas ou veredito — nem em nome de propriedade. Ver https://extrato.digital/formato-do-extrato e https://extrato.digital/legislacao.",
  "type": "object",
  "required": [
    "versaoSchema",
    "identificacao",
    "carimbo"
  ],
  "additionalProperties": false,
  "properties": {
    "versaoSchema": {
      "const": 1
    },
    "aviso": {
      "type": "string",
      "description": "Texto de encerramento do extrato (fato, não recomendação eleitoral)."
    },
    "identificacao": {
      "type": "object",
      "required": [
        "cargo",
        "situacao",
        "fonte",
        "consultadoEm"
      ],
      "additionalProperties": false,
      "description": "Quem exerce o cargo, confirmado na fonte — nunca de memória.",
      "properties": {
        "nome": {
          "type": "string",
          "description": "Como publicado pela fonte oficial. Ausente quando o retrato é do órgão/ente."
        },
        "cargo": {
          "type": "string"
        },
        "casaOuOrgao": {
          "type": "string"
        },
        "uf": {
          "type": "string",
          "maxLength": 2
        },
        "situacao": {
          "type": "string",
          "enum": [
            "em exercício",
            "licenciado",
            "suplente em exercício",
            "afastado",
            "não localizado"
          ],
          "description": "\"Eleito\" não é situação: o método cobre quem exerce."
        },
        "legislaturaOuMandato": {
          "type": "string"
        },
        "fonte": {
          "type": "string",
          "format": "uri"
        },
        "consultadoEm": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "trajetoria": {
      "type": "array",
      "description": "Cargos efetivamente exercidos, um por linha, cada um com fonte. Sem total de anos, sem série consolidada, sem filiações intercaladas.",
      "items": {
        "type": "object",
        "required": [
          "cargo",
          "fonte",
          "consultadoEm"
        ],
        "additionalProperties": false,
        "properties": {
          "cargo": {
            "type": "string"
          },
          "orgaoOuEnte": {
            "type": "string"
          },
          "inicio": {
            "type": "string"
          },
          "fim": {
            "type": [
              "string",
              "null"
            ]
          },
          "fonte": {
            "type": "string",
            "format": "uri"
          },
          "consultadoEm": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    },
    "recursos": {
      "type": "array",
      "description": "Cota parlamentar, verba de gabinete, emendas, execução orçamentária — cada valor com a nota/documento.",
      "items": {
        "type": "object",
        "required": [
          "descricao",
          "fonte",
          "consultadoEm"
        ],
        "additionalProperties": false,
        "properties": {
          "descricao": {
            "type": "string",
            "description": "O fato, em linguagem descritiva — nunca um juízo."
          },
          "valor": {
            "type": [
              "number",
              "string",
              "null"
            ],
            "description": "Valor numérico ou textual como publicado pela fonte."
          },
          "unidade": {
            "type": "string",
            "description": "Ex.: BRL, votos, dias. Declare para não confundir escala."
          },
          "data": {
            "type": "string",
            "description": "Data do FATO (AAAA-MM-DD) — diferente da data da consulta."
          },
          "fonte": {
            "type": "string",
            "format": "uri",
            "description": "URL do endpoint ou documento oficial. Sem isso, a linha não entra."
          },
          "consultadoEm": {
            "type": "string",
            "format": "date-time",
            "description": "Quando a fonte foi consultada, ISO 8601 com fuso."
          },
          "observacao": {
            "type": "string"
          },
          "rotulo": {
            "const": "registro público a verificar",
            "description": "Único rótulo admissível para um sinal. Rótulos que afirmam culpa (\"irregularidade\", \"suspeita\", \"problema\") são vedados — inclusive como nome de coluna ou chave."
          }
        }
      }
    },
    "producaoEAtuacao": {
      "type": "array",
      "description": "Proposições (separando autoria de adesão), votações com a votação-fonte, comissões, relatorias, contratos.",
      "items": {
        "type": "object",
        "required": [
          "descricao",
          "fonte",
          "consultadoEm"
        ],
        "additionalProperties": false,
        "properties": {
          "descricao": {
            "type": "string",
            "description": "O fato, em linguagem descritiva — nunca um juízo."
          },
          "valor": {
            "type": [
              "number",
              "string",
              "null"
            ],
            "description": "Valor numérico ou textual como publicado pela fonte."
          },
          "unidade": {
            "type": "string",
            "description": "Ex.: BRL, votos, dias. Declare para não confundir escala."
          },
          "data": {
            "type": "string",
            "description": "Data do FATO (AAAA-MM-DD) — diferente da data da consulta."
          },
          "fonte": {
            "type": "string",
            "format": "uri",
            "description": "URL do endpoint ou documento oficial. Sem isso, a linha não entra."
          },
          "consultadoEm": {
            "type": "string",
            "format": "date-time",
            "description": "Quando a fonte foi consultada, ISO 8601 com fuso."
          },
          "observacao": {
            "type": "string"
          },
          "rotulo": {
            "const": "registro público a verificar",
            "description": "Único rótulo admissível para um sinal. Rótulos que afirmam culpa (\"irregularidade\", \"suspeita\", \"problema\") são vedados — inclusive como nome de coluna ou chave."
          }
        }
      }
    },
    "lacunas": {
      "type": "array",
      "description": "Lacuna é informação. \"Não obtido\" (falha de acesso), \"sem registro no recurso publicado\" (a fonte respondeu e não há registro) e \"não declarado pelo órgão\" (inadimplência declaratória) são três fatos diferentes.",
      "items": {
        "type": "object",
        "required": [
          "oQue",
          "tipo"
        ],
        "additionalProperties": false,
        "properties": {
          "oQue": {
            "type": "string"
          },
          "tipo": {
            "type": "string",
            "enum": [
              "não obtido",
              "sem registro no recurso publicado",
              "não declarado pelo órgão",
              "não existe em dado aberto"
            ]
          },
          "comoConferir": {
            "type": "string"
          },
          "fonte": {
            "type": "string",
            "format": "uri"
          }
        }
      }
    },
    "carimbo": {
      "type": "object",
      "required": [
        "playbook",
        "versaoPlaybook",
        "geradoEm"
      ],
      "additionalProperties": false,
      "description": "Carimbo de reprodutibilidade: torna o extrato re-derivável e lembra que ele é um INSTANTÂNEO — a mesma consulta pode dar número diferente amanhã, sem que nenhum esteja errado.",
      "properties": {
        "playbook": {
          "type": "string",
          "description": "Ex.: deputado-federal"
        },
        "versaoPlaybook": {
          "type": "string",
          "description": "Ex.: 0.18 — cite o snapshot imutável correspondente."
        },
        "snapshot": {
          "type": "string",
          "format": "uri"
        },
        "geradoEm": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 com fuso (o método usa America/Sao_Paulo)."
        },
        "janelaConsultada": {
          "type": "string"
        },
        "assistente": {
          "type": "string",
          "description": "Opcional: qual IA executou o método."
        }
      }
    }
  },
  "propertyNames": {
    "not": {
      "pattern": "(?i)^(nota|score|pontuacao|pontuação|ranking|posicao|posição|avaliacao|avaliação|veredito|suspeita|irregularidade|comparacao|comparação)$"
    }
  }
}
