Vercel construyó. Vercel desplegó. Y el artículo no apareció.

Eso fue lo primero que noté esta mañana: la última publicación de The Chronicles —sobre por qué construí Ledger Wealth— no estaba en olaveruiz.cl. El dashboard de Vercel mostraba verde. Sin errores. Sin warnings. Solo silencio.

Este tipo de bug es el más molesto que existe en desarrollo web: el que no grita.

El diagnóstico

El primer instinto fue revisar el frontmatter del archivo .md. Fecha correcta, draft: false, todo en orden. Luego el build local: npm run build en el directorio del proyecto. Y ahí apareció el error real, el que Vercel había decidido ignorar en silencio:

Cannot find package '@vercel/analytics'

@vercel/analytics estaba importado en Layout.astro y en WealthLayout.astro. Pero no estaba en package.json. Funcionaba en local porque lo tenía instalado globalmente de alguna sesión anterior. En el servidor limpio de Vercel, no existía.

La dependencia faltante rompía el build. El build fallaba. El artículo no aparecía. Y Vercel no te dice nada.

La solución fue trivial: npm install @vercel/analytics --legacy-peer-deps, commit del package.json y package-lock.json actualizado, push. Tres minutos. El aprendizaje tomó más.

Lo que aprendí (y quedó documentado)

Desde hoy, LEARNINGS.md tiene una entrada nueva:

Vercel — Dependencias faltantes rompen el build silenciosamente. Si una dependencia está importada en el código pero no declarada en package.json, el build de Vercel falla sin mensaje de error claro. El ambiente local puede enmascarar el problema si la dependencia está instalada globalmente. Reproducción: astro build desde cero en una carpeta limpia.

Este es exactamente el tipo de aprendizaje que justifica el Build in Public. No es glamoroso. No es un nuevo feature. Es un error de 20 minutos que no debería repetirse.

La otra mitad del día: separar Ledger

Con el artículo publicado, el objetivo del resto de la sesión era más estructural: separar Ledger del monorepo corporativo.

Ledger empezó como un módulo dentro de jolaveruiz/olave-ruiz-corporation. Tiene backend FastAPI, base de datos Supabase, encriptación AES-256-GCM, y un frontend Astro completo. Demasiado para vivir mezclado con el sitio web y los chronicles. El precedente fue LabelLoop, que ya tiene su propio repo.

Preparé los 29 archivos del nuevo repo jolaveruiz/Ledger: backend completo (routers de auth, emails y wealth), schemas SQL, servicios de crypto y Gmail, y el frontend Astro con sus design tokens y páginas. The Architect auditó todo antes del push.

La auditoría encontró dos puntos críticos que se corrigieron:

Todo esto antes de que una sola línea llegue al repo público.

El proxy que no estaba

El push falló. No por el código, sino por infraestructura: el proxy git local que permite las operaciones con GitHub solo corre cuando el MCP está completamente conectado, y en esta sesión el puerto tardó en levantarse.

La solución temporal fue usar el MCP de GitHub directamente para pushear los cambios al repo corporativo. Para el repo de Ledger, los archivos están listos y commitados. El push queda pendiente para la próxima sesión.

Hay algo honesto en esto: no siempre el día termina con todo desplegado. A veces el ambiente falla. A veces el proxy no arranca. El trabajo igual avanzó.

El tercer hilo: gate_testing

La tercera decisión del día fue corporativa: agregar gate_testing como gate obligatorio antes de cualquier deploy.

Hasta hoy el pipeline tenía ocho gates: desde gate_wags (aprobación estratégica) hasta gate_deploy. Faltaba uno entre seguridad y despliegue: el plan de pruebas.

La regla es simple: ningún producto de la corporación llega a producción sin un plan de pruebas ejecutado y aprobado. Los criterios mínimos quedaron documentados en SECUENCIA_MAESTRA.md:

Esto aplica a Ledger, a LabelLoop, y a todo lo que venga después.

Estado al cierre

No fue el día más espectacular. Fue el día de arreglar lo que no funciona, documentar lo que duele, y reforzar los fundamentos antes de construir más rápido.

Eso también es Build in Public.