# 05 — Golden dataset: construção do conjunto de validação

Base: os 40 processos testados em `ocr-mini/RESULTADOS-2026-09-22.md` (ids 770-851, com MAI, 66 cartões PSP com validade gravada, 39 validades de CC). Critério de aceitação da Fase 2 do plano: precisão e cobertura **por campo** contra este dataset, zero falsos de confiança alta, e todos os casos negativos bloqueados.

## 1. Princípio: sem adjudicação manual prévia (decisão do utilizador, 22/09/2026)

O utilizador não quer trabalho de verificação um a um. O conjunto de validação da Fase 2 é **automático**: para cada processo e campo, compara-se o que o motor lê (`valor_ocr`) com o que está gravado em prod (`valor_sabichao`, SELECT só-leitura). A verdade definitiva constrói-se depois **com o uso da app** (tabela `fichas_fiabilidade`): cada valor que o utilizador escreve ou corrige à mão numa linha em revisão, ou antes do apply, é registado como verdade e como sinal de que os leitores falharam nesse campo.

### 1.1 Regra de classificação automática

| Situação | `estado` | O que se faz |
|---|---|---|
| `valor_sabichao` e `valor_ocr` coincidem (depois de normalizar formato) | `auto` | aceite; conta como acerto do motor |
| Divergem | `a_confirmar` | analisada na Fase 2 pelo Claude/Codex sem ver imagens (só valores e regras): ou o Sabichão está errado (como nos casos 806 e 843 de 22/09), ou o motor tem de baixar a confiança nesse padrão; fica documentado o motivo |
| Só uma fonte tem valor | `a_confirmar` | idem; se for o motor a não ler, é cobertura em falta |
| Sem fonte nenhuma | `sem_fonte` | não conta para a métrica |

Nenhuma linha exige ação do utilizador. Quando uma divergência só se resolve olhando para o documento, o caso segue para a app na fase de uso real, onde a decisão do utilizador na tabela de aprovação fica registada como verdade.

### 1.2 O que se mede

Por campo e por leitor: acertos (`auto`), divergências (`a_confirmar`) e cobertura (campos com leitura). Critério de aceitação da Fase 2 (PLANO.md): zero valores com confiança alta que divirjam do Sabichão sem explicação documentada.

## 2. Passos de construção

1. **Gerar o CSV por script** no CT assistente-dev (Fase 1; até lá pode correr no Mac com a NAS montada e SSH de consulta): para cada um dos 40 processos e cada campo, `valor_sabichao` + `valor_ocr` + regra 1.1.
2. **Casos negativos sintéticos** (secção 4 de `04-POLITICA-CONFIANCA.md`): documento errado, RC caducado, RC sem finalidade, morada divergente, número ilegível, sufixo incoerente, CC digital vs físico, re-admissão. O objetivo é testar o bloqueio/baixa de confiança, não o valor.
3. **Analisar as linhas `a_confirmar`** e documentar cada uma em `docs/validacao-fase2.md` (motivo, quem estava certo, alteração de regra se houver).
4. **Fechar**: métrica por campo publicada; divergências todas explicadas.

## 3. Campos a cobrir por processo

Os mesmos do manifesto (01-MANIFESTO.md): nome, nif, nascimento, ncc, validade_cc, niss, filho_de, especialidades (uma linha por cartão: nº + categoria + validade), val_rc + finalidade, naturalidade/concelho/distrito, nacionalidade, morada (original e normalizada), iban, email, contacto, estado_civil, ndependentes, habilitacoes, emergência (nome/contacto/relação), zona, local, horas, modalidade/motivo.

## 4. Ficheiro `05-golden-dataset.template.csv`

Colunas (cabeçalho só — sem dados reais, a preencher pelo script + pelo utilizador conforme os passos acima):

```
id_processo,mai,campo,valor_sabichao,valor_ocr,estado,fonte_documento,notas
```

| Coluna | Significado |
|---|---|
| `id_processo` | Id do processo na NAS/Sabichão (770-851 + casos negativos) |
| `mai` | MAI do processo |
| `campo` | Nome do campo do manifesto (ex. `validade_cc`, `val_ard`, `morada`) |
| `valor_sabichao` | Valor lido por SELECT só-leitura em prod (vazio se não aplicável) |
| `valor_ocr` | Valor lido pelo motor de extração (vazio se não aplicável) |
| `valor_verdade` | Preenchido automaticamente quando as duas fontes coincidem; vazio quando `estado=adjudicar` até o utilizador decidir |
| `estado` | `auto` \| `adjudicar` \| `confirmado` |
| `fonte_documento` | Nome do ficheiro na pasta do processo usado para adjudicar (quando `estado != auto`) |
| `notas` | Motivo da divergência, do caso negativo, ou da confirmação da amostra |

## 5. Critério de fecho

Todas as linhas `a_confirmar` explicadas por escrito; métrica por campo publicada; nenhum valor de confiança alta em divergência inexplicada. Sem passo de confirmação manual pelo utilizador.
