# UNEED Institution Baseline — auditoria inicial

Data: 2026-09-17. Fonte: `cpanel-source`, versão local mais recente (11 setembro). `web` contém a variante anterior Vinext/Cloudflare; pacotes e arquivos em `entrega` são distribuições, não fontes para a baseline. A raiz não é um repositório Git. Baseline será um repositório independente em `uneed-institution-baseline/`. Nenhum dado SQLite, upload, segredo, pacote de entrega ou histórico de clientes será copiado.

## KEEP
- Next.js App Router, React apenas nas interfaces interativas; Node e SQLite local, SQL parametrizado e migrações transacionais.
- Motor de candidatura em cinco passos, responsáveis, agregado/rendimentos/despesas, documentos condicionais, consentimentos e idempotência.
- Rascunhos AES-GCM com token de acesso guardado como hash e expiração.
- Documentos privados, verificações MIME + assinatura, hash SHA-256, limites e download autenticado.
- Administração: estados, histórico, notas, revisão documental, pedido de documentos, exportação e arquivo lógico.
- pdf-lib e Nodemailer: funcionalidades concretas, sem browser no servidor.

## MOVE TO CONFIG
- Nome, sigla, logótipo, contactos, cores e tipografia (`lib/site-config.ts`, layout, emails, PDF e componentes).
- Ano letivo, prefixo de candidaturas, respostas sociais, documentação e limites.
- Origem pública, credenciais, DB, storage e chaves em variáveis de ambiente. Remover `/novo`, utilizador cPanel e domínio do cliente.
- Identidade/cores/textos de cabeçalho e rodapé PDF; configuração de remetente separada dos templates.

## MOVE TO CONTENT
- Homepage, instituição, serviços, contactos e navegação em ficheiros explícitos.
- Textos de preparação do formulário e templates de comunicação fora do transporte SMTP.

## REMOVE
- Conteúdos e media CSPVF, fotografias, parceiros, regulamentos, logótipos, legacy-pages e roteamento legado.
- HomeSlider, cinco CSS globais sobrepostos e estilos específicos do cliente.
- Vinext, Vite, Wrangler, plugins Sites/Cloudflare/RSC, Tailwind/PostCSS não usados na versão Next, Drizzle ORM/kit se mantido SQL direto (nenhum consumidor funcional de getDb).
- Integração nominal ChatGPT de autenticação: a versão cPanel já usa credenciais locais; remover nomes e bypass `@sites.test`.
- server.js gerado com configuração enorme, caminhos locais e domínio embutido; usar entrada Node pequena e build normal.
- Importador Gravity específico e dados/testes privados. Preservar fonte original intacta.

## REFACTOR
- Homepage já não consulta DB, mas carrega slider cliente, fotografias em background e CSS global de backoffice. Tornar pública estática com componentes servidor, fontes sistema, CSS de funcionalidades só nas respetivas rotas.
- Migrações atualmente aplicadas preguiçosamente no primeiro acesso: comando explícito antes do arranque; conexão lazy para público sobreviver sem DB.
- Administração termina em LIMIT 100: implementar paginação limitada e índices para estado/data/arquivo.
- CSV carrega tudo e permite fórmulas: exportar em lotes, neutralizar células e excluir candidaturas arquivadas.
- Login sem rate limiting; sessão assinada com password, validação de expiração permissiva e sem revogação por utilizador. Criar utilizadores locais com hash scrypt, sessões revogáveis e papel admin explícito.
- CSRF tolera Origin ausente: verificar origem em mutações; logout por POST. Cookies HttpOnly, SameSite, Secure em HTTPS.
- Submissão gera PDF e envia email antes da resposta; outbox existente não tem consumidor. Transação grava candidatura + trabalho, processo finito por cron com lease, backoff, tentativas limitadas e estado visível.
- PDFs buscam logo por HTTP ao próprio site: ler asset local.
- Uploads podem ficar órfãos quando validação de um ficheiro posterior retorna cedo. Validar todos antes de gravar; cleanup em falha.
- Validação servidor: enumerados, consentimentos, datas, números finitos, limites de texto, tamanho real do corpo e origem.
- Downloads/rascunhos/APIs/admin: no-store; cabeçalhos de segurança e nenhuma informação técnica em erros.

## Operação e limites encontrados
Um processo Node permanente por instituição. SQLite WAL e ficheiros privados no disco da própria instituição. Sem evidência de worker/cron consumidor no código; `maintenance` só limpa rascunhos/checkpoint. Memória/CPU reais serão medidas em cópia isolada da build existente, nunca na instalação publicada. Não presumir RBAC multiutilizador ou retries funcionais só porque existem tabelas.

## Dependências
Antes: 6 dependências runtime e 19 de desenvolvimento. Depois: 5 runtime e 8 de desenvolvimento. Next/React/React DOM, pdf-lib e Nodemailer têm utilização direta. SQLite nativo dispensa driver/ORM adicional. Sharp será explícito apenas para variantes de imagem no build; ferramentas de benchmark ficam fora do runtime.

## Evidência
`baseline-evidence/source-sha256.json`: hashes das fontes de referência, excluindo dependências/build/dados. Comparar no final para verificar preservação. Benchmark e limitações em `performance-before-after.md`.

## Resultado da implementação

- Extração concluída num repositório Git próprio (`uneed-institution-baseline`), sem dados ou credenciais do CSPVF.
- As decisões acima foram aplicadas; o formulário, administração e modelo SQL foram preservados/refatorados. Páginas públicas, identidade e media são exemplos neutros.
- Autenticação local com scrypt, sessões opacas/revogáveis e papel ADMIN; removidos password global como chave de assinatura, integração nominal ChatGPT e bypass de emails de teste.
- Paginação de 25 candidaturas, CSV em lotes de 200 e neutralização de fórmulas. Uploads limitados e privados, CSRF e rate limiting. O servidor aceita até duas submissões de upload simultâneas.
- Outbox com consumidor finito, lease, backoff, retries e monitorização administrativa. PDF lê logo local. Templates de email e PDF separados da configuração e da aquisição dos dados.
- A distribuição final usa Next normal, sem copiar uma árvore standalone redundante. Não foram introduzidos workers permanentes ou serviços adicionais.
- Resend foi retirado do transporte final: uma via SMTP explícita cobre a instalação de referência. O importador Gravity e formulários específicos de recrutamento/denúncia não fazem parte da baseline neutra; o respetivo código original continua no CSPVF. O motor de candidaturas é o processo preservado e testado.

### Dependências e segurança

A consulta npm inicial identificou avisos nas versões herdadas de Next, Nodemailer, PostCSS transitivo e Sharp. A baseline foi atualizada para Next 16.3.5, Nodemailer 10.0.10 e Sharp 0.35.4, com eslint-config-next alinhado. O código CSPVF não foi atualizado. A auditoria final npm de todas as dependências devolveu zero vulnerabilidades conhecidas na data da execução; isto não constitui garantia de inexistência de falhas.

Referências primárias consultadas: [aviso Next sobre bypass de proxy](https://github.com/vercel/next.js/security/advisories/GHSA-6gpp-xcg3-4w24) e [aviso Nodemailer sobre parsing de endereços](https://github.com/nodemailer/nodemailer/security/advisories/GHSA-2x7j-588g-ccc2). A lista completa inicialmente recebida e as versões corrigidas foram avaliadas via npm audit; resultado final em `evidence/npm-audit.json`.

### Limites explícitos

A baseline não é uma migração automática da base de dados CSPVF. PDFs usam fontes standard latinas. SMTP tem semântica de pelo menos uma tentativa, podendo duplicar em caso de crash entre envio e confirmação. O filesystem não participa na transação SQLite: crash entre upload e commit pode deixar órfãos privados. O rate limit é local ao processo. O exemplo de política de privacidade precisa de texto próprio aprovado por cliente. Detalhes operacionais em `deployment.md`.
