Sonda che verifica la consegna, non la disponibilità
`GET /api/health/contact` risponde 200 se un lead può arrivare a una persona adesso e 503 se no. Verifica due cose separatamente: che il token del canale di notifica sia ancora valido (una richiesta reale al fornitore, con timeout di 8 secondi) e che il registro delle richieste sia scrivibile. La risposta è composta solo da valori logici — mai il token, l’identificatore del canale o il nome del bot. Il risultato viene tenuto in memoria per 60 secondi, così una sonda esterna premuta spesso non diventi essa stessa traffico. Quando il fornitore è inaccessibile, il campo diventa `null`, non `false`: «non so» e «non valido» sono stati diversi.
Registro scritto prima della consegna, non dopo
Ogni richiesta riceve un identificatore e viene scritta in un registro append-only, una riga JSON per evento, *prima* di tentare la notifica. La seconda riga, con lo stesso identificatore, dice cosa è realmente successo: `delivered` o `failed`, con il motivo troncato a 300 caratteri. La directory viene creata con permessi `0700`, i file con `0600`, e il percorso viene posto deliberatamente al di fuori della directory di versione, così che la cronologia sopravviva a una pubblicazione.
Verifica di accettazione eseguita dopo la pubblicazione
Uno script di verifica apre ogni pagina di prodotto, in gruppi di tre, e fallisce se manca il codice 200, l’ancora delle domande, l’ancora dell’esempio o l’indirizzo canonico. Verifica poi la mappa del sito — che non contenga varianti di lingua che non si possono aprire e che contenga ogni prodotto — e `robots.txt`, che non blocchi le risorse necessarie al rendering. Fallisce anche se nella pagina riappare contenuto di un vecchio cliente. È un elenco di cose che si sono già rotte una volta.
Aggiornamenti con gate, non con speranza
Lo script di pubblicazione rifiuta di avviarsi se il server ha meno di 500 MB di memoria libera, esegue `npm audit --audit-level=high` e si ferma alle vulnerabilità di livello alto se non conferma esplicitamente, poi costruisce da pulito — `.next` e `node_modules` eliminati, installazione dal file di lock. Se il processo non appare `online` dopo l’avvio, lo script mostra le ultime 50 righe di log ed esce con errore, invece di segnalare successo.
Riavvio con soglie, non a caso
Il processo si riavvia automaticamente oltre 500 MB di memoria, con un ritardo di 4 secondi tra i tentativi, aumento esponenziale del ritardo e arresto dopo 10 riavvii instabili — così un ciclo di crash diventa visibile invece di consumare il server in silenzio. Tempo di grazia allo spegnimento: 5 secondi, poi terminazione forzata. I log hanno data e fuso orario, in un unico flusso.
Duplicati trattati, non contati due volte
La stessa persona, lo stesso messaggio, due volte — un doppio clic, un ricaricamento della pagina — produceva due notifiche identiche per una sola richiesta. Ora l’impronta `sha256` della coppia indirizzo + messaggio viene tenuta 10 minuti in memoria; il secondo invio riceve lo stesso identificatore di richiesta e il contrassegno `duplicate`, e la notifica non si ripete. Si sopprimono solo i duplicati di una consegna riuscita; una fallita può passare di nuovo.
Codici di errore che dicono cosa si è rotto
400 per dati non validi, 405 sul metodo sbagliato, 500 per corpo della richiesta corrotto, 502 quando il canale di consegna ha risposto male, 503 quando le credenziali mancano. La differenza conta alle 3 di notte: 502 significa «fornitore», 503 significa «la nostra configurazione». Al visitatore si dice distintamente «abbiamo ricevuto la richiesta, ma non siamo riusciti a notificare» — non un falso successo.
Ritenzione applicata dal codice, non promessa nella policy
La nota di riservatezza pubblicata dice che le richieste del modulo si conservano 24 mesi. Il codice applica esattamente lo stesso numero: `LEAD_RETENTION_DAYS` predefinito 730, e i file più vecchi della soglia vengono eliminati a ogni scrittura, senza uno scheduler che può essere dimenticato. L’indirizzo IP viene troncato al prefisso di rete — `/24` su IPv4, `/48` su IPv6 — e si legge l’ultimo hop dall’intestazione, non il primo, perché il primo è inviato dal client.
Troviamo anche ciò che nessuno ha segnalato
Lo stesso passaggio nel codice ha messo in luce due cose che nessun utente aveva segnalato: il limite di 10 richieste al minuto si poteva aggirare completamente, perché si leggeva il primo elemento dall’intestazione degli indirizzi reindirizzati — quello controllato dal client — e una rotta di inizializzazione delle chiamate telefoniche era aperta in forma anonima, a nostro costo e dal nostro numero, anche se il componente che la usava non era più montato da nessuna parte. Entrambe corrette e verificate in produzione.