- Configure workspace Git repository with comprehensive .gitignore - Add Odoo as submodule for ERP reference code - Include documentation: SETUP.md, GIT-STRUCTURE.md - Add gitignore templates for projects (backend, frontend, database) - Structure supports independent repos per project/subproject level Workspace includes: - core/ - Reusable patterns, modules, orchestration system - projects/ - Active projects (erp-suite, gamilit, trading-platform, etc.) - knowledge-base/ - Reference code and patterns (includes Odoo submodule) - devtools/ - Development tools and templates - customers/ - Client implementations template 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
21 KiB
GAP-011: Validación Exhaustiva de Configuración API - Reporte Final
ID: GAP-011-VALIDATION Categoría: Arquitectura - Validación Post-Migración Fecha: 2025-11-24 Analista: Architecture-Analyst Estado: ⚠️ COMPLETADO CON HALLAZGOS CRÍTICOS
📋 RESUMEN EJECUTIVO
Objetivo
Validar exhaustivamente que las soluciones implementadas para corregir URLs duplicadas (/v1/v1/) son permanentes, no hardcoded, y no se repiten en ningún otro lugar del código.
Metodología
Validación sistemática en 6 dimensiones:
- URLs hardcoded con
/v1/en código activo - Validez de todos los
API_ENDPOINTSreferenciados - Imports del viejo
apiConfigen código activo - Patrones de construcción manual de URLs
- Coherencia entre rutas frontend y backend
- Documentación de hallazgos
Resultado General
✅ FIXES INICIALES EXITOSOS - Los dos problemas reportados (gamificationAPI.ts y educationalAPI.ts) están correctamente resueltos y no se repiten.
⚠️ HALLAZGOS CRÍTICOS ADICIONALES - Se encontraron múltiples endpoints referenciados en el código que NO existen en la configuración centralizada, lo que causará errores en runtime.
🔍 VALIDACIÓN 1: URLs Hardcoded con /v1/
Búsqueda Ejecutada
grep -rn "/v1/" --include="*.ts" --include="*.tsx" apps/frontend/src
Resultados
- Total de archivos analizados: 757 TypeScript files
- Archivos con
/v1/encontrados: 2 archivos
Detalle de Hallazgos
✅ ACEPTABLE: Archivo Deprecado
Archivo: src/services/api/apiConfig.deprecated.ts
Razón: Archivo deprecado correctamente, con warning comment referenciando GAP-011.
✅ ACEPTABLE: Tipos Generados
Archivo: src/generated/api-types.ts
Razón: Auto-generado desde Swagger del backend, incluye /v1/ en ejemplos de URLs.
Conclusión ✅
VALIDACIÓN PASADA - No existen URLs hardcoded con /v1/ en código activo que puedan causar duplicación.
🔍 VALIDACIÓN 2: Validez de API_ENDPOINTS
Búsqueda Ejecutada
grep -rn "API_ENDPOINTS\.(auth|gamification|educational|progress|economy|social|notifications|admin|teacher|student|health)\." \
--include="*.ts" --include="*.tsx" apps/frontend/src
Resultados
- Usos de API_ENDPOINTS encontrados: 107+ referencias
- Archivos afectados: 15 archivos
⚠️ CRÍTICO: Endpoints No Existentes en Config
Namespace educational - 9 endpoints NO existen
| Endpoint Usado | Archivo | Línea | Existe en Config |
|---|---|---|---|
API_ENDPOINTS.educational.moduleAccess(moduleId) |
educationalAPI.ts | 330 | ❌ NO |
API_ENDPOINTS.educational.moduleExercises(moduleId) |
educationalAPI.ts | 434 | ❌ NO |
API_ENDPOINTS.educational.userProgress(userId) |
educationalAPI.ts | 644 | ❌ NO (debe ser progress.userProgress) |
API_ENDPOINTS.educational.moduleProgress(userId, moduleId) |
educationalAPI.ts | 678 | ❌ NO (debe ser progress.moduleProgress) |
API_ENDPOINTS.educational.userDashboard(userId) |
educationalAPI.ts | 711 | ❌ NO |
API_ENDPOINTS.educational.exerciseAttempts(userId) |
educationalAPI.ts | 748 | ❌ NO |
API_ENDPOINTS.educational.userAnalytics(userId) |
educationalAPI.ts | 792 | ❌ NO |
API_ENDPOINTS.educational.activityStats(userId) |
educationalAPI.ts | 876 | ❌ NO |
API_ENDPOINTS.educational.activitiesByType(userId, type) |
educationalAPI.ts | 909 | ❌ NO |
Namespace admin - Estructura Anidada No Existe
Problema: El código espera sub-namespaces como API_ENDPOINTS.admin.organizations.list, pero el config tiene estructura plana como API_ENDPOINTS.admin.organizations (string).
Endpoints problemáticos en adminAPI.ts:
// ❌ NO EXISTEN (nested structure)
API_ENDPOINTS.admin.organizations.list
API_ENDPOINTS.admin.organizations.get(id)
API_ENDPOINTS.admin.organizations.create
API_ENDPOINTS.admin.organizations.update(id)
API_ENDPOINTS.admin.organizations.delete(id)
API_ENDPOINTS.admin.organizations.users(id)
API_ENDPOINTS.admin.organizations.updateSubscription(id)
API_ENDPOINTS.admin.organizations.updateFeatures(id)
API_ENDPOINTS.admin.approvals.pending
API_ENDPOINTS.admin.approvals.approve(id)
API_ENDPOINTS.admin.approvals.reject(id)
API_ENDPOINTS.admin.approvals.history
API_ENDPOINTS.admin.content.mediaLibrary
API_ENDPOINTS.admin.content.deleteMedia(id)
API_ENDPOINTS.admin.content.createVersion
API_ENDPOINTS.admin.users.list
API_ENDPOINTS.admin.users.get(id)
API_ENDPOINTS.admin.users.update(id)
API_ENDPOINTS.admin.users.delete(id)
API_ENDPOINTS.admin.users.activate(id)
API_ENDPOINTS.admin.users.deactivate(id)
API_ENDPOINTS.admin.users.suspend(id)
API_ENDPOINTS.admin.users.unsuspend(id)
API_ENDPOINTS.admin.roles.list
API_ENDPOINTS.admin.roles.permissions(roleId)
API_ENDPOINTS.admin.roles.updatePermissions(roleId)
API_ENDPOINTS.admin.roles.availablePermissions
API_ENDPOINTS.admin.gamification.settings
API_ENDPOINTS.admin.gamification.updateSettings
API_ENDPOINTS.admin.gamification.previewChanges
API_ENDPOINTS.admin.gamification.restoreDefaults
API_ENDPOINTS.admin.system.health
API_ENDPOINTS.admin.system.metrics
API_ENDPOINTS.admin.system.logs
API_ENDPOINTS.admin.system.maintenance
API_ENDPOINTS.admin.system.config
API_ENDPOINTS.admin.system.configCategories
API_ENDPOINTS.admin.system.categoryConfig(category)
API_ENDPOINTS.admin.system.validateConfig
API_ENDPOINTS.admin.reports.generate
API_ENDPOINTS.admin.reports.list
API_ENDPOINTS.admin.reports.download(reportId)
API_ENDPOINTS.admin.reports.delete(reportId)
API_ENDPOINTS.admin.reports.schedule(reportId)
// ✅ LO QUE EXISTE EN CONFIG (flat structure)
API_ENDPOINTS.admin.organizations // string: '/admin/organizations'
API_ENDPOINTS.admin.users // string: '/admin/users'
API_ENDPOINTS.admin.gamificationConfig // string: '/admin/gamification/config'
// ...etc
Namespace teacher - Estructura Anidada No Existe
Endpoints problemáticos en teacherApi.ts:
// ❌ NO EXISTEN (nested structure)
API_ENDPOINTS.teacher.dashboard.stats
API_ENDPOINTS.teacher.dashboard.activities
API_ENDPOINTS.teacher.dashboard.alerts
API_ENDPOINTS.teacher.dashboard.topPerformers
API_ENDPOINTS.teacher.dashboard.moduleProgress
API_ENDPOINTS.teacher.analytics
API_ENDPOINTS.teacher.engagementMetrics
API_ENDPOINTS.teacher.generateReport
API_ENDPOINTS.teacher.reportStatus(reportId)
API_ENDPOINTS.teacher.studentInsights(studentId)
API_ENDPOINTS.teacher.classroomStudents(classroomId)
API_ENDPOINTS.teacher.classroomStats(classroomId)
API_ENDPOINTS.teacher.createClassroom
API_ENDPOINTS.teacher.updateClassroom(id)
API_ENDPOINTS.teacher.deleteClassroom(id)
API_ENDPOINTS.teacher.assignment(assignmentId)
API_ENDPOINTS.teacher.createAssignment
API_ENDPOINTS.teacher.updateAssignment(assignmentId)
API_ENDPOINTS.teacher.deleteAssignment(assignmentId)
API_ENDPOINTS.teacher.assignmentSubmissions(assignmentId)
API_ENDPOINTS.teacher.submission(submissionId)
API_ENDPOINTS.teacher.gradeSubmission(submissionId)
// ✅ LO QUE EXISTE EN CONFIG (flat structure)
API_ENDPOINTS.teacher.dashboard // string: '/teacher/dashboard'
API_ENDPOINTS.teacher.classrooms // string: '/teacher/classrooms'
API_ENDPOINTS.teacher.classroom(id) // function: (id) => `/teacher/classrooms/${id}`
API_ENDPOINTS.teacher.assignments // string: '/teacher/assignments'
// ...etc
Impacto
🔴 CRÍTICO - Estos endpoints causarán errores en runtime:
TypeError: API_ENDPOINTS.admin.organizations.list is not a functionTypeError: Cannot read property 'list' of undefined
Archivos Afectados
src/services/api/educationalAPI.ts- 9 endpoints incorrectossrc/services/api/adminAPI.ts- ~50 endpoints incorrectossrc/services/api/teacher/analyticsApi.ts- 5 endpoints incorrectossrc/services/api/teacher/classroomsApi.ts- 7 endpoints incorrectossrc/services/api/teacher/assignmentsApi.ts- 8 endpoints incorrectossrc/services/api/teacher/teacherApi.ts- 5 endpoints incorrectossrc/apps/admin/hooks/useContentManagement.ts- 3 endpoints incorrectossrc/features/admin/api/adminAPI.ts- 2 endpoints incorrectos
Conclusión ⚠️
VALIDACIÓN FALLIDA - Existen múltiples endpoints referenciados que NO existen en el config centralizado.
🔍 VALIDACIÓN 3: Imports del Viejo apiConfig
Búsqueda Ejecutada
# Búsqueda 1: Imports relativos
grep -rn "from '\./apiConfig'" --include="*.ts" --include="*.tsx" apps/frontend/src
grep -rn 'from "\./apiConfig"' --include="*.ts" --include="*.tsx" apps/frontend/src
grep -rn "from '\.\.\/apiConfig'" --include="*.ts" --include="*.tsx" apps/frontend/src
# Búsqueda 2: Imports absolutos
grep -rn "from '@/services/api/apiConfig'" --include="*.ts" --include="*.tsx" apps/frontend/src
Resultados
- Archivos encontrados con imports viejos: 0 archivos (excluyendo
.deprecated.ts)
Conclusión ✅
VALIDACIÓN PASADA - No existen imports del viejo apiConfig en código activo.
🔍 VALIDACIÓN 4: Patrones de URLs Construidas Manualmente
Búsqueda Ejecutada
grep -rn "apiClient\.(get|post|put|delete|patch)\(\`[^\`]+\$\{" \
--include="*.ts" --include="*.tsx" apps/frontend/src
Resultados
- Instancias encontradas: 68 llamadas con URLs en template literals
- Patrón encontrado: Todas usan URLs relativas SIN
/v1/prefix
Ejemplos Validados (✅ CORRECTOS)
// ✅ CORRECTO - Sin /v1/ prefix
apiClient.get(`/gamification/users/${userId}/stats`)
apiClient.get(`/progress/users/${userId}`)
apiClient.get(`/educational/modules/${id}`)
apiClient.post(`/auth/logout`)
apiClient.patch(`/notifications/${notificationId}/read`)
apiClient.get(`/gamification/ranks/user/${userId}`)
apiClient.get(`/gamification/leaderboard/user/${userId}/position`)
Archivos con URLs Hardcoded (todos ✅ CORRECTOS)
src/hooks/useAchievements.ts- 3 URLs (✅ sin /v1/)src/services/NotificationService.ts- 1 URL (✅ sin /v1/)src/lib/api/progress.api.ts- 11 URLs (✅ sin /v1/)src/lib/api/educational.api.ts- 3 URLs (✅ sin /v1/)src/apps/student/hooks/useGamificationData.ts- 5 URLs (✅ sin /v1/)src/apps/student/hooks/useDashboardData.ts- 4 URLs (✅ sin /v1/)src/services/api/notificationsAPI.ts- 3 URLs (✅ sin /v1/)src/services/api/missionsAPI.ts- 3 URLs (✅ sin /v1/)src/services/api/admin/gamificationConfigApi.ts- 2 URLs (✅ sin /v1/)src/services/api/admin/classroomTeacherApi.ts- 5 URLs (✅ sin /v1/)src/services/api/profileAPI.ts- 4 URLs (✅ sin /v1/)src/features/gamification/missions/hooks/useMissions.ts- 3 URLs (✅ sin /v1/)src/apps/admin/hooks/useContentManagement.ts- 3 URLs (✅ sin /v1/)src/apps/admin/hooks/useUserManagement.ts- 1 URL (✅ sin /v1/)src/apps/admin/hooks/useAdminData.ts- 2 URLs (✅ sin /v1/)src/apps/admin/hooks/useSystemMonitoring.ts- 1 URL (✅ sin /v1/)src/apps/teacher/hooks/useStudentMonitoring.ts- 3 URLs (✅ sin /v1/)src/apps/teacher/hooks/useClassroomData.ts- 2 URLs (✅ sin /v1/)
Conclusión ✅
VALIDACIÓN PASADA - Todas las URLs construidas manualmente usan el patrón correcto sin /v1/ prefix.
🔍 VALIDACIÓN 5: Coherencia Frontend ↔ Backend
Metodología
Comparación entre:
- Frontend:
apps/frontend/src/config/api.config.ts(API_ENDPOINTS) - Backend:
apps/backend/src/shared/constants/routes.constants.ts(API_ROUTES)
Análisis de Coherencia
✅ Namespaces Alineados Correctamente
| Namespace | Frontend | Backend | Estado |
|---|---|---|---|
auth |
✅ 8 endpoints | ✅ 8 routes | ✅ MATCH |
gamification (core) |
✅ 8 endpoints | ✅ 20+ routes | ⚠️ Parcial (backend más completo) |
educational |
✅ 7 endpoints | ✅ 16+ routes | ⚠️ Parcial (backend más completo) |
progress |
✅ 5 endpoints | ✅ 50+ routes | ⚠️ Parcial (backend MUY más completo) |
notifications |
✅ 5 endpoints | ✅ 13 routes | ⚠️ Parcial (backend más completo) |
health |
✅ 2 endpoints | ✅ 4 routes | ⚠️ Parcial |
⚠️ Namespaces con Desalineación Significativa
Admin Namespace:
- Frontend config: Estructura plana simple (10 endpoints)
admin: { dashboard: '/admin/dashboard', users: '/admin/users', organizations: '/admin/organizations', // ...etc } - Backend routes: Estructura detallada (25+ endpoints)
ADMIN: { DASHBOARD: '/admin/dashboard', ORGANIZATIONS: '/admin/organizations', ORGANIZATION_BY_ID: (id) => `/admin/organizations/${id}`, ORGANIZATION_FEATURES: (id) => `/admin/organizations/${id}/features`, ORGANIZATION_SUBSCRIPTION: (id) => `/admin/organizations/${id}/subscription`, // ...etc } - Impacto: Frontend
adminAPI.tsespera estructura anidada que no existe en config
Teacher Namespace:
- Frontend config: Estructura plana simple (8 endpoints)
- Backend routes: Estructura más detallada (12 endpoints)
- Impacto: Frontend teacher APIs esperan más endpoints que los definidos
Missing Endpoints (Backend existe, Frontend NO)
Progress Module (Backend tiene 50+, Frontend tiene 5)
exerciseProgress(userId, exerciseId)- ❌ NO en frontend- Sessions (10+ endpoints) - ❌ NO en frontend
- Attempts (10+ endpoints) - ❌ NO en frontend
- Submissions (10+ endpoints) - ❌ NO en frontend
- Scheduled Missions (8+ endpoints) - ❌ NO en frontend
Educational Module (Backend tiene 16+, Frontend tiene 7)
moduleExercises(moduleId)- ❌ NO en frontend (usado en código!)exerciseSubmit(id)- ❌ NO en frontendexerciseValidate(id)- ❌ NO en frontendexerciseHints(id)- ❌ NO en frontend- Media resources (3 endpoints) - ❌ NO en frontend
- Assessment rubrics (2 endpoints) - ❌ NO en frontend
Gamification Module (Backend tiene 20+, Frontend tiene 8)
- Missions (4 endpoints) - ❌ NO en frontend (usado en código!)
- Comodines/Power-ups (3 endpoints) - ❌ NO en frontend
- Rank history - ❌ NO en frontend
- ML Coins transactions - ❌ NO en frontend
Conclusión ⚠️
DESALINEACIÓN SIGNIFICATIVA - El frontend config está incompleto comparado con las rutas reales del backend.
📊 ESTADÍSTICAS GENERALES
Scope de Análisis
- Total de archivos TypeScript: 757 files
- Archivos analizados en detalle: 30+ archivos API
- Líneas de código inspeccionadas: ~5,000+ LOC
- Patrones de búsqueda ejecutados: 8 patterns diferentes
Resultados por Validación
| # | Validación | Estado | Archivos Afectados |
|---|---|---|---|
| 1 | URLs hardcoded /v1/ |
✅ PASADA | 0 (2 aceptables) |
| 2 | Validez API_ENDPOINTS | ⚠️ FALLIDA | 8 archivos |
| 3 | Imports viejo config | ✅ PASADA | 0 archivos |
| 4 | URLs construidas manualmente | ✅ PASADA | 18 archivos (correctos) |
| 5 | Coherencia frontend↔backend | ⚠️ PARCIAL | N/A |
Hallazgos Críticos
🔴 CRÍTICO (Runtime Errors):
- 80+ endpoints referenciados que NO existen en config
- Estructura anidada esperada pero no definida (
admin.*.*,teacher.*.*)
🟡 ALTO (Funcionalidad Incompleta):
- Frontend config tiene ~50 endpoints menos que backend routes
- Muchos módulos (Progress, Educational, Gamification) parcialmente mapeados
🟢 BAJO (Mantenibilidad):
- 68 URLs hardcoded en template literals (patrón correcto pero no usa config)
✅ RESPUESTA A SOLICITUD DEL USUARIO
Pregunta del Usuario
"Puedes validar que son soluciones permanentes, que no esta hardcodeado y ya fue una solución definitiva y que no se repite en cualquier otro lado"
Respuesta: ✅ SÍ para los Fixes Originales
Para los 2 problemas reportados originalmente:
-
gamificationAPI.ts - duplicación
/v1/v1/:- ✅ Solución PERMANENTE: URL ahora usa
/gamification/users/${userId}/summary(sin /v1/) - ✅ NO hardcoded: Usa
apiClientcon baseURL del config centralizado - ✅ NO se repite: Validación exhaustiva confirma que NO hay más casos de
/v1/hardcoded
- ✅ Solución PERMANENTE: URL ahora usa
-
educationalAPI.ts -
userActivitiesno existe:- ✅ Solución PERMANENTE: Cambiado a
API_ENDPOINTS.progress.recentActivities(userId) - ✅ NO hardcoded: Usa endpoint del config centralizado
- ✅ NO se repite: Endpoint
progress.recentActivitiesexiste y está correctamente definido
- ✅ Solución PERMANENTE: Cambiado a
⚠️ PERO: Hallazgos Adicionales Críticos
La validación exhaustiva reveló 80+ endpoints adicionales con el mismo tipo de problema (referenciados pero no existen en config), que causarán errores similares cuando esas funcionalidades sean usadas.
🎯 RECOMENDACIONES
1. URGENTE: Completar API_ENDPOINTS Config
Prioridad: 🔴 CRÍTICA
Acción: Agregar todos los endpoints faltantes a /config/api.config.ts:
// Ejemplo: Admin namespace completo
admin: {
// Dashboard
dashboard: '/admin/dashboard',
analytics: '/admin/analytics',
reports: '/admin/reports',
settings: '/admin/settings',
// Organizations (nested structure)
organizations: '/admin/organizations',
organization: (id: string) => `/admin/organizations/${id}`,
organizationFeatures: (id: string) => `/admin/organizations/${id}/features`,
organizationSubscription: (id: string) => `/admin/organizations/${id}/subscription`,
organizationUsers: (id: string) => `/admin/organizations/${id}/users`,
// Users management
users: '/admin/users',
user: (id: string) => `/admin/users/${id}`,
userRoles: (id: string) => `/admin/users/${id}/roles`,
userPermissions: (id: string) => `/admin/users/${id}/permissions`,
// Classrooms
classrooms: '/admin/classrooms',
classroom: (id: string) => `/admin/classrooms/${id}`,
classroomTeachers: (classroomId: string) => `/admin/classrooms/${classroomId}/teachers`,
// Gamification config
gamificationConfig: '/admin/gamification/config',
gamificationParameters: '/admin/gamification/config/parameters',
gamificationParameter: (key: string) => `/admin/gamification/config/parameters/${key}`,
gamificationMayaRanks: '/admin/gamification/config/maya-ranks',
gamificationMayaRank: (id: string) => `/admin/gamification/config/maya-ranks/${id}`,
}
Archivos a actualizar:
/config/api.config.ts- Agregar ~50 endpoints faltantes
2. MEDIO: Refactorizar APIs para Usar Config
Prioridad: 🟡 ALTA
Acción: Reemplazar URLs hardcoded por referencias a API_ENDPOINTS:
// ❌ ANTES (hardcoded)
const response = await apiClient.get(`/gamification/users/${userId}/stats`);
// ✅ DESPUÉS (usa config)
const response = await apiClient.get(API_ENDPOINTS.gamification.userStats(userId));
Archivos a refactorizar (18 archivos):
src/hooks/useAchievements.tssrc/lib/api/progress.api.tssrc/lib/api/educational.api.tssrc/apps/student/hooks/useGamificationData.tssrc/apps/student/hooks/useDashboardData.ts- (ver lista completa en Validación 4)
3. LARGO PLAZO: Automatizar Validación
Prioridad: 🟢 MEDIA
Acción: Crear script de validación en CI/CD:
# Ejemplo: scripts/validate-api-endpoints.ts
# - Lee API_ENDPOINTS del frontend
# - Lee API_ROUTES del backend
# - Compara y reporta diferencias
# - Falla build si hay inconsistencias
4. DOCUMENTACIÓN: Actualizar ADR-015
Prioridad: 🟢 BAJA
Acción: Documentar hallazgos en ADR-015:
- Endpoints faltantes descubiertos
- Plan de completitud
- Lecciones aprendidas de GAP-011
📝 CONCLUSIÓN FINAL
Para el Usuario ✅
Los 2 fixes reportados son PERMANENTES y NO se repiten:
- ✅ gamificationAPI.ts - duplicación
/v1/v1/corregida permanentemente - ✅ educationalAPI.ts - endpoint
userActivitiescorregido permanentemente
No existen más URLs con /v1/ hardcoded en código activo.
Para el Proyecto ⚠️
Se descubrieron problemas estructurales más profundos:
- 80+ endpoints referenciados que NO existen en config centralizado
- Config frontend significativamente incompleto vs backend routes
- 18 archivos usando URLs hardcoded (patrón correcto pero no centralizado)
Estos problemas NO afectan las funcionalidades actualmente usadas por el usuario recién registrado, pero causarán errores cuando se intenten usar features de Admin/Teacher que dependen de esos endpoints.
Siguiente Paso Sugerido
🔴 RECOMENDACIÓN URGENTE: Completar el archivo /config/api.config.ts con todos los endpoints faltantes antes de que usuarios intenten usar funcionalidades Admin/Teacher, para evitar errores en producción.
🔗 REFERENCIAS
- GAP-011 Analysis:
/docs/90-transversal/GAP-011-API-CONFIG-MIGRATION-ANALYSIS.md - ADR-015:
/docs/97-adr/ADR-015-centralized-api-routes-configuration.md - Frontend Config:
/apps/frontend/src/config/api.config.ts - Backend Routes:
/apps/backend/src/shared/constants/routes.constants.ts - Traza Arquitectura:
/orchestration/trazas/TRAZA-ANALISIS-ARQUITECTURA.md
Reporte generado: 2025-11-24 Revisión: v1.0.0 Analista: Architecture-Analyst Agent