# Scripts de Validación de Integridad - GAMILIT Database

**Fecha:** 2025-11-24
**Mantenido por:** Database-Agent
**Propósito:** Scripts para validar y mantener la integridad de datos de XP y ML Coins

---

## 📋 Scripts Disponibles

### 1. `quick-validate-xp.sql`

**Descripción:** Validación rápida (30 segundos) para detectar problemas de integridad en XP.

**Uso:**
```bash
cd /home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit/apps/database
PGPASSWORD='C5hq7253pdVyVKUC' psql -h localhost -U gamilit_user -d gamilit_platform -f scripts/quick-validate-xp.sql
```

**Salida esperada (sistema saludable):**
```
1. Intentos con score > 0 pero xp_earned = 0:
   intentos_problematicos = 0

2. Usuarios con discrepancias:
   usuarios_con_discrepancias = 0

3. Estado de integridad:
   estado = "✅ INTEGRIDAD OK"
```

**Frecuencia recomendada:** Diaria o después de cada deployment

---

### 2. `validate-xp-integrity.sql`

**Descripción:** Validación completa (2-3 minutos) con reporte detallado de todos los aspectos de integridad.

**Uso:**
```bash
cd /home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit/apps/database
PGPASSWORD='C5hq7253pdVyVKUC' psql -h localhost -U gamilit_user -d gamilit_platform -f scripts/validate-xp-integrity.sql
```

**Validaciones incluidas:**
1. Intentos con score > 0 pero xp_earned = 0
2. Usuarios con discrepancias entre attempts y user_stats
3. Intentos donde xp_earned no coincide con la fórmula esperada
4. User stats sin attempts registrados
5. Resumen general del sistema

**Frecuencia recomendada:** Semanal o cuando se detecten anomalías

---

### 3. `fix-historical-xp-ml-coins-v2.sql`

**Descripción:** Script de corrección automática de datos históricos (solo si se detectan problemas).

**⚠️ ADVERTENCIA:** Solo ejecutar si `quick-validate-xp.sql` reporta problemas.

**Uso:**
```bash
cd /home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit/apps/database
PGPASSWORD='C5hq7253pdVyVKUC' psql -h localhost -U gamilit_user -d gamilit_platform -f scripts/fix-historical-xp-ml-coins-v2.sql

# Revisar output cuidadosamente antes de confirmar
# Si todo se ve bien, ejecutar en otra sesión:
PGPASSWORD='C5hq7253pdVyVKUC' psql -h localhost -U gamilit_user -d gamilit_platform -c "COMMIT;"
```

**Acciones que realiza:**
1. Deshabilita trigger `trg_check_rank_promotion_on_xp_gain`
2. Corrige `xp_earned` y `ml_coins_earned` en `exercise_attempts`
3. Recalcula `user_stats` basado en suma de attempts
4. Rehabilita trigger
5. Valida integridad final

**Frecuencia recomendada:** Solo cuando sea necesario (no es una tarea periódica)

---

## 🔍 Interpretación de Resultados

### Estado: ✅ INTEGRIDAD OK

Todo funciona correctamente. No se requiere acción.

### Estado: ❌ HAY PROBLEMAS

**Pasos a seguir:**

1. **Ejecutar validación completa:**
   ```bash
   psql -d gamilit_platform -f scripts/validate-xp-integrity.sql
   ```

2. **Analizar reporte detallado:**
   - ¿Cuántos intentos afectados?
   - ¿Cuántos usuarios tienen discrepancias?
   - ¿Cuál es la magnitud del problema?

3. **Si hay pocos casos aislados (< 5 usuarios):**
   - Ejecutar script de corrección automática
   - Revisar logs antes de confirmar
   - Validar resultado

4. **Si hay muchos casos (> 5 usuarios):**
   - NO ejecutar script automático
   - Investigar la causa raíz
   - Consultar con Database-Agent o Tech Lead

---

## 📊 Fórmulas de XP y ML Coins

### XP Earned
```sql
xp_earned = GREATEST(0, score - (hints_used * 10))
```

**Ejemplos:**
- Score: 100, hints: 0 → XP: 100
- Score: 100, hints: 2 → XP: 80
- Score: 50, hints: 10 → XP: 0 (no negativo)

### ML Coins Earned
```sql
ml_coins_earned = GREATEST(0, FLOOR(score / 10) - (comodines_used * 2))
```

**Ejemplos:**
- Score: 100, comodines: 0 → ML Coins: 10
- Score: 100, comodines: 2 → ML Coins: 6
- Score: 50, comodines: 0 → ML Coins: 5

---

## 🚨 Problemas Comunes

### 1. Intentos con xp_earned = 0

**Causa:** Bug en el código que crea el attempt sin calcular XP.

**Solución:** Ejecutar script de corrección automática.

**Prevención:** Agregar validación en backend antes de insertar attempt.

### 2. Discrepancia entre attempts y user_stats

**Causa:** Trigger `update_user_stats_on_exercise_complete` no se ejecutó correctamente.

**Solución:** Recalcular user_stats con script de corrección.

**Prevención:** Monitorear logs de triggers.

### 3. Fórmulas inconsistentes

**Causa:** Cambio en lógica de negocio sin migración de datos históricos.

**Solución:** Decidir si mantener datos históricos o migrar.

**Prevención:** Documentar cambios en fórmulas.

---

## 📝 Historial de Correcciones

### 2025-11-24: Corrección inicial de datos históricos

- **Usuario afectado:** `85a2d456-a07d-4be9-b9ce-4a46b183a2a0`
- **Intentos corregidos:** 1
- **XP recuperado:** +600 XP (500 → 1100)
- **ML Coins recuperados:** +90 ML Coins (220 → 310)
- **Bug adicional:** Corregida función `promote_to_next_rank()`

**Ver detalles completos:**
- `/apps/database/REPORTE-CORRECCION-XP-ML-COINS-2025-11-24.md`
- `/apps/database/RESUMEN-EJECUTIVO-CORRECCION-XP-2025-11-24.md`

---

## 🔗 Referencias

- **Política DDL-First:** `/orchestration/directivas/DIRECTIVA-POLITICA-CARGA-LIMPIA.md`
- **Traza de tareas:** `/orchestration/trazas/TRAZA-TAREAS-DATABASE.md`
- **Prompt Database-Agent:** `/orchestration/prompts/PROMPT-DATABASE-AGENT.md`

---

## 📞 Contacto

**Mantenido por:** Database-Agent
**Última actualización:** 2025-11-24

Para preguntas o problemas, consultar:
1. Documentación en `/apps/database/docs/`
2. Trazas en `/orchestration/trazas/`
3. Tech Lead del proyecto GAMILIT

---

**FIN DEL README**
