workspace-v1/orchestration/analisis/11-EJECUCION-ACTUALIZACION-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

EJECUCIÓN: Actualización Scripts BD - FIX-USER-STATS-TENANT

Agente: Orquestador (Tech Lead) Fecha ejecución: 2026-01-10 Versión Plan: Refinado (10-REFINAMIENTO-PLAN-SCRIPTS-BD-2026-01-10.md) Referencia: 08-PLAN-ACTUALIZACION-SCRIPTS-BD-2026-01-10.md


1. RESUMEN EJECUTIVO

1.1 Objetivo

Actualizar el script 05-user_stats.sql para corregir el tenant_id incorrecto y garantizar que todos los perfiles tengan registros de gamificación después de ejecutar drop-and-recreate-database.sh.

1.2 Resultado Final

EJECUCIÓN EXITOSA

Criterio Esperado Actual Estado
user_stats para todos los perfiles 48 48 OK
user_ranks para todos los perfiles 48 48 OK
comodines_inventory 48 48 OK
Tenant_id correcto GAMILIT Platform GAMILIT Platform OK
Sin errores FK violation 0 0 OK

2. CAMBIOS APLICADOS

2.1 Archivo Modificado

Archivo: /home/isem/workspace-v1/projects/gamilit/apps/database/seeds/prod/gamification_system/05-user_stats.sql

Versión anterior: 2.0 Versión nueva: 2.1

2.2 Cambios Específicos

Cambio 1: Versión en encabezado (Líneas 2 y 9)

- -- Seed: gamification_system.user_stats (PROD) - v2.0
+ -- Seed: gamification_system.user_stats (PROD) - v2.1

- -- Version: 2.0 (Refactored - Trigger-based creation)
+ -- Version: 2.1 (Fixed tenant_id + Fallback initialization - 2026-01-10)

Cambio 2: Corrección tenant_id (Línea 48)

  DO $$
  DECLARE
-     v_tenant_id uuid := '00000000-0000-0000-0000-000000000001';
+     v_tenant_id uuid := 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11';  -- GAMILIT Platform (tenant principal)
  BEGIN

Cambio 3: Bloque de inicialización global (Líneas 92-134, nueva sección)

-- =====================================================
-- FASE 0.1: Inicializar user_stats para TODOS los perfiles
-- =====================================================
-- CORRECCION 2026-01-10: El trigger initialize_user_stats no siempre ejecuta
-- durante el seed. Esta seccion garantiza que todos los perfiles tengan
-- registros de gamificacion.

DO $$
DECLARE
    v_profile RECORD;
    v_count INTEGER := 0;
    v_tenant_id uuid := 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11';  -- GAMILIT Platform
BEGIN
    FOR v_profile IN
        SELECT p.id as profile_id, p.user_id, p.display_name
        FROM auth_management.profiles p
        LEFT JOIN gamification_system.user_stats us ON us.user_id = p.id
        WHERE us.user_id IS NULL
    LOOP
        -- Insert user_stats
        INSERT INTO gamification_system.user_stats (user_id, tenant_id, ml_coins, ml_coins_earned_total)
        VALUES (v_profile.profile_id, v_tenant_id, 100, 100)
        ON CONFLICT (user_id) DO NOTHING;

        -- Insert user_ranks
        INSERT INTO gamification_system.user_ranks (user_id, tenant_id, current_rank, is_current, achieved_at)
        VALUES (v_profile.profile_id, v_tenant_id, 'Ajaw'::gamification_system.maya_rank, true, NOW())
        ON CONFLICT DO NOTHING;

        -- Insert comodines_inventory
        INSERT INTO gamification_system.comodines_inventory (user_id)
        VALUES (v_profile.profile_id)
        ON CONFLICT (user_id) DO NOTHING;

        v_count := v_count + 1;
    END LOOP;

    IF v_count > 0 THEN
        RAISE NOTICE '✓ Inicializados % perfiles sin user_stats (fallback)', v_count;
    ELSE
        RAISE NOTICE '✓ Todos los perfiles ya tienen user_stats (trigger funcionó correctamente)';
    END IF;
END $$;

3. VALIDACIÓN

3.1 Ejecución drop-and-recreate-database.sh

./drop-and-recreate-database.sh "postgresql://gamilit_user:***@localhost:5432/gamilit_platform"

Resultado:

  • Exit code: 0
  • Schemas creados: 16
  • Tablas creadas: 142
  • ENUMs creados: 39
  • Funciones creadas: 227
  • Triggers creados: 103
  • Seeds ejecutados: Todos sin errores

3.2 Verificación de Datos

SELECT
    (SELECT COUNT(*) FROM auth_management.profiles) as profiles_count,
    (SELECT COUNT(*) FROM gamification_system.user_stats) as user_stats_count,
    (SELECT COUNT(*) FROM gamification_system.user_ranks) as user_ranks_count,
    (SELECT COUNT(*) FROM gamification_system.comodines_inventory) as comodines_count,
    CASE
        WHEN (SELECT COUNT(*) FROM auth_management.profiles) =
             (SELECT COUNT(*) FROM gamification_system.user_stats)
        THEN 'OK'
        ELSE 'ERROR: Discrepancia'
    END as status;

Resultado:

profiles_count user_stats_count user_ranks_count comodines_count status
48 48 48 48 OK

3.3 Verificación de Tenant ID

SELECT
    us.tenant_id,
    t.name as tenant_name,
    COUNT(*) as count
FROM gamification_system.user_stats us
JOIN auth_management.tenants t ON t.id = us.tenant_id
GROUP BY us.tenant_id, t.name;

Resultado:

tenant_id tenant_name count
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 GAMILIT Platform 48

Todos los registros usan el tenant_id correcto

3.4 Verificación user_ranks

SELECT
    ur.tenant_id,
    t.name as tenant_name,
    COUNT(*) as count
FROM gamification_system.user_ranks ur
JOIN auth_management.tenants t ON t.id = ur.tenant_id
GROUP BY ur.tenant_id, t.name;

Resultado:

tenant_id tenant_name count
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 GAMILIT Platform 48

Todos los registros usan el tenant_id correcto


4. ARCHIVOS NO MODIFICADOS (CONFIRMADO)

Archivo Razón de no modificación
02-classrooms.sql UUID 00000000-... es para classroom ID, no tenant_id
04-moderation_rules.sql UUID es para user_id de usuario sistema
01-tenants.sql Ya documenta el tenant removido (no requiere cambios)
04-user_roles.sql Baja prioridad, usuarios demo no existen

5. RESUMEN DE DOCUMENTOS

Documento Descripción Estado
07-ANALISIS-CAMBIOS-SCRIPTS-BD Análisis inicial del problema Completado
08-PLAN-ACTUALIZACION-SCRIPTS-BD Plan de actualización Completado
09-VALIDACION-PLAN-SCRIPTS-BD Validación del plan Completado
10-REFINAMIENTO-PLAN-SCRIPTS-BD Refinamiento con búsqueda exhaustiva Completado
11-EJECUCION-ACTUALIZACION-SCRIPTS-BD Este documento Completado

6. CONCLUSIÓN

6.1 Problema Resuelto

El seed 05-user_stats.sql ahora:

  1. Usa el tenant_id correcto (a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11)
  2. Incluye fallback para inicializar TODOS los perfiles
  3. Genera registros consistentes en user_stats, user_ranks y comodines_inventory

6.2 Reproducibilidad Garantizada

Ejecutar drop-and-recreate-database.sh ahora produce una base de datos con:

  • 48 perfiles con registros de gamificación
  • Todos usando el tenant correcto
  • Sin errores FK violation

6.3 Nota sobre XP Inicial

Los usuarios inician con valores base (XP=0, level=1, ml_coins=100) como está diseñado. El XP variado para demos puede agregarse manualmente o a través de un seed separado si se requiere.


Ejecutado por: Orquestador (Tech Lead) Fecha: 2026-01-10 Estado: COMPLETADO