workspace-v1/orchestration/analisis/10-REFINAMIENTO-PLAN-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

6.8 KiB

REFINAMIENTO: Plan de Actualización Scripts BD

Fecha: 2026-01-10 Documentos de referencia:

  • 08-PLAN-ACTUALIZACION-SCRIPTS-BD-2026-01-10.md
  • 09-VALIDACION-PLAN-SCRIPTS-BD-2026-01-10.md

1. HALLAZGOS DEL ANÁLISIS EXTENDIDO

1.1 Archivos con UUID 00000000-0000-0000-0000-000000000001

Se realizó búsqueda exhaustiva en todos los seeds:

Archivo Líneas Uso del UUID Problema?
05-user_stats.sql 48 v_tenant_id SÍ - CRÍTICO
04-user_roles.sql 37,66,94,122,153 tenant_id SÍ - Potencial
02-classrooms.sql 105 classroom ID NO (es ID de entidad)
04-moderation_rules.sql 12,33,etc user_id (system user) NO (es ID de usuario)
01-tenants.sql 17,98 Comentario/histórico NO (ya documentado)
CREAR-USUARIOS-TESTING.sql múltiples tenant_id SÍ - Testing
02-test-users.sql 108,188 tenant_id NO (_deprecated)

1.2 Análisis de Contexto

02-classrooms.sql - NO REQUIERE CAMBIOS

-- Línea 105: UUID usado como ID del classroom (NO tenant_id)
'00000000-0000-0000-0000-000000000001'::uuid,  -- UUID predecible para default

-- Línea 107: tenant_id se obtiene dinámicamente (CORRECTO)
v_tenant_id,  -- Variable obtenida de lookup

El tenant_id se obtiene correctamente mediante lookup dinámico:

-- Líneas 37-45
SELECT id INTO v_tenant_id
FROM auth_management.tenants
WHERE name = 'GAMILIT Platform'
LIMIT 1;

04-moderation_rules.sql - NO REQUIERE CAMBIOS

-- Línea 12: UUID usado como user_id para usuario sistema
'00000000-0000-0000-0000-000000000001',  -- ID de usuario (system@gamilit.com)

Este es un user_id para un usuario sistema, no un tenant_id.

04-user_roles.sql - REQUIERE REVISIÓN POSTERIOR

Este archivo usa el UUID como tenant_id pero para usuarios demo que pueden no existir en la configuración actual (estudiante1@demo.glit.edu.mx, etc.).

Decisión: Verificar después de la corrección principal si estos usuarios existen. Si no existen, los INSERTs fallarán silenciosamente por el subselect vacío.


2. CAMBIOS CONFIRMADOS

2.1 Archivo Principal: 05-user_stats.sql

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

Cambio 1: Corregir tenant_id (Línea 48)

Antes:

DO $$
DECLARE
    v_tenant_id uuid := '00000000-0000-0000-0000-000000000001';

Después:

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

Cambio 2: Agregar inicialización global (después de línea 90)

Agregar bloque que inicializa user_stats para TODOS los perfiles sin registro:

-- =====================================================
-- 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 $$;

Cambio 3: Actualizar versión en encabezado (Líneas 2 y 9)

Antes:

-- Seed: gamification_system.user_stats (PROD) - v2.0
...
-- Version: 2.0 (Refactored - Trigger-based creation)

Después:

-- Seed: gamification_system.user_stats (PROD) - v2.1
...
-- Version: 2.1 (Fixed tenant_id + Fallback initialization - 2026-01-10)

3. ARCHIVOS SIN CAMBIOS (CONFIRMADO)

Archivo Razón
02-classrooms.sql UUID es para classroom ID, no tenant_id
04-moderation_rules.sql UUID es para user_id (system user)
01-tenants.sql Ya documenta el tenant removido
02-test-users.sql En carpeta _deprecated

4. ARCHIVOS PENDIENTES DE REVISIÓN

Archivo Prioridad Acción
04-user_roles.sql BAJA Verificar si usuarios demo existen
CREAR-USUARIOS-TESTING.sql BAJA En carpeta _testing, verificar uso

5. PLAN DE EJECUCIÓN REFINADO

Fase 6.1: Backup

cp 05-user_stats.sql 05-user_stats.sql.backup.2026-01-10

Fase 6.2: Aplicar Cambios

  1. Cambio 1: Corregir línea 48 (tenant_id)
  2. Cambio 2: Agregar bloque de inicialización global
  3. Cambio 3: Actualizar versión en encabezado

Fase 6.3: Verificación de Sintaxis

# Revisar que el archivo SQL es válido
psql -d gamilit_platform -f 05-user_stats.sql --echo-errors

Fase 7: Validación Completa

./drop-and-recreate-database.sh

Fase 7.1: 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,
    CASE
        WHEN (SELECT COUNT(*) FROM auth_management.profiles) =
             (SELECT COUNT(*) FROM gamification_system.user_stats)
        THEN 'OK'
        ELSE 'ERROR: Discrepancia'
    END as status;

6. CRITERIOS DE ÉXITO

  • 05-user_stats.sql modificado con tenant_id correcto
  • Bloque de inicialización global agregado
  • Versión actualizada a 2.1
  • drop-and-recreate-database.sh ejecuta sin errores
  • COUNT(user_stats) = COUNT(profiles)
  • COUNT(user_ranks) = COUNT(user_stats)
  • Sin errores FK violation

Refinado por: Orquestador (Tech Lead) Fecha: 2026-01-10 Estado: APROBADO PARA EJECUCIÓN