Tipos de pregunta
12 tipos en total — 10 auto-corregidos, essay manual/LLM, calculated como tipo avanzado de fórmula:
| Tipo | Auto-corrección | Casos de uso |
|---|---|---|
| multiple_choice | Sí | Conocimiento factual, conceptos |
| true_false | Sí | Verificación rápida |
| multiple_select | Sí | Múltiples respuestas correctas |
| fill_blank | Sí (normalización) | Vocabulario, fórmulas |
| matching | Sí | Asociaciones (palabra-definición) |
| ordering | Sí | Secuencia lógica/cronológica |
| numeric | Sí (con tolerance) | Cálculos matemáticos/físicos |
| short_answer | Sí (normalización + sinónimos) | Respuestas cortas |
| cloze | Sí | Múltiples espacios en un mismo texto |
| hotspot | Sí | Hacer clic en la región de una imagen |
| essay | Manual (o LLM opcional) | Redacción, ensayo |
| calculated | Avanzado (basado en fórmula) | Problemas numéricos parametrizados |
Configuración del quiz
QuizConfiguration en content JSON:
{
"maxAttempts": 3,
"timeLimitMinutes": 30,
"shuffleQuestions": true,
"shuffleOptions": true,
"accessCode": "ENEM2026",
"scoringPolicy": "highest", // highest | latest | average
"reviewMode": "after_submit", // after_submit | after_due_date | never
"passingScore": 70,
"showResultsToStudent": true,
"allowGoBack": false // si false, el alumno no puede volver a preguntas anteriores
}
Flujo de envío
POST /api/courses/[courseId]/lessons/[lessonId]/quiz/start
↓
- Valida matrícula + lesson availability (checkLessonAvailability)
- Valida que maxAttempts no haya sido superado
- Valida accessCode si está configurado
- Crea QuizAttempt con optionOrders (shuffles persistidos)
- Retorna preguntas SIN correctIndex (regla crítica 66)
↓
El alumno responde (el cliente envía tab switch events en segundo plano)
↓
POST /api/courses/[courseId]/lessons/[lessonId]/quiz/submit
↓
- remapStudentAnswer (revierte shuffle vía optionOrders)
- Auto-corrección por tipo
- Calcula score
- Crea/actualiza LessonCompletion (scoringPolicy decide)
- Dispara QuizEvaluationService:
- Actualiza ConceptMastery por concepts[] de la pregunta
- Detecta misconceptions (Haiku, ~$0.001)
- Crea Grade en el gradebook (si hay GradeItem asociada)
- Dispara automatización quiz_submitted
- Dispara handleGamificationEvent (XP, badges, contests)
Integridad académica
QuizAttempt persiste:
tabSwitchCount— cuántas veces el alumno salió de la pestañacopyPasteCount— intentos de copy/paste/cut detectadosblurCount— eventos de blur de la ventanatimeSpentSec— tiempo total (el tiempo promedio por pregunta se deriva de este)ipAddress,userAgentflagged/flagReason— true cuando alguna señal supera el límite configurado
Controles configurables en QuizConfiguration: accessCode, ipWhitelist (coincidencia exacta, validada server-side en quiz/start), requireLockdownBrowser (Safe Exam Browser o la app StudeiaMobile), requireFullscreen, preventTabSwitch con maxTabSwitches, y disableCopyPaste.
El gradebook muestra el ícono ShieldAlert + tooltip con el motivo del flag. El profesor decide si anula o ignora.
Question pooling (banco de preguntas)
Un quiz puede sortear un subconjunto aleatorio de uno o más bancos: useQuestionPool, questionPoolBankIds, questionPoolCount y questionPoolFilters (dificultad, etiquetas, tipos). Cada alumno recibe un conjunto diferente, seleccionado en el servidor — las respuestas correctas nunca se envían al cliente antes del envío.
Analytics psicométricos
/api/institution/courses/[id]/lessons/[lid]/quiz-analytics retorna:
Item difficulty (p-value)
difficulty = total_correctas / total_intentos
- < 0.3: muy difícil (revisar pregunta)
- 0.3-0.7: ideal
-
0.85: muy fácil
Point-biserial discrimination
Correlación entre acertar el ítem y el score total. Identifica preguntas que NO discriminan entre buenos y malos alumnos.
-
0.4: excelente
- 0.2-0.4: aceptable
- < 0.2: deficiente (eliminar/reformular)
Distractor analysis (MC y TF)
% de alumnos que eligieron cada alternativa incorrecta. Pista de misconceptions comunes:
Q: "¿Capital de Australia?"
A) Sydney (40% — misconception popular) ← FLAG
B) Canberra (45% — correcta)
C) Melbourne (10%)
D) Brisbane (5%)
Cronbach's alpha (consistencia interna)
Mide si las preguntas del quiz están evaluando el mismo constructo.
-
0.7: aceptable
- 0.6-0.7: cuestionable
- < 0.6: rediseñar el quiz
Requiere ≥ 30 intentos para confiabilidad estadística.
Score distribution
10 buckets de 0-100%. Ayuda a detectar quizzes con efecto techo/suelo (ceiling/floor effect).
Question bank
QuestionBank reutiliza preguntas en múltiples quizzes:
POST /api/institution/question-banks
POST /api/institution/question-banks/[id]/items
El editor de quizzes tiene un picker que filtra por banco, tipo, dificultad, etiquetas. La importación selecciona N preguntas aleatorias del banco.
Exportadores:
- Formato GIFT (compatible con Moodle, Canvas, Blackboard)
- CSV (para edición en hoja de cálculo)
El question bank puede ser incorporado al RAG para que el tutor IA también acceda:
POST /api/institution/question-banks/[id]/rag-ingest
Límites y cuotas
- Máximo 200 preguntas por quiz (UX)
- Máximo 1000 preguntas por question bank (rendimiento)
- Tiempo límite mínimo 1 minuto, máximo 360 minutos (6h)
- Max attempts: 1-99 o
null(ilimitado)
Honestidad técnica
Lo que Studeia hace bien:
- IA multi-proveedor para detección de misconceptions
- Analytics psicométricos en UI (pocos LMS los ofrecen)
- Question bank con RAG ingestion
- Contadores de integridad pasivos (tab switch, copy/paste, blur, tiempo)
- Lockdown vía Safe Exam Browser / StudeiaMobile
- IP whitelist por quiz + accessCode
- Question pooling a partir del banco
Lo que Studeia NO hace (aún):
- Proctoring con webcam/micrófono (usa Examity/ProctorU vía LTI)
- Adaptive testing (CAT) — roadmap
- La auto-corrección de essay con LLM es opcional (no es un corrector garantizado)