Sonda que verifica a entrega, não a disponibilidade
`GET /api/health/contact` responde 200 se um lead puder chegar a uma pessoa agora e 503 se não. Verifica duas coisas separadamente: que o token do canal de notificação ainda é válido (um pedido real ao fornecedor, com timeout de 8 segundos) e que o registo de pedidos é gravável. A resposta é composta apenas por valores lógicos — nunca o token, o identificador do canal ou o nome do bot. O resultado é mantido em memória durante 60 segundos, para que uma sonda externa pressionada com frequência não se torne ela própria tráfego. Quando o fornecedor está inacessível, o campo torna-se `null`, não `false`: “não sei” e “inválido” são estados diferentes.
Registo escrito antes da entrega, não depois
Cada pedido recebe um identificador e é escrito num registo append-only, uma linha JSON por evento, *antes* de se tentar a notificação. A segunda linha, com o mesmo identificador, diz o que aconteceu de facto: `delivered` ou `failed`, com o motivo truncado a 300 caracteres. O diretório é criado com permissões `0700`, os ficheiros com `0600`, e o caminho é colocado deliberadamente fora do diretório de versão, para que o histórico sobreviva a uma publicação.
Verificação de aceitação executada após a publicação
Um script de verificação abre cada página de produto, em grupos de três, e falha se faltar o código 200, a âncora de perguntas, a âncora de exemplo ou o endereço canónico. Depois verifica o mapa do site — para não conter variantes de idioma que não se possam abrir e para conter cada produto — e `robots.txt`, para não bloquear os recursos necessários à renderização. Também falha se reaparecer na página conteúdo de um cliente antigo. É uma lista de coisas que já se estragaram uma vez.
Atualizações com gate, não com esperança
O script de publicação recusa-se a arrancar se o servidor tiver menos de 500 MB de memória livre, executa `npm audit --audit-level=high` e pára nas vulnerabilidades de nível alto se você não confirmar explicitamente, depois constrói a partir do zero — `.next` e `node_modules` apagados, instalação a partir do ficheiro de lock. Se o processo não aparecer `online` após o arranque, o script mostra as últimas 50 linhas do registo e sai com erro, em vez de reportar sucesso.
Reinício com limiares, não às cegas
O processo reinicia-se automaticamente acima de 500 MB de memória, com 4 segundos de atraso entre tentativas, aumento exponencial do atraso e paragem após 10 reinícios instáveis — para que um ciclo de falha se torne visível em vez de consumir o servidor em silêncio. Tempo de graça ao parar: 5 segundos, depois terminação forçada. Os registos têm data e fuso horário, num único fluxo.
Duplicados tratados, não contados duas vezes
A mesma pessoa, a mesma mensagem, duas vezes — um duplo clique, um recarregamento da página — produzia duas notificações idênticas para um único pedido. Agora a impressão digital `sha256` do par endereço + mensagem é mantida em memória por 10 minutos; o segundo envio recebe o mesmo identificador de pedido e a marca `duplicate`, e a notificação não se repete. Só são suprimidos os duplicados de uma entrega bem-sucedida; uma falhada pode voltar a passar.
Códigos de erro que dizem o que se partiu
400 para dados inválidos, 405 para método errado, 500 para corpo de pedido corrompido, 502 quando o canal de entrega respondeu mal, 503 quando faltam credenciais. A diferença conta às 3 da manhã: 502 significa "fornecedor", 503 significa "a nossa configuração". Ao visitante é dito de forma distinta "recebemos o pedido, mas não conseguimos notificar" — não um falso sucesso.
Retenção aplicada por código, não prometida na política
A nota de confidencialidade publicada diz que os pedidos do formulário são guardados durante 24 meses. O código aplica exatamente o mesmo número: `LEAD_RETENTION_DAYS` por defeito 730, e os ficheiros mais antigos do que o limite são eliminados a cada escrita, sem agendador que possa ser esquecido. O endereço IP é truncado para o prefixo de rede — `/24` em IPv4, `/48` em IPv6 — e lê-se o último salto no cabeçalho, não o primeiro, porque o primeiro é enviado pelo cliente.
Encontramos também o que ninguém reclamou
A mesma passagem pelo código revelou duas coisas que nenhum utilizador tinha assinalado: o limite de 10 pedidos por minuto podia ser contornado por completo, porque se lia o primeiro elemento no cabeçalho de endereços redirecionados — o controlado pelo cliente — e uma rota de iniciação de chamadas telefónicas estava aberta anonimamente, a nosso custo e a partir do nosso número, embora o componente que a usava já não estivesse montado em lado nenhum. Ambas foram corrigidas e verificadas em produção.