# PNTP — Transversal: 5 itens, declarações, evidências e qualidade

> **Critérios:** todos, com ênfase nos 5 itens de verificação e nas dimensões 1.1/1.2.
> **Fase:** [`P29`](../../implementation-phases/P29-conformidade-pntp.md).
> **Estado atual:** cada fase tem filtros/export pontuais, mas não há garantia sistemática de
> `Atualizado em`, série de 3 anos, CSV, declaração de inexistência e prova de “sem login”.

## 1. Os 5 itens como contrato

| Item | Contrato do V7 | Prova |
|---|---|---|
| Disponibilidade | rota pública 200, HTML, sem login, URL estável | crawl de todas as rotas públicas |
| Atualidade | `Atualizado em` visível + `dateModified` JSON-LD | auditoria por módulo + teste |
| Série histórica | `exercicio`/`ano`, arquivamento, filtro | teste com 3 anos |
| Gravação | CSV determinístico | teste de bytes/ordem/cabeçalho |
| Filtro | server-side, allowlist | teste de query + resultado |

### 1.1 Disponibilidade
- Nenhuma rota de transparência pode redirecionar para login.
- 200 com conteúdo; não contar “em construção”.
- `X-Robots-Tag` só em áreas restritas (ADR-043); transparência é indexável.
- Teste de crawl: para cada rota pública, status 200, `Content-Type: text/html`, presença de
  `<main>`/tabela/lista.

### 1.2 Atualidade
- Componente `UpdatedAt` no layout/portal: data visível, `datetime` ISO e `dateModified` no
  `@graph`.
- Cada módulo declara `max_age_days` (30, 180, 365, 15, 25/45 dias úteis) e o `pntp:audit` compara
  `updated_at`/`publicado_em` com o prazo.
- “Atualizado em” não é a data do deploy; é a data do dado.

### 1.3 Série histórica
- `exercicio`/`ano` é coluna indexada; não derivar do `created_at`.
- Arquivar não apaga; `down()` preserva `backup_*`.
- Filtro por exercício; o padrão é o ano corrente, mas o histórico fica acessível.

### 1.4 Gravação
- `OpenData` (P5.5) com CSV: UTF-8, cabeçalho, ordem explícita, `fputcsv`, anti-injection
  (`=+-@`), `Content-Disposition: attachment`, sem PII além do allowlist.
- XLSX não é necessário; CSV é aceito pela cartilha.
- O CSV de um critério deve incluir **todas** as colunas exigidas, inclusive as do detalhamento.

### 1.5 Filtro
- Server-side, com allowlist de parâmetros; nunca filtrar a lista completa no navegador.
- Filtros mínimos por critério (exercício, mês, nome, documento, tipo, situação).
- Estado vazio explica e, quando aplicável, mostra a declaração de inexistência.

## 2. Declaração de inexistência

Tipo de conteúdo estruturado, não HTML livre:

- `declaracoes_inexistencia`: `id`, `criterio` (ex. `8.7`), `modulo`, `periodo_inicio`,
  `periodo_fim`, `texto` (AST ou texto validado), `publicado_em`, `updated_at`, `active`.
- Componente `<x-pntp::declaracao :criterio="'8.7'" />` ou consulta por critério; aparece na
  página do módulo quando não há registros.
- A declaração atende Disponibilidade, Filtro e Gravação; Atualidade/Série seguem a data declarada.
- CMS: `declaracoes.ver/editar`; auditoria; 4 locales.

## 3. Evidências e autoavaliação (PODE)

- `pntp_criterios` (referência idempotente, 181 linhas; `aplicavel` por perfil) e
  `pntp_evidencias` (`criterio`, `url`, `status`, `verificado_em`, `nota`).
- Tela CMS `Suporte → PNTP`: matriz, status, link da evidência, pendências; export CSV.
- Comando `pntp:audit`: verifica URLs, 200/HTML, `Atualizado em`, CSV, filtro e série; falha
  visível; não substitui a avaliação oficial.
- Sem prometer nota/selo; a tela é operacional.

## 4. PDF pesquisável

- Media registra `pdf_pesquisavel` (atestado do operador + amostra) e avisa no CMS.
- PDF escaneado não conta para critérios que exigem PDF pesquisável.
- Sem OCR (licença/peso, ADR-002); se o cliente exigir, decisão separada.

## 5. Evidência e testes

- [ ] Crawl de rotas públicas: 200, HTML, sem login.
- [ ] `UpdatedAt` em todas as páginas de dados; `dateModified` válido.
- [ ] CSV de cada critério com colunas completas; ordem/checksum.
- [ ] Filtros server-side; query count.
- [ ] Declaração de inexistência renderizada e exportável.
- [ ] `pntp:audit` com relatório; `make check` 2× + `E2E=1`; axe.

## 6. 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 de rotas, cache, timeout |
