# RF-SYS-002: Feature Flags (Banderas de Funcionalidad)

**ID:** RF-SYS-002
**Título:** Sistema de Feature Flags
**Prioridad:** Alta
**Estado:** ✅ Implementado
**Fase:** 1 - Alcance Inicial
**Épica:** EAI-006 - Configuración del Sistema

---

## 📋 Descripción

Sistema de feature flags para activar/desactivar funcionalidades de forma dinámica sin necesidad de redesplegar código, permitiendo rollouts graduales y A/B testing.

---

## 🎯 Objetivos

1. Habilitar/deshabilitar features sin redesplegar
2. Rollouts graduales (porcentaje de usuarios)
3. Targeting por roles, usuarios específicos o condiciones
4. Programar activación/desactivación de features
5. Soportar multi-tenancy

---

## 📊 Requerimientos Funcionales

### REQ-001: Activación/Desactivación Dinámica

**Como** Product Owner
**Quiero** activar/desactivar features sin redesplegar
**Para** controlar el lanzamiento de funcionalidades

**Criterios:**
- ✅ Flag `is_enabled` controla si feature está activa
- ✅ Cambios se aplican inmediatamente (sin reinicio)
- ✅ API para consultar estado de feature

### REQ-002: Rollout Gradual

**Como** Product Owner
**Quiero** activar features para un porcentaje de usuarios
**Para** hacer lanzamientos graduales y seguros

**Criterios:**
- ✅ `rollout_percentage` (0-100%)
- ✅ Distribución aleatoria consistente por usuario
- ✅ Incremento gradual del porcentaje

### REQ-003: Targeting por Usuarios/Roles

**Como** Product Owner
**Quiero** activar features para usuarios o roles específicos
**Para** hacer beta testing o features exclusivas

**Criterios:**
- ✅ `target_users` - Array de UUIDs de usuarios
- ✅ `target_roles` - Array de roles (student, admin_teacher, super_admin)
- ✅ `target_conditions` - JSONB para condiciones complejas

### REQ-004: Programación Temporal

**Como** Product Owner
**Quiero** programar cuándo se activa/desactiva una feature
**Para** lanzamientos coordinados

**Criterios:**
- ✅ `starts_at` - Fecha de inicio
- ✅ `ends_at` - Fecha de fin
- ✅ Feature solo activa entre estas fechas

---

## 🔧 Tabla: `system_configuration.feature_flags`

**Columnas:**
- `id` - UUID (PK)
- `tenant_id` - UUID (nullable)
- `feature_name` - TEXT (nombre descriptivo)
- `feature_key` - TEXT (UNIQUE, clave técnica)
- `description` - TEXT
- `is_enabled` - BOOLEAN
- `rollout_percentage` - INTEGER (0-100)
- `target_users` - UUID[]
- `target_roles` - gamilit_role[]
- `target_conditions` - JSONB
- `starts_at` - TIMESTAMPTZ
- `ends_at` - TIMESTAMPTZ

---

## 📝 Ejemplo de Uso

```json
{
  "feature_key": "new_exercise_mechanic_matching",
  "feature_name": "Nueva Mecánica: Matching Avanzado",
  "description": "Mecánica de ejercicios de matching con drag & drop mejorado",
  "is_enabled": true,
  "rollout_percentage": 25,
  "target_roles": ["admin_teacher"],
  "starts_at": "2025-11-15T00:00:00Z",
  "ends_at": null
}
```

---

## 🔗 Referencias

- **Especificación Técnica:** [ET-SYS-001](../especificaciones/ET-SYS-001-database-schema.md)
- **Implementación:** apps/database/ddl/schemas/system_configuration/tables/02-feature_flags.sql

---

**Creado:** 2025-11-08
**Estado:** ✅ Implementado
