# Registro real de la demo de Vibe Coding ## Prompt 1 · alcance inicial > Quiero crear una aplicación web sencilla para gestionar reservas de clases. Un administrador crea las clases y define plazas disponibles. Los usuarios pueden consultar horarios, reservar una plaza y cancelar su reserva. La primera versión se construyó con frontend HTML/CSS/JS, backend Python y SQLite para persistencia. ## Error real encontrado al ejecutar tests El test `test_admin_can_create_class` falló al crear una clase: ```text AttributeError: 'sqlite3.Cursor' object has no attribute 'lastrow'. Did you mean: 'lastrowid'? ``` ## Prompt de depuración usado como criterio > Reproduce el error, identifica la causa y explícame qué prueba demuestra que está corregido antes de tocar otras partes. Corrección aplicada: `lastrow` -> `lastrowid`. Después de la corrección pasaron los cuatro tests de reservas, capacidad y permisos. ## Revisión de seguridad La aplicación funcionaba, pero la revisión encontró dos problemas reales: - contraseñas almacenadas en texto plano; - títulos de clases insertados en el DOM mediante `innerHTML` sin escape, con riesgo de XSS si llegaba contenido malicioso. ## Prompt de revisión usado como criterio > Revisa este proyecto buscando problemas de seguridad, permisos, validación de datos y secretos expuestos. No añadas funciones nuevas. Prioriza fallos que permitan acceso o ejecución no previstos. Correcciones aplicadas: - contraseñas con PBKDF2-HMAC-SHA256 y salt individual; - escape del título antes de insertarlo en el HTML; - autorización de administrador comprobada en servidor; - reserva duplicada bloqueada por lógica y restricción UNIQUE; - aforo comprobado dentro de una transacción `BEGIN IMMEDIATE`; - cookie de sesión HttpOnly y SameSite=Lax. ## Estado final Tests ejecutados: - usuario normal no puede crear clases; - administrador sí puede crear clases; - una persona no puede reservar dos veces la misma clase; - el aforo no puede superarse. El proyecto sigue siendo una demo, no un producto: la sesión vive en memoria, no hay recuperación de contraseña, correo, monitorización, rate limiting, CSRF token ni despliegue de producción.