Arquitectura
Discrepancias y puntos por confirmar
Diferencias entre la documentación del repositorio y el código, y datos de arquitectura que deben confirmarse antes del cierre.
Esta sección describe la arquitectura según el código. Cuando un documento del repositorio dice otra cosa, se siguió el código y la diferencia queda anotada aquí.
Documentación frente al código
| Tema | Lo que dice el documento | Lo que hace el código |
|---|---|---|
| Etiquetas de Traefik en producción | README.md: "los labels en docker-compose.yml se detectan automáticamente" en Coolify | Las etiquetas están comentadas a propósito: con Coolify producían dos servicios para el mismo router y un error 502. Coolify genera su propia ruta desde Domains |
| Cabeceras y límite de peticiones | CLAUDE.md presenta moodle-headers (X-Forwarded-Proto) como configuración crítica de Traefik | dynamic/moodle.yml solo se usa en modo standalone. En producción no se aplica; Moodle usa sslproxy y no depende de esa cabecera |
| Servicio RAG | README.md: Python FastAPI + ChromaDB; docker-compose.yml conserva un bloque de ChromaDB comentado | La decisión vigente (docs/roadmap.md, CLAUDE.md) es Dify. rag-service/ está vacío |
Conector local_dify_sync | CLAUDE.md lo muestra en la estructura de plugins/ | No existe |
local_team_management | Plugin de la Fase 3 por desarrollar | Carpeta vacía; la gestión de equipos está implementada en local_deltamodules |
| Pines de plugins | CLAUDE.md (banner) y roadmap_v4_gaps.md G-1: plugins en ramas o en HEAD sin fijar, tarea F1.0 pendiente | El Dockerfile fija core y plugins a commits exactos con git-at; solo local_ai_manager, tiny_ai y block_ai_chat van por etiqueta |
| Versiones de plugins | README.md: MOODLE_405_STABLE, stable, latest, etc. | Commits exactos (ver Plugins y componentes) |
| Lista de plugins | README.md y CLAUDE.md no mencionan webservice_mcp, local_deltamodules, local_deltacerts, quizaccess_deltagate ni los dataformat | Todos están en la imagen |
| Política de contraseñas | README.md: mínimo 10 caracteres "mayúsculas + números" | requireupper = 0: la mayúscula no es obligatoria; sí letras, números y minúsculas |
| MFA | CLAUDE.md lista "MFA (nativo)" como plugin confirmado | Solo se exige a los super administradores |
| Dirección de producción | CLAUDE.md, README.md y .env.example: https://learning.deltamontero.net detrás de Cloudflare | Hoy la Academia se usa en la red interna de la empresa en http://192.168.0.192 (docs/drp.md). La publicación con dominio y Cloudflare está planificada |
| Estructura de cursos | CLAUDE.md: módulos modulo_1 a modulo_7 y Formación Líderes, según academia_dm_contenido.json | La estructura vigente sigue los 12 módulos del Manual (manual-academia.json: m1_induccion_corporativa … m12_clientes_desarrollos), más la Prueba Técnica de Selección y el curso de apoyo de IA. "Formación Complementaria — Líderes" se integró al Módulo 6 |
| Formato del respaldo | README.md: .tar.gz | backup.sh genera .tar con su .sha256 |
| Cron del respaldo | README-backup.md, ejemplo manual con 0 2 * * * | setup-backup.sh convierte la hora de Ecuador a la del servidor (en UTC, 0 7 * * *) |
| Portada sin sesión | Comentario de db/hooks.php: "Portada sin sesión → login" | La portada muestra la página institucional con los tres accesos (landing.php); ya no redirige al login |
| Acceso de postulantes | configure-candidate-access.php: clave de grupo por área y consulta LOPDP como actividad | El flujo vigente es el de local_candidate_enrollment con códigos de acceso; el script anterior sigue en la imagen |
| RAG casero | El plan oficial es Dify | Existen la tabla local_deltamodules_chunks e import-rag-chunks.php (embeddings de Gemini), marcados para no ejecutarse aún |
Discrepancias resueltas
| Tema | Antes | Estado actual del código |
|---|---|---|
| Clave de Groq | CLAUDE.md decía que la clave del chat se toma de la variable de entorno, pero configure-ai-groq.php solo corría a mano: cambiar GROQ_API_KEY en Coolify no actualizaba la clave guardada | moodle-config.sh ejecuta configure-ai-groq.php en cada despliegue (paso critico, antes de las cuotas de IA) cuando GROQ_API_KEY está definida. Cambiar la clave en Coolify y hacer Redeploy basta. Sin la variable se conservan la instancia y la clave guardadas |
| Datos personales y Groq | roadmap_v4.md F6 pide que los datos personales no lleguen al LLM; el agente de acciones enviaba al modelo nombres, correos y cédulas | El agente de acciones reemplaza cédulas (10 dígitos), RUC (13 dígitos) y correos por marcadores (CEDULA_1, RUC_1, correo1@dato.oculto) antes de enviar el mensaje, el historial y los resultados de las herramientas; la tabla de equivalencias vive solo en la sesión y el dato real se restaura dentro de la plataforma. Los nombres sí viajan. El chat informativo general (respuestas sin herramientas) envía el texto tal como se escribe. Ver Inteligencia artificial |
| Proveedores de privacidad | local_deltamodules se declaraba como plugin sin datos personales (null_provider) y local_candidate_enrollment no tenía proveedor | Ambos tienen proveedores de privacidad completos: declaran sus tablas, exportan y borran o desvinculan los datos de una persona desde la herramienta de privacidad de Moodle |
| Huésped de producción | CLAUDE.md y README.md: máquina virtual de Proxmox; docs/drp.md: contenedor de Proxmox | Confirmado: contenedor LXC de Proxmox (172246) con Coolify dentro. TI preparó un segundo contenedor (12030) para la mudanza prevista |
| Datos personales en el código | Cédulas en people::USERNAME_FIXES, contraseñas publicadas en create-second-superadmin.php y listas de personas en scripts de aprovisionamiento | Ya no están en el código actual (assign-users-to-cohorts.php se eliminó). Siguen en el historial de Git: ver Pendientes operativos |
Puntos por confirmar
| Punto | Con quién |
|---|---|
| Sistema operativo y recursos asignados al contenedor de producción (172246) | TI |
Fecha de publicación con el dominio learning.deltamontero.net y Cloudflare (hoy solo red interna) | TI |
Endurecimiento CIS v8 y firewall ufw limitado a Cloudflare (al publicar con dominio) | TI |
| Modo SSL de Cloudflare y origen del certificado del servidor (al publicar con dominio) | TI |
Controles equivalentes a moodle-headers y moodle-ratelimit en Coolify o Cloudflare | TI |
Resolvedor de certificados TLS en el modo standalone (no está en traefik.yml) | Desarrollo |
Zona horaria del sistema operativo de los contenedores (no se define TZ) | Desarrollo |
| Sincronización NTP del nodo Proxmox (reloj adelantado el 2026-10-06) | TI |
| Orden de ejecución de los scripts de aprovisionamiento en una instalación desde cero | Desarrollo |
| Qué videos están en Cloudflare R2, cómo se insertan y migración de la cuenta a la empresa | Desarrollo y TI |
| Destino de la copia externa cifrada de los respaldos | TI |
| Snapshot de Proxmox y gestor de contraseñas para las variables de entorno | TI |
Servicio de la app móvil (enablemobilewebservice) y su alcance | Desarrollo |
| Texto final del aviso de datos del postulante y revisión legal de la frontera de datos con Groq (LOPDP; los nombres y el chat general sí llegan al proveedor) | Talento Humano y asesoría legal |
| Política de retención de datos personales (fuera del registro de correos, que guarda 180 días) | Talento Humano y asesoría legal |
| Protocolo de integración con PowerBuilder | TI |
| Relación entre el RAG casero preparado y el plan con Dify | Desarrollo |
El estado general del proyecto y sus riesgos están en El proyecto; los pendientes de operación, en Operación.