Prototipo educativo para CHARAL 2026, Track 2: predicción, experimentación, justificación, feedback y prueba independiente. El instructor consulta evidencia sin calificar ni modificar sesiones.
El piloto de cuatro estudiantes se retiró del alcance el 31 de octubre de 2026. Las cuentas s1-s4 e i1 son datos demo, no participantes de investigación. No se afirma eficacia educativa.
| Acceso | Usuario demo |
|---|---|
| Estudiante | s1, s2, s3 o s4 |
| Instructor de solo lectura | i1 |
El acceso demo usa el identificador de usuario, sin contraseña. Para explorar Docker, desplegar «Unidades del curso» en Academia y abrir D01; las unidades siguientes respetan los prerrequisitos del servidor.
Flutter Web se aloja en Firebase Hosting (Spark) y FastAPI en Render Free. Salud de la API. Render puede dormir tras 15 minutos sin tráfico; el primer acceso puede tardar aproximadamente un minuto. SQLite es temporal y los avances pueden perderse al dormir, reiniciar o redesplegar el backend.
Verificado el 31 de octubre de 2026: publicación HTTPS, /health, catálogo,
login demo, CORS y carga de Academia desde el navegador. El recorrido completo
del laboratorio y las llamadas reales a Gemini/Jev quedan pendientes de verificar.
El alojamiento usa planes gratuitos; el consumo de los proveedores de IA se
gestiona por separado.
Requisitos: Flutter 3.47.7, Python 3.12 y uv. En dos terminales PowerShell:
# Terminal 1, desde la raíz
cd backend
uv sync --locked
# Solo si no existe .env; no sobrescribir la configuración actual:
Copy-Item .env.example .env
# Configurar claves y un LLM_MODEL disponible para tu cuenta.
uv run uvicorn app.main:app --reload --port 8000# Terminal 2, desde la raíz
cd frontend
flutter pub get
flutter run -d web-server --web-port 8080 --dart-define=API_BASE_URL=http://localhost:8000Abrir http://localhost:8080. Salud API: http://localhost:8000/health.
El arranque aplica Alembic y seed_if_empty sin reiniciar SQLite.
Seed manual desde backend: uv run python -m app.seed.
Incluye 9 módulos, 5 cuentas demo, 4 laboratorios y 15 objetivos.
flowchart LR
S[Estudiante] --> F[Flutter Web + Riverpod + GenUI]
F -->|REST + token opaco| B[FastAPI + SQLAlchemy]
B --> DB[(SQLite + Alembic)]
B --> V[Verificadores deterministas]
B -->|Hechos verificados + argumento| J[Jev: evaluación de los 4 labs]
B --> G[Gemini: tutor, feedback y planificador]
G --> M[Menú permitido + parámetros validados]
M --> B
I[Instructor: solo consulta] --> F
Academia → unidad → concepto/predicción → práctica y justificación → evaluación → reto adaptativo central → postest autorizado por servidor → reflexión y repaso. Las fases visibles dependen del laboratorio y del estado persistido.
- Frontend: lib/ui/academy/, lib/ui/labs/, lib/ui/labs/workspace/ y lib/ui/instructor/. Auth y tema globales con Riverpod.
- Backend: app/routers/, app/checks.py, app/labs_*.py, app/evaluation.py, app/socratic.py, app/interventions.py y app/activities.py.
- Catálogo cerrado de 13 tipos activos: app/interventions.py::CATALOG y frontend/lib/ui/tutor/catalog.dart::cognitiveFlowWidgets. frontend/lib/ui/tutor/tutor_surface.dart traduce ui_spec interna a A2UI.
- Gemini elige una actividad del menú permitido; backend valida parámetros y genera escenarios. No ejecuta código generado ni Docker arbitrario.
- Eventos con identidad de actividad y client_event_id idempotente; evidencia persistida, reanudación y permiso de postest controlados por backend.
| Pieza | Implementación y límite |
|---|---|
| Docker Academy | 12 unidades. D01/D02/D04/D07 con experimentos específicos; las otras usan DecisionScenarios. Retos con motores compartidos y 9 actividades de menú, filtradas por unidad/progreso/bancos. No equivale a terminal, editor Compose o pipeline ejecutable. |
| Data Detective | Datos sintéticos, clasificación de anomalías y simulación de limpieza. |
| ML Experiment | Curvas sintéticas deterministas y comparación de hipótesis; no entrena modelos reales. |
| Model Monitoring | Distribuciones/series simuladas con variantes de feature y cambio; no conecta infraestructura real. |
| Evaluación | EVALUATOR_MODE=jev para los cuatro labs y argumentos de retos. Fallo o falta de clave: pending sin scores inventados. |
| Tutor y planificador | Gemini real. Fallo, falta de clave o actividad inválida: HTTP 503 reintentable, sin respuesta inventada. |
| Mocks | Solo pruebas/CI o simulación local explícita: EVALUATOR_MODE=mock y LLM_ALLOW_MOCK=1, con etiquetas visibles. |
| Instructor | Consulta de estudiantes, sesiones, criterios, historial, exportación y estadísticas. instructor_reviews queda como histórico de solo lectura. |
| Dominio | Evidencia del postest independiente; avanzar pasos o evaluar práctica no demuestra dominio. |
Límites y backlog: Catálogo GenUI. Docker aparece primero en Academia; los otros cursos llevan Work in progress. Quedan QA y revisión didáctica: tener widgets y tests no acredita producto terminado.
cd backend
$env:JEV_LIVE_TEST = "0"
uv run pytest -qcd frontend
flutter analyze --no-pub
flutter test
flutter build web --release --dart-define=API_BASE_URL=https://cognitiveflow-ai.onrender.comLos tests backend usan SQLite en memoria y _no_live_llm. No activar JEV_LIVE_TEST=1 en QA de entrega. CI: .github/workflows/ci.yml. Los resultados de auditorías anteriores son históricos; ejecutar las suites sobre la versión que se vaya a publicar.
Guía de despliegue: Render Free para FastAPI y Firebase Hosting para Flutter. render.yaml configura Jev y desactiva el mock del tutor; claves, modelo Gemini y orígenes CORS se introducen en Render.
Proyecto Firebase: cognitiveflow-39af7. Desde la raíz, tras compilar Flutter
y autorizar la CLI con la cuenta del proyecto:
npx --yes firebase-tools deploy --only hosting --project cognitiveflow-39af7firebase.json publica frontend/build/web y conserva las rutas de la SPA.
En Render, CORS_ORIGINS permite ambos dominios de Firebase:
CORS_ORIGINS=https://cognitiveflow-39af7.web.app,https://cognitiveflow-39af7.firebaseapp.comEn Render Free, SQLite es efímera: reinicios o redespliegues pueden perder sesiones y tokens. El seed repone cuentas demo, no el historial perdido. La SQLite local no se sube ni se borra. Conservar evidencia entre redespliegues requiere almacenamiento persistente y respaldos verificados.
GET /instructor/backup requiere token instructor y descarga la base completa. No es un export anonimizado ni una instantánea transaccional. Para una copia coherente, detener escrituras y respaldar con la API apagada; conservar WAL/SHM asociados si existen. Restaurar en DATABASE_URL con la API detenida y verificar las migraciones al arrancar. Nunca borrar SQLite para actualizar el esquema.
- Verificar el recorrido completo de laboratorio, evaluación y reto Gemini/Jev en la demo pública. Un health correcto no prueba claves, créditos ni funcionamiento de proveedores.
- Video de 5 minutos, deck, PDF de gobernanza de 3–5 páginas y resumen de máximo 300 palabras.
- Revisar cambios Git, QA final, accesibilidad y errores de proveedores.
La demo pública no acredita resultados con estudiantes ni eficacia educativa. Fuentes: código y tests, plan de rediseño, plan educativo, diseño y auditorías fechadas en docs/audits/.