English · Español
Fase 41 — Portal del learner: Entregando el currículo a muchos¶
Requiere: 40 — Hardening, postmortem, "qué sigue" Enseña:
web-portal·argon2id·csrf·spaced-repetition·multi-tenancySalta a cualquier capítulo desde el índice de referencia de fases.
Mapa del capítulo¶
🇪🇸 La fase 41 no añade conocimiento de IA: añade acceso. Un único proceso FastAPI sirve el currículo de 40 fases a varios estudiantes, con login (sin contraseña por defecto), vista de profesor / admin, registro de proceso por estudiante, y repetición espaciada de preguntas de examen falladas. La construcción real espera a las fases 33 (serving) y 37 (seguridad). Esto es el portal — no el tutor.
Dónde encaja esta fase en el currículo¶
- Anclaje de spec:
LYNX_CORTEX.md§3 (audiencia: cohortes futuras) + §4 / Fase 33 (FastAPI) + §4 / Fase 37 (seguridad / modelo de amenazas). - Anclaje de enmienda:
LYNX_CORTEX_ADDENDUM.md§A14 — la Fase 41 es una fase post-currículo añadida tras el alcance original de 40 fases y se rige por A14 (redactado junto con este README). - Anclaje de tema: §A13 — la materia que el portal entrega es el currículo del tutor de gramática (20 verbos × 5 tiempos × 3 personas con traducciones al español pareadas). El portal en sí no tiene modelo.
- Anclaje de método: §A12 — esta fase está pre-escrita: plan + teoría + enunciados de lab antes de abrir la fase; soluciones just-in-time.
- Prerrequisitos: las Fases 33 y 37 deben cerrarse primero.
- Plan:
PHASE_41_PLAN.mden la raíz del repo.
Qué produce el portal¶
Un único comando — just portal — arranca un proceso FastAPI en localhost:8000 que hace lo siguiente:
- Autentica a los estudiantes mediante credenciales hasheadas con Argon2id respaldadas por el módulo
src/minivault/. Nunca se establece ni transmite una contraseña por defecto; el admin emite un enlace de invitación de un solo uso, el learner lo canjea y establece su propia contraseña. - Renderiza el currículo fase por fase desde
docs/phase-NN-*/. La teoría y los enunciados de lab se leen en vivo desde el repo; la base de datos solo guarda el estado del learner, nunca el contenido del currículo. - Captura el proceso mediante una tabla
event_log: quién leyó qué, cuándo, contra qué SHA de artefacto. El profesor / admin puede inspeccionar la traza cronológica de cualquier learner. - Quizzes y exámenes extraídos del banco de preguntas de cada fase (materia: tutor de gramática §A13). Las notas en formato libre se guardan al lado.
- Re-presenta los fallos a través de
src/minireview/: las preguntas de examen falladas entran en el mazo de revisión del learner, programadas por SM-2, drenadas una a una hasta que se respondan correctamente. - Administra mediante un rol de profesor / admin que puede: crear nuevos estudiantes, inspeccionar progreso, auditar notas y ver la salud del mazo de revisión por learner.
Además, commiteado al repo:
src/miniportal/BLUEPRINT.md— diseño de la app FastAPI, mapa de rutas, inventario de plantillas.src/minivault/BLUEPRINT.md— configuración de Argon2id, manejo del pepper, API de verificación.src/minireview/BLUEPRINT.md— diseño del scheduler SM-2 (y FSRS bajo feature flag).docs/phase-41-learner-portal/theory/— motivación + arquitectura.docs/phase-41-learner-portal/lab/— seis enunciados de lab (00 → 05).infra/portal/Caddyfile.example— configuración recomendada del reverse proxy (citada; no incluida enjust portal).PHASE_41_REPORT.md— reflexión de fase al cierre.
Mapa de archivos hands-off¶
| Ruta | Propietario | Estado |
|---|---|---|
PHASE_41_PLAN.md |
Claude (pre-write) → Borja (revisiones) | Pre-escrito |
docs/phase-41-learner-portal/README.md |
Claude (pre-write) | Pre-escrito (este archivo) |
docs/phase-41-learner-portal/theory/00-motivation.md |
Claude (pre-write) | Pre-escrito |
docs/phase-41-learner-portal/theory/01-architecture.md |
Claude (pre-write) | Pre-escrito |
docs/phase-41-learner-portal/lab/0[0-5]-*.md |
Claude (pre-write de enunciados; sin soluciones) | Pre-escrito por separado |
docs/phase-41-learner-portal/solutions/*.md |
Claude (just-in-time, tras el intento de Borja) | ⏳ |
src/miniportal/BLUEPRINT.md |
Claude (scaffold) → Borja (revisión) | ⏳ |
src/minivault/BLUEPRINT.md |
Claude (scaffold) → Borja (revisión) | ⏳ |
src/minireview/BLUEPRINT.md |
Claude (scaffold) → Borja (revisión) | ⏳ |
src/miniportal/*.py, src/minivault/*.py, src/minireview/*.py |
Solo Borja (CLAUDE.md §0.2) | ⏳ |
PHASE_41_REPORT.md |
Borja (al cierre de la fase) | ⏳ |
Cadena de teoría (leer en orden)¶
theory/00-motivation.md— por qué existe un portal; la separación currículo / mentorización; por qué pre-escribir no basta; la elección del primer login sin contraseña; el eje multi-estudiante / profesor-admin; ética del registro de proceso.theory/01-architecture.md— diagramas C4 de contexto + contenedores; stack FastAPI + Jinja2 + HTMX + SQLite + Argon2id; inventario de rutas; la secuencia canónica de "enviar respuesta de examen" con los middlewares de la Fase 37 aplicados.
Cadena de labs (hacer en orden, tras cerrar las Fases 33 + 37)¶
lab/00-bring-up-and-first-student.md— bootstrap, creación del admin, primer estudiante.lab/01-passwordless-first-login.md— emisión, canje, revocación y expiración del token de invitación.lab/02-vault-and-sessions.md— curva temporal de Argon2id; ida y vuelta de cookie de sesión firmada; logout y rotación del pepper.lab/03-progress-and-events.md— consultas al log de proceso; construcción del dashboard de admin.lab/04-spaced-repetition.md— sembrar fallos de examen; avanzar el reloj; verificar el calendario SM-2; drenar el mazo.lab/05-security-replay.md— re-ejecutar las tres amenazas demo de la Fase 37 a través del portal.
Definición de Done (binaria, al estilo docs/DONE_ENOUGH.md)¶
Enunciada por completo en PHASE_41_PLAN.md (raíz del repo) §7. Nueve checks, todos binarios, todos automatizados:
-
just portalarranca en < 2 s;/healthdevuelve 200. -
just portal-admin --create-admin <name>emite un enlace de invitación de un solo uso; el enlace canjeado establece la contraseña; el enlace queda revocado. - Un segundo estudiante creado por el admin puede iniciar sesión, ver la fase 01, enviar una nota, hacer el quiz, hacer el examen.
- Una pregunta de examen fallada aparece en la cola de revisión del estudiante en el momento programado por SM-2.
- La vista de progreso del admin muestra last-active, tasa de aprobado de exámenes y tamaño del mazo de revisión por estudiante.
-
experiments/41-security-replay/confirma que las tres amenazas demo de la Fase 37 son detectadas. -
pytest src/miniportal/ src/minivault/ src/minireview/está en verde. -
bandit -r src/miniportal src/minivault src/minireviewreporta 0 hallazgos de severidad alta. -
PHASE_41_REPORT.mdestá commiteado segúnLYNX_CORTEX.md§7.6.
Qué NO cubre esta fase¶
- Ninguna técnica nueva de ML. La Fase 41 no tiene modelo ni entrenamiento.
- No SPA. Anti-objetivo §10 de la spec. Solo HTMX + Jinja2.
- Sin aislamiento multi-cohorte. Un archivo SQLite = una cohorte.
- Sin SSO / OAuth. Solo credenciales locales.
- Sin envío de email en v1. Enlaces de invitación impresos en el terminal del admin.
- Sin auto-evaluación de notas en formato libre. Las notas se guardan, no se puntúan.
- Sin refactors "de pulido" de fases anteriores. Si un contrato de la Fase 33 o 37 necesita cambiar para satisfacer al portal, regístralo como una revisión de la Fase 33/37 según la cláusula de flexibilidad de A12 — no lo parchees en silencio desde la Fase 41.
Qué hacer cuando termines¶
Escribe PHASE_41_REPORT.md según LYNX_CORTEX.md §7.6. Concretamente: resultados por lab, la curva temporal empírica de Argon2id, el dimensionado del mazo de revisión observado en el estudiante sembrado, y los pendientes (probablemente: envío de email, SSO, aislamiento de cohortes, migración a FSRS).
Siguiente: theory/00-motivation.md.
Lecturas recomendadas¶
Opcional — enriquece pero no es necesario para aprobar la fase.
- 📘 OWASP Application Security Verification Standard (ASVS) — OWASP · 2021. la checklist de auth + sesión que el portal sigue.
- 📄 Argon2: the Memory-Hard Password Hashing Function — Biryukov, Dinu, Khovratovich · 2015. el hash de contraseña que usa el portal.