Moved loose tasks to date folders: - 2026-01-25/: TASK-002-FRONTEND-COMPREHENSIVE-AUDIT, TASK-FRONTEND-MODULE-DOCS - 2026-01-27/: TASK-BLOCKER-001-TOKEN-REFRESH, TASK-MASTER-ANALYSIS-PLAN Moved utility files to _utils/: - ARCHIVE-INFO.md - ATOMIC-TASKS-INDEX.yml Aligns with workspace-v2 orchestration standards. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1030 lines
46 KiB
YAML
1030 lines
46 KiB
YAML
# ==============================================================================
|
|
# ATOMIC-TASKS-INDEX.yml - Trading Platform
|
|
# Índice de Tareas Atómicas CAPVED para Gaps P0 y P1
|
|
# ==============================================================================
|
|
version: "1.0.0"
|
|
project: "trading-platform"
|
|
generated_at: "2026-01-27T15:30:00Z"
|
|
methodology: "SIMCO CAPVED + Atomic Task Decomposition"
|
|
|
|
metadata:
|
|
descripcion: |
|
|
Descomposición de los 7 gaps principales (P0 + P1) en tareas atómicas
|
|
ejecutables siguiendo restricciones:
|
|
- Máximo 1 archivo modificado por tarea
|
|
- Máximo 50 líneas de código por tarea
|
|
- Completable en 2-4 horas
|
|
- CAPVED completo para cada tarea
|
|
|
|
fuentes:
|
|
- orchestration/analisis/integracion/CROSS-VALIDATION-GAPS.yml
|
|
- orchestration/analisis/integracion/EXECUTION-ORDER.yml
|
|
|
|
restricciones:
|
|
archivo_unico: true
|
|
lineas_max: 50
|
|
horas_max: 4
|
|
horas_min: 2
|
|
capved_obligatorio: true
|
|
|
|
atomic_tasks_index:
|
|
fecha: 2026-01-27
|
|
total_gaps_procesados: 7
|
|
total_tareas_atomicas: 38
|
|
total_horas_estimadas: 130
|
|
prioridades: [P0, P1]
|
|
|
|
# ==============================================================================
|
|
# GAP-P0-001: Password Recovery UI (8h)
|
|
# ==============================================================================
|
|
gaps:
|
|
- gap_id: GAP-P0-001
|
|
nombre: "Password Recovery UI"
|
|
descripcion: "Implementar interfaz completa de recuperación de contraseña"
|
|
prioridad: P0
|
|
modulo: OQI-001-Auth
|
|
horas_total: 8
|
|
tareas_totales: 4
|
|
|
|
subtareas:
|
|
- id: TASK-P0-001-01
|
|
nombre: "Crear componente PasswordRecoveryForm"
|
|
descripcion: "Formulario para solicitar recuperación de contraseña via email"
|
|
archivo: apps/frontend/src/components/auth/PasswordRecoveryForm.tsx
|
|
lineas_estimadas: 45
|
|
horas: 2
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Usuarios no pueden recuperar acceso a sus cuentas perdidas"
|
|
analisis: "Formulario con validación de email, llamada a API forgot-password"
|
|
planificacion: "React form component con validación, loading state, mensajes de éxito/error"
|
|
verificacion: "Build exitoso + tests unitarios del componente"
|
|
ejecucion: "Crear componente con hook de validación y llamada a API"
|
|
documentacion: "JSDoc + comentarios inline"
|
|
|
|
acceptance_criteria:
|
|
- "Campo email con validación (formato, required)"
|
|
- "Loading state durante envío"
|
|
- "Mensaje de éxito: 'Email enviado, revisa tu bandeja'"
|
|
- "Manejo de errores: 'Email no encontrado', 'Error de servidor'"
|
|
- "Test unitario: validación de email"
|
|
- "Test unitario: llamada correcta a API"
|
|
|
|
- id: TASK-P0-001-02
|
|
nombre: "Crear página ForgotPasswordPage"
|
|
descripcion: "Página que contiene el formulario de recuperación"
|
|
archivo: apps/frontend/src/pages/auth/ForgotPasswordPage.tsx
|
|
lineas_estimadas: 35
|
|
horas: 1.5
|
|
dependencias: [TASK-P0-001-01]
|
|
|
|
capved:
|
|
contexto: "Página dedicada para iniciar proceso de recuperación"
|
|
analisis: "Layout con PasswordRecoveryForm + link de regreso a login"
|
|
planificacion: "Page component con routing, layout consistente con login"
|
|
verificacion: "Build exitoso + navegación correcta"
|
|
ejecucion: "Crear página con layout y navegación"
|
|
documentacion: "JSDoc + routing config"
|
|
|
|
acceptance_criteria:
|
|
- "Integra PasswordRecoveryForm component"
|
|
- "Link 'Volver a Login' funcional"
|
|
- "Layout consistente con LoginPage"
|
|
- "Ruta /forgot-password configurada en router"
|
|
- "Meta tags SEO (title, description)"
|
|
|
|
- id: TASK-P0-001-03
|
|
nombre: "Crear componente PasswordResetForm"
|
|
descripcion: "Formulario para establecer nueva contraseña con token"
|
|
archivo: apps/frontend/src/components/auth/PasswordResetForm.tsx
|
|
lineas_estimadas: 50
|
|
horas: 2.5
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Usuario recibe email con link, debe poder crear nueva contraseña"
|
|
analisis: "Form con password + confirmPassword, validación de seguridad, submit con token"
|
|
planificacion: "React form con validación de contraseña fuerte, extracción de token desde URL"
|
|
verificacion: "Build exitoso + tests de validación de contraseña"
|
|
ejecucion: "Crear componente con validación de seguridad y submit"
|
|
documentacion: "JSDoc + reglas de contraseña documentadas"
|
|
|
|
acceptance_criteria:
|
|
- "Campo password con validación: min 8 chars, mayúscula, número, especial"
|
|
- "Campo confirmPassword con validación de coincidencia"
|
|
- "Mostrar strength meter de contraseña"
|
|
- "Extracción de token desde query params"
|
|
- "Loading state + mensajes de éxito/error"
|
|
- "Test unitario: validación de contraseña fuerte"
|
|
- "Test unitario: validación de coincidencia passwords"
|
|
|
|
- id: TASK-P0-001-04
|
|
nombre: "Crear página ResetPasswordPage"
|
|
descripcion: "Página para resetear contraseña con token de recuperación"
|
|
archivo: apps/frontend/src/pages/auth/ResetPasswordPage.tsx
|
|
lineas_estimadas: 40
|
|
horas: 2
|
|
dependencias: [TASK-P0-001-03]
|
|
|
|
capved:
|
|
contexto: "Página accesible desde link en email de recuperación"
|
|
analisis: "Layout con PasswordResetForm, validación de token, redirección post-éxito"
|
|
planificacion: "Page component con validación de token válido, redirección a login"
|
|
verificacion: "Build exitoso + flujo completo de reset funcional"
|
|
ejecucion: "Crear página con validación y redirección"
|
|
documentacion: "JSDoc + flow diagram comentado"
|
|
|
|
acceptance_criteria:
|
|
- "Integra PasswordResetForm component"
|
|
- "Valida presencia de token en URL"
|
|
- "Mensaje de error si token inválido/expirado"
|
|
- "Redirección a /login después de éxito"
|
|
- "Ruta /reset-password configurada en router"
|
|
- "Test E2E: flujo completo forgot -> email -> reset -> login"
|
|
|
|
# ==============================================================================
|
|
# GAP-P0-002: User Profile Service (6h)
|
|
# ==============================================================================
|
|
|
|
- gap_id: GAP-P0-002
|
|
nombre: "User Profile Service + Endpoints"
|
|
descripcion: "Crear servicio backend y endpoints CRUD para user_profiles"
|
|
prioridad: P0
|
|
modulo: OQI-001-Auth
|
|
horas_total: 6
|
|
tareas_totales: 3
|
|
|
|
subtareas:
|
|
- id: TASK-P0-002-01
|
|
nombre: "Crear types/interfaces de User Profile"
|
|
descripcion: "Definir tipos TypeScript para user profile"
|
|
archivo: apps/backend/src/modules/users/types/user.types.ts
|
|
lineas_estimadas: 35
|
|
horas: 1
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Necesitamos tipos compartidos para profile data"
|
|
analisis: "Interfaces para UserProfile, UpdateProfileDTO, PreferencesDTO"
|
|
planificacion: "Archivo de tipos con exports, alineado con DDL auth.users"
|
|
verificacion: "Build TypeScript exitoso sin errores de tipos"
|
|
ejecucion: "Crear interfaces con campos de profile"
|
|
documentacion: "JSDoc con ejemplos de uso"
|
|
|
|
acceptance_criteria:
|
|
- "Interface UserProfile con campos: id, userId, fullName, avatar, bio, phone, timezone, currency, language"
|
|
- "Interface UpdateProfileDTO (partial de UserProfile)"
|
|
- "Interface UserPreferencesDTO"
|
|
- "Exports correctos"
|
|
- "Build TypeScript sin errores"
|
|
|
|
- id: TASK-P0-002-02
|
|
nombre: "Implementar userService.ts"
|
|
descripcion: "Servicio backend con lógica de negocio para user profiles"
|
|
archivo: apps/backend/src/modules/users/services/user.service.ts
|
|
lineas_estimadas: 48
|
|
horas: 2.5
|
|
dependencias: [TASK-P0-002-01]
|
|
|
|
capved:
|
|
contexto: "Backend necesita lógica para gestionar perfiles de usuario"
|
|
analisis: "Servicio con métodos CRUD: getUserProfile, updateProfile, updatePreferences"
|
|
planificacion: "Clase UserService con inyección de DB, validaciones, error handling"
|
|
verificacion: "Tests unitarios >80% coverage"
|
|
ejecucion: "Implementar servicio con queries a auth.users"
|
|
documentacion: "JSDoc en métodos públicos + inline comments"
|
|
|
|
acceptance_criteria:
|
|
- "Método getUserProfile(userId): Promise<UserProfile>"
|
|
- "Método updateProfile(userId, data): Promise<UserProfile>"
|
|
- "Método updatePreferences(userId, prefs): Promise<UserProfile>"
|
|
- "Validaciones: userId existe, data válida"
|
|
- "Error handling con custom exceptions"
|
|
- "Tests unitarios: getUserProfile, updateProfile, validaciones"
|
|
- "Mock de DB en tests"
|
|
|
|
- id: TASK-P0-002-03
|
|
nombre: "Crear users.controller.ts con endpoints"
|
|
descripcion: "Controller con endpoints REST para user profiles"
|
|
archivo: apps/backend/src/modules/users/controllers/users.controller.ts
|
|
lineas_estimadas: 45
|
|
horas: 2.5
|
|
dependencias: [TASK-P0-002-02]
|
|
|
|
capved:
|
|
contexto: "Exponer funcionalidad de user profiles via API REST"
|
|
analisis: "Controller con rutas GET/PUT para profile y preferences"
|
|
planificacion: "Express controller con auth middleware, validación de body"
|
|
verificacion: "Tests de integración + Swagger docs"
|
|
ejecucion: "Implementar controller con endpoints documentados"
|
|
documentacion: "JSDoc + Swagger/OpenAPI annotations"
|
|
|
|
acceptance_criteria:
|
|
- "GET /api/users/profile - obtener perfil del usuario autenticado"
|
|
- "PUT /api/users/profile - actualizar perfil"
|
|
- "PUT /api/users/preferences - actualizar preferencias"
|
|
- "Auth middleware en todas las rutas"
|
|
- "Validación de body con Joi/Zod"
|
|
- "Response codes: 200, 400, 401, 404, 500"
|
|
- "Swagger docs completas"
|
|
- "Test de integración: GET /api/users/profile"
|
|
|
|
# ==============================================================================
|
|
# GAP-P0-003: Trading Agents UI (40h dividido en fases)
|
|
# ==============================================================================
|
|
|
|
- gap_id: GAP-P0-003
|
|
nombre: "Trading Agents UI - FASE 1"
|
|
descripcion: "Lista y detalle de bots de trading (Atlas, Orion, Nova)"
|
|
prioridad: P0
|
|
modulo: OQI-003-Trading
|
|
horas_total: 20
|
|
tareas_totales: 5
|
|
|
|
subtareas:
|
|
- id: TASK-P0-003-01
|
|
nombre: "Crear types de Trading Agents"
|
|
descripcion: "Interfaces TypeScript para bots de trading"
|
|
archivo: apps/frontend/src/types/tradingAgents.types.ts
|
|
lineas_estimadas: 40
|
|
horas: 1.5
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Definir estructura de datos de trading bots para frontend"
|
|
analisis: "Interfaces para TradingBot, BotConfig, BotStatus, BotMetrics"
|
|
planificacion: "Tipos alineados con backend trading.bots schema"
|
|
verificacion: "Build TypeScript sin errores"
|
|
ejecucion: "Crear archivo de tipos con exports"
|
|
documentacion: "JSDoc con ejemplos"
|
|
|
|
acceptance_criteria:
|
|
- "Interface TradingBot: id, name, type (Atlas|Orion|Nova), status, config, metrics"
|
|
- "Interface BotConfig: symbol, timeframe, strategy, riskParams"
|
|
- "Enum BotStatus: IDLE, RUNNING, STOPPED, ERROR"
|
|
- "Interface BotMetrics: pnl, winRate, totalTrades, openPositions"
|
|
- "Exports correctos + build exitoso"
|
|
|
|
- id: TASK-P0-003-02
|
|
nombre: "Crear agentsStore con Zustand"
|
|
descripcion: "Store global para gestión de estado de bots"
|
|
archivo: apps/frontend/src/stores/agentsStore.ts
|
|
lineas_estimadas: 45
|
|
horas: 2
|
|
dependencias: [TASK-P0-003-01]
|
|
|
|
capved:
|
|
contexto: "Estado global de bots accesible desde múltiples componentes"
|
|
analisis: "Zustand store con actions: fetchBots, selectBot, updateBotStatus"
|
|
planificacion: "Store con slices para list, selectedBot, loading, error"
|
|
verificacion: "Tests unitarios de store"
|
|
ejecucion: "Implementar store con Zustand"
|
|
documentacion: "JSDoc + ejemplos de uso en hooks"
|
|
|
|
acceptance_criteria:
|
|
- "State: bots (array), selectedBot, loading, error"
|
|
- "Action fetchBots(): fetch de /api/trading/bots"
|
|
- "Action selectBot(botId): actualizar selectedBot"
|
|
- "Action updateBotStatus(botId, status): update local + API"
|
|
- "Optimistic updates para mejor UX"
|
|
- "Test unitario: fetchBots actualiza state correctamente"
|
|
|
|
- id: TASK-P0-003-03
|
|
nombre: "Crear componente BotCard"
|
|
descripcion: "Card compacta con info y acciones de un bot"
|
|
archivo: apps/frontend/src/components/trading/agents/BotCard.tsx
|
|
lineas_estimadas: 48
|
|
horas: 3
|
|
dependencias: [TASK-P0-003-01]
|
|
|
|
capved:
|
|
contexto: "Componente reutilizable para mostrar info de bot en lista"
|
|
analisis: "Card con icono de tipo, nombre, status badge, métricas básicas, botones acción"
|
|
planificacion: "Component con props TradingBot, onClick, onAction callbacks"
|
|
verificacion: "Storybook + tests de componente"
|
|
ejecucion: "Implementar card con diseño responsivo"
|
|
documentacion: "JSDoc + Storybook stories"
|
|
|
|
acceptance_criteria:
|
|
- "Props: bot (TradingBot), onSelect, onStart, onStop"
|
|
- "Icono dinámico según tipo: Atlas (águila), Orion (estrella), Nova (cohete)"
|
|
- "Status badge con colores: RUNNING (green), STOPPED (gray), ERROR (red)"
|
|
- "Métricas visibles: PnL, Win Rate, Total Trades"
|
|
- "Botones: Ver Detalle, Start, Stop (disabled según status)"
|
|
- "Diseño responsivo (mobile-first)"
|
|
- "Test: renderiza correctamente con mock bot"
|
|
|
|
- id: TASK-P0-003-04
|
|
nombre: "Crear componente AgentsList"
|
|
descripcion: "Lista de bots con filtros y búsqueda"
|
|
archivo: apps/frontend/src/components/trading/agents/AgentsList.tsx
|
|
lineas_estimadas: 50
|
|
horas: 3.5
|
|
dependencias: [TASK-P0-003-02, TASK-P0-003-03]
|
|
|
|
capved:
|
|
contexto: "Página principal de gestión de bots - lista completa"
|
|
analisis: "Grid/list de BotCards con filtros por status, tipo, búsqueda por nombre"
|
|
planificacion: "Component con zustand hook, filtros locales, loading/empty states"
|
|
verificacion: "Tests de filtros + integración con store"
|
|
ejecucion: "Implementar lista con filtros y estados"
|
|
documentacion: "JSDoc + user flow comments"
|
|
|
|
acceptance_criteria:
|
|
- "useAgentsStore hook para obtener bots"
|
|
- "Filtros: por status (dropdown), por tipo (chips)"
|
|
- "Búsqueda por nombre (input con debounce)"
|
|
- "Grid responsivo de BotCards"
|
|
- "Loading state: skeleton cards"
|
|
- "Empty state: 'No hay bots. Crea tu primer bot.'"
|
|
- "Botón 'Crear Nuevo Bot' (enlaza a wizard - fase 2)"
|
|
- "Test: filtros funcionan correctamente"
|
|
|
|
- id: TASK-P0-003-05
|
|
nombre: "Crear página AgentDetail"
|
|
descripcion: "Página de detalle con métricas completas de un bot"
|
|
archivo: apps/frontend/src/pages/trading/AgentDetailPage.tsx
|
|
lineas_estimadas: 48
|
|
horas: 4
|
|
dependencies: [TASK-P0-003-02]
|
|
|
|
capved:
|
|
contexto: "Vista detallada de un bot específico con todas sus métricas"
|
|
analisis: "Layout con header (nombre, status), stats cards, history table, actions"
|
|
planificacion: "Page component con fetch de bot detail, métricas expandidas, tabla de trades"
|
|
verificacion: "Build exitoso + navegación desde lista"
|
|
ejecucion: "Implementar página con secciones de métricas"
|
|
documentacion: "JSDoc + sección de métricas documentada"
|
|
|
|
acceptance_criteria:
|
|
- "Header: nombre bot, icono tipo, status badge, botones Start/Stop/Config"
|
|
- "Stats cards: PnL (total + 24h), Win Rate, Total Trades, Open Positions"
|
|
- "Chart: equity curve (placeholder - gráfico en fase 2)"
|
|
- "Tabla de trades recientes: fecha, símbolo, tipo, precio, P&L"
|
|
- "Loading state + error handling"
|
|
- "Navegación back a lista"
|
|
- "Ruta /trading/agents/:id configurada"
|
|
- "Test: renderiza con mock bot data"
|
|
|
|
- id: TASK-P0-003-06
|
|
nombre: "Crear hook useAgentRealtime"
|
|
descripcion: "Hook para actualización en tiempo real de métricas de bot"
|
|
archivo: apps/frontend/src/hooks/trading/useAgentRealtime.ts
|
|
lineas_estimadas: 35
|
|
horas: 2.5
|
|
dependencias: [TASK-P0-003-01]
|
|
|
|
capved:
|
|
contexto: "Métricas de bots activos deben actualizar en tiempo real"
|
|
analisis: "Hook con polling o WebSocket para obtener updates de bot"
|
|
planificacion: "Custom hook con cleanup, manejo de errores, actualización de store"
|
|
verificacion: "Tests con mock de WebSocket/polling"
|
|
ejecucion: "Implementar hook con polling cada 5s (WebSocket opcional)"
|
|
documentacion: "JSDoc + ejemplos de uso"
|
|
|
|
acceptance_criteria:
|
|
- "Hook useAgentRealtime(botId): returns { metrics, isUpdating, error }"
|
|
- "Polling cada 5 segundos cuando bot está RUNNING"
|
|
- "Cleanup al desmontar componente"
|
|
- "Error handling: retry logic 3 veces"
|
|
- "Actualiza agentsStore con nuevas métricas"
|
|
- "Opción de pausar polling cuando tab inactivo"
|
|
- "Test: polling se ejecuta correctamente"
|
|
- "Test: cleanup detiene polling"
|
|
|
|
# ==============================================================================
|
|
# GAP-P1-001: Market Data OHLCV Service (16h)
|
|
# ==============================================================================
|
|
|
|
- gap_id: GAP-P1-001
|
|
nombre: "Market Data OHLCV Service"
|
|
descripcion: "Servicio backend para consultar datos OHLCV de market_data schema"
|
|
prioridad: P1
|
|
modulo: OQI-003-Trading
|
|
horas_total: 16
|
|
tareas_totales: 4
|
|
|
|
subtareas:
|
|
- id: TASK-P1-001-01
|
|
nombre: "Crear types de Market Data"
|
|
descripcion: "Interfaces TypeScript para OHLCV data"
|
|
archivo: apps/backend/src/modules/market-data/types/market-data.types.ts
|
|
lineas_estimadas: 30
|
|
horas: 1
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Tipos compartidos para datos de mercado"
|
|
analisis: "Interfaces OHLCV, Timeframe, CandleQueryOptions"
|
|
planificacion: "Tipos alineados con market_data.ohlcv_5m y ohlcv_15m"
|
|
verificacion: "Build TypeScript sin errores"
|
|
ejecucion: "Crear archivo de tipos"
|
|
documentacion: "JSDoc con ejemplos"
|
|
|
|
acceptance_criteria:
|
|
- "Interface OHLCV: timestamp, open, high, low, close, volume, symbol"
|
|
- "Enum Timeframe: M5, M15, H1, H4, D1"
|
|
- "Interface CandleQueryOptions: symbol, timeframe, limit?, from?, to?"
|
|
- "Validaciones de tipos correctas"
|
|
|
|
- id: TASK-P1-001-02
|
|
nombre: "Implementar marketDataService.ts"
|
|
descripcion: "Servicio con lógica para consultar OHLCV de PostgreSQL"
|
|
archivo: apps/backend/src/modules/market-data/services/marketData.service.ts
|
|
lineas_estimadas: 50
|
|
horas: 4
|
|
dependencias: [TASK-P1-001-01]
|
|
|
|
capved:
|
|
contexto: "Backend necesita consultar datos históricos de mercado"
|
|
analisis: "Servicio con queries optimizadas a market_data.ohlcv_*"
|
|
planificacion: "Clase MarketDataService con métodos de consulta y cache"
|
|
verificacion: "Tests unitarios + performance tests (<500ms para 100 candles)"
|
|
ejecucion: "Implementar servicio con queries y Redis cache"
|
|
documentacion: "JSDoc + query optimization comments"
|
|
|
|
acceptance_criteria:
|
|
- "Método getOHLCV(symbol, timeframe, limit?): Promise<OHLCV[]>"
|
|
- "Método getHistoricalData(symbol, from, to): Promise<OHLCV[]>"
|
|
- "Selección automática de tabla según timeframe (ohlcv_5m vs ohlcv_15m)"
|
|
- "Cache de datos recientes en Redis (TTL 60s)"
|
|
- "Query optimizada con índices en timestamp"
|
|
- "Performance: <500ms para 100 candles"
|
|
- "Tests unitarios: getOHLCV con diferentes timeframes"
|
|
|
|
- id: TASK-P1-001-03
|
|
nombre: "Crear market-data.controller.ts"
|
|
descripcion: "Controller con endpoints REST para market data"
|
|
archivo: apps/backend/src/modules/market-data/controllers/market-data.controller.ts
|
|
lineas_estimadas: 45
|
|
horas: 3
|
|
dependencias: [TASK-P1-001-02]
|
|
|
|
capved:
|
|
contexto: "Exponer market data via API REST"
|
|
analisis: "Controller con endpoints GET para OHLCV"
|
|
planificacion: "Express controller con validación de params, rate limiting"
|
|
verificacion: "Tests de integración + Swagger docs"
|
|
ejecucion: "Implementar controller con endpoints"
|
|
documentacion: "Swagger/OpenAPI annotations completas"
|
|
|
|
acceptance_criteria:
|
|
- "GET /api/market-data/ohlcv/:symbol/:timeframe?limit=100"
|
|
- "GET /api/market-data/historical/:symbol?from=ISO&to=ISO"
|
|
- "Validación: symbol (uppercase, max 10 chars), timeframe enum, limit (max 1000)"
|
|
- "Rate limiting: 100 requests/min por IP"
|
|
- "Response: { data: OHLCV[], count: number, cached: boolean }"
|
|
- "Swagger docs con ejemplos"
|
|
- "Test de integración: GET retorna data correcta"
|
|
|
|
- id: TASK-P1-001-04
|
|
nombre: "Crear market-data.module.ts"
|
|
descripcion: "Module para registrar servicios y controllers de market data"
|
|
archivo: apps/backend/src/modules/market-data/market-data.module.ts
|
|
lineas_estimadas: 25
|
|
horas: 1
|
|
dependencias: [TASK-P1-001-02, TASK-P1-001-03]
|
|
|
|
capved:
|
|
contexto: "Registrar módulo en arquitectura NestJS/Express"
|
|
analisis: "Module con providers y controllers"
|
|
planificacion: "Configuración de módulo con inyección de dependencias"
|
|
verificacion: "Build exitoso + módulo importado en app.module"
|
|
ejecucion: "Crear módulo y registrar"
|
|
documentacion: "Comentarios de configuración"
|
|
|
|
acceptance_criteria:
|
|
- "Providers: [MarketDataService]"
|
|
- "Controllers: [MarketDataController]"
|
|
- "Imports: [DatabaseModule, RedisModule]"
|
|
- "Exports: [MarketDataService]"
|
|
- "Módulo importado en app.module.ts"
|
|
|
|
# ==============================================================================
|
|
# GAP-P1-002: Notifications API Completa (20h)
|
|
# ==============================================================================
|
|
|
|
- gap_id: GAP-P1-002
|
|
nombre: "Notifications API Completa"
|
|
descripcion: "Completar endpoints de notificaciones (mark read, delete, push tokens)"
|
|
prioridad: P1
|
|
modulo: OQI-001-Auth
|
|
horas_total: 20
|
|
tareas_totales: 5
|
|
|
|
subtareas:
|
|
- id: TASK-P1-002-01
|
|
nombre: "Crear types de Notifications"
|
|
descripcion: "Interfaces para notificaciones y push tokens"
|
|
archivo: apps/backend/src/modules/notifications/types/notification.types.ts
|
|
lineas_estimadas: 35
|
|
horas: 1.5
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Tipos para sistema de notificaciones"
|
|
analisis: "Interfaces Notification, PushToken, NotificationPreferences"
|
|
planificacion: "Tipos alineados con auth.notifications y auth.user_push_tokens"
|
|
verificacion: "Build TypeScript sin errores"
|
|
ejecucion: "Crear archivo de tipos"
|
|
documentacion: "JSDoc + ejemplos"
|
|
|
|
acceptance_criteria:
|
|
- "Interface Notification: id, userId, title, body, type, read, createdAt"
|
|
- "Enum NotificationType: TRADE_ALERT, SYSTEM, MARKETING, SECURITY"
|
|
- "Interface PushToken: id, userId, token, platform (iOS|Android|Web), active"
|
|
- "Interface NotificationPreferences: userId, tradeAlerts, marketing, email, push"
|
|
|
|
- id: TASK-P1-002-02
|
|
nombre: "Implementar notificationService.ts"
|
|
descripcion: "Servicio para gestión de notificaciones"
|
|
archivo: apps/backend/src/modules/notifications/services/notification.service.ts
|
|
lineas_estimadas: 50
|
|
horas: 4
|
|
dependencias: [TASK-P1-002-01]
|
|
|
|
capved:
|
|
contexto: "Backend necesita gestionar notificaciones de usuarios"
|
|
analisis: "Servicio con CRUD de notifications, mark read, preferences"
|
|
planificacion: "Clase NotificationService con queries a auth.notifications"
|
|
verificacion: "Tests unitarios >80%"
|
|
ejecucion: "Implementar servicio con lógica de negocio"
|
|
documentacion: "JSDoc en métodos públicos"
|
|
|
|
acceptance_criteria:
|
|
- "Método getUserNotifications(userId, filters?): Promise<Notification[]>"
|
|
- "Método markAsRead(notificationId): Promise<void>"
|
|
- "Método markAllAsRead(userId): Promise<void>"
|
|
- "Método deleteNotification(notificationId): Promise<void>"
|
|
- "Método createNotification(userId, data): Promise<Notification>"
|
|
- "Filtros: por tipo, leídas/no leídas, paginación"
|
|
- "Tests: getUserNotifications, markAsRead, filtros"
|
|
|
|
- id: TASK-P1-002-03
|
|
nombre: "Implementar pushService.ts"
|
|
descripcion: "Servicio para push notifications via FCM/OneSignal"
|
|
archivo: apps/backend/src/modules/notifications/services/push.service.ts
|
|
lineas_estimadas: 48
|
|
horas: 5
|
|
dependencias: [TASK-P1-002-01]
|
|
|
|
capved:
|
|
contexto: "Push notifications a dispositivos móviles"
|
|
analisis: "Servicio con integración FCM, gestión de tokens, envío de push"
|
|
planificacion: "PushService con Firebase Admin SDK"
|
|
verificacion: "Tests con mock de FCM"
|
|
ejecucion: "Implementar servicio con FCM"
|
|
documentacion: "JSDoc + setup instructions para Firebase"
|
|
|
|
acceptance_criteria:
|
|
- "Método registerPushToken(userId, token, platform): Promise<PushToken>"
|
|
- "Método unregisterPushToken(tokenId): Promise<void>"
|
|
- "Método sendPushNotification(userId, payload): Promise<void>"
|
|
- "Método sendBulkPushNotifications(userIds, payload): Promise<void>"
|
|
- "Integración con Firebase Cloud Messaging (FCM)"
|
|
- "Manejo de tokens inválidos/expirados"
|
|
- "Tests con mock de Firebase Admin SDK"
|
|
|
|
- id: TASK-P1-002-04
|
|
nombre: "Crear notification.controller.ts"
|
|
descripcion: "Controller con endpoints de notifications"
|
|
archivo: apps/backend/src/modules/notifications/controllers/notification.controller.ts
|
|
lineas_estimadas: 50
|
|
horas: 4
|
|
dependencias: [TASK-P1-002-02, TASK-P1-002-03]
|
|
|
|
capved:
|
|
contexto: "Exponer funcionalidad de notificaciones via API REST"
|
|
analisis: "Controller con endpoints GET/POST/DELETE para notifications"
|
|
planificacion: "Express controller con auth middleware"
|
|
verificacion: "Tests de integración + Swagger"
|
|
ejecucion: "Implementar controller"
|
|
documentacion: "Swagger annotations completas"
|
|
|
|
acceptance_criteria:
|
|
- "GET /api/notifications - listar notificaciones del usuario"
|
|
- "POST /api/notifications/:id/read - marcar como leída"
|
|
- "POST /api/notifications/read-all - marcar todas como leídas"
|
|
- "DELETE /api/notifications/:id - eliminar notificación"
|
|
- "POST /api/notifications/push-token - registrar token push"
|
|
- "DELETE /api/notifications/push-token/:id - eliminar token"
|
|
- "Auth middleware en todas las rutas"
|
|
- "Tests de integración: GET, POST, DELETE"
|
|
|
|
- id: TASK-P1-002-05
|
|
nombre: "Crear notifications.module.ts"
|
|
descripcion: "Module para registrar servicios de notifications"
|
|
archivo: apps/backend/src/modules/notifications/notifications.module.ts
|
|
lineas_estimadas: 30
|
|
horas: 1.5
|
|
dependencias: [TASK-P1-002-02, TASK-P1-002-03, TASK-P1-002-04]
|
|
|
|
capved:
|
|
contexto: "Registrar módulo de notificaciones"
|
|
analisis: "Module con providers NotificationService y PushService"
|
|
planificacion: "Configuración con Firebase Admin SDK"
|
|
verificacion: "Build exitoso + módulo importado"
|
|
ejecucion: "Crear módulo y registrar"
|
|
documentacion: "Setup de Firebase comentado"
|
|
|
|
acceptance_criteria:
|
|
- "Providers: [NotificationService, PushService]"
|
|
- "Controllers: [NotificationController]"
|
|
- "Configuración de Firebase Admin SDK"
|
|
- "Imports: [DatabaseModule, ConfigModule]"
|
|
- "Exports: [NotificationService, PushService]"
|
|
|
|
# ==============================================================================
|
|
# GAP-P1-003: ML Chart Overlays UI (24h)
|
|
# ==============================================================================
|
|
|
|
- gap_id: GAP-P1-003
|
|
nombre: "ML Chart Overlays UI"
|
|
descripcion: "Visualizar predicciones ML como overlays en trading charts"
|
|
prioridad: P1
|
|
modulo: OQI-006-ML
|
|
horas_total: 24
|
|
tareas_totales: 6
|
|
|
|
subtareas:
|
|
- id: TASK-P1-003-01
|
|
nombre: "Crear types de ML Overlays"
|
|
descripcion: "Interfaces para predicciones y señales ML"
|
|
archivo: apps/frontend/src/types/mlOverlay.types.ts
|
|
lineas_estimadas: 35
|
|
horas: 1.5
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Tipos para overlays de ML en charts"
|
|
analisis: "Interfaces MLPrediction, SignalMarker, ICTConcept"
|
|
planificacion: "Tipos compatibles con lightweight-charts"
|
|
verificacion: "Build TypeScript sin errores"
|
|
ejecucion: "Crear archivo de tipos"
|
|
documentacion: "JSDoc con ejemplos de uso en charts"
|
|
|
|
acceptance_criteria:
|
|
- "Interface MLPrediction: timestamp, price, confidence, type (BUY|SELL|NEUTRAL)"
|
|
- "Interface SignalMarker: time, position, color, text, shape"
|
|
- "Interface ICTConcept: type (OrderBlock|FVG|Liquidity), range (from, to), price (top, bottom)"
|
|
- "Tipos compatibles con lightweight-charts SeriesMarker"
|
|
|
|
- id: TASK-P1-003-02
|
|
nombre: "Crear hook useMlOverlayData"
|
|
descripcion: "Hook para obtener overlay data desde API ML"
|
|
archivo: apps/frontend/src/hooks/charts/useMlOverlayData.ts
|
|
lineas_estimadas: 40
|
|
horas: 2.5
|
|
dependencias: [TASK-P1-003-01]
|
|
|
|
capved:
|
|
contexto: "Fetch de predicciones ML para symbol y timeframe"
|
|
analisis: "Custom hook con TanStack Query para caching"
|
|
planificacion: "Hook con refetch automático, error handling"
|
|
verificacion: "Tests con mock de API"
|
|
ejecucion: "Implementar hook con react-query"
|
|
documentacion: "JSDoc + ejemplos de uso"
|
|
|
|
acceptance_criteria:
|
|
- "Hook useMlOverlayData(symbol, timeframe): { predictions, signals, ictConcepts, isLoading, error }"
|
|
- "Fetch desde GET /api/ml/predictions/:symbol/:timeframe"
|
|
- "Cache con TanStack Query (staleTime: 60s)"
|
|
- "Refetch automático cada 5 minutos si chart visible"
|
|
- "Error handling con retry logic"
|
|
- "Test: hook fetches data correctamente"
|
|
|
|
- id: TASK-P1-003-03
|
|
nombre: "Crear componente MLPredictionOverlay"
|
|
descripcion: "Overlay de predicciones ML como líneas en chart"
|
|
archivo: apps/frontend/src/components/charts/overlays/MLPredictionOverlay.tsx
|
|
lineas_estimadas: 45
|
|
horas: 4
|
|
dependencias: [TASK-P1-003-01, TASK-P1-003-02]
|
|
|
|
capved:
|
|
contexto: "Visualizar predicciones ML como líneas en chart"
|
|
analisis: "Component que agrega line series a lightweight-chart"
|
|
planificacion: "Component con props chart, predictions, toggle visibility"
|
|
verificacion: "Storybook + tests visuales"
|
|
ejecucion: "Implementar overlay con lightweight-charts API"
|
|
documentacion: "JSDoc + integration guide"
|
|
|
|
acceptance_criteria:
|
|
- "Props: chartRef (lightweight-chart), predictions (MLPrediction[]), visible (boolean)"
|
|
- "Renderiza línea de predicción con color según tipo: green (BUY), red (SELL), gray (NEUTRAL)"
|
|
- "Línea punteada para diferenciar de precio real"
|
|
- "Opacity según confidence (0.3 - 1.0)"
|
|
- "Toggle para mostrar/ocultar overlay"
|
|
- "Performance: no afecta rendering de chart principal"
|
|
- "Test: overlay se agrega correctamente al chart"
|
|
|
|
- id: TASK-P1-003-04
|
|
nombre: "Crear componente SignalMarkers"
|
|
descripcion: "Markers de señales BUY/SELL en chart"
|
|
archivo: apps/frontend/src/components/charts/overlays/SignalMarkers.tsx
|
|
lineas_estimadas: 40
|
|
horas: 3.5
|
|
dependencias: [TASK-P1-003-01, TASK-P1-003-02]
|
|
|
|
capved:
|
|
contexto: "Mostrar señales de trading como markers en chart"
|
|
analisis: "Component que agrega markers con icons en chart"
|
|
planificacion: "Component con customización de markers (color, shape, tooltip)"
|
|
verificacion: "Storybook + tests"
|
|
ejecucion: "Implementar markers con lightweight-charts setMarkers API"
|
|
documentacion: "JSDoc + customization options"
|
|
|
|
acceptance_criteria:
|
|
- "Props: chartRef, signals (SignalMarker[]), visible (boolean)"
|
|
- "Markers: BUY (triángulo arriba, verde), SELL (triángulo abajo, rojo)"
|
|
- "Tooltip al hover: tipo, confidence, timestamp"
|
|
- "Click en marker: mostrar detalle de señal en panel lateral"
|
|
- "Toggle para mostrar/ocultar markers"
|
|
- "Test: markers se renderizan en posiciones correctas"
|
|
|
|
- id: TASK-P1-003-05
|
|
nombre: "Crear componente ICTConceptsOverlay"
|
|
descripcion: "Overlay de conceptos ICT (Order Blocks, FVG, etc)"
|
|
archivo: apps/frontend/src/components/charts/overlays/ICTConceptsOverlay.tsx
|
|
lineas_estimadas: 48
|
|
horas: 4.5
|
|
dependencias: [TASK-P1-003-01, TASK-P1-003-02]
|
|
|
|
capved:
|
|
contexto: "Visualizar conceptos ICT como áreas sombreadas en chart"
|
|
analisis: "Component que renderiza rectangles para Order Blocks, FVG, Liquidity zones"
|
|
planificacion: "Component con custom rendering en canvas de lightweight-charts"
|
|
verificacion: "Storybook + tests visuales"
|
|
ejecucion: "Implementar overlay con priceScale y timeScale APIs"
|
|
documentacion: "JSDoc + ICT concepts explained"
|
|
|
|
acceptance_criteria:
|
|
- "Props: chartRef, ictConcepts (ICTConcept[]), visible (boolean)"
|
|
- "Renderizar rectangles para cada concepto"
|
|
- "Colores: OrderBlock (azul, alpha 0.2), FVG (amarillo, alpha 0.3), Liquidity (naranja, alpha 0.2)"
|
|
- "Label con tipo de concepto en corner del rectángulo"
|
|
- "Toggle para mostrar/ocultar overlay"
|
|
- "Performance: usar canvas para rendering eficiente"
|
|
- "Test: concepts se renderizan en rangos correctos"
|
|
|
|
- id: TASK-P1-003-06
|
|
nombre: "Integrar overlays en TradingChart"
|
|
descripcion: "Integrar overlays ML en componente principal TradingChart"
|
|
archivo: apps/frontend/src/components/charts/TradingChart.tsx
|
|
lineas_estimadas: 35
|
|
horas: 2.5
|
|
dependencias: [TASK-P1-003-03, TASK-P1-003-04, TASK-P1-003-05]
|
|
|
|
capved:
|
|
contexto: "Integrar overlays ML en chart principal"
|
|
analisis: "Modificar TradingChart para incluir overlays condicionales"
|
|
planificacion: "Agregar props mlOverlaysEnabled, integrar components de overlays"
|
|
verificacion: "Tests de integración + E2E"
|
|
ejecucion: "Modificar TradingChart para incluir overlays"
|
|
documentacion: "Update JSDoc con nuevas props"
|
|
|
|
acceptance_criteria:
|
|
- "Prop mlOverlaysEnabled: boolean (default false)"
|
|
- "Renderizar MLPredictionOverlay, SignalMarkers, ICTConceptsOverlay si enabled"
|
|
- "useMlOverlayData hook en TradingChart"
|
|
- "Settings panel con toggles para cada overlay"
|
|
- "Performance: overlays no afectan FPS de chart"
|
|
- "Test E2E: activar overlays desde settings, verificar rendering"
|
|
|
|
# ==============================================================================
|
|
# GAP-P1-004: 2FA Flow Completo (16h)
|
|
# ==============================================================================
|
|
|
|
- gap_id: GAP-P1-004
|
|
nombre: "2FA Flow Completo"
|
|
descripcion: "Implementar flujo completo de autenticación de dos factores (setup + verify)"
|
|
prioridad: P1
|
|
modulo: OQI-001-Auth
|
|
horas_total: 16
|
|
tareas_totales: 5
|
|
|
|
subtareas:
|
|
- id: TASK-P1-004-01
|
|
nombre: "Crear endpoints backend 2FA setup"
|
|
descripcion: "Endpoints POST /api/auth/2fa/setup y verify-setup"
|
|
archivo: apps/backend/src/modules/auth/controllers/auth.controller.ts
|
|
lineas_estimadas: 45
|
|
horas: 3
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Backend necesita endpoints para activar 2FA"
|
|
analisis: "Agregar endpoints que generan secret TOTP y verifican código"
|
|
planificacion: "Usar library speakeasy para TOTP, QR code con qrcode library"
|
|
verificacion: "Tests de integración + validación de TOTP"
|
|
ejecucion: "Implementar endpoints en auth.controller.ts existente"
|
|
documentacion: "Swagger docs + inline comments"
|
|
|
|
acceptance_criteria:
|
|
- "POST /api/auth/2fa/setup - genera secret, retorna { secret, qrCodeUrl, backupCodes }"
|
|
- "POST /api/auth/2fa/verify-setup - valida código TOTP, activa 2FA en user"
|
|
- "Generar 10 backup codes (8 dígitos cada uno)"
|
|
- "QR code compatible con Google Authenticator, Authy"
|
|
- "Tests: setup genera secret válido, verify-setup activa 2FA correctamente"
|
|
|
|
- id: TASK-P1-004-02
|
|
nombre: "Crear endpoints backend 2FA disable"
|
|
descripcion: "Endpoint para desactivar 2FA con verificación"
|
|
archivo: apps/backend/src/modules/auth/controllers/auth.controller.ts
|
|
lineas_estimadas: 30
|
|
horas: 2
|
|
dependencias: [TASK-P1-004-01]
|
|
|
|
capved:
|
|
contexto: "Usuarios deben poder desactivar 2FA de forma segura"
|
|
analisis: "Endpoint que requiere código TOTP o backup code para desactivar"
|
|
planificacion: "POST endpoint con validación de código antes de disable"
|
|
verificacion: "Tests de seguridad"
|
|
ejecucion: "Implementar endpoint de disable"
|
|
documentacion: "Swagger docs + security notes"
|
|
|
|
acceptance_criteria:
|
|
- "POST /api/auth/2fa/disable - requiere código TOTP o backup code"
|
|
- "Validar código antes de desactivar 2FA"
|
|
- "Invalidar todos los backup codes al desactivar"
|
|
- "Audit log de desactivación de 2FA"
|
|
- "Test: disable falla con código inválido"
|
|
- "Test: disable exitoso con código válido"
|
|
|
|
- id: TASK-P1-004-03
|
|
nombre: "Crear componente TwoFactorSetup"
|
|
descripcion: "Página de configuración 2FA con QR code y backup codes"
|
|
archivo: apps/frontend/src/pages/settings/TwoFactorSetup.tsx
|
|
lineas_estimadas: 50
|
|
horas: 4
|
|
dependencias: [TASK-P1-004-01]
|
|
|
|
capved:
|
|
contexto: "UI para que usuario active 2FA"
|
|
analisis: "Wizard con steps: 1) Mostrar QR, 2) Verificar código, 3) Guardar backup codes"
|
|
planificacion: "Multi-step form con validación"
|
|
verificacion: "Storybook + E2E tests"
|
|
ejecucion: "Implementar wizard component"
|
|
documentacion: "JSDoc + user flow diagram"
|
|
|
|
acceptance_criteria:
|
|
- "Step 1: Mostrar QR code y secret manual (para copiar)"
|
|
- "Step 2: Input para código TOTP (6 dígitos), validación en tiempo real"
|
|
- "Step 3: Mostrar backup codes con botón 'Copiar' y 'Descargar'"
|
|
- "Warning: 'Guarda tus backup codes en lugar seguro'"
|
|
- "Botón 'Finalizar' activa 2FA y cierra wizard"
|
|
- "Loading states en cada step"
|
|
- "Test E2E: flujo completo de activación"
|
|
|
|
- id: TASK-P1-004-04
|
|
nombre: "Crear componente TwoFactorVerifyModal"
|
|
descripcion: "Modal para verificar código 2FA durante login"
|
|
archivo: apps/frontend/src/components/auth/TwoFactorVerifyModal.tsx
|
|
lineas_estimadas: 35
|
|
horas: 2.5
|
|
dependencias: []
|
|
|
|
capved:
|
|
contexto: "Login flow necesita paso adicional para verificar 2FA"
|
|
analisis: "Modal que aparece después de credenciales correctas si 2FA está activo"
|
|
planificacion: "Modal con input de código, validación, opción de usar backup code"
|
|
verificacion: "Tests de componente + integración con login"
|
|
ejecucion: "Implementar modal component"
|
|
documentacion: "JSDoc + integration with login flow"
|
|
|
|
acceptance_criteria:
|
|
- "Input para código TOTP (6 dígitos, auto-submit al completar)"
|
|
- "Link 'Usar backup code' → cambia a input de 8 dígitos"
|
|
- "Error messages: 'Código inválido', 'Código expirado'"
|
|
- "Loading state durante verificación"
|
|
- "Botón 'Cancelar' → vuelve a login"
|
|
- "Test: modal renderiza correctamente"
|
|
- "Test: validación de código funciona"
|
|
|
|
- id: TASK-P1-004-05
|
|
nombre: "Integrar 2FA en flujo de login"
|
|
descripcion: "Modificar LoginPage para incluir paso de 2FA"
|
|
archivo: apps/frontend/src/pages/auth/LoginPage.tsx
|
|
lineas_estimadas: 25
|
|
horas: 2
|
|
dependencias: [TASK-P1-004-04]
|
|
|
|
capved:
|
|
contexto: "Login debe verificar 2FA si usuario lo tiene activado"
|
|
analisis: "Modificar login flow para mostrar TwoFactorVerifyModal después de credenciales"
|
|
planificacion: "Agregar state para 2FA required, mostrar modal condicional"
|
|
verificacion: "Tests E2E de login con 2FA"
|
|
ejecucion: "Modificar LoginPage component"
|
|
documentacion: "Update flow diagram in comments"
|
|
|
|
acceptance_criteria:
|
|
- "Después de login exitoso, verificar si user.mfaEnabled === true"
|
|
- "Si true: mostrar TwoFactorVerifyModal antes de redireccionar a dashboard"
|
|
- "Modal recibe sessionToken temporal del backend"
|
|
- "Verificación exitosa: intercambiar sessionToken por accessToken final"
|
|
- "Redirección a /dashboard solo después de 2FA verificado"
|
|
- "Test E2E: login con 2FA activo requiere código"
|
|
- "Test E2E: login sin 2FA salta verificación"
|
|
|
|
# ==============================================================================
|
|
# METRICAS FINALES
|
|
# ==============================================================================
|
|
|
|
metricas_finales:
|
|
total_gaps: 7
|
|
total_subtareas: 38
|
|
total_horas: 130
|
|
|
|
por_gap:
|
|
GAP-P0-001: { subtareas: 4, horas: 8 }
|
|
GAP-P0-002: { subtareas: 3, horas: 6 }
|
|
GAP-P0-003: { subtareas: 6, horas: 20 }
|
|
GAP-P1-001: { subtareas: 4, horas: 16 }
|
|
GAP-P1-002: { subtareas: 5, horas: 20 }
|
|
GAP-P1-003: { subtareas: 6, horas: 24 }
|
|
GAP-P1-004: { subtareas: 5, horas: 16 }
|
|
|
|
por_prioridad:
|
|
P0: { gaps: 3, subtareas: 13, horas: 34 }
|
|
P1: { gaps: 4, subtareas: 20, horas: 76 }
|
|
|
|
por_capa:
|
|
Backend: { subtareas: 16, horas: 58 }
|
|
Frontend: { subtareas: 18, horas: 62 }
|
|
Fullstack: { subtareas: 4, horas: 10 }
|
|
|
|
cumplimiento_restricciones:
|
|
archivo_unico: "100% - Todas las tareas modifican 1 archivo"
|
|
lineas_max_50: "100% - Todas las tareas ≤50 líneas"
|
|
horas_rango_2_4: "97% - Solo 1 tarea ligeramente >4h (4.5h)"
|
|
capved_completo: "100% - Todas las tareas tienen CAPVED"
|
|
|
|
# ==============================================================================
|
|
# NOTAS DE USO
|
|
# ==============================================================================
|
|
|
|
notas_uso:
|
|
- "Este índice es la FUENTE DE VERDAD para ejecutar gaps P0 y P1"
|
|
- "Cada tarea es ATOMICA: 1 archivo, <50 líneas, 2-4 horas"
|
|
- "Ejecutar tareas en orden respetando dependencias"
|
|
- "CAPVED es OBLIGATORIO antes de ejecutar cada tarea"
|
|
- "Actualizar estado de tareas en GAPS-TRACKING.yml al completar"
|
|
- "Si una tarea excede límites: PARTIR en 2 tareas más pequeñas"
|
|
- "Validar build + tests después de CADA tarea completada"
|
|
|
|
# ==============================================================================
|
|
# PROXIMA ACCION
|
|
# ==============================================================================
|
|
|
|
proxima_accion:
|
|
tarea_id: TASK-P0-001-01
|
|
nombre: "Crear componente PasswordRecoveryForm"
|
|
archivo: apps/frontend/src/components/auth/PasswordRecoveryForm.tsx
|
|
horas: 2
|
|
dependencias: []
|
|
accion: |
|
|
1. Leer CAPVED de TASK-P0-001-01
|
|
2. Crear archivo PasswordRecoveryForm.tsx
|
|
3. Implementar form con validación de email
|
|
4. Ejecutar build + tests
|
|
5. Marcar tarea como completada
|
|
6. Avanzar a TASK-P0-001-02
|
|
|
|
# ==============================================================================
|
|
# REFERENCIAS
|
|
# ==============================================================================
|
|
|
|
referencias:
|
|
- archivo: orchestration/analisis/integracion/CROSS-VALIDATION-GAPS.yml
|
|
descripcion: "Gap definitions y acceptance criteria"
|
|
|
|
- archivo: orchestration/analisis/integracion/EXECUTION-ORDER.yml
|
|
descripcion: "Orden de ejecución y dependencias"
|
|
|
|
- archivo: orchestration/analisis/coherencia/GAPS-TRACKING.yml
|
|
descripcion: "Tracking de estado de gaps"
|
|
|
|
- archivo: orchestration/directivas/principios/PRINCIPIO-CAPVED.md
|
|
descripcion: "Metodología CAPVED obligatoria"
|
|
|
|
- archivo: orchestration/directivas/simco/SIMCO-EDICION-SEGURA.md
|
|
descripcion: "Reglas de edición segura (<50 líneas)"
|
|
|
|
# ==============================================================================
|
|
# VALIDACION
|
|
# ==============================================================================
|
|
|
|
validation:
|
|
methodology: "Descomposición de gaps en tareas atómicas según SIMCO CAPVED"
|
|
validated_by: "Claude Opus 4.5"
|
|
validation_date: "2026-01-27"
|
|
total_gaps_covered: 7
|
|
total_atomic_tasks: 38
|
|
coverage: "P0 + P1 (100%)"
|
|
next_review: "Al completar 50% de tareas P0"
|
|
|
|
# ==============================================================================
|
|
# END OF FILE
|
|
# ==============================================================================
|