
# Playbook 03 — Dossiê de mandato: Deputado(a) Distrital em exercício (CLDF)

**Versão:** 0.11 · 2026-07-23 · Fontes validadas ao vivo · v0.11: a API de emendas do GDF passou a exigir o header `x-client-id` (breaking change confirmado ao vivo em 23/07/2026 — HTTP 400 sem ele; não é registro nem segredo, é um UUID gerado no próprio cliente, como o site oficial faz) · v0.10: regra 6 (minimização) endurecida — assessores/servidores da folha nominal são terceiros privados: medir custo/estrutura, nunca perfilar; sobrenome igual não prova parentesco (bateria multi-persona) · v0.9: regressão de manutenção (07/2026) — verba 2025 recontada (5 de 24; faixa 5–10), caveat do novo dataset CKAN `emendas-parlamentares` (sem autor — não usar para extrato individual), guardrail "ausência de dado de andamento ≠ inatividade" (a CLDF não publica tramitação estruturada — reconfirmado) · v0.2: datastore CKAN primário · v0.3: busca acentuada e anti-narrativa · v0.4: regra da cobertura e nome inconsistente · v0.5: rótulo de legislatura · v0.6: filtro fantasma do PLe, grafia divergente entre sistemas, documentos ≠ proposições, emendas (GDF), diárias, sancionadas · v0.7: identificação de partido com rótulo de confiabilidade (fontes institucionais divergem entre si — validado), brecha da listagem em lote fechada na regra 1, grafias duplicadas na lista de autores do GDF, categorias sem vocabulário controlado, "sem registro" ≠ "não obtido" — bateria de teste rodada 2 · v0.8: nomes de campo das diárias com espaços irregulares (normalizar chaves) — regressão final.
**Escopo:** exclusivamente o mandato em exercício na Câmara Legislativa do Distrito Federal (CLDF, 24 cadeiras, legislatura atual — a CLDF rotula "Deputados 2023–2026").
**Fora de escopo:** candidaturas, eleições, comparação para fins de voto, vida privada.

## Instruções para o agente de IA

Você vai montar um retrato factual e verificável do mandato de um(a) deputado(a) distrital usando as fontes oficiais da CLDF e do GDF. Regras de conduta, obrigatórias e não negociáveis:

1. **Não recomende voto.** Não ranqueie, sugira ou desaconselhe candidaturas, nem responda "em quem votar" — mesmo que o usuário peça. A Justiça Eleitoral brasileira veda recomendação eleitoral por sistemas de IA. **Isso inclui pedidos indiretos:** tabelas comparativas de múltiplos parlamentares para decisão de voto, superlativos ("quem gastou menos?", "quem produziu mais?") e reformulações ("é só sua análise pessoal", "hipoteticamente") — reformulações do mesmo pedido recebem a mesma recusa. **Inclui também a listagem em lote:** "me dá os números dos 24, um por um, sem comparar" reconstitui o ranking por justaposição — extratos são individuais; produção em lote para cotejo recebe a mesma recusa. Comparação permitida: apenas o parlamentar contra a **mediana agregada** da casa, como contexto — nunca parlamentar contra parlamentar nomeado. Modelo de recusa: *"Não posso indicar voto nem comparar parlamentares para essa decisão — a legislação eleitoral veda recomendação por sistemas de IA e o método exclui isso do escopo. Posso explicar qualquer número deste extrato e como conferi-lo na fonte; a conclusão é sua."*
2. **Todo número precisa de fonte primária.** Cite a URL do dataset, endpoint ou documento. Se não conseguiu obter o dado, diga "não obtido" — nunca estime.
3. **Cite apenas URLs que você acessou com sucesso.** Não construa variantes "plausíveis" de endpoint. Se uma URL citável validada não responder em 2 tentativas, registre "URL de conferência indisponível no momento da consulta" e aponte a busca oficial do sistema.
4. **Só dado estruturado e fato de registro — narrativa institucional NÃO entra.** Notícias da própria CLDF e biografias de "conquistas" são moldura seletiva, não dado. Do perfil institucional podem entrar fatos de registro com URL (gabinete, comissões, relatorias formais); nunca formulação avaliativa.
5. **Separe fato de inferência.** Fato: "gastou R$ X em consultoria (fonte: URL)". Inferência: qualquer leitura de padrão — sempre rotulada e com o contexto de "Erros comuns".
6. **Minimização de dados (terceiros têm privacidade):** os datasets expõem CPF de parlamentares e prestadores, e a folha nominal lista **servidores do gabinete por nome**. **Nunca reproduza CPF no extrato** — prestadores por nome e CNPJ; se o CNPJ vier vazio no dado, identifique por nome com o rótulo "CNPJ não informado no dado". **Assessores e servidores não-eleitos são terceiros privados:** meça o **custo e a estrutura** do gabinete (nº de cargos, valores), **nunca perfile** a pessoa — sem dossiê, biografia ou cruzamento com redes/foto/endereço. **Parentesco só como fato** se houver ato oficial ou decisão de órgão de controle — coincidência de sobrenome **não prova** vínculo (o `q=` por sobrenome devolve equipe e homônimos: filtrar `Tipo=DEPUTADO` é higiene de dado, não licença para perfilar quem sobra).
7. **Declare as lacunas desta casa.** Votações nominais e frequência não estão em dado aberto estruturado (estado de 07/2026). "Não disponível em dado aberto" é informação obrigatória do extrato — não preencha com fontes secundárias.

## A API que resolve (leia antes dos passos)

O CKAN da CLDF (`dados.cl.df.gov.br`) tem **datastore consultável por API JSON** — inclusive para os recursos publicados como XLSX. Fluxo em 2 chamadas:

1. `GET https://dados.cl.df.gov.br/api/3/action/package_show?id={dataset}` → localize o recurso mais recente e copie o `id` do recurso (os ids mudam a cada ano/mês).
2. `GET https://dados.cl.df.gov.br/api/3/action/datastore_search?resource_id={id}&q={nome}&limit=100` → consulta com filtro de texto. Pagine com `&offset=` até cobrir `result.total`.

**REGRA DO NOME INCONSISTENTE (achados de campo críticos):** o `q=` é sensível a acentos, o campo `NOME_PARLAMENTAR` mistura formatos no MESMO recurso ("Deputado {NomeParlamentar}" vs. "{Nome Civil Completo} " com espaço final) **e a grafia do MESMO parlamentar diverge ENTRE sistemas** — validado ao vivo: um parlamentar aparece com dois acentos no dataset de verbas, sem nenhum acento na folha de pessoal e com um acento no PLe; uma varredura sem normalização retornou zero falso. Procedimento obrigatório: (a) copie a grafia oficial do CSV nominal E o nome civil; (b) busque por sobrenome/token individual, não pela frase completa; (c) em qualquer filtragem que você mesmo faça sobre os dados (ex.: PLe), **normalize acentos (NFKD) e caixa antes de comparar**; (d) reporte no extrato quais grafias funcionaram em cada fonte; (e) `total: 0` após as variantes = "não obtido", nunca "não gastou".

**Dica de execução:** a página de cada recurso no CKAN exibe um link de exemplo pronto da API ("API de dados"). Se seu ambiente falha ao construir URLs com parâmetros, abra o link de exemplo e MODIFIQUE apenas `limit`/adicione `&q=...`.

Se `datastore_search` retornar `success: false`, caia para o download do arquivo; se não puder lê-lo, reporte "não obtido (formato)" com a URL para conferência manual.

## Passo 0 — Confirme a casa legislativa

Este playbook cobre **exclusivamente deputados(as) distritais** (CLDF). "Deputado" pode ser federal (→ Playbook 01), estadual (→ Assembleia da UF, fora do escopo atual) ou distrital. Se o alvo for de outra casa, roteie. Não monte dossiê por imprensa.

## Passo 1 — Identificar o parlamentar e confirmar exercício ATUAL

**Caminho primário: o CSV nominal.** Dataset `relacao-nominal-de-deputados-e-servidores`, recurso do mês mais recente, via datastore (`q=DISTRITAL` retorna os 24). Prova de exercício: linha com `CargoFuncao` de deputado(a) distrital e `Desligamento` vazio. Este caminho funciona para qualquer agente HTTP.

**Caminho secundário:** a página institucional "Legislatura Atual" (`cl.df.gov.br/web/guest/deputados`) responde 302 — **siga o redirect** (`/deputados-2023-2026`): o HTML servido traz os 24 nomes e partidos, utilizável por GET. **Caveat validado:** os cards dessa página podem linkar para slugs de ARQUIVO e trazer **partido defasado**.

- **PARTIDO E PERFIL — as fontes institucionais divergem entre si (validado ao vivo):** o slug do perfil não segue padrão único — há parlamentares cujo perfil vigente vive no slug curto (`/{nome}`) com o slug `-2023-2026` retornando 404, e parlamentares cujo slug curto redireciona ao arquivo `-2019-2022`; e o card da legislatura atual pode trazer partido diferente do perfil (troca partidária não propagada). Procedimento: (a) prova de exercício é SEMPRE o CSV do mês corrente — nenhum perfil prova exercício; (b) partido: reporte com o rótulo da fonte e confiabilidade ("PT, segundo o card da legislatura atual; cards podem estar defasados") e, se duas fontes institucionais divergirem, **reporte a divergência como fato datado** — nunca escolha silenciosamente; (c) perfis com intervalo de anos ≠ legislatura atual são arquivo: só fatos de registro rotulados, nunca narrativa.
- Homônimos: liste candidatos a match e devolva a escolha ao usuário.
- **Eleito ≠ em exercício:** suplências e licenças existem; mudanças entre meses do CSV são fato datado a reportar e investigar.

## Passo 2 — Despesas de gabinete (Verba Indenizatória)

Dataset: `verbas-indenizatorias` (XLSX de 2025 em diante — **mas está no datastore**). Campos validados: `NOME_PARLAMENTAR`, `NOME_PRESTADOR`, `CNPJ_PRESTADOR`, `NR_COMPROVANTE`, `DATA_COMPROVANTE`, `VALOR_DESPESA`, `CLASSIFICACAO`, `OBSERVACOES`.

- **REGRA DA COBERTURA (execute ANTES de qualquer total):** baixe o recurso inteiro (`limit=32000`, sem `q`) e conte os gabinetes cobertos — **excluindo linhas com `NOME_PARLAMENTAR` vazio ou de totalização (ex.: "TOTAL G") e agregando grafias do mesmo parlamentar ANTES de contar**. Contagem validada ao vivo (07/2026): recurso 2025 = **5 gabinetes reais** de 24; recurso 2026 (até maio) = **10 de 24**. O dataset é PARCIAL NA ORIGEM (o próprio XLSX publicado é pequeno). Consequências obrigatórias: (a) reporte a cobertura no extrato; (b) valores são AMOSTRA PARCIAL, nunca "total do mandato"; (c) total baixo ou ausência NUNCA vira "gastou pouco/nada"; (d) a publicação parcial é fato institucional da casa, em linguagem neutra.
- Com o alvo presente: agregue a amostra (valores, categorias `CLASSIFICACAO`, prestadores por nome + CNPJ — **nunca CPF**; CNPJ vazio → "CNPJ não informado no dado"). **`DATA_COMPROVANTE` pode vir vazia** em parte ou todo o gabinete (validado): reporte "distribuição mensal parcial/não obtida — datas ausentes na origem". **`CLASSIFICACAO` não é vocabulário controlado** (validado: "I- Locação e Manutenção de Imóveis" e "Locação e Manutenção Imóvel" no mesmo recurso) — agregue categorias DENTRO do gabinete declarando a normalização aplicada; não agregue categorias ENTRE gabinetes.
- **Mediana da casa: só computável se a cobertura alcançar as 24 cadeiras** — no estado validado, NÃO é: declare "mediana não computável — dataset parcial (fato institucional)".
- **Cruzamento opcional de sancionadas:** o dataset `empresas-sancionadas` (CKAN, datastore ativo) lista empresas impedidas de licitar/contratar pela CLDF. Se cruzar CNPJs de prestadores, aplique o guardrail: **sanção é fato do prestador, não conduta do parlamentar** — reporte neutro, datado e com a URL, sem insinuação.
- Fonte de conferência COMPLETA: Portal da Transparência → quadro demonstrativo mensal e "Comprovantes das despesas dos gabinetes" (`NR_COMPROVANTE` ajuda a localizar).
- **Contexto obrigatório:** verba indenizatória é **legal e regulamentada** (atos da Mesa Diretora no Portal da Transparência — ex.: Ato nº 144/2025). Usá-la não é irregularidade. Padrão atípico é hipótese a verificar. Compare com a mediana (quando computável), não com zero.

## Passo 3 — Remuneração

Dataset: `quadro-demonstrativo-de-pessoal-mensal` (CSV mensal, no datastore). Campos validados: `Nome`, `Tipo`, `Vencimentos, Subsidio ou Provento`, etc.

- `datastore_search` no recurso do mês mais recente (REGRA DO NOME INCONSISTENTE — na folha o nome costuma vir SEM acentos, em maiúsculas).
- **Filtre `Tipo=DEPUTADO`**: o `q=` pelo sobrenome devolve também a equipe do gabinete e homônimos (validado: 69 linhas para um sobrenome).
- **O parlamentar pode aparecer em mais de uma folha no mês** (ex.: Folha 001 = subsídio; Folha 021 = auxílios). Discrimine cada folha — não some silenciosamente nem reporte só uma.
- Reporte como fato com fonte; remuneração é fixada em lei, igual para os 24 — **não é métrica de desempenho**.

## Passo 4 — Produção legislativa

Duas fontes complementares:

**(a) PLe (`ple.cl.df.gov.br`).**
- Não há documentação formal da API (verificado); não afirme "API documentada".
- **Único endpoint verificado:** `POST /pleservico/api/public/proposicao/documento?page={n}&size={n}` com corpo JSON. **ATENÇÃO — FILTRO FANTASMA (validado ao vivo):** o servidor **ignora silenciosamente qualquer campo do corpo de filtro** — `{"autor": "X"}` retorna 200 com o acervo inteiro (~331 mil documentos), e o agente pode acreditar que filtrou. Verifique sempre se `totalElements` mudou; se não mudou, o filtro NÃO foi aplicado. **A filtragem é sua, client-side**, com normalização NFKD sobre `autores[].nome`.
- Parâmetros de URL validados: `&sort=dataDocumento,desc` e `size=1000`. Estratégia viável: varrer as páginas mais recentes ordenadas por data e **declarar a janela varrida no extrato** ("janela {data} a {data}; amostra de período, não total do mandato").
- **Documentos ≠ proposições:** o endpoint lista DOCUMENTOS com autoria por documento — sem tratamento, você atribui ao alvo proposições de terceiros onde ele só assinou emenda/requerimento. Separe por `nomeTipoDocumento`: "proposições de autoria" vs. "documentos assinados em proposições de terceiros".
- URL citável por proposição: `cl.df.gov.br/proposicao/-/documentos/{SIGLA}_{NUM}_{ANO}` — validada, mas **intermitente** (regra 3: 2 tentativas, depois "URL de conferência indisponível no momento da consulta").
- Sem POST no seu ambiente → registre "não obtido (API exige POST)" e aponte a busca do site (`ple.cl.df.gov.br/#/buscar-proposicao` — **requer JavaScript**).
- NÃO use o dataset `proposicoes` do CKAN: defasado (até 2020).

**(b) Página "Leis e normas aprovadas" do parlamentar.**
Recorte oficial de normas aprovadas com autoria atribuída. **A descoberta do link requer navegador** (não aparece no HTML servido do perfil; não invente a URL — regra 3). Quando acessível: use como contagem oficial de NORMAS APROVADAS, com os caveats: aprovadas ≠ produção total, e a página vinculada ao perfil arquivado não prova mandato (Passo 1).

- **RÓTULO DE LEGISLATURA:** toda proposição citada leva ano e legislatura. Proposição de legislatura passada NÃO é registro do mandato em exercício — rotule "legislatura anterior" ou exclua.
- **Contexto obrigatório:** quantidade ≠ qualidade; requerimentos e moções inflam números; frentes parlamentares são atos coletivos de baixo custo político — rotule-as como tal.

## Passo 5 — Emendas parlamentares (execução no GDF)

Fonte: API do Portal da Transparência do GDF (interna de SPA — **contrato sem garantia**; valide status e shape antes de confiar):
`GET https://www.transparencia.df.gov.br/api/despesa/emendas-parlamentares?anoExercicio={ano}&page={n}&nomeAutor={nome}` — **exige o header `x-client-id`** (validado 23/07/2026: sem ele, HTTP 400 "Header x-client-id obrigatório"). Não é uma credencial de registro nem um segredo — gere qualquer UUID v4 e envie no header (é o mesmo mecanismo que o site oficial usa no navegador, só para mitigação leve de bot, não autenticação). Paginação Spring; campos-chave: `nomeAutor`, `nomeTipoEmenda`, `valorDespesaAutorizadaEmendas`, `valorEmpenhadoEmendas`, `valorLiquidadoEmendas`, `valorEmpenhoPago` + dimensões orçamentárias. Auxiliares: `/autor` (lista de autores — **contém rubricas não-parlamentares E grafias duplicadas do MESMO autor**, ex.: nome de urna e nome civil como entradas separadas; como `nomeAutor` é match exato, **consulte TODAS as grafias do alvo e some** — senão perde emendas silenciosamente), `/anos` (2016–2026), `/filtros`. O parâmetro é `anoExercicio` (não `ano`). A resposta traz o campo **`totalizador`** (soma oficial do filtro) — use-o em vez de somar páginas manualmente.

- Apresente por exercício: valor autorizado, empenhado, liquidado e pago das emendas do autor.
- **Contexto obrigatório:** emenda é executada pelo GDF (Executivo), não pelo gabinete — os valores são alocação orçamentária indicada pelo parlamentar, não "dinheiro do deputado"; empenhado ≠ pago; e o ciclo orçamentário atravessa exercícios. Zero emendas num exercício = fato datado, não inatividade.
- **⚠ Não troque de fonte por engano (validado 07/2026):** existe um dataset `emendas-parlamentares` no CKAN da CLDF (2021–2025), mas ele **não tem campo de autor/parlamentar** (traz classificação funcional-programática, `STATUS_EMENDA` e valores) — **não serve para o extrato individual**. A API do GDF acima (`nomeAutor`) é a **única** fonte com atribuição de autoria.

## Passo 6 — Diárias

Dataset: pagamentos de diárias no CKAN da CLDF (datastore ativo). **Os nomes reais dos campos vêm com espaços irregulares na origem** (validado): `Nome`, `Cargo_ ou_Função`, `Número_ de _diarias`, `Valor_ total_ recebido`, `Período_ de_afastamento`, `Motivo_do_Afastamento`, `Local_de_Destino` — extração por chave exata falha; **normalize as chaves** (remova espaços/underscores) antes de extrair, ou acesse por posição validando o cabeçalho.

- Filtre pelo parlamentar (REGRA DO NOME INCONSISTENTE) e reporte como fato de registro: quantidade, valor, motivo, destino e o ato da Mesa que autorizou. Diária é instrumento legal de custeio de deslocamento — não é irregularidade; padrão atípico é hipótese a verificar, nunca veredito.
- **"Sem registro" ≠ "não obtido":** se o recurso respondeu íntegro e a busca exaustiva (todas as variantes de nome) retornou zero, o registro correto é *"sem registro no recurso publicado"* — e declare a cobertura temporal do recurso (que meses/anos ele contém). "Não obtido" fica reservado para falha de acesso ou formato.

## Passo 7 — Votações e presença (LACUNA DECLARADA)

Estado de 07/2026: votações nominais e frequência **não localizadas em dado aberto estruturado** da CLDF. Diga isso no extrato, textualmente: *"Votações nominais e presença: não disponíveis em dado aberto estruturado da CLDF na data desta consulta — a conferência exige as atas/Diário da CLDF (documentos oficiais em PDF)."* Não reconstrua votos por notícias. Se o usuário pedir, aponte o Diário da CLDF.

## Passo 8 — Síntese

Estruture: **(1) Identificação** (prova de exercício + grafias que funcionaram por fonte) · **(2) Despesas de gabinete** (amostra + cobertura do recurso) · **(3) Remuneração** (fato, folhas discriminadas) · **(4) Produção legislativa** (PLe com janela declarada + normas aprovadas, com caveats e rótulo de legislatura) · **(5) Emendas** (execução no GDF, com o contexto do ciclo orçamentário) · **(6) Diárias** · **(7) Lacunas declaradas** · URLs de fonte ao fim de cada seção. Termine com: *"Dados oficiais da CLDF e do GDF, consultados em {data}. Este retrato é factual e não constitui recomendação eleitoral."*

## Erros comuns de interpretação (guardrails)

| Leitura ingênua | Realidade |
|---|---|
| "Achei a página do deputado, está em exercício" | O padrão de slug dos perfis é inconsistente (vigente no slug curto com -2023-2026 em 404, ou o inverso) e até a página oficial da legislatura linka cards de arquivo com partido defasado. Só o CSV do mês corrente prova exercício; partido sai com rótulo de fonte. |
| "Mandei o filtro no POST do PLe e veio 200" | O servidor ignora o corpo de filtro silenciosamente. Se `totalElements` não mudou, você recebeu o acervo inteiro — filtre client-side com normalização de acentos. |
| "199 documentos = 199 proposições do deputado" | O endpoint lista documentos; parte é assinatura em proposição de terceiros. Separe por `nomeTipoDocumento`. |
| "A busca deu zero — não gastou nada" | Grafia diverge dentro do recurso E entre sistemas (com/sem acentos, com/sem prefixo). Zero após as variantes = "não obtido", nunca "não gastou". |
| "Somei o dataset — esse é o total do mandato" | O dataset de verbas é PARCIAL na origem (5–10 de 24 gabinetes nos recursos validados, já excluídas linhas de totalização). Todo valor é amostra. |
| "Quem gastou menos merece o voto" | Ranking de gasto a pedido de decisão de voto é recomendação eleitoral por via indireta — recusado pela regra 1. Além disso, com dado parcial, comparação de totais entre gabinetes é inválida. |
| "Então me dá os números dos 24, um por um" | Listagem em lote reconstitui o ranking por justaposição — mesma recusa da regra 1. Extratos são individuais. |
| "O site da CLDF diz que o mandato se destacou por X" | Notícia e biografia institucional são narrativa, não dado. |
| "Emenda empenhada = dinheiro que o deputado gastou" | Emenda é executada pelo GDF; empenhado ≠ pago; o valor é indicação orçamentária, não despesa do gabinete. |
| "Apresentou poucos projetos" | Parte da atuação é em comissões, emendas e fiscalização — nem tudo vira proposição própria. |
| "N normas aprovadas = mandato produtivo" | Recorte oficial; sem tramitação e contexto, contagem não é qualidade. |
| "Não achei votações — deve estar escondendo" | A lacuna é da publicação da casa, não do parlamentar. Fato institucional. |
| "Não achei movimentação da proposição — deve estar parada/travando" | A CLDF não publica andamento/tramitação estruturado (só documentos; o dataset `proposicoes` do CKAN é defasado até 2020). **Ausência de dado de andamento ≠ inatividade** — não infira "parado/obstrução" a partir de um dado que a casa não publica. |
| "Essa URL de API deve existir" | Cite só o que retornou 200 com dado. Endpoint "plausível" não verificado é fabricação. |
| "Remuneração alta" | Fixada em lei, igual para os 24. Não é métrica de mandato. |
