# Catálogo Portal — segurança e SEO

## Limite de confiança

Somente os scripts locais de importação consultam `VW_PORTAL_PRODUTOS` via API, com SELECT. Nenhum script modifica o agente, o workflow ou o ERP. Não há endpoint público de sincronização, SQL livre ou proxy. O servidor web não recebe credenciais nem consulta o ERP em visitas.

Credenciais são lidas em memória da configuração local existente ou de variáveis de ambiente. Não copiar arquivos de credenciais para este projeto, imagens, logs ou hospedagem. Não executar scripts com depuração de cabeçalhos/respostas. A pasta `.catalog-work` é privada e ignorada pelo Git.

Campos públicos permitidos: código, slug, nome, marca comercial, unidade, grupo editorial, categoria e caminho local da imagem. Preço, quantidade de estoque, custo, popularidade, índices comerciais, marcas de controle, documentos, tokens e dados pessoais não são publicados. A projeção usa lista explícita de campos, não espalhamento do registro original. Textos contaminados e registros sem categoria, inativos ou de uso interno são excluídos. Ainda é necessária revisão comercial humana antes da publicação: filtros automáticos não provam ausência absoluta de informação sensível em texto livre ou pixels de imagens.

Imagens são obtidas somente para códigos numéricos aprovados, com tamanho de entrada limitado, assinatura validada e reprocessamento WebP sem metadados EXIF. O endereço e a autenticação do ERP não acompanham a imagem. Conferir visualmente fotos prioritárias e direitos de uso. Imagens ausentes exibem aviso honesto.

## Atualizar, sem publicar

1. `npm run catalog:sync`: paginação por código e substituição atômica da cópia pública somente após leitura completa. Erros preservam a cópia anterior.
2. `npm run catalog:images -- --limit=120`: lote limitado de imagens pendentes. Repetir para completar; não executar simultaneamente com a sincronização ou outro lote.
3. `npm run typecheck:ui`, `npm run lint`, `npm test`; revisar categorias, imagens e amostras comerciais.
4. Recompilar/reiniciar a prévia. Não copiar scripts, arquivos privados ou fontes completas para uma pasta pública de hospedagem.

Não existe agendamento. Dados não são em tempo real. Nesta entrega: 5.828 produtos, 15 categorias, 290 imagens prontas. A lista de candidatos continha 4.006 referências com imagem; arquivos ausentes, grandes ou inválidos podem não ser importáveis. Os 100 registros excluídos não foram publicados. Atualizações posteriores podem alterar esses totais.

## SEO sem promessas inventadas

Cada produto tem URL com código estável, título, descrição factual, canonical, breadcrumbs, dados Product e links de relacionados. Uma mudança no nome redireciona permanentemente o slug antigo identificado pelo mesmo código. Categorias possuem orientação editorial; páginas têm 24 itens e navegação HTML rastreável. Busca e filtros ficam noindex, evitando combinações redundantes no índice.

Não são inventados preço, oferta, avaliações, disponibilidade ou especificações. O Product sem oferta/avaliação não garante elegibilidade aos resultados enriquecidos do Google. A base técnica não garante posição: priorizar descrições úteis, fichas verificadas e fotos aprovadas dos produtos relevantes, evitando milhares de páginas pouco diferenciadas.

Referências: [estrutura de e-commerce](https://developers.google.com/search/docs/specialty/ecommerce/help-google-understand-your-ecommerce-site-structure), [paginação](https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading), [requisitos Product](https://developers.google.com/search/docs/appearance/structured-data/product-snippet).

## Porta de publicação

### Pendências de qualidade observadas na prévia

Revisar códigos 2755/2756/2757: a foto exibida aparenta marca diferente da marca textual. Código 18914 descreve cabo, mas o grupo recebido é disjuntor bipolar; 15980 descreve CLP, com grupo de disjuntor; 8333 tem unidade MT apesar da descrição de disjuntor motor. Não corrigir o ERP nesta tarefa nem inventar especificações; exigir conferência comercial. A origem real de um registro não comprova a correção da ficha ou fotografia. A indexação continua bloqueada até revisão.

Local/staging continuam noindex, robots bloqueado e sitemap vazio. `PORTAL_ALLOW_INDEXING=true` exige também URL HTTPS e é reservado ao build de produção explicitamente aprovado. Definir `NEXT_PUBLIC_SITE_URL` correto; nunca ativar indexação no localhost. Revisar dados comerciais, políticas e mapa de redirecionamentos do WordPress antes de qualquer publicação. O sitemap de produção inclui somente rotas canônicas selecionadas e produtos/categorias reais; não inclui filtros nem lista de orçamento.

Os testes conferem projeção de dados, ausência do cliente ERP nos arquivos do navegador, imagens locais, metadados, 404 de arquivos privados, paginação, WhatsApp e bloqueio local. Não substituem pentest, revisão de configuração da hospedagem, auditoria completa de acessibilidade ou aprovação humana do conteúdo.

## Verificação desta entrega

Typecheck, lint, build e 18 testes aprovados. As 15 categorias responderam HTTP 200. No navegador, filtro WEG retornou 32 itens em duas páginas, mantendo a marca na página seguinte; busca “cabo 2,5” retornou 92 referências. Catálogo e detalhe sem overflow horizontal em 320, 375, 768 e 1024 pixels; revisão visual também em 1440 pixels. Barra móvel do detalhe leva o código do produto, sem importar a base para o cliente. Nenhum erro de console observado no percurso final. Não foi enviada mensagem real nem alterada a lista persistida do usuário.
