Gamilit: - Backend: Teacher services, assignments, gamification, exercise submissions - Frontend: Admin/Teacher/Student portals, module 4-5 mechanics, monitoring - Database: DDL functions, seeds for dev/prod, auth/gamification schemas - Docs: Architecture, features, guides cleanup and reorganization Core/Orchestration: - New workspace directives index - Documentation directive Trading-platform: - Database seeds and inventory updates - Tech leader validation report 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
14 KiB
ANALISIS DE IMPACTO: Correcciones de Gamificacion
GAMILIT - FASE 4
Fecha: 2025-12-14 Proyecto: GAMILIT Rol: Tech-Leader Agent Basado en: GAMIFICATION-CORRECTION-PLAN-2025-12-14.md
RESUMEN DE IMPACTO
| Correccion | Componentes Afectados | Riesgo | Requiere Testing |
|---|---|---|---|
| P0-001 (SQL) | 0 funciones SQL dependientes | BAJO | SI (SQL tests) |
| P0-002 (isMinRank) | 0 componentes externos | BAJO | NO |
| P0-003 (Progress) | 2 componentes UI | MEDIO | SI (UI tests) |
| P0-004 (API) | 4+ componentes UI | ALTO | SI (E2E tests) |
P0-001: calculate_maya_rank_helpers.sql
Dependencias Encontradas
Funciones SQL que usan esta funcion: NINGUNA
Basado en busqueda exhaustiva, la funcion calculate_maya_rank_from_xp() no es llamada por:
- Otras funciones SQL en el schema gamification_system
- Triggers existentes
- Views o materialized views
Documentacion que referencia esta funcion:
orchestration/inventarios/MASTER_INVENTORY.yml(linea 91-92) - Solo documentacionapps/backend/migrations/README.md(linea 48-56) - Solo ejemplos
Analisis de Impacto
| Aspecto | Estado | Detalle |
|---|---|---|
| Funciones dependientes | ✅ NINGUNA | No hay cascada de cambios |
| Triggers | ✅ NO AFECTADOS | Triggers usan maya_ranks table |
| Views | ✅ NO AFECTADAS | No hay views usando esta funcion |
| Backend | ✅ NO AFECTADO | Backend usa RanksService, no SQL directo |
| Frontend | ✅ NO AFECTADO | Frontend no llama SQL |
Conclusion P0-001
RIESGO: BAJO El cambio es seguro. La funcion es una utilidad "pura" que no tiene dependencias en cadena.
P0-002: isMinRank en useRank.ts
Dependencias Encontradas
Archivos que importan useRank:
apps/frontend/src/features/gamification/ranks/components/RankComparison.tsx
apps/frontend/src/features/gamification/ranks/components/RankUpModal.tsx
apps/frontend/src/features/gamification/ranks/hooks/index.ts (re-export)
Uso de isMinRank en componentes:
Buscando uso de isMinRank:
useRank.ts: Se define y exporta (linea 34, 65-68, 143)- Ningun componente externo usa
isMinRank
Analisis de Impacto
| Aspecto | Estado | Detalle |
|---|---|---|
| RankComparison.tsx | ✅ NO USA | Usa compareToNext, compareToRank |
| RankUpModal.tsx | ✅ NO USA | Usa currentRank, previousRank, prestigeLevel |
| Otros componentes | ✅ NO USAN | No hay referencias externas |
Conclusion P0-002
RIESGO: MUY BAJO
La variable isMinRank se exporta pero no se usa en ningun componente externo actualmente. El cambio no tiene impacto visible.
P0-003: Calculo de Progreso (XP vs ML Coins)
Dependencias Encontradas
Componentes que usan progress de useRank:
RankComparison.tsx- Muestra progreso hacia siguiente rangoRankUpModal.tsx- Podria mostrar progreso
Variables relacionadas en ranksStore:
// ranksStore.ts - userProgress incluye:
{
currentLevel: number;
currentXP: number;
xpToNextLevel: number;
totalXP: number; // <-- EXISTE
currentRank: string;
mlCoinsEarned: number; // <-- Actualmente usado
...
}
Analisis de Impacto
| Aspecto | Estado | Detalle |
|---|---|---|
| RankComparison.tsx | ⚠️ AFECTADO | Muestra progress percentage |
| RankUpModal.tsx | ⚠️ VERIFICAR | Podria usar progress |
| Dashboard widgets | ⚠️ VERIFICAR | Podrian mostrar progress |
| ranksStore | ✅ TIENE totalXP | Campo disponible |
Dependencias de Datos
Para que P0-003 funcione, se necesita verificar:
- ranksStore tiene
totalXP: ✅ SI (userProgress.totalXP) - Backend envia
totalXP: ✅ SI (UserStats.total_xp) - Umbrales de XP disponibles: ❌ NO - Actualmente hardcodeados
Cambios Adicionales Requeridos
Para P0-003, ademas del hook, se necesita:
- Agregar constantes de umbrales XP en frontend
- O mejor: usar P0-004 para obtener umbrales desde API
Conclusion P0-003
RIESGO: MEDIO
El cambio requiere verificar que los componentes que usen progress se actualicen correctamente. Se recomienda implementar P0-004 primero.
P0-004: Reemplazar Mock Data con API
Dependencias Encontradas
Archivos que importan de mockData/ranksMockData:
apps/frontend/src/features/gamification/ranks/hooks/useRank.ts
Componentes que usan useRank (indirectamente afectados):
apps/frontend/src/features/gamification/ranks/components/RankComparison.tsx
apps/frontend/src/features/gamification/ranks/components/RankUpModal.tsx
Componentes que usan useRanksStore directamente:
apps/frontend/src/features/gamification/ranks/components/PrestigeSystem.tsx
apps/frontend/src/features/gamification/ranks/components/ProgressTimeline.tsx
apps/frontend/src/features/gamification/ranks/hooks/useMultipliers.ts
apps/frontend/src/features/gamification/ranks/hooks/useProgression.ts
apps/frontend/src/apps/student/pages/GamificationPage.tsx
apps/frontend/src/apps/student/pages/EnhancedProfilePage.tsx
apps/frontend/src/apps/student/pages/GamificationTestPage.tsx
apps/frontend/src/apps/student/components/exercise/CompletionModal.tsx
apps/frontend/src/features/gamification/components/StreakIndicator.tsx
apps/frontend/src/shared/hooks/useInvalidateDashboard.ts
Analisis de Impacto
| Componente | Impacto | Accion Requerida |
|---|---|---|
| useRank.ts | ALTO | Modificar para usar API |
| RankComparison.tsx | MEDIO | Verificar props |
| RankUpModal.tsx | MEDIO | Verificar props |
| PrestigeSystem.tsx | BAJO | Usa ranksStore, no useRank |
| ProgressTimeline.tsx | BAJO | Usa ranksStore |
| useMultipliers.ts | BAJO | Usa ranksStore |
| useProgression.ts | BAJO | Usa ranksStore |
| GamificationPage.tsx | BAJO | Usa ranksStore |
| EnhancedProfilePage.tsx | BAJO | Usa ranksStore |
| CompletionModal.tsx | BAJO | Usa useProgression |
Dependencias de Backend
Para P0-004, se necesita verificar endpoints:
| Endpoint | Estado | Accion |
|---|---|---|
| GET /gamification/ranks/config | ✅ EXISTE | getAllRanksConfig() |
| GET /gamification/ranks/progress/:userId | ✅ EXISTE | calculateRankProgress() |
| GET /gamification/users/:id/rank | ⚠️ VERIFICAR | getCurrentRank() |
Verificacion de RanksController
// Endpoints existentes en ranks.controller.ts:
@Get('users/:userId/current') // getCurrentRank
@Get('users/:userId/history') // getUserRankHistory
@Get('users/:userId/progress') // calculateRankProgress
@Post('users/:userId/promote') // promoteToNextRank
@Get('config') // getAllRanksConfig (necesita agregar)
Conclusion P0-004
RIESGO: ALTO pero MANEJABLE
- El cambio afecta multiples componentes indirectamente
- Los componentes usan ranksStore (Zustand), no useRank directamente
- El store ya tiene metodo
fetchUserProgressque puede ser extendido - Se recomienda implementar de forma incremental
MATRIZ DE DEPENDENCIAS COMPLETA
┌─────────────────────────────────────────────────────────────────────────┐
│ DATABASE LAYER │
├─────────────────────────────────────────────────────────────────────────┤
│ calculate_maya_rank_helpers.sql (P0-001) │
│ └── [NO DEPENDENCIAS] │
│ │
│ maya_ranks table (seed) │
│ ├── check_rank_promotion() ─── trg_check_rank_promotion_on_xp_gain │
│ └── promote_to_next_rank() │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ BACKEND LAYER │
├─────────────────────────────────────────────────────────────────────────┤
│ RanksService (RANK_CONFIG hardcoded v2.1) │
│ ├── RanksController │
│ │ ├── GET /ranks/users/:id/current │
│ │ ├── GET /ranks/users/:id/progress │
│ │ └── GET /ranks/config (agregar endpoint) │
│ └── ExerciseAttemptService │
│ └── UserStatsService.addXp() │
│ └── [TRIGGER DB → check_rank_promotion] │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ FRONTEND LAYER │
├─────────────────────────────────────────────────────────────────────────┤
│ ranksStore (Zustand) ◄── fetchUserProgress() │
│ ├── useProgression hook │
│ ├── useMultipliers hook │
│ └── Componentes directos (GamificationPage, etc.) │
│ │
│ useRank hook (P0-002, P0-003, P0-004) │
│ ├── mockData/ranksMockData (ELIMINAR) │
│ ├── RankComparison.tsx │
│ └── RankUpModal.tsx │
└─────────────────────────────────────────────────────────────────────────┘
ORDEN DE IMPLEMENTACION RECOMENDADO
Basado en el analisis de dependencias:
Fase 1: Sin Dependencias (Seguro)
- P0-001 - Actualizar SQL function (no afecta nada)
- P0-002 - Corregir isMinRank (no usado externamente)
Fase 2: Verificar Backend
- Verificar/crear endpoint
GET /ranks/config - Verificar respuesta de
GET /ranks/users/:id/progress
Fase 3: Frontend con Cuidado
- P0-004 - Crear ranksAPI.ts con llamadas API
- P0-003 - Actualizar calculo de progress
Fase 4: Testing
- Ejecutar tests unitarios de ranksStore
- Ejecutar tests de integracion
- Verificar manualmente en UI
CHECKLIST PRE-IMPLEMENTACION
Base de Datos
- Verificar que no hay queries usando calculate_maya_rank_from_xp
- Tener script de rollback listo
Backend
- Verificar endpoint /ranks/config existe
- Verificar respuesta incluye umbrales XP
Frontend
- Backup de useRank.ts actual
- Verificar totalXP disponible en ranksStore
- Preparar mock para desarrollo
Testing
- Tests unitarios de ranksStore pasando
- Tests de integracion de RanksIntegration.test.tsx
- Tests de DashboardIntegration.test.tsx
PLAN DE ROLLBACK
Si P0-001 falla:
-- Restaurar version v1.0
CREATE OR REPLACE FUNCTION gamification_system.calculate_maya_rank_from_xp(xp INTEGER)
RETURNS TEXT AS $$
BEGIN
IF xp < 1000 THEN RETURN 'Ajaw';
ELSIF xp < 3000 THEN RETURN 'Nacom';
ELSIF xp < 6000 THEN RETURN 'Ah K''in';
ELSIF xp < 10000 THEN RETURN 'Halach Uinic';
ELSE RETURN 'K''uk''ulkan';
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
Si P0-002/003/004 fallan:
# Restaurar useRank.ts desde git
git checkout HEAD -- apps/frontend/src/features/gamification/ranks/hooks/useRank.ts
CONCLUSION
El analisis de impacto confirma que las correcciones son seguras de implementar siguiendo el orden recomendado:
- P0-001 y P0-002 son de riesgo muy bajo y pueden implementarse inmediatamente
- P0-003 y P0-004 requieren coordinacion pero tienen dependencias claras
- No hay "cascadas" de cambios inesperadas
- Los tests existentes cubren la mayoria de los casos
Recomendacion: Proceder con la implementacion en el orden indicado.
Proximo Paso: FASE 5 - Ejecucion del Plan de Implementacion
Autor: Tech-Leader Agent Revision: 1.0 Fecha: 2025-12-14