workspace-v1/orchestration/analisis/07-ANALISIS-CAMBIOS-SCRIPTS-BD-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

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:

  1. Tenant ID incorrecto: Usa '00000000-0000-0000-0000-000000000001' pero el tenant correcto es 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'

  2. 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:

  1. El seed ya existe y es el lugar correcto para esta lógica
  2. Solo requiere corregir el tenant_id
  3. Debe incluir fallback para usuarios sin user_stats

7. PRÓXIMO PASO

Proceder a FASE 2: Análisis detallado para:

  1. Revisar contenido actual del seed 05-user_stats.sql
  2. Identificar el tenant_id correcto
  3. Verificar el trigger initialize_user_stats
  4. Crear plan de modificación

Analizado por: Orquestador (Tech Lead) Fecha: 2026-01-10 Estado: FASE 1 COMPLETADA