Fase 5 completada (21/21 correcciones ejecutadas): P2-001: Documentar Social API (10 controllers, 106 endpoints) P2-002: Documentar componentes Frontend (497 componentes, 103 hooks) P2-003: Actualizar FRONTEND_INVENTORY.yml a v4.0 P2-004: Documentar views Database (17 views en 7 schemas) P2-005: Documentar rutas duplicadas Auth (requiere refactor) P2-006: Documentar código muerto Teacher (requiere refactor) Archivos creados: - docs/90-transversal/api/API-SOCIAL-MODULE.md - docs/frontend/COMPONENTES-INVENTARIO.md - docs/database/VIEWS-INVENTARIO.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1292 lines
48 KiB
YAML
1292 lines
48 KiB
YAML
# FRONTEND_INVENTORY.yml - Inventario Consolidado Global
|
|
|
|
project: GAMILIT
|
|
version: 4.0
|
|
generated: 2025-11-08
|
|
updated: 2025-12-26
|
|
source: Inventario Real del Frontend Implementado + Auditoria Documentacion vs Desarrollo 2025-12-23/26
|
|
status: Actualizado con auditoria completa de componentes, hooks y mecanicas
|
|
last_analysis: 2025-12-26 - Auditoria documentacion vs desarrollo - metricas reales verificadas
|
|
|
|
# ============================================================================
|
|
# RESUMEN EJECUTIVO
|
|
# ============================================================================
|
|
|
|
summary:
|
|
total_files: 900+ # ✅ Actualizado 2025-12-26 - auditoria real
|
|
total_components: 497 # ✅ ACTUALIZADO 2025-12-26 - auditoria: shared(40) + features(31) + gamification(71) + mechanics(156) + apps(180) + otros(19)
|
|
total_hooks: 103 # ✅ ACTUALIZADO 2025-12-26 - auditoria: shared(12) + apps(57) + features(32) + root(2)
|
|
total_features: 10
|
|
total_pages: 64 # ✅ ACTUALIZADO 2025-12-26 - auditoria real (Student 24 + Teacher 13 + Admin 27)
|
|
total_stores: 11
|
|
total_api_services: 15 # Sin cambios (usa apiClient existente)
|
|
total_mechanics: 30 # ✅ ACTUALIZADO 2025-12-26 - 23 oficiales + 3 extras + 4 auxiliares
|
|
total_routes: 20 # ✅ ACTUALIZADO 2025-11-29
|
|
lines_of_code: ~100000 # ✅ ACTUALIZADO 2025-12-26
|
|
|
|
changes_from_v3_0:
|
|
mechanics_implemented: 8 # 5 M4 + 3 M5
|
|
components_created: 6 # MediaUploader, RubricEvaluator, ReviewPanelPage, ReviewList, ReviewDetail, etc.
|
|
hooks_created: 2 # useVideoRecorder, useAudioRecorder
|
|
pages_created: 1 # ReviewPanelPage (teacher portal)
|
|
total_loc_added: ~3000
|
|
epic: EXT-003
|
|
user_story: US-M4M5-001
|
|
note: "Implementación completa de mecánicas creativas M4-M5 con sistema de revisión manual y carga multimedia"
|
|
files_created:
|
|
- apps/frontend/src/shared/components/mechanics/MediaUploader.tsx
|
|
- apps/frontend/src/shared/components/mechanics/RubricEvaluator.tsx
|
|
- apps/frontend/src/shared/hooks/useVideoRecorder.ts
|
|
- apps/frontend/src/shared/hooks/useAudioRecorder.ts
|
|
- apps/frontend/src/apps/teacher/pages/ReviewPanel/ReviewPanelPage.tsx
|
|
- apps/frontend/src/apps/teacher/pages/ReviewPanel/ReviewList.tsx
|
|
- apps/frontend/src/apps/teacher/pages/ReviewPanel/ReviewDetail.tsx
|
|
- "... + 8 mecánicas M4/M5 completas"
|
|
|
|
changes_from_v2_9:
|
|
pages_created: 1 # AdminAssignmentsPage.tsx (289 LOC)
|
|
hooks_created: 1 # useAdminAssignments.ts (292 LOC)
|
|
components_created: 4 # AssignmentsTable, AssignmentDetailModal, AssignmentFilters, index
|
|
routes_added: 1 # /admin/assignments (super_admin only)
|
|
total_loc_added: 1258
|
|
epic: EXT-002
|
|
user_story: US-AE-009
|
|
note: "US-AE-009: Admin Assignments View - Visualización completa de tareas para super_admin con filtros, paginación y detalle"
|
|
files_created:
|
|
- apps/frontend/src/apps/admin/pages/AdminAssignmentsPage.tsx
|
|
- apps/frontend/src/apps/admin/hooks/useAdminAssignments.ts
|
|
- apps/frontend/src/apps/admin/components/assignments/AssignmentsTable.tsx
|
|
- apps/frontend/src/apps/admin/components/assignments/AssignmentDetailModal.tsx
|
|
- apps/frontend/src/apps/admin/components/assignments/AssignmentFilters.tsx
|
|
- apps/frontend/src/apps/admin/components/assignments/index.ts
|
|
|
|
changes_from_v2_8:
|
|
files_deleted: 4 # EvidenceBoard.tsx, MagnifyingGlass.tsx, AIHintSystem.tsx, detectiveTextualAPI.ts
|
|
files_rewritten: 4 # detectiveTextualTypes.ts, detectiveTextualSchemas.ts, detectiveTextualMockData.ts, DetectiveTextualExercise.tsx
|
|
components_removed: 3 # EvidenceBoard, MagnifyingGlass, AIHintSystem
|
|
api_services_removed: 1 # detectiveTextualAPI (reemplazado por progressAPI)
|
|
mechanic_restored: "DetectiveTextual (Módulo 2.1)"
|
|
note: "FE-106: Restauración de mecánica Detective Textual a selección múltiple según Documento de Diseño"
|
|
|
|
changes_from_v2_7:
|
|
pages_created: 1 # TeacherExerciseResponsesPage
|
|
pages_improved: 9 # Dashboard, Progress, Students, Analytics, Alerts, Monitoring, Classes, Assignments, Gamification
|
|
pages_scoped: 3 # Reports, Analytics, Gamification (sin ML predictions)
|
|
pages_discarded: 3 # Resources, Communication, Content
|
|
components_created: 15 # ResponsesTable, ResponseDetailModal, etc.
|
|
hooks_created: 1 # useExerciseResponses
|
|
api_services_created: 1 # exerciseResponsesApi
|
|
note: "TEACHER-PORTAL-001: Desarrollo completo del Portal Teacher con nueva página de respuestas"
|
|
|
|
changes_from_v2_6:
|
|
types_updated: 4 # adminTypes.ts, progress.types.ts, leaderboard.types.ts, enums.constants.ts
|
|
fields_added: 15 # +15 campos en adminTypes.ts (gamificación, submissions)
|
|
enum_states_added: 2 # NEEDS_REVIEW, ABANDONED en ProgressStatus
|
|
typo_fixed: 1 # KUKUKULKAN → KUKULKAN
|
|
files_modified: 8 # 5 archivos typo + 2 types + 1 formatters
|
|
note: "ARCH-STU-ADM-001: Corrección integración Student↔Admin Portal"
|
|
|
|
changes_from_v2_5:
|
|
total_files: +15 # +12 teacher portal + 2 types + 1 config
|
|
total_components: +4
|
|
total_hooks: +4
|
|
total_api_services: +4
|
|
coherence_fixes: 1 # FE-101: Alert interface collision
|
|
note: "Coherence Analysis: Alert → SystemAlert/StudentInterventionAlert renaming"
|
|
|
|
changes_from_v2_4:
|
|
total_files: +12
|
|
total_components: +4
|
|
total_hooks: +4
|
|
total_api_services: +4
|
|
note: "Teacher Portal Enhancement - GAPs T002, T003, T004, T005 resueltos"
|
|
|
|
changes_from_v2_2:
|
|
total_files: +20
|
|
total_components: +4
|
|
total_pages: +15
|
|
total_routes: +15
|
|
note: "Implementadas 15 rutas que estaban como TODO, agregadas páginas auth, corregidos usuarios hardcodeados"
|
|
|
|
stack:
|
|
framework: React 19.2.0
|
|
build_tool: Vite 7.1.10
|
|
language: TypeScript 5.9.3
|
|
state_management: Zustand 5.0.8
|
|
routing: React Router DOM 7.9.4
|
|
styling: TailwindCSS 4.1.14
|
|
forms: React Hook Form 7.65.0
|
|
validation: Zod 4.1.12
|
|
http_client: Axios 1.12.2
|
|
websocket: Socket.io Client 4.8.1
|
|
icons: Lucide React 0.545.0
|
|
animations: Framer Motion 12.23.24
|
|
charts: Recharts 3.3.0
|
|
|
|
# ============================================================================
|
|
# FEATURES IMPLEMENTADAS (10)
|
|
# ============================================================================
|
|
|
|
features:
|
|
- name: auth
|
|
path: src/features/auth/
|
|
phase: 1
|
|
epic: EAI-001
|
|
components: 16
|
|
hooks: 5
|
|
stores: 3
|
|
api_files: 3
|
|
types: 1
|
|
tests: 1
|
|
status: completed
|
|
|
|
- name: gamification
|
|
path: src/features/gamification/
|
|
phase: 1
|
|
epic: EAI-003
|
|
components: 74
|
|
hooks: 15
|
|
stores: 11
|
|
api_files: 7
|
|
types: 8
|
|
tests: 1
|
|
status: completed
|
|
|
|
- name: mechanics
|
|
path: src/features/mechanics/
|
|
phase: 1
|
|
epic: EAI-002
|
|
components: 61
|
|
hooks: 1
|
|
api_files: 2
|
|
status: completed
|
|
total_mechanics: 33
|
|
|
|
# ============================================================================
|
|
# TESTING
|
|
# ============================================================================
|
|
# ⚠️ CRÍTICO: Test coverage muy bajo - necesita mejora urgente
|
|
|
|
testing:
|
|
unit_tests:
|
|
total: 8
|
|
coverage: 13%
|
|
files_tested:
|
|
- apps/student/pages/__tests__/EmailVerificationPage.test.tsx
|
|
- apps/student/pages/__tests__/LoginPage.test.tsx
|
|
- apps/student/pages/__tests__/RegisterPage.test.tsx
|
|
- apps/student/pages/admin/__tests__/UserManagementPage.test.tsx
|
|
- features/admin/components/__tests__/DeactivateUserModal.test.tsx
|
|
- features/auth/__tests__/authStore.test.ts
|
|
- features/gamification/leaderboard/LiveLeaderboard.test.tsx
|
|
- shared/hooks/useSanitizedHTML.test.ts
|
|
|
|
overall_coverage: 13%
|
|
coverage_goal: 40%
|
|
gap: -27%
|
|
priority: CRÍTICA
|
|
|
|
untested:
|
|
components_without_tests: ~371
|
|
hooks_tested: 1 de 68 (1.5%)
|
|
stores_tested: 1 de 11 (9%)
|
|
apis_tested: 0 de 11 (0%)
|
|
e2e_tests: 0
|
|
|
|
# ============================================================================
|
|
# ESTADO DE IMPLEMENTACIÓN
|
|
# ============================================================================
|
|
|
|
implementation_status:
|
|
completed:
|
|
- "✅ Sistema de autenticación completo"
|
|
- "✅ 33 mecánicas educativas implementadas"
|
|
- "✅ Sistema de gamificación robusto"
|
|
- "✅ Portal de estudiantes (core features)"
|
|
|
|
partial:
|
|
- "⚠️ Portal de administración (básico)"
|
|
- "⚠️ Testing (solo 8 tests)"
|
|
- "⚠️ PWA (configurado pero no activado)"
|
|
|
|
not_implemented:
|
|
- "❌ Feature 'Education' (directorio vacío)"
|
|
|
|
# ============================================================================
|
|
# RUTAS IMPLEMENTADAS (React Router v7)
|
|
# ============================================================================
|
|
# Actualizado: 2025-11-09
|
|
# Total: 18 rutas (15 nuevas implementadas desde v2.2)
|
|
|
|
routing:
|
|
router_version: "React Router DOM 7.9.4"
|
|
total_routes: 18
|
|
public_routes: 5
|
|
protected_routes: 13
|
|
|
|
public:
|
|
- path: /login
|
|
component: LoginPage
|
|
status: ✅ Implementada
|
|
date: 2025-11-08
|
|
|
|
- path: /register
|
|
component: RegisterPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /forgot-password
|
|
component: ForgotPasswordPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /reset-password
|
|
component: PasswordResetPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /verify-email
|
|
component: EmailVerificationPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
protected:
|
|
- path: /
|
|
redirect: /dashboard
|
|
status: ✅ Redirect activo
|
|
|
|
- path: /dashboard
|
|
component: DashboardPage
|
|
status: ✅ Implementada
|
|
date: 2025-11-08
|
|
|
|
- path: /progress
|
|
component: MyProgressPage
|
|
status: ✅ Implementada
|
|
date: 2025-11-08
|
|
|
|
- path: /modules/:moduleId
|
|
component: ModuleDetailPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /achievements
|
|
component: AchievementsPage
|
|
status: ✅ Implementada
|
|
date: 2025-11-08
|
|
|
|
- path: /leaderboard
|
|
component: LeaderboardPage
|
|
status: ✅ Implementada
|
|
date: 2025-11-08
|
|
|
|
- path: /exercises/:exerciseId
|
|
component: ExercisePage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
note: "Antes era placeholder, ahora completamente funcional"
|
|
|
|
- path: /missions
|
|
component: MissionsPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /profile
|
|
component: EnhancedProfilePage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /settings
|
|
component: SettingsPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /friends
|
|
component: FriendsPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /shop
|
|
component: ShopPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /inventory
|
|
component: InventoryPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
- path: /guilds
|
|
component: GuildsPage
|
|
status: ✅ Implementada (NUEVA)
|
|
date: 2025-11-09
|
|
|
|
# ============================================================================
|
|
# ARQUITECTURA DE AUTENTICACIÓN
|
|
# ============================================================================
|
|
# Actualizado: 2025-11-09
|
|
|
|
authentication:
|
|
context: AuthProvider
|
|
location: src/app/providers/AuthContext.tsx
|
|
features:
|
|
- "Login/Logout con JWT"
|
|
- "Registro de usuarios"
|
|
- "Recuperación de contraseña"
|
|
- "Verificación de email"
|
|
- "Protected routes con ProtectedRoute component"
|
|
- "Persistencia de sesión en localStorage"
|
|
- "Auto-refresh de token"
|
|
|
|
components:
|
|
- ProtectedRoute (src/shared/components/ProtectedRoute.tsx)
|
|
- LoginPage
|
|
- RegisterPage
|
|
- ForgotPasswordPage
|
|
- PasswordResetPage
|
|
- EmailVerificationPage
|
|
|
|
# ============================================================================
|
|
# CORRECCIONES APLICADAS (2025-11-09)
|
|
# ============================================================================
|
|
|
|
corrections_2025_11_09:
|
|
pages_fixed:
|
|
- file: apps/student/pages/ModuleDetailPage.tsx
|
|
issue: "Usuario hardcodeado mockUser"
|
|
fix: "Removido mockUser, usando datos reales de API"
|
|
|
|
- file: apps/student/pages/InventoryPage.tsx
|
|
issue: "Usuario hardcodeado mockUserInventory"
|
|
fix: "Removido mock, usando datos reales de API"
|
|
|
|
- file: apps/student/pages/SettingsPage.tsx
|
|
issue: "Usuario hardcodeado mockUser"
|
|
fix: "Removido mock, usando useAuth() hook"
|
|
|
|
- file: apps/student/pages/ProfilePage.tsx
|
|
issue: "Usuario hardcodeado mockUser"
|
|
fix: "Removido mock, usando useAuth() hook"
|
|
|
|
- file: apps/student/pages/ShopPage.tsx
|
|
issue: "Usuario hardcodeado mockUserStats"
|
|
fix: "Removido mock, usando datos reales de gamificación"
|
|
|
|
- file: apps/student/pages/GuildsPage.tsx
|
|
issue: "Usuario hardcodeado mockGuilds"
|
|
fix: "Removido mock, usando datos reales de API"
|
|
|
|
- file: apps/student/pages/FriendsPage.tsx
|
|
issue: "Usuario hardcodeado mockFriends"
|
|
fix: "Removido mock, usando datos reales de API"
|
|
|
|
- file: apps/student/pages/ExercisePage.tsx
|
|
issue: "Usuario hardcodeado mockStudentId"
|
|
fix: "Removido mock, usando user.id real"
|
|
|
|
mechanics_fixed:
|
|
- file: features/mechanics/module2/ConstruccionHipotesis/ConstruccionHipotesisExercise.tsx
|
|
fix: "Removido studentId hardcodeado"
|
|
|
|
- file: features/mechanics/module2/PuzzleContexto/PuzzleContextoExercise.tsx
|
|
fix: "Removido studentId hardcodeado"
|
|
|
|
- file: features/mechanics/module2/RuedaInferencias/RuedaInferenciasExercise.tsx
|
|
fix: "Removido studentId hardcodeado"
|
|
|
|
- file: features/mechanics/module4/AnalisisMemes/AnalisisMemesExercise.tsx
|
|
fix: "Removido studentId hardcodeado"
|
|
|
|
react_router_v7:
|
|
- file: App.tsx
|
|
fix: "Removidos warnings de future flags (v7_startTransition, v7_relativeSplatPath)"
|
|
note: "React Router v7 ya incluye estos comportamientos por defecto"
|
|
|
|
# ============================================================================
|
|
# TEACHER PORTAL ENHANCEMENT (2025-11-24)
|
|
# ============================================================================
|
|
# GAPs resueltos: T002, T003, T004, T005
|
|
|
|
teacher_portal_enhancement_2025_11_24:
|
|
date: "2025-11-24"
|
|
analyst: "Architecture-Analyst"
|
|
status: "✅ COMPLETADO"
|
|
|
|
gaps_resolved:
|
|
- gap_id: GAP-T002
|
|
title: "TeacherAlertsPage gestión habilitada"
|
|
type: "Frontend Only"
|
|
description: "Botones de gestión conectados con endpoints existentes"
|
|
files_modified:
|
|
- "apps/frontend/src/apps/teacher/pages/TeacherAlertsPage.tsx"
|
|
- "apps/frontend/src/apps/teacher/components/alerts/InterventionAlertsPanel.tsx"
|
|
changes:
|
|
- "Habilitados botones: Acknowledge, Resolve, Dismiss"
|
|
- "Agregado toast notifications (react-hot-toast)"
|
|
- "Removido banner 'Sistema de Alertas Básico'"
|
|
|
|
- gap_id: GAP-T003
|
|
title: "TeacherContentManagement CRUD completo"
|
|
type: "Backend + Frontend"
|
|
description: "CRUD completo para contenido personalizado del maestro"
|
|
files_created:
|
|
- "apps/frontend/src/services/api/teacher/teacherContentApi.ts"
|
|
- "apps/frontend/src/apps/teacher/hooks/useTeacherContent.ts"
|
|
files_modified:
|
|
- "apps/frontend/src/apps/teacher/pages/TeacherContentManagement.tsx"
|
|
- "apps/frontend/src/services/api/teacher/index.ts"
|
|
features:
|
|
- "Listar contenido con filtros (módulo, tipo, estado)"
|
|
- "Crear nuevo contenido"
|
|
- "Editar contenido existente"
|
|
- "Eliminar contenido (soft delete)"
|
|
- "Clonar contenido"
|
|
- "Publicar contenido"
|
|
|
|
- gap_id: GAP-T004
|
|
title: "TeacherGamification otorgar bonus"
|
|
type: "Backend + Frontend"
|
|
description: "Sistema para otorgar ML Coins bonus a estudiantes"
|
|
files_created:
|
|
- "apps/frontend/src/services/api/teacher/bonusCoinsApi.ts"
|
|
- "apps/frontend/src/apps/teacher/hooks/useGrantBonus.ts"
|
|
files_modified:
|
|
- "apps/frontend/src/apps/teacher/pages/TeacherGamification.tsx"
|
|
features:
|
|
- "Modal para otorgar bonus"
|
|
- "Validación de monto (1-1000 ML Coins)"
|
|
- "Campo obligatorio de razón (min 10 caracteres)"
|
|
- "Feedback visual de éxito/error"
|
|
|
|
- gap_id: GAP-T005
|
|
title: "TeacherCommunication selectores dinámicos"
|
|
type: "Frontend Only"
|
|
description: "Selectores de clase/estudiante con datos reales"
|
|
files_modified:
|
|
- "apps/frontend/src/apps/teacher/pages/TeacherCommunicationPage.tsx"
|
|
- "apps/frontend/src/apps/teacher/components/communication/AnnouncementForm.tsx"
|
|
- "apps/frontend/src/apps/teacher/components/communication/FeedbackForm.tsx"
|
|
changes:
|
|
- "Reemplazados placeholders por dropdowns dinámicos"
|
|
- "Selector de clase usando useClassrooms()"
|
|
- "Selector cascada: clase -> estudiante"
|
|
|
|
new_api_services:
|
|
- name: teacherContentApi
|
|
path: "apps/frontend/src/services/api/teacher/teacherContentApi.ts"
|
|
methods:
|
|
- getContent (GET /teacher/content)
|
|
- getContentById (GET /teacher/content/:id)
|
|
- createContent (POST /teacher/content)
|
|
- updateContent (PUT /teacher/content/:id)
|
|
- deleteContent (DELETE /teacher/content/:id)
|
|
- cloneContent (POST /teacher/content/:id/clone)
|
|
- publishContent (POST /teacher/content/:id/publish)
|
|
|
|
- name: bonusCoinsApi
|
|
path: "apps/frontend/src/services/api/teacher/bonusCoinsApi.ts"
|
|
methods:
|
|
- grantBonus (POST /teacher/students/:studentId/bonus)
|
|
|
|
- name: interventionAlertsApi
|
|
path: "apps/frontend/src/services/api/teacher/interventionAlertsApi.ts"
|
|
methods:
|
|
- getAlerts
|
|
- getAlertById
|
|
- acknowledgeAlert
|
|
- resolveAlert
|
|
- dismissAlert
|
|
|
|
- name: teacherMessagesApi
|
|
path: "apps/frontend/src/services/api/teacher/teacherMessagesApi.ts"
|
|
methods:
|
|
- getMessages
|
|
- sendMessage
|
|
- markAsRead
|
|
|
|
new_hooks:
|
|
- name: useTeacherContent
|
|
path: "apps/frontend/src/apps/teacher/hooks/useTeacherContent.ts"
|
|
purpose: "Estado y operaciones CRUD para contenido del maestro"
|
|
|
|
- name: useGrantBonus
|
|
path: "apps/frontend/src/apps/teacher/hooks/useGrantBonus.ts"
|
|
purpose: "Estado y validaciones para otorgar bonus ML Coins"
|
|
|
|
- name: useInterventionAlerts
|
|
path: "apps/frontend/src/apps/teacher/hooks/useInterventionAlerts.ts"
|
|
purpose: "Estado y operaciones para alertas de intervención"
|
|
|
|
- name: useTeacherMessages
|
|
path: "apps/frontend/src/apps/teacher/hooks/useTeacherMessages.ts"
|
|
purpose: "Estado y operaciones para mensajería del maestro"
|
|
|
|
global_changes:
|
|
- file: "apps/frontend/src/App.tsx"
|
|
change: "Agregado Toaster de react-hot-toast para notificaciones globales"
|
|
|
|
teacher_portal_status_post_fix:
|
|
total_pages: 13
|
|
fully_functional: 10 # 77% (antes 62%)
|
|
partially_functional: 2 # 15%
|
|
placeholder: 1 # 8%
|
|
improvement: "+15% funcionalidad"
|
|
remaining_placeholder: "TeacherResourcesPage (GAP-T001 - Fase 3)"
|
|
|
|
# ============================================================================
|
|
# COHERENCE ANALYSIS FIXES (2025-11-24)
|
|
# ============================================================================
|
|
# Correcciones P0 implementadas post-análisis arquitectónico
|
|
|
|
coherence_analysis_fixes_2025_11_24:
|
|
date: "2025-11-24"
|
|
analyst: "Architecture-Analyst"
|
|
task_id: "FE-101"
|
|
status: "✅ COMPLETADO"
|
|
|
|
alert_interface_collision_fix:
|
|
priority: "P0 - CRÍTICO"
|
|
issue: "Name collision entre dos interfaces 'Alert' diferentes"
|
|
impact: "Riesgo de errores TypeScript al importar ambas en el mismo archivo"
|
|
|
|
collision_details:
|
|
file_1:
|
|
path: "apps/frontend/src/services/api/adminTypes.ts"
|
|
line: 581
|
|
interface: "Alert (System monitoring alerts)"
|
|
properties: 29
|
|
purpose: "Alertas de monitoreo del sistema"
|
|
|
|
file_2:
|
|
path: "apps/frontend/src/services/api/teacher/interventionAlertsApi.ts"
|
|
line: 39
|
|
interface: "Alert (Student intervention alerts)"
|
|
properties: 17
|
|
purpose: "Alertas de intervención estudiantil"
|
|
|
|
solution_implemented:
|
|
approach: "Semantic renaming with backwards compatibility"
|
|
|
|
adminTypes_changes:
|
|
- "Alert → SystemAlert"
|
|
- "AlertSeverity → SystemAlertSeverity"
|
|
- "AlertStatus → SystemAlertStatus"
|
|
- "AlertType → SystemAlertType"
|
|
- "Added deprecated aliases for gradual migration"
|
|
|
|
interventionAlertsApi_changes:
|
|
- "Alert → StudentInterventionAlert"
|
|
- "AlertType → InterventionAlertType"
|
|
- "AlertSeverity → InterventionAlertSeverity"
|
|
- "AlertStatus → InterventionAlertStatus"
|
|
- "AlertsListResponse → InterventionAlertsListResponse"
|
|
- "Added deprecated aliases for backwards compatibility"
|
|
|
|
files_modified:
|
|
total: 15
|
|
type_definitions: 2
|
|
admin_components: 9
|
|
teacher_components: 3
|
|
other: 1
|
|
|
|
list:
|
|
- "apps/frontend/src/services/api/adminTypes.ts"
|
|
- "apps/frontend/src/services/api/teacher/interventionAlertsApi.ts"
|
|
- "apps/frontend/src/apps/admin/pages/AdminMonitoringPage.tsx"
|
|
- "apps/frontend/src/apps/admin/pages/AdminSettingsPage.tsx"
|
|
- "apps/frontend/src/apps/admin/components/monitoring/LogsViewer.tsx"
|
|
- "apps/frontend/src/apps/admin/components/monitoring/SystemAlertsTable.tsx"
|
|
- "apps/frontend/src/apps/admin/components/monitoring/AlertDetailsModal.tsx"
|
|
- "apps/frontend/src/apps/admin/components/settings/GeneralSettings.tsx"
|
|
- "apps/frontend/src/apps/admin/components/settings/EmailSettings.tsx"
|
|
- "apps/frontend/src/apps/admin/components/settings/NotificationSettings.tsx"
|
|
- "apps/frontend/src/apps/admin/components/settings/BackupSettings.tsx"
|
|
- "apps/frontend/src/apps/admin/components/settings/ApiKeysSettings.tsx"
|
|
- "apps/frontend/src/apps/teacher/pages/TeacherAlertsPage.tsx"
|
|
- "apps/frontend/src/apps/teacher/components/alerts/InterventionAlertsPanel.tsx"
|
|
- "apps/frontend/src/apps/teacher/components/alerts/AlertFilters.tsx"
|
|
|
|
validation:
|
|
typescript_check: "0 errors ✅"
|
|
build_result: "Success (12.13s) ✅"
|
|
name_collisions: 0
|
|
backwards_compatibility: "Maintained via deprecated aliases ✅"
|
|
|
|
deprecated_aliases:
|
|
removal_timeline: "1 sprint (2025-12-08)"
|
|
migration_guide: |
|
|
// Admin code
|
|
import { Alert } from 'adminTypes' // ⚠️ DEPRECATED
|
|
import { SystemAlert } from 'adminTypes' // ✅ NEW
|
|
|
|
// Teacher code
|
|
import { Alert } from 'interventionAlertsApi' // ⚠️ DEPRECATED
|
|
import { StudentInterventionAlert } from 'interventionAlertsApi' // ✅ NEW
|
|
|
|
documentation:
|
|
implementation_report: "orchestration/agentes/frontend/fix-alert-interface-collision-2025-11-24/IMPLEMENTATION-REPORT.md"
|
|
files_modified_list: "orchestration/agentes/frontend/fix-alert-interface-collision-2025-11-24/FILES-MODIFIED.md"
|
|
trace_updated: "orchestration/trazas/TRAZA-TAREAS-FRONTEND.md (FE-101)"
|
|
|
|
coherence_metrics_update:
|
|
before:
|
|
issues_p0: 1
|
|
coherence: "95.3%"
|
|
|
|
after:
|
|
issues_p0: 0
|
|
coherence: "96.8%"
|
|
improvement: "+1.5%"
|
|
|
|
# ============================================================================
|
|
# ADMIN PORTAL INTEGRATION FIX (2025-11-24)
|
|
# ============================================================================
|
|
# Correcciones ARCH-INT-001: Integración Backend-Frontend-Database
|
|
|
|
admin_portal_integration_fix_2025_11_24:
|
|
date: "2025-11-24"
|
|
analyst: "Architecture-Analyst"
|
|
task_id: "ARCH-INT-001"
|
|
status: "✅ COMPLETADO"
|
|
|
|
summary:
|
|
total_issues_fixed: 5
|
|
total_files_modified: 23
|
|
build_status: "✅ Exitoso"
|
|
typescript_errors_introduced: 0
|
|
|
|
issues_resolved:
|
|
- issue_id: FE-INT-001
|
|
title: "Endpoints hardcodeados centralizados"
|
|
severity: "P0"
|
|
description: "18 endpoints hardcodeados en servicios API"
|
|
solution: "Migración a api.config.ts centralizado"
|
|
files_modified:
|
|
- "apps/frontend/src/config/api.config.ts"
|
|
- "apps/frontend/src/services/api/adminAPI.ts"
|
|
- "apps/frontend/src/services/api/admin/classroomTeacherApi.ts"
|
|
endpoints_centralized:
|
|
monitoring: 5
|
|
progress: 6
|
|
classroomTeachers: 4
|
|
bulk: 3
|
|
total: 18
|
|
|
|
- issue_id: FE-INT-002
|
|
title: ".env.production HTTPS sin SSL"
|
|
severity: "P1"
|
|
description: "HTTPS/WSS configurado pero servidor sin certificado SSL"
|
|
solution: "Cambiar a HTTP/WS, documentar configuración temporal"
|
|
files_modified:
|
|
- "apps/frontend/.env.production"
|
|
changes:
|
|
- "VITE_API_PROTOCOL: https → http"
|
|
- "VITE_WS_PROTOCOL: wss → ws"
|
|
- "Documentación de IP temporal agregada"
|
|
|
|
- issue_id: FE-INT-003
|
|
title: "Tipos desincronizados con DB"
|
|
severity: "P1"
|
|
description: "User.status y Organization.tier no alineados con enums de BD"
|
|
solution: "Sincronización de tipos + export de type aliases"
|
|
files_modified:
|
|
- "apps/frontend/src/services/api/adminTypes.ts"
|
|
- "apps/frontend/src/apps/admin/types/index.ts"
|
|
- "apps/frontend/src/apps/admin/components/dashboard/OrganizationsTable.tsx"
|
|
- "apps/frontend/src/apps/admin/hooks/useOrganizations.ts"
|
|
- "apps/frontend/src/apps/admin/pages/AdminInstitutionsPage.tsx"
|
|
- "apps/frontend/src/apps/admin/components/advanced/TenantManagementPanel.tsx"
|
|
type_changes:
|
|
- "User.status: +banned, +pending"
|
|
- "Organization.tier: premium → professional"
|
|
- "UserStatus type alias: exported"
|
|
- "SubscriptionTier type alias: exported"
|
|
|
|
api_config_structure:
|
|
file: "apps/frontend/src/config/api.config.ts"
|
|
sections_added:
|
|
- name: "admin.monitoring"
|
|
endpoints:
|
|
- "metrics: '/admin/monitoring/metrics'"
|
|
- "metricsHistory: '/admin/monitoring/metrics/history'"
|
|
- "errorStats: '/admin/monitoring/errors/stats'"
|
|
- "recentErrors: '/admin/monitoring/errors/recent'"
|
|
- "errorTrends: '/admin/monitoring/errors/trends'"
|
|
|
|
- name: "admin.progress"
|
|
endpoints:
|
|
- "overview: '/admin/progress/overview'"
|
|
- "classroom: (id) => '/admin/progress/classrooms/${id}'"
|
|
- "student: (id) => '/admin/progress/students/${id}'"
|
|
- "module: (id) => '/admin/progress/modules/${id}'"
|
|
- "exercise: (id) => '/admin/progress/exercises/${id}'"
|
|
- "export: '/admin/progress/export'"
|
|
|
|
- name: "admin.classroomTeachers"
|
|
endpoints:
|
|
- "list: '/admin/classroom-teachers'"
|
|
- "bulk: '/admin/classroom-teachers/bulk'"
|
|
- "byClassroom: (id) => '/admin/classrooms/${id}/teachers'"
|
|
- "byTeacher: (id) => '/admin/teachers/${id}/classrooms'"
|
|
|
|
- name: "admin.bulk"
|
|
endpoints:
|
|
- "suspendUsers: '/admin/users/bulk/suspend'"
|
|
- "deleteUsers: '/admin/users/bulk/delete'"
|
|
- "updateRole: '/admin/users/bulk/update-role'"
|
|
|
|
validation:
|
|
backend_build: "✅ Exitoso"
|
|
frontend_build: "✅ Exitoso (14.78s)"
|
|
typescript_errors: 0
|
|
breaking_changes: 0
|
|
|
|
dependencies:
|
|
depends_on:
|
|
- "Backend API: 16 controladores admin"
|
|
- "Database: system_alerts, audit_logs, profiles, tenants"
|
|
depended_by:
|
|
- "Todas las páginas del portal admin (10 páginas)"
|
|
- "Hooks: useAdminDashboard, useOrganizations, useContentManagement, useSystemMonitoring"
|
|
|
|
documentation:
|
|
main_report: "docs/90-transversal/CORRECCION-INTEGRACION-ADMIN-API-2025-11-24.md"
|
|
analysis_folder: "orchestration/agentes/architecture-analyst/analisis-portal-admin-integracion-2025-11-24/"
|
|
trace_entry: "orchestration/trazas/TRAZA-ANALISIS-ARQUITECTURA.md (ARCH-INT-001)"
|
|
|
|
metrics_improvement:
|
|
db_backend_frontend_sync:
|
|
before: "65/100"
|
|
after: "85/100"
|
|
improvement: "+20 points"
|
|
|
|
centralized_endpoints:
|
|
before: "~70%"
|
|
after: "100%"
|
|
improvement: "+30%"
|
|
|
|
correct_ports:
|
|
before: "~70%"
|
|
after: "100%"
|
|
improvement: "+30%"
|
|
|
|
pending_backlog:
|
|
- task_id: "CLEAN-001"
|
|
description: "Eliminar archivos deprecated (apiConfig.deprecated.ts, api-endpoints.deprecated.ts)"
|
|
priority: "P2"
|
|
|
|
- task_id: "SSL-001"
|
|
description: "Configurar certificado SSL en servidor"
|
|
priority: "P1"
|
|
|
|
- task_id: "DNS-001"
|
|
description: "Configurar dominio api.gamilit.com"
|
|
priority: "P1"
|
|
|
|
# ============================================================================
|
|
# TEACHER PORTAL INTEGRATION FIX (2025-11-24)
|
|
# ============================================================================
|
|
# Correcciones ARCH-INT-002: Integración Teacher Portal APIs
|
|
|
|
teacher_portal_integration_fix_2025_11_24:
|
|
date: "2025-11-24"
|
|
analyst: "Architecture-Analyst"
|
|
task_id: "ARCH-INT-002"
|
|
status: "✅ COMPLETADO"
|
|
|
|
summary:
|
|
phases_completed: 3
|
|
files_deleted: 1
|
|
types_synced: true
|
|
build_status: "✅ Exitoso"
|
|
|
|
files_deleted:
|
|
- file: "apps/frontend/src/shared/constants/api-endpoints.deprecated.ts"
|
|
status: "DELETED"
|
|
reason: "Archivo deprecado sin imports activos"
|
|
replaced_by: "apps/frontend/src/config/api.config.ts"
|
|
|
|
types_synchronization:
|
|
intervention_alerts:
|
|
frontend_file: "apps/frontend/src/services/api/teacher/interventionAlertsApi.ts"
|
|
backend_file: "apps/backend/src/shared/types/intervention-alerts.types.ts"
|
|
status: "100% sincronizado"
|
|
comment_added: "// Synchronized with backend: apps/backend/src/shared/types/intervention-alerts.types.ts"
|
|
types_aligned:
|
|
- "InterventionAlertType"
|
|
- "InterventionAlertSeverity"
|
|
- "InterventionAlertStatus"
|
|
- "StudentInterventionAlert"
|
|
|
|
documentation:
|
|
main_report: "docs/90-transversal/INTEGRACION-TEACHER-PORTAL-APIs-2025-11-24.md"
|
|
final_report: "orchestration/agentes/architecture-analyst/analisis-integracion-teacher-portal-2025-11-24/REPORTE-FINAL-IMPLEMENTACION.md"
|
|
trace_entry: "orchestration/trazas/TRAZA-TAREAS-FRONTEND.md (FE-103)"
|
|
|
|
validation:
|
|
build_result: "✅ Exitoso"
|
|
type_check_result: "✅ Sin errores"
|
|
deprecated_files_remaining: 0
|
|
|
|
notes:
|
|
- "api-endpoints.deprecated.ts eliminado (sin imports activos)"
|
|
- "apiConfig.deprecated.ts ya había sido eliminado previamente"
|
|
- "Tipos de InterventionAlert sincronizados con backend"
|
|
- "Comentarios de sincronización agregados en archivo frontend"
|
|
|
|
# ============================================================================
|
|
# DETECTIVE TEXTUAL RESTORATION (2025-11-28)
|
|
# ============================================================================
|
|
# FE-106: Restauración de mecánica incorrecta a diseño original
|
|
|
|
detective_textual_restoration_2025_11_28:
|
|
date: "2025-11-28"
|
|
analyst: "Architecture-Analyst"
|
|
task_id: "FE-106"
|
|
status: "✅ COMPLETADO"
|
|
|
|
summary:
|
|
mechanic_name: "Detective Textual"
|
|
module: "Módulo 2 - Ejercicio 2.1"
|
|
issue: "Mecánica implementada incorrectamente (conexiones en lugar de selección múltiple)"
|
|
resolution: "Reescritura completa del componente según Documento de Diseño"
|
|
|
|
incorrect_implementation:
|
|
description: "EvidenceBoard con conexiones entre piezas de evidencia"
|
|
components_removed:
|
|
- file: "EvidenceBoard.tsx"
|
|
purpose: "Tablero de evidencias con conexiones"
|
|
status: "ELIMINADO"
|
|
- file: "MagnifyingGlass.tsx"
|
|
purpose: "Herramienta de zoom"
|
|
status: "ELIMINADO"
|
|
- file: "AIHintSystem.tsx"
|
|
purpose: "Sistema de pistas AI"
|
|
status: "ELIMINADO"
|
|
- file: "detectiveTextualAPI.ts"
|
|
purpose: "API específica (obsoleta)"
|
|
status: "ELIMINADO"
|
|
|
|
correct_implementation:
|
|
description: "Selección múltiple con inferencia textual según Documento de Diseño"
|
|
mechanic_flow:
|
|
- "1. Mostrar pasaje de lectura"
|
|
- "2. Presentar preguntas de inferencia"
|
|
- "3. Usuario selecciona 1 de 4 opciones"
|
|
- "4. Mostrar explicación post-respuesta"
|
|
|
|
files_rewritten:
|
|
- file: "detectiveTextualTypes.ts"
|
|
changes:
|
|
- "Nueva interface InferenceQuestion"
|
|
- "Nueva interface DetectiveTextualExercise"
|
|
- "inference_type: causa_efecto | contexto_situacional | motivacion"
|
|
|
|
- file: "detectiveTextualSchemas.ts"
|
|
changes:
|
|
- "Schema Zod inferenceQuestionSchema"
|
|
- "Schema Zod detectiveTextualExerciseSchema"
|
|
- "Validación de 4 opciones por pregunta"
|
|
|
|
- file: "detectiveTextualMockData.ts"
|
|
changes:
|
|
- "Datos mock sincronizados con seeds DB"
|
|
- "4 preguntas sobre Marie Curie"
|
|
- "Tipos de inferencia: causa_efecto, contexto_situacional, motivacion"
|
|
|
|
- file: "DetectiveTextualExercise.tsx"
|
|
changes:
|
|
- "Nuevo componente QuestionCard"
|
|
- "Interfaz de selección múltiple"
|
|
- "Barra de progreso por pregunta"
|
|
- "Modal de feedback con explicación"
|
|
- "Integración con progressAPI"
|
|
|
|
backend_alignment:
|
|
dto: "DetectiveTextualAnswersDto"
|
|
format: '{ "questions": { "q1": "1", "q2": "0", ... } }'
|
|
status: "✅ Alineado"
|
|
|
|
database_alignment:
|
|
seeds_file: "03-exercises-module2.sql"
|
|
structure: "passage + questions + options + correctAnswer"
|
|
status: "✅ Sin cambios necesarios (seeds correctos)"
|
|
|
|
clean_load_directive:
|
|
violated: false
|
|
reason: "No se realizaron cambios en base de datos"
|
|
directive_file: "orchestration/directivas/DIRECTIVA-POLITICA-CARGA-LIMPIA.md"
|
|
|
|
validation:
|
|
typescript_check: "✅ Sin errores en archivos DetectiveTextual"
|
|
design_document_alignment: "✅ Mecánica coincide con DocumentoDeDiseño_Mecanicas_GAMILIT_v6_1.md"
|
|
backend_dto_alignment: "✅ Formato de respuesta coincide"
|
|
seeds_alignment: "✅ Datos mock sincronizados"
|
|
|
|
documentation:
|
|
design_document: "docs/00-vision-general/DocumentoDeDiseño_Mecanicas_GAMILIT_v6_1.md"
|
|
seeds_file: "apps/database/seeds/dev/educational_content/03-exercises-module2.sql"
|
|
trace_entry: "orchestration/trazas/TRAZA-TAREAS-FRONTEND.md (FE-106)"
|
|
|
|
path_structure:
|
|
location: "apps/frontend/src/features/mechanics/module2/DetectiveTextual/"
|
|
files:
|
|
- "detectiveTextualTypes.ts (reescrito)"
|
|
- "detectiveTextualSchemas.ts (reescrito)"
|
|
- "detectiveTextualMockData.ts (reescrito)"
|
|
- "DetectiveTextualExercise.tsx (reescrito)"
|
|
- "index.ts (sin cambios)"
|
|
|
|
# ============================================================================
|
|
# STUDENT PORTAL FIXES (2025-11-29)
|
|
# ============================================================================
|
|
# FE-108 y FE-109: Correcciones del portal Student
|
|
|
|
student_portal_fixes_2025_11_29:
|
|
date: "2025-11-29"
|
|
analyst: "Architecture-Analyst"
|
|
task_ids: ["FE-108", "FE-109"]
|
|
status: "✅ COMPLETADO"
|
|
|
|
summary:
|
|
issues_fixed: 3
|
|
files_modified: 3
|
|
build_status: "✅ Exitoso (4138 modules)"
|
|
typescript_errors: 0
|
|
|
|
fixes:
|
|
- fix_id: FE-108
|
|
title: "Dashboard Rango Auto-actualización"
|
|
priority: "P1"
|
|
issue: "Rango no se actualizaba después de completar ejercicio"
|
|
root_cause: "invalidateQueries() no fuerza refetch con staleTime configurado"
|
|
solution: "Cambiar a refetchQueries() con type: 'active'"
|
|
file_modified: "apps/frontend/src/shared/hooks/useInvalidateDashboard.ts"
|
|
changes:
|
|
- "invalidateQueries() → refetchQueries()"
|
|
- "exact: false → type: 'active'"
|
|
impact: "Dashboard se actualiza inmediatamente post-ejercicio"
|
|
|
|
- fix_id: FE-109
|
|
title: "Leaderboard Endpoints Mapeo"
|
|
priority: "P0"
|
|
issue: "Pestañas School y Classroom mostraban errores de ID"
|
|
root_cause: "Frontend usaba endpoint genérico inexistente en backend"
|
|
solution: "Mapeo de tipos a endpoints específicos del backend"
|
|
files_modified:
|
|
- file: "apps/frontend/src/features/gamification/social/api/socialAPI.ts"
|
|
changes:
|
|
- "getLeaderboard() ahora mapea tipos a endpoints específicos"
|
|
- "Acepta options: { schoolId, userId }"
|
|
- "Endpoints: /leaderboard/global, /leaderboard/schools/:id, /leaderboard/friends/:id"
|
|
- file: "apps/frontend/src/features/gamification/social/store/leaderboardsStore.ts"
|
|
changes:
|
|
- "Integración con authStore para obtener schoolId/userId"
|
|
- "Pasa opciones a socialAPI.getLeaderboard()"
|
|
|
|
api_endpoints_mapping:
|
|
global:
|
|
frontend_type: "'global'"
|
|
backend_endpoint: "/gamification/leaderboard/global"
|
|
params_required: "none"
|
|
school:
|
|
frontend_type: "'school'"
|
|
backend_endpoint: "/gamification/leaderboard/schools/:schoolId"
|
|
params_required: "schoolId from user profile"
|
|
friends:
|
|
frontend_type: "'friends'"
|
|
backend_endpoint: "/gamification/leaderboard/friends/:userId"
|
|
params_required: "userId from auth"
|
|
|
|
validation:
|
|
typescript_check: "✅ Sin errores"
|
|
build_result: "✅ Exitoso (4138 modules)"
|
|
lint_errors: 0
|
|
lint_warnings: "1197 (preexistentes)"
|
|
|
|
documentation:
|
|
trace_entries:
|
|
- "orchestration/trazas/TRAZA-TAREAS-FRONTEND.md (FE-108)"
|
|
- "orchestration/trazas/TRAZA-TAREAS-FRONTEND.md (FE-109)"
|
|
|
|
clean_load_directive:
|
|
violated: false
|
|
reason: "Cambios solo en frontend, sin modificaciones a base de datos"
|
|
|
|
# ============================================================================
|
|
# M4-M5 IMPLEMENTATION (2025-11-29)
|
|
# ============================================================================
|
|
# Implementación completa de mecánicas creativas Módulos 4 y 5
|
|
|
|
m4_m5_implementation:
|
|
date: "2025-11-29"
|
|
status: "PRODUCTION_READY"
|
|
|
|
shared_components_added:
|
|
- name: MediaUploader
|
|
path: src/shared/components/mechanics/MediaUploader.tsx
|
|
purpose: "Carga de archivos multimedia para ejercicios creativos"
|
|
supported_types: ["image/*", "video/*", "audio/*"]
|
|
max_file_size: "50MB"
|
|
|
|
- name: RubricEvaluator
|
|
path: src/shared/components/mechanics/RubricEvaluator.tsx
|
|
purpose: "Evaluación con rúbricas para docentes"
|
|
features:
|
|
- "Criterios configurables"
|
|
- "Escala de puntaje"
|
|
- "Comentarios por criterio"
|
|
- "Cálculo automático de puntuación total"
|
|
|
|
hooks_added:
|
|
- name: useVideoRecorder
|
|
path: src/shared/hooks/useVideoRecorder.ts
|
|
purpose: "Grabación de video para VideoCarta"
|
|
features:
|
|
- "Grabación de video desde webcam"
|
|
- "Preview en tiempo real"
|
|
- "Conversión a Blob/File"
|
|
- "Manejo de permisos de cámara"
|
|
|
|
- name: useAudioRecorder
|
|
path: src/shared/hooks/useAudioRecorder.ts
|
|
purpose: "Grabación de audio para ejercicios multimedia"
|
|
features:
|
|
- "Grabación de audio desde micrófono"
|
|
- "Visualización de forma de onda"
|
|
- "Conversión a Blob/File"
|
|
- "Manejo de permisos de micrófono"
|
|
|
|
teacher_pages_added:
|
|
- name: ReviewPanel
|
|
path: src/apps/teacher/pages/ReviewPanel/
|
|
purpose: "Panel de revisión manual de ejercicios M4-M5"
|
|
components:
|
|
- ReviewPanelPage.tsx
|
|
- ReviewList.tsx
|
|
- ReviewDetail.tsx
|
|
features:
|
|
- "Lista de ejercicios pendientes de revisión"
|
|
- "Vista detallada de respuesta del estudiante"
|
|
- "Integración con RubricEvaluator"
|
|
- "Envío de feedback y calificación"
|
|
|
|
module4_mechanics:
|
|
status: "ALL_IMPLEMENTED"
|
|
count: 5
|
|
types:
|
|
- verificador_fake_news:
|
|
path: src/features/mechanics/module4/VerificadorFakeNews/
|
|
description: "Verificación de noticias falsas con fuentes"
|
|
|
|
- infografia_interactiva:
|
|
path: src/features/mechanics/module4/InfografiaInteractiva/
|
|
description: "Infografía interactiva con componentes multimedia"
|
|
|
|
- quiz_tiktok:
|
|
path: src/features/mechanics/module4/QuizTikTok/
|
|
description: "Quiz estilo TikTok de comprensión multimodal"
|
|
|
|
- navegacion_hipertextual:
|
|
path: src/features/mechanics/module4/NavegacionHipertextual/
|
|
description: "Navegación por contenido hipertextual entre nodos enlazados"
|
|
files:
|
|
- NavegacionHipertextualExercise.tsx
|
|
- navegacionHipertextualTypes.ts
|
|
- HypertextDocument.tsx
|
|
- NavigationBreadcrumbs.tsx
|
|
expected_data_structure:
|
|
nodes: "HypertextNode[] - array de nodos navegables"
|
|
startNodeId: "string - ID del nodo inicial"
|
|
targetNodeId: "string - ID del nodo objetivo"
|
|
hypertext_node_interface:
|
|
id: "string"
|
|
title: "string"
|
|
content: "string"
|
|
links: "array de {targetId: string, label: string}"
|
|
|
|
- analisis_memes:
|
|
path: src/features/mechanics/module4/AnalisisMemes/
|
|
description: "Análisis crítico de memes (requiere revisión manual)"
|
|
manual_review: true
|
|
|
|
module5_mechanics:
|
|
status: "ALL_IMPLEMENTED"
|
|
count: 3
|
|
types:
|
|
- diario_multimedia:
|
|
path: src/features/mechanics/module5/DiarioMultimedia/
|
|
description: "Diario multimedia con texto, imagen y audio"
|
|
manual_review: true
|
|
media_types: ["text", "image", "audio"]
|
|
|
|
- comic_digital:
|
|
path: src/features/mechanics/module5/ComicDigital/
|
|
description: "Creación de cómic digital panel a panel"
|
|
manual_review: true
|
|
media_types: ["image", "text"]
|
|
|
|
- video_carta:
|
|
path: src/features/mechanics/module5/VideoCarta/
|
|
description: "Video carta personal grabada desde webcam"
|
|
manual_review: true
|
|
media_types: ["video"]
|
|
max_duration: "3 minutes"
|
|
|
|
manual_review_system:
|
|
status: "IMPLEMENTED"
|
|
backend_entity: "manual_reviews"
|
|
frontend_components:
|
|
- ReviewPanelPage
|
|
- ReviewList
|
|
- ReviewDetail
|
|
- RubricEvaluator
|
|
workflow:
|
|
- "1. Estudiante envía ejercicio creativo"
|
|
- "2. Backend crea registro en manual_reviews (PENDING)"
|
|
- "3. Docente accede a ReviewPanel"
|
|
- "4. Docente evalúa con rúbrica"
|
|
- "5. Backend actualiza estado a REVIEWED"
|
|
- "6. Estudiante recibe feedback y puntuación"
|
|
|
|
media_upload_system:
|
|
status: "IMPLEMENTED"
|
|
backend_service: "MediaStorageService"
|
|
backend_entity: "media_attachments"
|
|
storage_path: "apps/backend/uploads/"
|
|
components:
|
|
- MediaUploader (frontend)
|
|
- media-upload.controller.ts (backend)
|
|
- media-storage.service.ts (backend)
|
|
supported_formats:
|
|
images: ["jpg", "jpeg", "png", "gif", "webp"]
|
|
videos: ["mp4", "webm", "mov"]
|
|
audio: ["mp3", "wav", "ogg", "m4a"]
|
|
|
|
integration:
|
|
backend_controllers:
|
|
- media-upload.controller.ts
|
|
- manual-review.controller.ts
|
|
backend_services:
|
|
- media-storage.service.ts
|
|
- manual-review.service.ts
|
|
database_tables:
|
|
- media_attachments
|
|
- manual_reviews
|
|
seeds:
|
|
- 05-exercises-module4.sql
|
|
- 06-exercises-module5.sql
|
|
|
|
testing_status:
|
|
unit_tests: "NOT_IMPLEMENTED"
|
|
integration_tests: "NOT_IMPLEMENTED"
|
|
manual_testing: "PASSED"
|
|
notes: "Mecánicas probadas manualmente en desarrollo"
|
|
|
|
# ============================================================================
|
|
# CHANGELOG / MODIFICACIONES RECIENTES
|
|
# ============================================================================
|
|
changelog:
|
|
- date: "2025-12-18"
|
|
tarea_id: "CORR-ERRORES-M4-001"
|
|
type: "Bug Fix - M4-M5 Exercise Adapters"
|
|
status: "✅ VIGENTE (8 adapters activos)"
|
|
description: "Implementación de 8 adaptadores para ejercicios M4-M5 oficiales en exerciseAdapter.ts"
|
|
changes:
|
|
exerciseAdapter_m4_oficiales:
|
|
- "adaptToQuizTikTokData() - Mapea questions[].text→question, correct→correctAnswer"
|
|
- "adaptToInfografiaInteractivaData() - Transforma sections[]→cards[]"
|
|
- "adaptToVerificadorFakeNewsData() - Pass-through articles[]"
|
|
- "adaptToNavegacionHipertextualData() - Extrae content.nodes[]"
|
|
- "adaptToAnalisisMemesData() - Pass-through memes[]"
|
|
exerciseAdapter_m5_oficiales:
|
|
- "adaptToDiarioMultimediaData() - M5 adapter"
|
|
- "adaptToComicDigitalData() - M5 adapter"
|
|
- "adaptToVideoCartaData() - M5 adapter"
|
|
adapters_eliminados_por_limpieza:
|
|
- "adaptToEmailFormalData() - ELIMINADO (ejercicio no oficial)"
|
|
- "adaptToChatLiterarioData() - ELIMINADO (ejercicio no oficial)"
|
|
- "adaptToEnsayoArgumentativoData() - ELIMINADO (ejercicio no oficial)"
|
|
- "adaptToResenaCriticaData() - ELIMINADO (ejercicio no oficial)"
|
|
files_modified: 1
|
|
adapters_active: 8
|
|
adapters_removed: 4
|
|
removal_reason: "LIMPIEZA-M4-EJERCICIOS-001 - ejercicios no oficiales según DocumentoDeDiseño v6.4"
|
|
errors_fixed:
|
|
- "InfografiaInteractivaExercise: Cannot read properties of undefined (reading 'filter')"
|
|
- "QuizTikTokExercise: Cannot read properties of undefined (reading '0')"
|
|
documentation:
|
|
- "orchestration/analisis/PLAN-CORRECCION-ERRORES-M4-2025-12-18.md"
|
|
- "orchestration/reportes/HISTORIAL-CORRECCIONES-2025.md#limpieza-m4-ejercicios-001"
|
|
|
|
- date: "2025-12-18"
|
|
tarea_id: "IMPL-M4M5-CORRECCIONES-001"
|
|
type: "Feature Implementation - M4-M5 Corrections"
|
|
status: "⚠️ PARCIALMENTE REVERTIDO"
|
|
reversion_reason: "M4 files eliminados por LIMPIEZA-M4-EJERCICIOS-001 - solo M5 files vigentes"
|
|
description: "Correcciones estructura M5: types, schemas, mockData extraídos de componentes"
|
|
changes:
|
|
module4_eliminado:
|
|
note: "TODOS los archivos M4 fueron eliminados - ejercicios no oficiales según DocumentoDeDiseño v6.4"
|
|
files_removed:
|
|
- "ResenaCritica/ - directorio completo ELIMINADO"
|
|
- "ChatLiterario/ - directorio completo ELIMINADO"
|
|
- "EmailFormal/ - directorio completo ELIMINADO"
|
|
- "EnsayoArgumentativo/ - directorio completo ELIMINADO"
|
|
module5_vigente:
|
|
- "ComicDigital/comicDigitalTypes.ts - Types para paneles y speech bubbles"
|
|
- "ComicDigital/comicDigitalSchemas.ts - Zod schemas para cómic digital"
|
|
- "ComicDigital/comicDigitalMockData.ts - Mock layouts, backgrounds, templates"
|
|
- "DiarioMultimedia/diarioMultimediaTypes.ts - Types para diario multimedia"
|
|
- "DiarioMultimedia/diarioMultimediaSchemas.ts - Zod schemas para entradas diario"
|
|
- "DiarioMultimedia/diarioMultimediaMockData.ts - Mock themes y prompts"
|
|
- "VideoCarta/videoCartaTypes.ts - Types para video carta"
|
|
- "VideoCarta/videoCartaSchemas.ts - Zod schemas para secciones video"
|
|
- "VideoCarta/videoCartaMockData.ts - Mock secciones y filtros"
|
|
files_created_vigentes: 9
|
|
files_removed: 8
|
|
impact:
|
|
- "M5: 3 mecánicas con estructura completa extraída de componentes TSX"
|
|
- "M4: Reducido a 5 ejercicios oficiales según DocumentoDeDiseño v6.4"
|
|
reference: "orchestration/reportes/HISTORIAL-CORRECCIONES-2025.md#limpieza-m4-ejercicios-001"
|
|
documentation:
|
|
- "orchestration/analisis/PLAN-IMPLEMENTACION-M4-M5-2025-12-18.md"
|
|
|
|
- date: "2025-12-15"
|
|
tarea_id: "IMPL-ACHIEVEMENTS-001"
|
|
type: "Feature Fix - Achievements System Frontend"
|
|
description: "Correcciones del sistema de achievements en frontend"
|
|
changes:
|
|
types:
|
|
- "useDashboardData.ts: Extendido AchievementData con campos mlCoinsReward, xpReward, rewards"
|
|
- "achievementsTypes.ts: Corregido imports de tipos SSOT (AchievementCategory, AchievementReward)"
|
|
components:
|
|
- "ProgressTreeVisualizer.tsx: Expandido iconMap de 4 a 35+ iconos Lucide"
|
|
- "AchievementsPreview.tsx: Recompensas dinámicas en lugar de hardcoded (+50 ML, +100 XP)"
|
|
files_modified:
|
|
- "apps/frontend/src/apps/student/hooks/useDashboardData.ts"
|
|
- "apps/frontend/src/features/gamification/social/types/achievementsTypes.ts"
|
|
- "apps/frontend/src/features/gamification/social/components/Achievements/ProgressTreeVisualizer.tsx"
|
|
- "apps/frontend/src/apps/student/components/gamification/AchievementsPreview.tsx"
|
|
impact:
|
|
- "Tipos Achievement y AchievementData ahora compatibles"
|
|
- "Todos los iconos de achievements se muestran correctamente"
|
|
- "Recompensas muestran valores reales del backend"
|
|
documentation:
|
|
- "orchestration/reportes/IMPL-ACHIEVEMENTS-2025-12-15.md"
|
|
|
|
- date: "2025-11-29"
|
|
tarea_id: "M4-M5-IMPLEMENTATION"
|
|
type: "Epic Implementation - Modules 4 & 5 Frontend"
|
|
description: "Implementación de mecánicas creativas M4-M5 con sistema de revisión manual"
|
|
changes:
|
|
- "MediaUploader component"
|
|
- "RubricEvaluator component"
|
|
- "ReviewPanelPage"
|
|
- "useVideoRecorder hook"
|
|
- "useAudioRecorder hook"
|
|
impact:
|
|
- "8 mecánicas creativas implementadas"
|
|
- "Sistema de upload multimedia funcional"
|
|
- "Panel de revisión para docentes"
|