# P29 — Conformidade PNTP: declarações, evidências e qualidade

| Campo | Valor |
|---|---|
| Programa | F7+ — operação, estrutura e conteúdo |
| Status | `planejado` |
| Depende de | P22–P28 |
| Habilita | — |
| Tamanho | **G** (4–6 sessões) |
| ADRs | ADR-053 (PDF pesquisável), ADR-001, ADR-002, ADR-018, ADR-019, ADR-024, ADR-027, ADR-035, ADR-043 |

## 1. Objetivo

Transformar os **5 itens de verificação** do PNTP (Disponibilidade, Atualidade, Série Histórica,
Gravação de Relatórios e Filtro de Pesquisa) em contrato verificável em todos os módulos, e
entregar a **declaração de inexistência** e a **evidência** que a avaliação cobra. Não é um novo
portal: é a camada de qualidade que fecha P22–P28.

**Resultado observável:** o `pntp:audit` percorre as rotas públicas e reporta 200/HTML/sem login,
`Atualizado em`, CSV e filtro; toda página de dados vazia mostra a declaração; o CMS tem a matriz
de evidências; o build falha se uma rota de transparência exigir login ou não tiver atualização.

## 2. Escopo fechado

### S1 — Contratos transversais

- `Core\Support\UpdatedAt`/componente `<x-pntp::updated-at>`: data visível, `datetime` ISO e
  `dateModified` no `@graph`.
- `Services\OpenData` (`DatasetExporter`, P5.5) usado por todos os datasets públicos: CSV UTF-8,
  cabeçalho, ordem explícita, anti-injection, `Content-Disposition`; teste de colunas por critério.
  Relatório operacional que **não** é dataset público usa o mesmo contrato de bytes do
  `DatasetExporter`; não criar um segundo serializador no módulo nem no Core.
- Convenção de `exercicio`/`ano` e arquivamento (sem `DELETE`) documentada e testada.
- Filtros server-side com allowlist; nenhum filtro no navegador.

### S2 — Declaração de inexistência

> **D18:** declaração é conteúdo estruturado (tabela + AST + componente), não HTML livre.

- `declaracoes_inexistencia`: `id`, `criterio`, `modulo`, `periodo_inicio`, `periodo_fim`,
  `texto` (AST/texto validado), `publicado_em`, `updated_at`, `active`.
- Componente `<x-pntp::declaracao>`; aparece quando o conjunto está vazio; link no CMS.
- Permissões `declaracoes.ver/editar`; auditoria; 4 locales.
- A declaração responde Disponibilidade/Filtro/Gravação; Atualidade/Série seguem a data declarada.

### S3 — Auditoria e evidências

- Comando `pntp:audit`:
  - crawl das rotas públicas de transparência (allowlist do manifest) → status, content-type,
    presença de `<main>`/tabela, ausência de redirect para login;
  - verifica `Atualizado em`/`dateModified` e `max_age_days` por módulo;
  - verifica CSV (200, `text/csv`, cabeçalho) e filtro (parâmetro allowlist);
  - relatório por critério; falha visível; não substitui a avaliação oficial.
- `pntp_criterios` (referência idempotente, 181 linhas, `aplicavel` por perfil) e
  `pntp_evidencias` (`criterio`, `url`, `status`, `verificado_em`, `nota`) — **PODE**; tela
  `Suporte → PNTP`; export CSV.
- Sem prometer nota/selo; a tela é operacional.

### S4 — PDF pesquisável e conteúdo

- **D20:** PDF **gerado pelo sistema** (Diário Oficial, atos, relatórios) é produzido a partir do
  dado bruto no banco, com camada de texto real; a busca indexa o texto estruturado e o PDF é
  pesquisável. Exemplo: uma edição do Diário gerada de `diario_edicoes`/matérias, não um scan.
- **PDF anexado externo** não passa por OCR. Media registra `pdf_pesquisavel` como atestado
  (`true|false|unknown`), com amostra; o CMS avisa. Sem camada de texto, não há promessa de
  pontuação; o operador pode substituir por versão pesquisável.
- Sem OCR (ADR-002); se o cliente exigir, decisão separada (dependência, custo, privacidade).
- HTML é a superfície; PDF/CSV é complemento; link externo não substitui 17.1–17.3.

### S5 — Fechamento

- E2E: crawl de rotas, declaração, `Atualizado em`, CSV, filtro, sem login.
- `make check` 2× + `E2E=1`; `SNIFF_A11Y_STRICT=1`; cobertura ≥90%.
- Atualizar `PNTP.md`, `INVENTARIO.md` e o estado das fases.

## 3. Fora de escopo

- Motor de avaliação oficial/nota/selo; integração com o Radar.
- OCR, assinatura digital, ETL.
- Substituir os testes de cada fase; P29 é a camada transversal.

## 4. Fatias de sessão

| Sessão | Entrega | Prova | Depende |
|---|---|---|---|
| **P29.S1** | `UpdatedAt` + `Export` + convenções | data/CSV/filtro em 2 módulos | P9/P22 |
| **P29.S2** | declaração de inexistência | página vazia declara; CMS; 4 locales | S1 |
| **P29.S3** | `pntp:audit` + evidências (PODE) | crawl/CSV/filtro; relatório | S1–S2 |
| **P29.S4** | PDF pesquisável (gerado × anexo) | gerado tem texto; externo atestado; sem OCR | S1 |
| **P29.S5** | E2E/docs/2× check | evidência no `kd` | S1–S4 |

## 5. Contratos e dados

- **Componentes:** `UpdatedAt`, `Declaracao`, `PntpBadge` (opcional).
- **Tabelas:** `declaracoes_inexistencia`, `pntp_criterios`, `pntp_evidencias`.
- **Comando:** `pntp:audit`.
- **Serviço:** `Services\OpenData` (`DatasetExporter`, P5.5) para CSV/JSON/XML públicos; nenhum
  `services/Export` separado.
- **Rotas:** `pntp.cms.*` (Suporte), `declaracoes.cms.*`.

## 6. DoD

- [ ] 5 itens contratualizados e testados em todos os módulos P22–P28.
- [ ] `Atualizado em`/`dateModified`; CSV; filtro; 3 anos; sem login.
- [ ] Declaração de inexistência renderizada e exportável.
- [ ] `pntp:audit` com relatório; falha visível; sem promessa de selo.
- [ ] PDF gerado pelo sistema tem texto pesquisável; anexo externo é atestado sem OCR.
- [ ] `make check` 2× + `E2E=1`; cobertura ≥90%.

## Fechamento — ficha de revisão

> **Obrigatório antes de fechar:** criar `_to_revision/P29-conformidade-pntp.md` e seguir
> `_to_revision/README.md` + `_to_revision/PROTOCOLO.md` (v2.0). A ficha não é gate de build; é a
> entrada da fila de revisão profunda.

- Cabeçalho: fase, `kd` épico/tasks/slices, âncoras (este arquivo, ADRs e código) e status
  `⬜ pendente` → `🟡 em revisão` → `✅ revisado` / `🔧 com correções`.
- Conteúdo: o que foi implementado, arquivos/superfícies a revisar, checklist D1–D14 aplicável,
  riscos e observações.
- Fechamento: preencher “Notas da revisão” com data/revisor/resultado e achados (`kd write
  --anchor`), atualizar a fila em `_to_revision/README.md` e `_to_revision/_inventario.md`.
- Achado com correção exige teste vermelho→verde; a fase só é `closed` no `kd` com a ficha
  registrada.

## 7. Riscos

| Risco | Mitigação |
|---|---|
| “Atualizado em” de deploy | data do dado; teste de campo |
| CSV incompleto | contrato por critério; teste de colunas |
| Declaração em HTML livre | AST/validação; componente |
| Auditoria virar promessa de selo | relatório operacional, sem nota |
| Crawl lento | allowlist; cache; timeout |
| PDF escaneado | gerado pelo sistema tem texto; anexo externo atestado + aviso; sem OCR |

## 8. Retomada

```bash
kd prime
kd ask "PNTP auditoria declaração inexistência atualizado em CSV filtro"
kd task list --ready
```

Ler: `wiki/backlog/pntp-2026/transversal.md` → `PNTP.md` §2/§4 → P22–P28.
