workspace-v1/orchestration/analisis/PLAN-CORRECCION-STUDENT-PORTAL-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

353 lines
11 KiB
Markdown

# PLAN DE CORRECCIÓN - PORTAL ESTUDIANTES GAMILIT
**Fecha:** 2026-01-10
**Estado:** PENDIENTE VALIDACIÓN
---
## RESUMEN DE HALLAZGOS
Tras el análisis exhaustivo, se identificaron las siguientes causas raíz:
| Tarea | Problema | Causa Raíz | Tipo |
|-------|----------|------------|------|
| Leaderboard | Usuarios genéricos | `FEATURE_FLAGS.USE_MOCK_DATA` retorna `[]` cuando está activo | Código |
| Achievements | No encuentra datos usuario | Usuarios testing sin achievements por diseño + UX deficiente | Seeds/UX |
| ModuleDetail | Error al cargar ejercicios | Múltiples (RLS, JWT, seeds, relaciones) | Multi-factor |
---
## TAREA 1: CORRECCIÓN LEADERBOARD
### Diagnóstico Final
El código está correcto. El problema es que `FEATURE_FLAGS.USE_MOCK_DATA` en `socialAPI.ts:390-392` retorna `[]` (vacío) cuando está activo, en lugar de datos mock reales.
**Verificación necesaria:**
1. Confirmar si `VITE_USE_MOCK_DATA` está definido en algún `.env.local` o `.env.development`
2. Verificar que el backend está corriendo y responde
3. Verificar que hay datos en `gamification_system.user_stats`
### Plan de Corrección
#### FASE 1: Verificación de ambiente
```bash
# 1.1 Verificar todas las variables de entorno
grep -r "VITE_USE_MOCK_DATA" apps/frontend/
# 1.2 Verificar si hay .env.local
cat apps/frontend/.env.local 2>/dev/null || echo "No existe .env.local"
# 1.3 Verificar backend corriendo
curl -s http://localhost:3006/api/v1/health | jq
# 1.4 Verificar endpoint leaderboard
curl -s http://localhost:3006/api/v1/gamification/leaderboard/global | jq
```
#### FASE 2: Corrección de código (si es necesario)
**Archivo:** `/apps/frontend/src/features/gamification/social/api/socialAPI.ts`
**Cambio propuesto (líneas 390-393):**
```typescript
// ANTES:
if (FEATURE_FLAGS.USE_MOCK_DATA) {
await new Promise((resolve) => setTimeout(resolve, 600));
return []; // ← Retorna vacío
}
// DESPUÉS:
if (FEATURE_FLAGS.USE_MOCK_DATA) {
await new Promise((resolve) => setTimeout(resolve, 600));
// Importar datos mock si está habilitado
const { leaderboardMockData } = await import('../mockData/leaderboardsMockData');
return leaderboardMockData;
}
```
#### FASE 3: Validación de Seeds
**Verificar datos en BD:**
```sql
-- Verificar user_stats con datos
SELECT u.email, p.display_name, us.level, us.total_xp, us.ml_coins
FROM gamification_system.user_stats us
JOIN auth_management.profiles p ON p.user_id = us.user_id
JOIN auth.users u ON u.id = p.user_id
ORDER BY us.total_xp DESC
LIMIT 20;
```
### Archivos a Modificar
| Archivo | Líneas | Cambio |
|---------|--------|--------|
| `socialAPI.ts` | 390-392 | Retornar mock data real o eliminar condición |
| `.env` | N/A | Asegurar `VITE_USE_MOCK_DATA` no esté definido o sea `false` |
### Criterios de Éxito
- [ ] Leaderboard muestra usuarios reales de la BD
- [ ] Usuarios ordenados por XP/score descendente
- [ ] Usuario actual marcado con `isCurrentUser: true`
- [ ] No errores en consola
---
## TAREA 2: CORRECCIÓN ACHIEVEMENTS
### Diagnóstico Final
**NO ES UN BUG** - Es comportamiento intencional:
- Los usuarios de testing (`student@gamilit.com`, etc.) NO tienen achievements por diseño
- Esto permite que empiecen desde cero como usuarios nuevos
- Los usuarios demo (Ana García, Carlos Ramírez, etc.) SÍ tienen achievements
**Problema UX:** La página debería mostrar todos los achievements disponibles aunque estén "locked", no un mensaje de "no hay datos".
### Plan de Corrección
#### FASE 1: Verificar endpoint de achievements
```bash
# Obtener todos los achievements disponibles
curl -s http://localhost:3006/api/v1/gamification/achievements | jq
# Obtener achievements del usuario student
curl -s -H "Authorization: Bearer <token>" \
http://localhost:3006/api/v1/gamification/users/cccccccc-cccc-cccc-cccc-cccccccccccc/achievements | jq
```
#### FASE 2: Mejora de UX (Frontend)
**Archivo:** `/apps/frontend/src/apps/student/pages/GamificationPage.tsx` o página de Achievements
**Cambio propuesto:**
- Si `unlockedAchievements.length === 0`, mostrar:
- "No tienes logros desbloqueados aún"
- Lista de achievements disponibles con estado "locked"
- Call to action: "¡Completa ejercicios para desbloquear logros!"
#### FASE 3: Opción - Agregar achievement "Primera Visita" automático
Los usuarios de testing podrían tener al menos el achievement de "Primera Visita" si se activa el trigger correspondiente al hacer login.
**Verificar trigger:**
```sql
-- Verificar si existe trigger para crear achievement automático
SELECT * FROM pg_trigger WHERE tgname LIKE '%achievement%';
```
### Archivos a Modificar
| Archivo | Líneas | Cambio |
|---------|--------|--------|
| `GamificationPage.tsx` | Sección achievements | Mejorar UX para lista vacía |
| `AchievementsPage.tsx` | Render | Mostrar achievements locked si no hay unlocked |
| `achievementsStore.ts` | N/A | Sin cambios - funciona correctamente |
### Criterios de Éxito
- [ ] Página muestra todos los achievements (locked y unlocked)
- [ ] Usuario sin achievements ve mensaje amigable + lista de disponibles
- [ ] Progreso de achievements se muestra correctamente
- [ ] No errores 404 en consola
---
## TAREA 3: CORRECCIÓN MODULE DETAIL
### Diagnóstico Final
El problema puede tener múltiples causas:
1. **RLS (Row Level Security):** El usuario debe pertenecer a un classroom con assignments asignados
2. **JWT:** El token debe ser válido y contener el userId correcto
3. **Seeds:** Los ejercicios deben existir y estar relacionados con el módulo
4. **Relaciones:** module_id en exercises debe coincidir con id del módulo
### Plan de Corrección
#### FASE 1: Diagnóstico completo
```bash
# 1.1 Verificar módulos existentes
curl -s http://localhost:3006/api/v1/educational/modules | jq
# 1.2 Verificar ejercicios de un módulo específico (reemplazar {moduleId})
curl -s -H "Authorization: Bearer <token>" \
http://localhost:3006/api/v1/educational/modules/{moduleId}/exercises | jq
# 1.3 Verificar que usuario tiene classroom
curl -s -H "Authorization: Bearer <token>" \
http://localhost:3006/api/v1/users/me/classrooms | jq
```
#### FASE 2: Verificar seeds de módulos y ejercicios
```sql
-- Verificar módulos
SELECT id, title, status, is_active
FROM educational_content.modules
ORDER BY order_index;
-- Verificar ejercicios por módulo
SELECT m.title as module, COUNT(e.id) as exercises
FROM educational_content.modules m
LEFT JOIN educational_content.exercises e ON e.module_id = m.id
GROUP BY m.id, m.title
ORDER BY m.order_index;
-- Verificar que student@ pertenece a classroom
SELECT c.name as classroom, u.email
FROM educational_content.classrooms c
JOIN educational_content.classroom_students cs ON cs.classroom_id = c.id
JOIN auth.users u ON u.id = cs.student_id
WHERE u.email = 'student@gamilit.com';
```
#### FASE 3: Correcciones de código (si es necesario)
**Mejorar manejo de errores en frontend:**
**Archivo:** `/apps/frontend/src/apps/student/pages/ModuleDetailPage.tsx`
```typescript
// Agregar mensaje de error más descriptivo
if (error) {
return (
<ErrorState
title="Error al cargar el módulo"
message={error}
suggestions={[
"Verifica tu conexión a internet",
"Asegúrate de estar asignado a un aula",
"Contacta a tu profesor si el problema persiste"
]}
onRetry={() => refetch()}
/>
);
}
```
#### FASE 4: Verificar relaciones classroom-student-assignment
**Si el usuario no está en un classroom:**
```sql
-- Agregar student@ a un classroom de prueba
INSERT INTO educational_content.classroom_students (classroom_id, student_id)
SELECT
c.id,
u.id
FROM educational_content.classrooms c,
auth.users u
WHERE c.name = 'Aula Demo'
AND u.email = 'student@gamilit.com'
ON CONFLICT DO NOTHING;
```
### Archivos a Modificar
| Archivo | Líneas | Cambio |
|---------|--------|--------|
| `ModuleDetailPage.tsx` | Error handling | Mejorar mensajes de error |
| `useModules.ts` | 94-129 | Agregar logging detallado |
| Seeds SQL | N/A | Verificar relaciones classroom-student |
### Criterios de Éxito
- [ ] Módulos se cargan correctamente
- [ ] Ejercicios del módulo se muestran
- [ ] Progreso del usuario visible
- [ ] Errores descriptivos si hay problemas
- [ ] No errores 500 en backend
---
## TAREA 4: VALIDACIÓN INTEGRAL
### Alcance
1. **Verificación de dependencias cruzadas**
2. **Seeds consistentes entre tablas**
3. **Integraciones con portales admin/teacher**
4. **Duplicidad de funcionalidades**
### Plan de Validación
#### FASE 1: Validar consistencia de datos
```sql
-- Verificar integridad referencial
-- 1. Usuarios sin profile
SELECT u.id, u.email FROM auth.users u
LEFT JOIN auth_management.profiles p ON p.user_id = u.id
WHERE p.id IS NULL;
-- 2. Profiles sin user_stats
SELECT p.display_name, p.user_id FROM auth_management.profiles p
LEFT JOIN gamification_system.user_stats us ON us.user_id = p.user_id
WHERE us.id IS NULL;
-- 3. user_achievements huérfanos
SELECT ua.id, ua.user_id, ua.achievement_id
FROM gamification_system.user_achievements ua
LEFT JOIN auth_management.profiles p ON p.user_id = ua.user_id
LEFT JOIN gamification_system.achievements a ON a.id = ua.achievement_id
WHERE p.id IS NULL OR a.id IS NULL;
-- 4. Ejercicios sin módulo válido
SELECT e.id, e.title, e.module_id
FROM educational_content.exercises e
LEFT JOIN educational_content.modules m ON m.id = e.module_id
WHERE m.id IS NULL;
```
#### FASE 2: Verificar integraciones
```bash
# Portal Admin - Verificar endpoints
curl -s http://localhost:3006/api/v1/admin/users | head
curl -s http://localhost:3006/api/v1/admin/statistics | head
# Portal Teacher - Verificar endpoints
curl -s http://localhost:3006/api/v1/teachers/classrooms | head
curl -s http://localhost:3006/api/v1/teachers/assignments | head
```
#### FASE 3: Revisar duplicidad de funcionalidades
Archivos a revisar:
- `/apps/frontend/src/features/gamification/social/api/socialAPI.ts`
- `/apps/frontend/src/api/gamification.api.ts`
- `/apps/frontend/src/features/gamification/social/api/achievementsAPI.ts`
**Consolidación recomendada:**
- Unificar llamadas API duplicadas
- Usar un solo store por dominio
- Eliminar funciones duplicadas
---
## ORDEN DE EJECUCIÓN
1. **FASE 0:** Verificación de ambiente (backend corriendo, BD accesible)
2. **TAREA 1:** Corregir Leaderboard (más crítico)
3. **TAREA 3:** Corregir ModuleDetail (afecta funcionalidad core)
4. **TAREA 2:** Mejorar UX Achievements (mejora incremental)
5. **TAREA 4:** Validación integral (consolidación)
---
## ESTIMACIÓN DE CAMBIOS
| Tarea | Archivos | Complejidad | Riesgo |
|-------|----------|-------------|--------|
| Leaderboard | 1-2 | Baja | Bajo |
| Achievements | 2-3 | Media | Bajo |
| ModuleDetail | 2-4 | Alta | Medio |
| Validación | N/A | Media | Bajo |
---
## SIGUIENTE PASO
**Ejecutar diagnóstico de ambiente para confirmar estado actual antes de aplicar correcciones.**