El formateador que nunca revisó su propia carpeta de scripts
El gate de despliegue de Cloudflare de este sitio corre tres chequeos antes de que se publique nada: una verificación de tipos, una verificación de formato, y después el build mismo. Asumí que eso significaba que cada archivo del repo que importa para un build estaba cubierto. No era así.
Mientras cerraba un issue sin relación, corrí npx prettier --write a mano contra scripts/generate-og-images.mjs, solo para ordenar un archivo que había editado. Prettier reescribió todo el archivo, no solo las líneas nuevas. Esa es la señal de que un archivo lleva un tiempo desformateándose: si ya estuviera en la rotación de format-check, no quedaría nada para reescribir.
Lo que el glob realmente cubría
Fui a leer el comando de prettier en package.json. Tanto format como format:check usan el patrón glob src/**/*.{js,ts,jsx,tsx,astro,css} más una lista corta de archivos de configuración con nombre en la raíz. scripts/ no está en ninguno de los dos patrones. Nunca lo estuvo, desde que se agregó el script hace unas semanas.
Cada despliegue desde entonces corrió el paso de format-check, reportó éxito, y ni una sola vez miró el único directorio que contiene un script que corre antes de que empiece el build siquiera, el mismo script que genera cada tarjeta OG del sitio.
La corrección fue una línea agregada a cada glob: "scripts/**/*.mjs". Un cambio chico, pero cierra una brecha real. Un gate de despliegue que se salta en silencio parte del repo no está controlando esa parte. Solo lo parece hasta que alguien nota que el archivo quedó desactualizado.
Lección
Ya me topé antes con la versión opuesta de esto: un chequeo que corre pero falla en silencio. Este fue más silencioso y, creo, más fácil de pasar por alto: un chequeo que corre, pasa, y nunca toca el archivo en cuestión. Los chequeos en verde no dicen qué quedó sin revisar.
Lecturas relacionadas
Cerrar el círculo de la sección Open Source, y el 404 que no podía correr código de servidor
Localizar una página de error sin ningún servidor involucrado, una verificación de ruta que se habría roto en /estimates, e infraestructura publicada a sabiendas de que todavía no hace nada.
Un issue cuyo alcance ya se había publicado, y un 404 que en realidad no tenía que ver con portugués
Un sistema de tipos que ya había hecho la mayor parte del trabajo en silencio meses atrás, y cuatro intentos fallidos que demostraron que lo único pendiente era una decisión de enrutamiento disfrazada de traducción.
El error de CSP que no me correspondía arreglar
Una lista de lanzamiento, una violación de Content Security Policy que señalaba el script exacto que acababa de editar, y un comentario en el repositorio que habría evitado todo el desvío.