Un check verde che non ha mai guardato
Scritta agosto 2026
Dal costruire da solo una piattaforma gestionale multi-tenant — una di quattro note su ciò che il lavoro ha insegnato davvero.
Un layout radice lanciava un'eccezione a ogni richiesta. Ogni controllo statico del repository passava: il type checker, la suite unitaria, tutti i gate di lint, la build di produzione. Il rilascio era verde.
L'unico segnale è stato il runner end-to-end che non trovava mai l'app pronta, riportato un quarto d'ora dopo come un timeout, con la causa sepolta in una riga di log che si ripeteva una volta al secondo.
Perché non l'ha preso nulla
Tutti quei controlli sono statici. Nessuno di essi disegna una pagina dentro un server che risponde. Un albero può superare un type checker, mille test unitari e una build di produzione mentre restituisce 500 a ogni singola richiesta, perché nessuna di quelle cose fa una richiesta.
Il controllo che avrebbe dovuto prenderlo ce l'avevo già: una sonda che avvia l'app compilata, richiede una pagina e conta le fibre del framework agganciate nel markup restituito. Esisteva da mesi. Riportava ok — 7 fibre / 34 elementi.
La pagina di errore del framework è React, e si idrata.
La sonda restituiva lo stato HTTP dal giorno in cui era stata scritta, e il verdetto non lo leggeva mai. Quindi richiedeva la pagina, riceveva un 500, disegnava la pagina di errore integrata del framework — che è un albero React, e aggancia fibre esattamente come una pagina funzionante — le contava, e riportava successo. Non era rotta. Rispondeva a una domanda diversa da quella che tutti credevano stesse rispondendo.
La regola che ne ho tratto
La correzione è una riga: fallire su uno stato maggiore o uguale a 400. La lezione non è la riga. È che un check verde non è la stessa cosa di un check che ha guardato, e il momento per scoprirlo è quando un controllo passa su qualcosa che ti aspettavi in pieno che prendesse. È il segnale più economico che avrai mai che uno strumento è puntato sulla cosa sbagliata, e arriva travestito da buona notizia.
Adesso tratto "è passato" come un'affermazione che a sua volta ha bisogno di prove, in una situazione precisa: quando ho rotto qualcosa apposta per vedere un controllo prenderlo, e non lo prende. Ogni gate che ho scritto da allora viene mostrato rosso contro il difetto per cui esiste, prima di avere il permesso di essere verde.
Il corollario è un'abitudine più che uno strumento. Qualunque modifica che tocchi un layout, un provider o qualsiasi altra cosa che ogni rotta disegna riceve un passaggio manuale prima che io creda alla pipeline: compilarla, avviarla, richiedere una pagina, leggere il codice di stato.