# Decisões da Fase 0 (fecho dos pontos "A CONFIRMAR")

Data: 2026-09-22. Estas decisões prevalecem sobre as notas "A CONFIRMAR" dos documentos 00 a 06.

| # | Documento | Ponto | Decisão |
|---|---|---|---|
| 1 | 03 | Username do utilizador técnico no CT 107 e no CT dev | `assistente` |
| 2 | 03 | `dry_run` na chave de consulta ou de apply | Chave de **consulta**: `inserir.php` sem `--apply` não escreve; permite ver o dry-run antes de existir chave de apply (Fases 2-4). |
| 3 | 03 | Exit code 2 do wrapper | 2 = falha de geração/validação (manifesto inválido, PDF não gerado, lote de email fora dos limites); 3 = falha de envio/execução externa; 1 = argumentos/ambiente; 0 = ok. Alinhado com `fichas_email.php`. |
| 4 | 03 | Persistência da idempotência do apply | Ficheiro `/var/lib/assistente/apply/<chave>.json` no CT 107 (0600, criado atomicamente com `O_EXCL`), com o resultado; apply repetido devolve o resultado gravado. Sem SQLite. |
| 5 | 06 | Estrutura de `linhas[].posicao` | O binário `ocr` devolve por ficheiro `{"file","pages":[{"page","text","lines":[{"text","conf","x","y","w","h"}]}]}` com `x,y,w,h` normalizados 0-1, origem no canto superior esquerdo, linhas ordenadas de cima para baixo e da esquerda para a direita. O leitor devolve exatamente isto. |
| 6 | 06 | Limites do leitor | Ficheiro até 25 MB; PDF até 30 páginas; timeout 180 s por pedido (o Qwen a 17 tok/s precisa de margem); MIME verificado por conteúdo (jpeg, png, heic, tiff, pdf). |
| 7 | 06 | Um endpoint ou dois para leitura e comparação semântica | Dois: `POST /v1/analisar-documento` (imagem + tipo → JSON por schema) e `POST /v1/comparar` (só texto: dois valores + tipo de campo → `{equivalente: bool, motivo}`). A comparação nunca recebe imagens. |
| 8 | 01 | Campos não respondidos no manifesto | String vazia `""`, nunca chave omitida (é o que o `campo()` do `inserir.php` espera e o que o SKILL.md exemplifica). `nhoras` é a exceção documentada: `null` = não respondido. |
| 9 | 04/02 | Limiar numérico para `por_rever` | Não há limiar numérico: a confiança é categórica por campo (`alta` cumpre a política do campo; tudo o resto é `rever`). A calibração 100/90-99/70-89 do plano fica só como indicador na UI. Um caso vai a `por_rever` sempre que existir pelo menos um campo `rever` ou um cartão sem validade. |
| 10 | 02 | Recuperação de leases presos | 2 tentativas automáticas (volta a `registado`); à 3ª falha → `erro_tecnico` com o motivo; o utilizador pode relançar manualmente. |
| 11 | 05 | Onde corre o gerador do CSV | No CT assistente-dev (Fase 1); antes disso no Mac com a NAS montada. |
| 12 | 00 | HTTPS + token suficiente no MVP | Sim, com firewall no mini a aceitar só o IP do CT. Certificado de cliente na Fase 6. |
| 13 | 00 | Retenção de backups e rotação de chaves | Backups: 14 diários, 8 semanais, 12 mensais (o mesmo esquema do restic dos backups SQL do Proxmox). Rotação de chaves SSH: imediata em caso de suspeita, e no mínimo anual; responsável: TI (utilizador). |
