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
7.3 KiB
ANÁLISIS: Cambios Manuales vs Scripts BD
Agente: Orquestador (Tech Lead) Tipo de tarea: Corrección | Sincronización Scripts Prioridad: P1 Fecha análisis: 2026-01-10 Referencia: 05-EJECUCION-FIX-STUDENT-PORTAL-2026-01-10.md
1. CONTEXTO
Durante la ejecución del plan FIX-STUDENT-PORTAL-001, se identificaron y aplicaron correcciones manuales a la base de datos que NO están reflejadas en los scripts de seed. Esto significa que si alguien ejecuta drop-and-recreate-database.sh, encontrará los mismos problemas.
1.1 Problema Identificado
Después de ejecutar drop-and-recreate-database.sh:
user_stats: 0 registros (esperado: 48)user_ranks: 0 registros (esperado: 48)
1.2 Causa Raíz
El seed 05-user_stats.sql tiene dos problemas:
-
Tenant ID incorrecto: Usa
'00000000-0000-0000-0000-000000000001'pero el tenant correcto es'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11' -
Trigger no ejecuta: El trigger
initialize_user_stats(AFTER INSERT en profiles) debería crear automáticamente los registros, pero no está funcionando correctamente durante el proceso de seed.
2. CAMBIOS MANUALES APLICADOS
2.1 Cambio 1: Inicialización de user_stats
Descripción: Inicializar user_stats para los 48 perfiles existentes
SQL ejecutado manualmente:
DO $$
DECLARE
v_profile RECORD;
v_count INTEGER := 0;
v_tenant_id uuid := 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'; -- Tenant correcto
BEGIN
FOR v_profile IN
SELECT p.user_id, p.display_name
FROM auth_management.profiles p
LEFT JOIN gamification_system.user_stats us ON us.user_id = p.user_id
WHERE us.user_id IS NULL
LOOP
INSERT INTO gamification_system.user_stats (user_id, tenant_id, ml_coins, ml_coins_earned_total)
VALUES (v_profile.user_id, v_tenant_id, 100, 100)
ON CONFLICT (user_id) DO NOTHING;
INSERT INTO gamification_system.user_ranks (user_id, tenant_id, current_rank, is_current, achieved_at)
VALUES (v_profile.user_id, v_tenant_id, 'Ajaw'::gamification_system.maya_rank, true, NOW())
ON CONFLICT DO NOTHING;
INSERT INTO gamification_system.comodines_inventory (user_id)
VALUES (v_profile.user_id)
ON CONFLICT (user_id) DO NOTHING;
v_count := v_count + 1;
END LOOP;
RAISE NOTICE 'Initialized user_stats for % profiles', v_count;
END $$;
Resultado: 48 registros creados en user_stats, user_ranks y comodines_inventory
2.2 Cambio 2: XP variado para demo
Descripción: Actualizar 10 usuarios aleatorios con XP variado para leaderboard realista
SQL ejecutado manualmente:
DO $$
DECLARE
v_users uuid[];
v_xp_values int[] := ARRAY[5000, 3500, 2800, 2100, 1500, 1200, 950, 750, 500, 300];
v_level_values int[] := ARRAY[5, 4, 3, 3, 2, 2, 1, 1, 1, 1];
i int;
BEGIN
SELECT ARRAY(
SELECT user_id FROM gamification_system.user_stats
WHERE user_id NOT IN (
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid,
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid,
'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid
)
ORDER BY random()
LIMIT 10
) INTO v_users;
FOR i IN 1..array_length(v_users, 1) LOOP
UPDATE gamification_system.user_stats
SET
total_xp = v_xp_values[i],
level = v_level_values[i],
exercises_completed = v_xp_values[i] / 50,
ml_coins = 100 + (v_xp_values[i] / 10),
current_rank = CASE
WHEN v_level_values[i] >= 5 THEN 'Ah K''in'::gamification_system.maya_rank
WHEN v_level_values[i] >= 3 THEN 'Nacom'::gamification_system.maya_rank
ELSE 'Ajaw'::gamification_system.maya_rank
END
WHERE user_id = v_users[i];
END LOOP;
END $$;
Resultado: 10 usuarios con XP variado, triggers de promoción ejecutados
3. ARCHIVOS QUE REQUIEREN ACTUALIZACIÓN
3.1 Archivo Principal
| Archivo | Ubicación | Cambio Requerido |
|---|---|---|
| 05-user_stats.sql | seeds/prod/gamification_system/ | Corregir tenant_id y agregar inicialización robusta |
3.2 Archivos Dependientes a Verificar
| Archivo | Dependencia | Verificación |
|---|---|---|
| 01-demo-users.sql | Crea usuarios → debe activar trigger | Verificar orden de ejecución |
| 02-profiles.sql | Crea perfiles → trigger initialize_user_stats | Verificar que trigger existe |
| 06-user_ranks.sql | Depende de user_stats | Puede ser redundante |
| create-database.sh | Orden de ejecución de seeds | Verificar orden correcto |
3.3 Trigger a Verificar
| Trigger | Tabla | Función | Estado |
|---|---|---|---|
| trg_initialize_user_stats | auth_management.profiles | gamilit.initialize_user_stats() | Verificar funcionamiento |
4. ANÁLISIS DE IMPACTO
4.1 Objetos Afectados Directamente
gamification_system.user_stats (TABLA)
├── Depende de: auth_management.profiles (FK user_id)
├── Depende de: auth_management.tenants (FK tenant_id)
├── Afecta a: Trigger promoción de rangos
└── Afecta a: Leaderboard global
gamification_system.user_ranks (TABLA)
├── Depende de: auth_management.profiles (FK user_id)
├── Depende de: auth_management.tenants (FK tenant_id)
└── Afecta a: Sistema de rangos Maya
gamification_system.comodines_inventory (TABLA)
├── Depende de: auth_management.profiles (FK user_id)
└── Afecta a: Sistema de comodines
4.2 Objetos Afectados Indirectamente
Frontend:
├── LeaderboardPage → Consulta user_stats
├── GamificationPage → Consulta achievements + user_stats
└── UserProfile → Muestra nivel y XP
Backend:
├── LeaderboardService → Query user_stats
├── UserStatsService → CRUD user_stats
└── RanksService → Query user_ranks
5. OPCIONES DE SOLUCIÓN
Opción A: Corregir Seed user_stats.sql
Descripción: Modificar el seed para usar el tenant_id correcto y asegurar inicialización
Pros:
- Solución definitiva
- Reproducible
- Sigue patrón existente
Contras:
- Modifica archivo existente
- Requiere verificar que no rompa otros casos
Opción B: Crear nuevo seed de inicialización
Descripción: Crear un seed separado que garantice la inicialización
Pros:
- No modifica archivos existentes
- Más seguro
Contras:
- Duplicación de lógica
- Un archivo más que mantener
Opción C: Corregir función del trigger
Descripción: Verificar y corregir la función initialize_user_stats()
Pros:
- Solución en el origen
- Automático para nuevos usuarios
Contras:
- Más complejo
- Puede afectar producción
6. RECOMENDACIÓN
Opción seleccionada: A (Corregir Seed)
Razones:
- El seed ya existe y es el lugar correcto para esta lógica
- Solo requiere corregir el tenant_id
- Debe incluir fallback para usuarios sin user_stats
7. PRÓXIMO PASO
Proceder a FASE 2: Análisis detallado para:
- Revisar contenido actual del seed 05-user_stats.sql
- Identificar el tenant_id correcto
- Verificar el trigger initialize_user_stats
- Crear plan de modificación
Analizado por: Orquestador (Tech Lead) Fecha: 2026-01-10 Estado: FASE 1 COMPLETADA