workspace-v1/orchestration/analisis/ANALISIS-STUDENT-PORTAL-PAGES-2026-01-10.md
rckrdmrd e56e927a4d [MAINT-001] docs(orchestration): Actualizacion directivas SIMCO, perfiles y documentacion
Cambios incluidos:
- INDICE-DIRECTIVAS-WORKSPACE.yml actualizado
- Perfiles de agentes: PERFIL-ML.md, PERFIL-SECURITY.md
- Directivas SIMCO actualizadas:
  - SIMCO-ASIGNACION-PERFILES.md
  - SIMCO-CCA-SUBAGENTE.md
  - SIMCO-CONTEXT-ENGINEERING.md
  - SIMCO-CONTEXT-RESOLUTION.md
  - SIMCO-DELEGACION-PARALELA.md
- Inventarios actualizados: DEVENV-MASTER, DEVENV-PORTS
- Documentos de analisis agregados:
  - Analisis y planes de fix student portal
  - Analisis scripts BD
  - Analisis achievements, duplicados, gamification
  - Auditoria documentacion gamilit
  - Backlog discrepancias NEXUS
  - Planes maestros de resolucion
- Reportes de ejecucion agregados
- Knowledge base gamilit README actualizado
- Referencia submodulo gamilit actualizada (commit beb94f7)

Validaciones:
- Plan validado contra directivas SIMCO-GIT
- Dependencias verificadas
- Build gamilit: EXITOSO
2026-01-10 04:51:28 -06:00

8.7 KiB

ANALISIS DETALLADO - PORTAL ESTUDIANTES GAMILIT

Fecha: 2026-01-10 Estado: EN PROGRESO


RESUMEN EJECUTIVO

Se ha realizado un análisis exhaustivo de 3 páginas problemáticas del portal de estudiantes:

Página Problema Reportado Causa Raíz Severidad
Leaderboard Muestra usuarios genéricos Flag USE_MOCK_DATA activo + flujo async incorrecto CRÍTICA
Achievements No encuentra datos del usuario Seeds sin achievements para usuarios de testing MEDIA
ModuleDetail Error al cargar datos de ejercicios Múltiples causas: RLS, JWT, seeds vacíos ALTA

TAREA 1: PÁGINA LEADERBOARD

Problema

La página de Leaderboard muestra usuarios genéricos en lugar de los usuarios reales cargados en el sistema.

Causa Raíz Identificada

FLUJO PROBLEMÁTICO:

LeaderboardPage monta
    ↓
useLeaderboards() hook
    ↓
useLeaderboardsStore inicia con entries=[]
    ↓
useEffect llama setLeaderboardType('global')
    ↓
setLeaderboardType() es ASYNC pero NO se espera
    ↓
Componente renderiza INMEDIATAMENTE con entries=[]
    ↓
getLeaderboard() se ejecuta en background
    ↓
Verifica FEATURE_FLAGS.USE_MOCK_DATA
    ↓
Si TRUE: retorna [] (VACÍO)
Si FALSE: hace API call a backend

Puntos de Fallo Específicos

# Archivo Línea Problema Severidad
1 leaderboardsStore.ts 38-42 Store inicia vacío, nunca se llama a setLeaderboardType() automáticamente CRÍTICA
2 LeaderboardPage.tsx 84 setLeaderboardType('global') NO está dentro de async/await CRÍTICA
3 socialAPI.ts 390-392 Flag USE_MOCK_DATA retorna [] en lugar de datos mock ALTA
4 api.config.ts 714 VITE_USE_MOCK_DATA puede estar activado MEDIA

Archivos Afectados

Frontend:

  • /apps/frontend/src/apps/student/pages/LeaderboardPage.tsx - Líneas 59-71, 82-85, 413-417
  • /apps/frontend/src/features/gamification/social/hooks/useLeaderboards.ts - Líneas 9-52
  • /apps/frontend/src/features/gamification/social/store/leaderboardsStore.ts - Líneas 38-42, 44-105
  • /apps/frontend/src/features/gamification/social/api/socialAPI.ts - Líneas 383-456, 390-392
  • /apps/frontend/src/config/api.config.ts - Líneas 589-599, 714

Backend:

  • /apps/backend/src/modules/gamification/controllers/leaderboard.controller.ts - Líneas 75-145
  • /apps/backend/src/modules/gamification/services/leaderboard.service.ts - Líneas 41-164

Database:

  • /apps/database/seeds/prod/gamification_system/05-user_stats.sql
  • /apps/database/seeds/prod/gamification_system/02-leaderboard_metadata.sql

Dependencias Críticas

  1. Store Zustand: currentLeaderboard debe poblarse antes de renderizar
  2. API Client: Debe llamar a backend, no retornar datos vacíos
  3. Feature Flags: USE_MOCK_DATA debe estar en false
  4. Backend Service: Consulta user_stats y profiles
  5. Base de Datos: user_stats y profiles deben tener datos

TAREA 2: PÁGINA ACHIEVEMENTS

Problema

La página de Logros no encuentra datos asociados al usuario.

Causa Raíz Identificada

NO ES UN BUG - ES UX:

  • El sistema está correctamente implementado
  • Los usuarios de testing (student@, teacher@, admin@) NO tienen achievements asignados intencionalmente
  • La página debería mostrar todos los achievements disponibles aunque estén "locked"

Análisis del Flujo de Datos

GamificationPage.tsx (L90)
  ↓ fetchAchievements(user.id)
useAchievementsStore.fetchAchievements (L161)
  ↓ await getUserAchievements(userId)
achievementsAPI.getUserAchievements (L143)
  ├─ await getAllAchievements() ← Obtiene 20 achievements
  └─ await apiClient.get(`/gamification/users/${userId}/achievements`)
     ↓ [MERGE LOGIC]
     Returns: achievements con isUnlocked=false para todos

Puntos de Atención

# Archivo Línea Problema Severidad
1 achievements.service.ts 179-196 Retorna user_achievements vacío para usuarios sin logros MEDIA
2 achievementsAPI.ts 143-182 Duplicidad con gamification.api.ts BAJA
3 AchievementsPage.tsx 402-409 UX: Debería mostrar "No tienes logros desbloqueados" + lista de disponibles MEDIA

Usuarios en Seeds

Usuario Email Achievements Status
student student@gamilit.com 0 Por diseño
teacher teacher@gamilit.com 0 Por diseño
admin admin@gamilit.com 0 Por diseño
Ana García (demo) 4 OK
Carlos Ramírez (demo) 2 OK
María Fernanda (demo) 6 OK

Archivos Afectados

Frontend:

  • /apps/frontend/src/apps/student/pages/GamificationPage.tsx - Líneas 62, 81-90
  • /apps/frontend/src/pages/AchievementsPage.tsx - Líneas 90-113, 402-409
  • /apps/frontend/src/features/gamification/social/store/achievementsStore.ts - Líneas 161-202
  • /apps/frontend/src/features/gamification/social/api/achievementsAPI.ts - Líneas 143-182

Backend:

  • /apps/backend/src/modules/gamification/controllers/achievements.controller.ts - Líneas 165-213
  • /apps/backend/src/modules/gamification/services/achievements.service.ts - Líneas 179-196

Database:

  • /apps/database/seeds/prod/gamification_system/04-achievements.sql - 20 achievements
  • /apps/database/seeds/prod/gamification_system/08-user_achievements.sql - Sin datos para usuarios de testing

TAREA 3: PÁGINA MODULE DETAIL

Problema

La página de Módulos marca error al cargar los datos de detalle de ejercicios.

Causa Raíz Identificada

MÚLTIPLES POSIBLES CAUSAS:

  1. Autenticación JWT requerida
  2. RLS (Row Level Security) bloquea acceso
  3. Módulos en estado "backlog"
  4. Usuario no pertenece al classroom correcto
  5. Seeds de ejercicios vacíos

Flujo de Datos

user.id = "xxx"
moduleId = "yyy"
    ↓
useModuleDetail(moduleId, user.id)
    ↓
GET /educational/modules/yyy → SUCCESS (módulo cargado)
GET /educational/modules/yyy/exercises → ERROR (422, 404, 500)
    ↓
catch (err) → console.error() [línea 129]
setError("An error occurred")
setExercises([])
    ↓
ModuleDetailPage:
- if (error || !module) → "Error al cargar el módulo"
- else → página con exercises = []

Puntos de Fallo

# Archivo Línea Problema Severidad
1 useModules.ts 94 API call a exercises CRÍTICA
2 exercises.controller.ts 627 @UseGuards(JwtAuthGuard) requiere auth ALTA
3 exercises.controller.ts 678 RLS valida que usuario sea student ALTA
4 modules seed 12-15 Módulos 4-5 en estado "backlog" MEDIA

Chain de Dependencias

ModuleDetailPage
  ↓
useModuleDetail
  ├── apiClient.get(/educational/modules/{id})
  │   └── Backend: Module Service findById()
  │       └── DB: SELECT * FROM modules WHERE id={id}
  │
  └── apiClient.get(/educational/modules/{moduleId}/exercises) ← CRÍTICO
      └── Backend: ExercisesController findByModule()
          ├── ExercisesService: findByModuleId()
          │   └── DB: SELECT * FROM exercises WHERE module_id={moduleId}
          ├── ExerciseSubmissionService: findByUserId()
          └── ExerciseAttemptService: findByUserId()

Archivos Afectados

Frontend:

  • /apps/frontend/src/apps/student/pages/ModuleDetailPage.tsx - Líneas 191, 255, 555-571, 577
  • /apps/frontend/src/shared/hooks/useModules.ts - Líneas 85, 94, 115-126, 129
  • /apps/frontend/src/config/api.config.ts - Líneas 121-148

Backend:

  • /apps/backend/src/modules/educational/controllers/exercises.controller.ts - Líneas 627-628, 678-715
  • /apps/backend/src/modules/educational/services/exercises.service.ts - Líneas 421-429, 455-463

Database:

  • /apps/database/seeds/prod/educational_content/01-modules.sql
  • /apps/database/seeds/prod/educational_content/02-exercises-*.sql

TAREA 4: VALIDACIÓN INTEGRAL (PENDIENTE)

Se realizará después de corregir las 3 tareas anteriores.

Alcance

  • Validación de integración de todos los objetos y componentes
  • Mecánicas de gamificación asociadas a estudiantes
  • Integraciones con portales de admin y teacher
  • Carga de seeds correctos
  • Validación de duplicidad de funcionalidades
  • Dependencias entre objetos
  • Actualización de DB, backend y frontend

PRÓXIMOS PASOS

Fase de Planeación

  1. Crear plan detallado para cada tarea
  2. Identificar todas las correcciones necesarias
  3. Validar plan contra análisis

Fase de Ejecución

  1. Ejecutar correcciones por tarea
  2. Validar cada corrección
  3. Integrar y probar

Fase de Validación

  1. Pruebas end-to-end
  2. Validación de seeds
  3. Verificación de dependencias