Expediente 404-PAP-bis: la recaída
Historia clínica de un gemelo: el mismo patógeno, otro órgano — y por qué esta vez el colapso duró minutos, no una tarde
🩺 Mostrar historia clínica → 📋 Protocolo de sesión →
Historia clínica · Servicio de Patología del Código
Creíamos estar de alta. El hub /expedientes en verde, el caso cerrado, la gloria. Y entonces /nosotros dio 404. Al instante. Del logro a la miseria sin transición — un espejismo, una montaña rusa que solo baja.
Mostrar cuadro
- PAP
- Project's Architecture Principles — las reglas y patrones que sostienen la arquitectura del proyecto: la fuente única de la verdad que todo el código debe respetar.
- anti-PAP
- Código escrito en contra de esas reglas: un stub que re-lista a mano lo que routes.ncl ya declara, duplicando y contradiciendo la fuente de la verdad.
Protocolo para declarar, versionar y verificar esto → ontoref.dev
El doble balance — lo que costó, y lo que dejó
Caso 404-PAP · sin historia
- Diagnóstico ~88 min
- Builds 8
- Pistas falsas 8
Caso bis · con historia clínica
- Diagnóstico ~15 min
- Builds 1
- Pistas falsas 0
- Factor de aceleración vs. el primer caso ~30×
- Tamaño del arreglo final 1 <i>línea</i>
Mismo bug. ~30× más rápido. No porque el segundo fuera más fácil — era idéntico — sino porque el primero se declaró. Eso es ontoref trabajando en tiempo real: el dao te sostiene en la recaída, el modo te da el paso, y el howto previo convierte “otra tarde perdida” en “quince minutos y un antibiótico conocido”.
Diagnóstico diferencial — lo que se descartó
| El binario / la caché | “¿Otra vez yo? Los marcadores ya no bastan.” | reincidente conocido |
| La ruta /nosotros declarada | “Consto en routes.ncl. Constante normal.” | constante normal |
| El FTL & el componente horneado | “Presente y correcto. Analítica negativa.” | analítica negativa |
| pages_htmx::dispatch | “Sí… el match que elige la página estática era el foco.” | el patógeno |
Etiología — la causa — Etiología gemela · un match hardcoded en las páginas estáticas
match path {
"/services" | "/servicios" => Some(static_page::render(env, "services", lang)),
// … cada página a mano … menos /nosotros …
_ => None, // ← /nosotros caía aquí → 404
}
El Expediente 404-PAP mató un match hardcoded en render_content_or_grid (páginas de contenido). El gemelo vivía intacto en el órgano de al lado — las páginas estáticas, pages_htmx::dispatch:
Ruta declarada, FTL presente, componente horneado — y aun así 404. El mismo anti‑PAP: un match que duplica lo que routes.ncl ya sabe.
Tratamiento — PAP-compliant · una línea, sin ramas nuevas
_ => resolve_static_page(env, path, lang), // lee del registry: cualquier ruta cuyo componente // acabe en "Page" → static_page(page_id kebab). Cero arms nuevos.
Pronóstico
Lo revelador no es que recayera. Es cuánto duró. El primer caso, sin historia previa, costó una tarde. El gemelo, idéntico, costó minutos — porque el primero ya estaba declarado como historia clínica (content-kind-howto): fui directo al órgano, reconocí el patógeno, apliqué el mismo antibiótico.
| El primer caso, ya declarado como historia | content-kind-howto → consulta directa |
| Reconocer el patógeno sin re-interrogar | mismo antibiótico → registry |
| Cerrar la recaída también registrada | static-page-howto → el 3º durará segundos |
La profilaxis — qué exige hoy la lección
- ✓El incidente se convierte en historia declarada — es lo que hizo la recaída ~30× más corta
mode:generate-expediente/register_proof
⊘Deuda declarada: La recaída tenía causa, y no era la memoria: el primer arreglo nunca había vuelto a la plantilla, así que no era recaída sino reinfección desde la fuente. Ya volvió — el backport está en las dos plantillas y la lista a mano está prohibida por una restricción tipada. Lo que queda es lo de siempre: nada la ejecuta. El justfile de rustelo no llama a ningún validador, así que la puerta que impediría la próxima reinfección existe y está callada. La saldaría una receta just en su cadena. El expediente 8/0 cuenta por qué el arreglo tardó meses en volver a casa.
El patógeno tiene familia: cualquier match hardcoded que sombree el registry. La vacuna es la misma para todos — leer de la fuente única. El caso se cierra registrado (static-page-howto) para que el tercer gemelo, si aparece, dure segundos.
Glosario
Sin coincidencias.