Clase 11

Consejo rápido — Esto es todo lo que necesitas saber para empezar

La app se rompió. El login que funcionaba ayer hoy no funciona. Los pagos se cobran dos veces. Cada cambio en el código rompe otra cosa. Decirle a la IA que “lo arregle” solo lo empeora.

No la reescribas. Si la reescribes, en tres meses se romperá en el mismo lugar. Primero bloquea el estado actual.

Tres herramientas estructurales:

  • codistill — Diagnostica. Extrae automáticamente endpoints de API, esquemas de DB y flujos de autenticación del código existente.
  • huma — Bloquea. Añade pruebas de regresión a todos los endpoints para proteger el comportamiento actual.
  • yongol — Migra. Genera un nuevo backend desde SSOT y demuestra comportamiento idéntico usando las pruebas existentes.

Avanza de izquierda a derecha. Diagnostica con codistill, bloquea con huma y migra con yongol cuando estés listo.

Dile al agente: “Ejecuta codist scan para extraer los endpoints, el esquema de DB y los flujos de autenticación de este proyecto.”

Obtienes el estado actual. Puedes ver cuántos de los 25 endpoints están vivos y cuántos están muertos.

Dile al agente: “Ejecuta huma verify para revisar el estado de todos los endpoints, y escribe una prueba Hurl para cada uno que esté activo.”

Este es tu conjunto de pruebas de regresión. Bloquea lo que está funcionando ahora. Mientras estas pruebas pasen, el agente puede modificar el código sin romper el comportamiento existente.

Dile al agente: “Ahora arregla el bug de login. Pero todas las pruebas Hurl deben pasar.”

Arregla el bug sin romper nada más. Estás haciendo reparaciones con el ratchet puesto.


Pruébalo tú mismo

No necesitas una app rota para experimentarlo. Vive el ciclo “construir → romper → rescatar” en menos de tres minutos.

Paso 1 — Construye la app

En Claude Code:

“Crea una API simple de lista de tareas. Cinco endpoints: listar tareas, agregar tarea, actualizar tarea, eliminar tarea, marcar tarea como completada. Levanta el servidor.”

Paso 2 — Diagnostica con codist

“Ejecuta codist scan para extraer la lista de endpoints de este proyecto.”

codist extrae automáticamente la ruta, el método y los parámetros de los 5 endpoints. Este es tu mapa actual.

Paso 3 — Bloquea con huma

“Ejecuta huma verify y escribe una prueba Hurl para cada endpoint.”

Se genera un archivo Hurl para cada uno de los 5 endpoints. El comportamiento actual queda bloqueado.

Paso 4 — Rómpelo a propósito

“Cambia el formato de respuesta del endpoint de actualizar tarea. Renombra el campo title a name.”

Después del cambio:

“Ejecuta las pruebas Hurl.”

Una prueba falla. “Se esperaba title pero llegó name.” El drift fue capturado. El ratchet está funcionando.

Paso 5 — Repara con el ratchet puesto

“Arréglalo para que todas las pruebas Hurl pasen. Pero la nueva funcionalidad que usa el campo name también debe mantenerse.”

El agente mantiene la compatibilidad hacia atrás mientras aplica la corrección. Cuando Hurl pasa, el comportamiento existente queda preservado.

Esta es una versión en miniatura de codistill → huma → reparar. Con una app realmente rota, el proceso escala a 25, 50 o 200 endpoints — el principio es el mismo.


Por qué este es el enfoque correcto

Introducción: La verdadera razón por la que se rompió tu app

En 2025, las bases de datos de 170 apps construidas con Lovable quedaron completamente expuestas en internet — correos electrónicos, claves de API, información de pagos. La causa no fue un bug de código. La IA construyó las apps sin políticas de seguridad, y nadie lo verificó.

En enero de 2026, 1.5 millones de tokens de API se filtraron desde la red social de IA Moltbook. La misma causa. La IA lo construyó, los humanos no lo revisaron.

Esto no es la historia de otro. Si construiste una app con vibe coding, estás sentado sobre la misma estructura.

“Haz un login” — 30 segundos. “Agrega pagos” — 2 minutos. “Añade un panel de administración” — 5 minutos. Tres meses después, la IA “limpia” la lógica de pagos y cambia el cálculo de descuentos, agregar una nueva función rompe la autenticación, y una página que funcionaba ayer devuelve un error 500 hoy.

Tienes dos opciones:

  1. Reescribir
  2. Rescatar

Reescribir era una opción hace tres meses. El problema es que reescribir repite el mismo patrón. El drift no es un problema de código — es un problema estructural.

Necesitas aprender a rescatar.


Autorrescate para el náufrago — 5 pasos

Rescatar una app rota es como responder a una emergencia de montaña. No corras. Identifica tu posición, asegura la seguridad y muévete un paso a la vez.


Paso 1. Diagnosticar — Qué sigue vivo

Lo primero que debes hacer no es arreglar el código. Es entender el estado actual.

Dile al agente: "Escanea todos los endpoints de API de este proyecto.
Envía una petición real a cada endpoint y
registra el código de estado de respuesta.
Resume los resultados en una tabla: ruta, método, código de estado, tiempo de respuesta."

Si 18 de 25 endpoints devuelven 200, 4 devuelven 401 y 3 devuelven 500 — ese es tu mapa actual. Empezar reparaciones sin mapa hace que lo que arreglas rompa otras cosas.

El codist scan de codistill automatiza este trabajo. Extrae endpoints, modelos de datos y flujos de autenticación del código existente.


Paso 2. Bloquear — Proteger primero lo que está vivo

Una vez diagnosticado, bloquea los endpoints activos.

Dile al agente: "Escribe una prueba Hurl para cada uno de los 18 endpoints que devuelven 200.
Usa la respuesta actual como valor esperado.
Para los endpoints que requieren autenticación, ejecuta primero la secuencia de login para
obtener un token y úsalo."

Estos 18 archivos Hurl son tu red de seguridad. Sin importar qué cambios vengan después, si estas pruebas pasan, el comportamiento existente queda preservado.

El huma verify de huma sistematiza este proceso. Hace seguimiento del estado por endpoint y califica cada uno como PASS/IMPROVE/FAIL.

Importante: El bloqueo parcial no funciona. Si solo bloqueas 10 de los 18 endpoints, no sabrás si los otros 8 se rompen durante las reparaciones. La cobertura total es la regla.


Paso 3. Reparar — Corregir con el ratchet puesto

Con la red de seguridad en su lugar, ahora puedes arreglar bugs.

Dile al agente: "Encuentra y arregla la causa del fallo de login.
Todas las pruebas Hurl deben pasar.
Si alguna prueba falla, revierte el cambio."

Esta es la aplicación en el mundo real del Ratchet Pattern de la Clase 6. Arregla sin romper. Ejecuta Hurl después de cada reparación. Pasa — al siguiente bug. Falla — revierte.

Arregla los 3 endpoints que devuelven errores 500 de la misma manera. Una vez reparados, añade nuevas pruebas Hurl. El ratchet hace clic un diente más.


Paso 4. Extraer — Sacar la lógica de la caja negra

Este es el paso crítico. La causa raíz de una app rota generalmente está aquí.

Si estás usando Supabase:

  • Las políticas RLS solo existen en el panel de control, no en el código
  • La lógica de negocio está escondida dentro de Edge Functions
  • La lógica de autenticación está atada a Supabase Auth

Si estás usando Firebase:

  • Las Security Rules solo existen en la consola
  • La lógica está dispersa entre Cloud Functions

La misma estructura sin importar qué BaaS uses. La lógica de negocio vive fuera del codebase.

Dile al agente: "Extrae todas las políticas RLS del panel de control de Supabase.
Guarda las políticas SELECT, INSERT, UPDATE, DELETE de cada tabla
como archivos SQL. Haz commit en git."
Dile al agente: "Analiza la lógica de negocio en las Edge Functions.
Documenta qué funciones implementan qué reglas de negocio."

Esto es sacar la lógica de la caja negra hacia el codebase. Una vez fuera, el agente puede leerla, probarla y bloquearla con el ratchet.

El codist ddl de codistill extrae DDL de bases de datos existentes. codist scan extrae SSOT del código. Son herramientas para moverse de la caja negra a la capa declarativa.


Paso 5. Migrar — Solo cuando estés listo

Después de los pasos 1–4, la app está en este estado:

  • Cada endpoint tiene una prueba de regresión Hurl
  • Los bugs están arreglados
  • La lógica de la caja negra está documentada en el codebase
  • El ratchet está puesto, evitando que nuevos cambios rompan el comportamiento existente

Desde este estado, decide sobre la migración. De Supabase a backend propio, de Deno a Go, lo que sea.

La red de seguridad de la migración son las pruebas Hurl escritas en el paso 2. Ejecuta el mismo Hurl contra el nuevo servidor — si todo pasa, se prueba el comportamiento idéntico al legacy.

Dile al agente: "Genera un backend Go+Gin con yongol generate.
Haz que todas las pruebas Hurl existentes pasen."

La migración es el paso 5, no el paso 1. Intentar migrar en el paso 1 fallará. Esta es una lección confirmada en revisiones post-incidente.


Cómo escapar de Supabase

El escenario más frecuente de la Clase 11 es Supabase. Empiezas con vibe coding, te vas all-in en Supabase, y tres meses después se rompe.

La secuencia de salida:

1. Mantén la DB, solo añade el ratchet

Mantén el PostgreSQL de Supabase como está. Cambiar la DB es lo último.

codist ddl → extraer DDL de las tablas existentes
huma verify → evaluar el estado de los endpoints
hurl → bloquear todas las APIs activas en su totalidad

2. Mueve la lógica al código

Políticas RLS → archivos Rego. Edge Functions → anotaciones SSaC. Del panel de control al codebase.

3. Desacopla la autenticación

Supabase Auth es lo último que se elimina. Como no se pueden extraer los hashes de contraseñas de auth.users, si no hay usuarios aún, migra de inmediato; si ya hay usuarios, ejecuta un período de autenticación dual.

4. Levanta el nuevo servidor y valida con Hurl

yongol generate → generar backend Go+Gin
ejecutar todas las pruebas hurl → probar comportamiento idéntico al legacy

Cuando Hurl pase completamente, cambia el tráfico.


Por qué no debes reescribir

“¿No puedo simplemente reescribirlo desde cero?”

No. Tres razones:

1. El mismo patrón se repite

El drift es un problema estructural, no de código. Reescribir sin un ratchet te lleva de vuelta al mismo punto de quiebre en tres meses.

2. El conocimiento está enterrado en el legacy

Tres meses de vibe coding acumularon reglas de negocio en el código. Reescribir significa reconstruir esas reglas desde la memoria. La memoria se equivoca.

3. Es posible que ya tengas usuarios

Hay un momento en que un prototipo se convierte en producción. Si hay aunque sea un usuario, “reescribir” significa migración de datos, transición de autenticación y tiempo de inactividad.

Aprender a rescatar es más valioso que aprender a reescribir. Porque el legacy siempre existe, y el código nuevo se convierte en legacy en seis meses.


Cómo la Clase 11 se relaciona con las Clases 1–10

ClaseConstruir bien desde el principioClase 11: Rescatar lo que se rompió
Clase 3 HurlDeclarar el contrato de APIBloquear el comportamiento existente como pruebas de regresión
Clase 4 yongolGenerar desde SSOTExtraer SSOT del código existente
Clase 6 RatchetBloquear cuando las pruebas pasanArreglar sin romper
Clase 8 filefuncEstructurar el códigoLimpiar el código legacy
Clase 10 DDLDeclarar el esquemaExtraer DDL de la DB existente

Las mismas herramientas, dirección opuesta. Las Clases 1–10 iban “de arriba hacia abajo” (declarar → generar). La Clase 11 va “de abajo hacia arriba” (código existente → extraer → declarar).

codistill es la herramienta que automatiza esta extracción “de abajo hacia arriba”. Destila SSOT del código existente.


Del náufrago al rescatador

Después de completar este proceso, tienes dos capacidades:

  1. Cómo construir desde cero (Clases 1–10) — declarar, verificar, bloquear, persistir
  2. Cómo rescatar lo que se rompió (Clase 11) — diagnosticar, bloquear, reparar, extraer, migrar

La mayor parte del código en el mundo es legacy. Los proyectos que se construyen desde cero son raros. La capacidad de rescatar se usa con más frecuencia.

El vibe coding no ha terminado. Has aprendido a sostener las riendas.


Artículos relacionados


Reins Engineering — Todas las clases

ClaseTítulo
Clase 1Cómo delegar a la IA
Clase 2Cómo desconfiar de la IA
Clase 3Apps que no se rompen
Clase 4Decisiones fuera del código
Clase 5IA con riendas
Clase 6Bloquear cuando las pruebas pasan
Clase 7Invertir la adulación
Clase 8La fábrica del agente
Clase 9Automatización más allá del código
Clase 10La ley de los datos
Clase 11Cómo rescatar una app de vibe coding que se rompió

Fuentes

  • Feathers, M. (2004). Working Effectively with Legacy Code. Prentice Hall. — La obra original sobre characterization testing. La técnica de envolver el código legacy en pruebas para bloquear el comportamiento actual. Base teórica del paso 2 de la Clase 11.
  • CVE-2025-48757 (2025). Más de 170 apps generadas por Lovable con RLS faltante exponiendo sus DBs de Supabase. ameeba.com
  • OG William (2026). “Moltbook Hack: Supabase Vibe Coding.” Exposición de 1.5M tokens de API. blog.ogwilliam.com
  • Cursino, D. et al. (2026). “Speed at the Cost of Quality? The Impact of AI Coding on Software.” MSR 2026. arxiv.org/abs/2511.04427 — Aumento permanente del 41.6% en la complejidad del código tras adoptar Cursor. Evidencia cuantitativa de por qué el vibe coding se rompe.
  • Liu, Z. et al. (2026). “Debt Behind the AI Boom: A Large-Scale Empirical Study of AI-Generated Code in the Wild.” arxiv.org/abs/2603.28592 — Análisis de 6,299 repositorios y 302,600 commits de IA. La deuda técnica sin resolver se disparó de cientos a principios de 2025 a más de 110,000 en febrero de 2026.
  • Storey, M.-A. (2026). “From Technical Debt to Cognitive and Intent Debt.” arxiv.org/abs/2603.22106 — Teoriza la causa raíz del drift como “deuda cognitiva” (erosión del entendimiento compartido) y “deuda de intención” (justificación no externalizada).
  • Nguyen, H. et al. (2025). “Vibe Coding in Practice: Flow, Technical Debt, and Guidelines for Sustainable Use.” arxiv.org/abs/2512.11922 — El primer artículo académico que documenta el intercambio flow-debt en el vibe coding.
  • Cloud Security Alliance (2026). “Vibe Coding Security Crisis: Credential Sprawl and SDLC Debt.” labs.cloudsecurityalliance.org — El 45% del código generado por IA contiene vulnerabilidades del OWASP Top 10. La tasa de exposición de secretos en commits de IA es 2 veces mayor.
  • GitClear (2025). “AI Copilot Code Quality 2025.” gitclear.com — Análisis de 211M líneas. La duplicación de código aumentó 4 veces, el ratio de refactorización bajó del 25% al 10%.
  • Encore (2026). “Backend as a Service (BaaS) in 2026: Providers, Tradeoffs, and Migration Paths.” encore.dev — Salir de un BaaS no es portarlo — es reescribir el backend.