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
8.7 KiB
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
- Store Zustand: currentLeaderboard debe poblarse antes de renderizar
- API Client: Debe llamar a backend, no retornar datos vacíos
- Feature Flags: USE_MOCK_DATA debe estar en false
- Backend Service: Consulta user_stats y profiles
- 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 | 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:
- Autenticación JWT requerida
- RLS (Row Level Security) bloquea acceso
- Módulos en estado "backlog"
- Usuario no pertenece al classroom correcto
- 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
- Crear plan detallado para cada tarea
- Identificar todas las correcciones necesarias
- Validar plan contra análisis
Fase de Ejecución
- Ejecutar correcciones por tarea
- Validar cada corrección
- Integrar y probar
Fase de Validación
- Pruebas end-to-end
- Validación de seeds
- Verificación de dependencias