decisions.md — Registro de decisiones (ADRs)
Decisiones pedagógicas y técnicas del curso, con su porqué. Formato ligero de ADR. Se añaden solo decisiones con impacto; nunca se borran.
ADR-0001 — Estructura y metodología del curso
- Fecha: 2026-09-28
- Estado: aceptada
- Contexto: El alumno quiere un curso documentado en MD que también sirva a otros desarrolladores, con memoria para que cualquier agente retome el hilo. Existen muchas formas de estructurarlo (una sola wiki, un repo por lección, chat puro…).
- Decisión: Estructura
README.md+CURRICULUM.md+memory/+lessons/NN-nombre/{lesson.md,exercises.md,solutions.md}. Metodología por lección: objetivos → teoría → ejercicios → corrección → autoevaluación → aplicación al proyecto. - Consecuencias: El curso es autocontenido, navegable y continuable por cualquier agente. Coste: mantener la memoria actualizada en cada sesión (obligatorio según protocolo).
ADR-0002 — El stack lo elige el alumno, no el profesor
- Fecha: 2026-09-28
- Estado: aceptada
- Contexto: El requisito dice explícitamente que el desarrollador (alumno) elige lenguaje y framework, y el profesor enseña a partir de eso. Antes de la elección no se puede impartir código concreto.
- Decisión: Las lecciones 00 y 01 se redactan genéricas (teoría universal, código de ejemplo con nota de adaptación). Al confirmarse el stack, el profesor personaliza las instrucciones de instalación y los ejemplos, y lo registra en
student-profile.md. - Consecuencias: Respetamos la autonomía del alumno; la lección 01 ya es útil aunque tarde en elegir. Coste: primera sesión de personalización tras la elección.
ADR-0004 — Modelo de datos v1 de TicketFlow (decisiones de diseño del proyecto)
- Fecha: 2026-09-28
- Estado: aceptada (v1; se revisará en Lección 10 con transacciones reales)
- Contexto: Al empezar el proyecto hilo conductor se decidió modelar antes de seguir teoría. Había varias opciones para garantizar la invariante I1 (un asiento no se vende dos veces): checks en vistas, contadores de aforo, constraints de BD.
- Decisión: Invariantes estructurales en la base de datos mediante
UniqueConstraintcondicionales enReservationItem(PostgreSQL las soporta; MySQL no, ver ADR-0003). Reservas de un solo evento para transacciones atómicas locales. Asiento como fila física (no contador) para poder expresar I1. Máquinas de estado como métodos del modelo con excepciones de dominio;cancel()idempotente.AUTH_USER_MODELa app propia declarado antes de la primera migración. - Consecuencias: El modelo es correcto por construcción y auditable. Coste: PostgreSQL requerido (o adaptar constraints), y el job de expiración (L29) deberá consultarse
status+expires_ateficientemente (índice ya creado).
ADR-0006 — Todo el contenido en Markdown; la web es un renderizador
- Fecha: 2026-09-28
- Estado: aceptada (sustituye parcialmente al ADR-0005)
- Contexto: El ADR-0005 versionaba el HTML de las lecciones generado por el build. El alumno pidió explícitamente mantener todo en Markdown y tener un renderizador que lo muestre en la web — el Markdown como única fuente de verdad, sin artefactos derivados en el repo.
- Decisión: El repo no versiona HTML de lecciones (
site/lessons/en.gitignore). El servidorsite/tools/serve.py(Python puro, stdlib) renderiza en cada petición los.mdcon el parser del curso: portada (catálogo generado desde los.mdpresentes), lecciones, memoria, temario y docs. Sirve conCache-Control: no-storepara que editar un.mdy recargar baste.build.pyconserva las funciones puras de render y un modo build opcional para CI/despliegue estático. - Consecuencias: Editar = recargar; cero pasos de build para publicar; el agente (o el alumno) trabaja siempre en Markdown. Coste: el sitio requiere el renderizador corriendo (para estático puro queda el modo build); el render por petición es barato (ficheros locales, documentos pequeños).
ADR-0005 — Lecciones publicadas como HTML pre-renderizado (generador propio)
- Fecha: 2026-09-28
- Estado: aceptada
- Contexto: El alumno pidió las lecciones y ejercicios «1 x 1» visibles en la web sin abrir ficheros locales. Opciones: renderizar Markdown en el navegador con JS (dependencia + prohibición de innerHTML de las reglas dicresoft), usar un generador externo (Hugo/ Eleventy: dependencia nueva), o pre-renderizar en build.
- Decisión: Generador propio en Python puro (
site/tools/build.py, sin dependencias) que conviertelessons/<slug>/{lesson,exercises,solutions}.mdasite/lessons/<slug>/<doc>/index.htmlcon el sistema de diseño del sitio. El Markdown fuente conserva los emojis (convención del repo); el build los elimina o traduce — la UI publicada no lleva ninguno. El catálogo de la portada se regenera desde un catálogo declarativo único entre marcadores. Cobertura: 25 tests unitarios (site/tools/test_build.py). - Consecuencias: El sitio sigue siendo estático y funciona sin JS (gate de accesibilidad); el código de las lecciones se sirve escapado (sin riesgo de inyección); añadir una lección nueva = escribir el MD y ejecutar
python3 site/tools/build.py. Coste: el parser cubre el subconjunto Markdown del curso (no Markdown arbitrario); los tests lo protegen contra regresiones.
ADR-0003 — PostgreSQL como base de datos por defecto
- Fecha: 2026-09-28
- Estado: aceptada
- Contexto: El temario exige SQL avanzado, EXPLAIN, transacciones y funciones de ventana; PostgreSQL es el motor que mejor las soporta y el más usado en la industria.
- Decisión: Salvo preferencia contraria del alumno, todo el módulo de bases de datos se imparte sobre PostgreSQL. La Lección 01 usa SQL estándar portable para los ejemplos.
- Consecuencias: Coherencia durante todo el módulo 2; si el alumno prefiere otro motor, se registra aquí la excepción.