Tu app funciona.
La abriste en el navegador. Hiciste clic en los botones. Todo responde.
Hiciste el deploy. Nadie se quejó.
Y ahí está el problema.
Porque "funciona" no significa lo mismo que "está bien". Y cuando le delegas el código a una IA sin revisarlo, la diferencia entre los dos puede ser un endpoint sin autenticación, un token JWT que no expira nunca, o una contraseña guardada en texto plano en tu base de datos.
No porque la IA sea mala. Sino porque la IA optimiza para "hacer que funcione el prompt". No para "hacer que sea seguro en producción".
Lo que la IA no te dice cuando genera tu código
La IA generó tu endpoint. Lo probaste con Postman. Devolvió 200.
Pero no te dijo que cualquier usuario autenticado puede acceder a los datos de cualquier otro usuario simplemente cambiando el ID en la URL.
La IA configuró tu autenticación con JWT. Los tokens se generan. Los usuarios entran.
Pero no te dijo que esos tokens no tienen fecha de expiración. Que si uno se filtra, es válido para siempre.
La IA puso CORS para que el frontend pudiera llamar al backend.
Pero no te dijo que lo configuró con origin: '*'. Que eso significa que cualquier dominio del mundo puede hacer peticiones a tu API.
Esto no es teoría. Es lo que aparece cuando auditas una app de vibe coding. Una tras otra.
/vibe-audit — 30 segundos para saber en qué lío estás
Construí AI Workflow Kit porque me cansé de revisar código generado por IA de manera manual y encontrar los mismos 20 problemas cada vez.
La instalación:
npx ai-workflow-kit
Y luego, en cualquier proyecto:
/vibe-audit
Eso es todo. La skill escanea el proyecto completo, lee los archivos más críticos, y genera un reporte con severidad, evidencia concreta y el fix sugerido.
No te dice "hay un problema de seguridad". Te dice exactamente dónde está, qué línea, qué puede pasar si no lo arreglas, y cómo arreglarlo.
Los problemas que encuentra. Siempre.
Después de auditar decenas de apps generadas con IA, hay 20 patrones que aparecen una y otra vez. Estos son los más comunes:
Los críticos — los que pueden costarte el proyecto:
Secretos hardcodeados. La IA pone API keys, contraseñas y URLs de base de datos directamente en el código porque "funciona más rápido en el prompt". Aparece en casi el 100% de los proyectos generados sin revisión.
// Lo que encuentras
OPENAI_API_KEY = "sk-..."
password: "admin123"
const SECRET = "abc123"
Sin validación de inputs. Los endpoints confían ciegamente en req.body. Cualquier usuario puede mandarte lo que quiera. Incluyendo role: "admin".
const { email, role } = req.body
await db.users.update({ role }) // el usuario se da a sí mismo rol de admin
IDOR — acceso a recursos de otros usuarios. El endpoint GET /api/orders/:id no verifica que ese pedido sea tuyo. Cambia el número en la URL. Accedes a los datos de cualquier otro usuario.
Contraseñas sin hashear. No siempre. Pero ocurre, especialmente cuando el prompt fue vago o rápido.
JWT sin expiración. jwt.sign(payload, secret) sin expiresIn. Token válido para siempre. Si se filtra — en logs, en localStorage, en cualquier sitio — el atacante tiene acceso permanente.
Stack traces expuestos al cliente. res.json({ error: err.stack }) en el manejador de errores. En producción esto le da al atacante rutas internas, versiones de librerías y lógica de la aplicación.
Los importantes — los que te explotan en producción:
Queries sin paginación. db.findMany() sin límite. En desarrollo con 10 registros, perfecto. En producción con 50.000, la base de datos se cae.
APIs de terceros sin rate limiting. La IA conecta tu app a OpenAI, Stripe, o cualquier API externa y llama directamente sin control. Un bot puede hacer miles de llamadas y arruinarte la factura o hacer que el proveedor banee tu cuenta.
Sin estados de loading o error en el frontend. La IA genera el happy path perfecto. Si la API tarda o falla, la app se queda en blanco o explota en silencio.
console.logs de desarrollo en producción. La IA logea todo para depurar. Esos logs exponen datos internos y contaminan los logs de producción.
El reporte que genera /vibe-audit tiene este formato:
# Vibe Audit — nombre-del-proyecto
Auditado: fecha
## Resumen
- 🔴 Críticos: N (bloquear producción o son riesgos de seguridad)
- 🟡 Importantes: N (afectan estabilidad o mantenibilidad)
- 🔵 Mejoras: N (deuda técnica, calidad)
## 🔴 Críticos
### Contraseñas sin hashear
**Dónde:** `src/auth/register.ts` línea 23
**Evidencia:**
[código problemático]
**Riesgo:** Si la base de datos se compromete, todas las contraseñas quedan expuestas en texto plano
**Fix sugerido:**
[código corregido]
No generalidades. Código concreto. Línea exacta. Fix aplicable.
El resto del kit
/vibe-audit es la razón de ser del kit. Pero no está solo.
Una vez que tu app está auditada y los problemas críticos resueltos, el workflow se mantiene limpio con el resto de las herramientas:
Skills:
-
/commit— lee el diff real y genera un commit semántico. Sin copy-paste, sin "fix stuff" -
/pr— PR con descripción, plan de tests y checklist de revisión -
/review @archivo— revisa bugs, seguridad y rendimiento con criterios de ingeniería real -
/plan [tarea]— fuerza planificación antes de ejecutar. Para tareas complejas, un plan aprobado vale más que código rápido -
/debug [problema]— diagnóstico con hipótesis antes de proponer fixes
Agentes especializados:
-
/frontend— componentes siguiendo el sistema de diseño del proyecto -
/api— endpoints con validación, auth y manejo de errores -
/test— tests por comportamiento, no por implementación -
/refactor— mejora el código sin cambiar el comportamiento -
/docs— JSDoc, README, ADR según el contexto
Hooks automáticos — sin activación, corren solos:
- Bloquea comandos destructivos antes de que se ejecuten
- Escanea archivos staged buscando API keys antes de cada commit
- Formatea con Prettier o Biome después de cada edición
- Corre ESLint y devuelve los errores a Claude para que los corrija
- Notificación de escritorio cuando Claude termina (Mac/Linux/Windows)
Funciona con Claude Code, Cursor y GitHub Copilot.
La diferencia entre vibe coding y vibe coding bien hecho
El vibe coding no va a desaparecer. Ni debería.
La velocidad es real. La productividad es real. Poder construir en horas lo que antes tardaba días es real.
El problema no es la velocidad. El problema es confundir "rápido" con "hecho".
Tu app necesita los dos. Velocidad para llegar al mercado. Y un /vibe-audit para saber qué hay dentro antes de que alguien más lo descubra por ti.
Una línea:
npx ai-workflow-kit
Top comments (0)