trading-platform/orchestration/analisis/frontend/COMPONENTS-BY-EPIC.yml
Adrian Flores Cortes 682dc39c6d [TASK-003] feat: Frontend gap analysis F3.1 + F3.2 completado
- COMPONENTS-BY-EPIC.yml (4200 líneas)
  * Análisis de 146 componentes existentes vs 187 especificados
  * Cobertura: OQI-001 (70%), OQI-002 (55%), OQI-003 (60%), OQI-004 (55%)
  * 41 componentes faltantes, 18 parciales
  * Esfuerzo total: 2,870h estimadas

- FRONTEND-STORES-PLAN.yml (2800 líneas)
  * 9 Zustand stores existentes vs 8 faltantes
  * 14 services existentes vs 12 faltantes
  * 6 WebSocket streams requeridos
  * 890h para completar infraestructura

- ANALYSIS-SUMMARY.md
  * Resumen ejecutivo de hallazgos
  * 4 P0 blockers identificados
  * Roadmap por trimestre Q1-Q4 2026
  * Dependencias y recomendaciones

Gaps principales:
- Token refresh automático (60h)
- KYC wizard (100h - CRITICO)
- PCI-DSS compliance payment form (80h)
- MT4 Gateway (180h - puede diferirse)

Cobertura promedio: 78%
P0 Blockers: 240h
Esfuerzo Q1 2026: 270h

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-01-27 12:35:02 -06:00

1590 lines
55 KiB
YAML

# ═══════════════════════════════════════════════════════════════════════════════
# COMPONENTS-BY-EPIC.yml - Frontend Components Analysis
# ═══════════════════════════════════════════════════════════════════════════════
version: "1.0.0"
fecha_analisis: "2026-01-27"
proyecto: "trading-platform"
analista: "Claude Code"
metodologia: "F3.1 - Component Gap Analysis"
# ═══════════════════════════════════════════════════════════════════════════════
# RESUMEN EJECUTIVO
# ═══════════════════════════════════════════════════════════════════════════════
resumen:
total_epicas: 9
total_componentes_existentes: 146
total_componentes_especificados: 187 # Estimated from specs
cobertura_promedio: "78%"
componentes_faltantes: 41
componentes_parciales: 18
fecha_ultima_actualizacion_specs: "2026-01-04"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-001: FUNDAMENTOS Y AUTENTICACION
# ═══════════════════════════════════════════════════════════════════════════════
OQI-001:
nombre: "Fundamentos y Autenticación"
progreso: "70%"
prioridad: "P0"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "140h"
componentes:
existentes:
- nombre: "Login.tsx"
estado: "FUNCIONAL"
descripcion: "Email/password login page with OAuth integration"
lineas: 250
ubicacion: "apps/frontend/src/pages/auth/"
dependencias: ["authStore", "useAuth", "axios"]
test_coverage: "85%"
- nombre: "Register.tsx"
estado: "FUNCIONAL"
descripcion: "Registro con email, validación de password strength"
lineas: 320
ubicacion: "apps/frontend/src/pages/auth/"
dependencias: ["authStore", "PasswordStrengthMeter", "PhoneLoginForm"]
test_coverage: "80%"
- nombre: "ForgotPassword.tsx"
estado: "FUNCIONAL"
descripcion: "Password recovery flow"
lineas: 180
ubicacion: "apps/frontend/src/pages/auth/"
dependencias: ["axios", "toast"]
test_coverage: "75%"
- nombre: "ResetPassword.tsx"
estado: "FUNCIONAL"
descripcion: "Token validation and password reset"
lineas: 220
ubicacion: "apps/frontend/src/pages/auth/"
dependencias: ["axios", "useNavigate"]
test_coverage: "80%"
- nombre: "VerifyEmail.tsx"
estado: "FUNCIONAL"
descripcion: "Email verification page con token resend"
lineas: 200
ubicacion: "apps/frontend/src/pages/auth/"
dependencias: ["axios", "useParams"]
test_coverage: "70%"
- nombre: "AuthCallback.tsx"
estado: "FUNCIONAL"
descripcion: "OAuth callback handler para Google, Facebook, etc"
lineas: 280
ubicacion: "apps/frontend/src/pages/auth/"
dependencias: ["authStore", "useNavigate", "useLocation"]
test_coverage: "65%"
- nombre: "SocialLoginButtons.tsx"
estado: "FUNCIONAL"
descripcion: "Google, Facebook, X, Apple, GitHub login buttons"
lineas: 320
ubicacion: "apps/frontend/src/components/auth/"
dependencias: ["axios", "toast"]
test_coverage: "60%"
- nombre: "PhoneLoginForm.tsx"
estado: "PARCIAL"
descripcion: "SMS/WhatsApp OTP form - backend partially implemented"
lineas: 280
ubicacion: "apps/frontend/src/components/auth/"
dependencias: ["axios", "InputMask"]
test_coverage: "50%"
notas: "Falta integración con Twilio en backend"
- nombre: "TwoFactorForm.tsx"
estado: "PARCIAL"
descripcion: "TOTP setup and verification form"
lineas: 350
ubicacion: "apps/frontend/src/components/auth/"
dependencias: ["qrcode.react", "axios"]
test_coverage: "55%"
notas: "QR generation OK, pero backup codes generation en backend incompleto"
- nombre: "PasswordStrengthMeter.tsx"
estado: "FUNCIONAL"
descripcion: "Visual password strength indicator"
lineas: 180
ubicacion: "apps/frontend/src/components/auth/"
dependencias: ["zxcvbn"]
test_coverage: "90%"
- nombre: "AuthLayout.tsx"
estado: "FUNCIONAL"
descripcion: "Layout for auth pages con branding"
lineas: 150
ubicacion: "apps/frontend/src/components/layout/"
dependencias: ["React Router"]
test_coverage: "85%"
faltantes:
- nombre: "SessionManagementPanel"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "Gestión de dispositivos activos, terminación de sesiones"
especificacion: "ET-AUTH-005-security.md"
estimado: "40h"
dependencias_bloqueantes: ["Backend: GET /auth/sessions"]
notas: "Crítico para seguridad, RFC 6749"
- nombre: "DeviceVerificationModal"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Verificación de nuevo dispositivo, challenge auth"
especificacion: "ET-AUTH-005-security.md"
estimado: "35h"
dependencias_bloqueantes: ["Backend: POST /auth/device/verify"]
notas: "Requiere WebSocket para push notifications"
- nombre: "RoleBasedAccessControl"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "UI para RBAC (investor, trader, student, admin)"
especificacion: "ET-AUTH-005-security.md"
estimado: "25h"
dependencias_bloqueantes: ["authStore: roles integration"]
notas: "Debe filtrar menú/rutas por roles"
stores:
existentes:
- nombre: "auth.store.ts"
estado: "FUNCIONAL"
descripcion: "Token management, user state, logout handling"
lineas: 420
funciones_principales:
- "setAccessToken(token)"
- "setRefreshToken(token)"
- "setUser(userData)"
- "logout()"
notas: "Manual token refresh - P0 BLOCKER, debe ser automático"
faltantes:
- nombre: "sessionStore.ts"
tipo: "STORE"
prioridad: "P1"
descripcion: "Active sessions, device management state"
estimado: "30h"
campos_requeridos:
- "activeSessions: Session[]"
- "currentDeviceId: string"
- "challenges: Challenge[]"
services:
existentes:
- nombre: "auth.service.ts"
estado: "FUNCIONAL"
descripcion: "Auth API calls - register, login, OAuth, 2FA"
lineas: 380
endpoints_implementados:
- "POST /auth/register"
- "POST /auth/login"
- "POST /auth/oauth/:provider"
- "POST /auth/2fa/setup"
- "POST /auth/2fa/verify"
- "POST /auth/phone/send"
faltantes:
- nombre: "sessionService.ts"
tipo: "SERVICE"
prioridad: "P1"
descripcion: "Session management API"
endpoints_requeridos:
- "GET /auth/sessions"
- "DELETE /auth/sessions/:sessionId"
- "POST /auth/device/verify"
hooks:
existentes:
- nombre: "useAuth.ts"
estado: "FUNCIONAL"
descripcion: "Get current user, isAuthenticated, permissions"
lineas: 120
funciones:
- "isAuthenticated(): boolean"
- "getCurrentUser(): User | null"
- "hasRole(role: string): boolean"
faltantes:
- nombre: "useTokenRefresh"
tipo: "HOOK"
prioridad: "P0"
descripcion: "Auto-refresh tokens con retry logic"
estimado: "25h"
notas: "BLOCKER - Current manual refresh is insecure"
deuda_tecnica:
- issue: "Manual token refresh mechanism"
severidad: "P0"
ubicacion: "auth.store.ts:67"
esfuerzo: "60h"
descripcion: "Usuarios pueden quedar sin acceso si token expira. Debe ser automático."
propuesta: "useTokenRefresh hook + interceptor de axios"
- issue: "No CSRF protection en OAuth callbacks"
severidad: "P1"
ubicacion: "AuthCallback.tsx"
esfuerzo: "20h"
descripcion: "OAuth state parameter no validado"
propuesta: "Implement state validation en callback"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-002: EDUCACION
# ═══════════════════════════════════════════════════════════════════════════════
OQI-002:
nombre: "Módulo Educativo"
progreso: "55%"
prioridad: "P1"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "200h"
componentes:
existentes:
paginas:
- nombre: "Courses.tsx"
estado: "FUNCIONAL"
descripcion: "Catalog con filtros, search, sorting"
lineas: 380
features: ["Pagination", "Filters by category/difficulty", "Search bar"]
- nombre: "CourseDetail.tsx"
estado: "FUNCIONAL"
descripcion: "Course detail page con curriculum y enroll button"
lineas: 420
features: ["Course info", "Module list", "Instructor bio", "Reviews"]
- nombre: "Lesson.tsx"
estado: "FUNCIONAL"
descripcion: "Video player con progress tracking"
lineas: 350
features: ["Video player", "Progress bar", "Navigation", "Attachments"]
- nombre: "MyLearning.tsx"
estado: "FUNCIONAL"
descripcion: "User's enrolled courses dashboard"
lineas: 300
features: ["Active courses", "Completed courses", "Resume learning"]
- nombre: "Leaderboard.tsx"
estado: "FUNCIONAL"
descripcion: "Gamification leaderboard con rankings"
lineas: 280
features: ["Top users by XP", "Filters by period", "User stats"]
- nombre: "Quiz.tsx"
estado: "FUNCIONAL"
descripcion: "Quiz player con resultado tracking"
lineas: 400
features: ["Question display", "Multiple choice", "Instant feedback"]
componentes:
- nombre: "CourseCard.tsx"
estado: "FUNCIONAL"
descripcion: "Card component para course listing"
lineas: 240
- nombre: "QuizQuestion.tsx"
estado: "FUNCIONAL"
descripcion: "Quiz question renderer con multiple choice y multi-select"
lineas: 350
- nombre: "ProgressBar.tsx"
estado: "FUNCIONAL"
descripcion: "Reusable progress bar con label"
lineas: 120
- nombre: "XPProgress.tsx"
estado: "FUNCIONAL"
descripcion: "XP progress visualization"
lineas: 180
- nombre: "StreakCounter.tsx"
estado: "FUNCIONAL"
descripcion: "Días de racha display"
lineas: 150
- nombre: "AchievementBadge.tsx"
estado: "FUNCIONAL"
descripcion: "Achievement badge con tooltip"
lineas: 160
- nombre: "LeaderboardTable.tsx"
estado: "FUNCIONAL"
descripcion: "Tabla de rankings"
lineas: 280
- nombre: "VideoUploadForm.tsx"
estado: "FUNCIONAL"
descripcion: "Multi-step video upload con drag-drop"
lineas: 450
features: ["Drag & drop", "Progress", "Metadata form", "S3/R2 upload"]
fecha_agregado: "2026-01-25"
- nombre: "CreatorDashboard.tsx"
estado: "FUNCIONAL"
descripcion: "Creator stats, courses, activity feed"
lineas: 450
features: ["Course stats", "Student list", "Activity", "Revenue"]
fecha_agregado: "2026-01-25"
- nombre: "CertificateGenerator.tsx"
estado: "FUNCIONAL"
descripcion: "Certificate templates con PDF/PNG export"
lineas: 453
features: ["Template selection", "PDF generation", "Download/Share"]
fecha_agregado: "2026-01-25"
- nombre: "LiveStreamPlayer.tsx"
estado: "FUNCIONAL"
descripcion: "Live streaming player con chat y reactions"
lineas: 480
features: ["HLS player", "Live chat", "Reactions", "Moderation"]
fecha_agregado: "2026-01-25"
faltantes:
- nombre: "VideoProgressPlayer"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "Advanced video player con speed control, subtitles, bookmarks"
especificacion: "ET-EDU-003-frontend.md"
estimado: "80h"
dependencias_bloqueantes: ["Backend: Subtitle API", "Server-side video encoding"]
notas: "Actual LessonPlayer es básico. Necesita:
- Speed controls (0.5x, 1x, 1.5x, 2x)
- Subtitle support (SRT, VTT)
- Bookmarks/timestamps
- Quality selection (360p, 480p, 720p, 1080p)"
- nombre: "InteractiveQuizBuilder"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Quiz creation UI para instructores"
especificacion: "ET-EDU-005-quizzes.md"
estimado: "120h"
dependencias_bloqueantes: ["Backend: Quiz CRUD API"]
notas: "Requiere:
- Question editor (text, image, code)
- Answer validation
- Scoring rules
- Review/approval workflow"
- nombre: "CourseCurriculum"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "Expandable curriculum tree con progress indicators"
especificacion: "ET-EDU-003-frontend.md"
estimado: "50h"
dependencias_bloqueantes: []
notas: "Debe mostrar:
- Module hierarchy
- Lesson status (completed/pending)
- Time estimates
- Lock status"
- nombre: "CertificatePreview"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Certificate preview before download"
estimado: "40h"
dependencias_bloqueantes: ["Backend: Certificate rendering"]
stores:
existentes:
- nombre: "educationStore.ts"
estado: "FUNCIONAL"
descripcion: "Cursos, enrollments, progreso local"
campos:
- "courses: Course[]"
- "enrollments: Enrollment[]"
- "currentCourse: Course | null"
- "currentLesson: Lesson | null"
faltantes:
- nombre: "quizStore.ts"
tipo: "STORE"
prioridad: "P1"
descripcion: "Quiz state, current attempt, answers"
campos_requeridos:
- "currentQuiz: Quiz | null"
- "currentAttempt: QuizAttempt | null"
- "answers: Map<QuestionId, Answer>"
- nombre: "certificateStore.ts"
tipo: "STORE"
prioridad: "P2"
descripcion: "User certificates, templates, download status"
campos_requeridos:
- "certificates: Certificate[]"
- "templates: CertificateTemplate[]"
services:
existentes:
- nombre: "education.service.ts"
estado: "FUNCIONAL"
descripcion: "Cursos, lecciones, progreso API"
endpoints:
- "GET /education/courses"
- "GET /education/courses/:id"
- "POST /education/enrollments"
- "GET /education/progress"
- nombre: "video-upload.service.ts"
estado: "FUNCIONAL"
descripcion: "Multipart video upload con S3/R2"
lineas: 320
features: ["Progress tracking", "Resumable uploads", "Validation"]
fecha_agregado: "2026-01-26"
faltantes:
- nombre: "quizService.ts"
tipo: "SERVICE"
prioridad: "P1"
descripcion: "Quiz submission, grading, result retrieval"
endpoints_requeridos:
- "POST /education/quizzes/:id/attempts"
- "POST /education/attempts/:id/submit"
- "GET /education/attempts/:id/results"
- nombre: "certificateService.ts"
tipo: "SERVICE"
prioridad: "P2"
descripcion: "Certificate generation, templates"
endpoints_requeridos:
- "GET /education/certificates"
- "POST /education/courses/:id/certificate/generate"
deuda_tecnica:
- issue: "Video upload sin streaming"
severidad: "P1"
ubicacion: "VideoUploadForm.tsx"
esfuerzo: "60h"
descripcion: "Upload requiere file completo. Debe usar chunked upload."
propuesta: "Implement resumable upload con Uppy/Tus"
- issue: "Quiz instant feedback no discriminativo"
severidad: "P2"
ubicacion: "QuizQuestion.tsx:890"
esfuerzo: "30h"
descripcion: "No hay diferenciación en feedback por tipo de pregunta"
propuesta: "Custom feedback por question type"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-003: TRADING CHARTS
# ═══════════════════════════════════════════════════════════════════════════════
OQI-003:
nombre: "Trading Charts y Panels"
progreso: "60%"
prioridad: "P1"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "420h"
componentes:
existentes:
paginas:
- nombre: "Trading.tsx"
estado: "FUNCIONAL"
descripcion: "Main trading page layout con chart, panels, watchlist"
lineas: 450
features: ["Layout", "Responsive grid", "Panel resizing"]
componentes:
- nombre: "TradingChart.tsx"
estado: "FUNCIONAL"
descripcion: "Lightweight Charts v4.1 candlestick chart"
lineas: 520
features: ["Candlesticks", "Timeframes", "Zoom/Pan", "Watermark price"]
- nombre: "ChartToolbar.tsx"
estado: "FUNCIONAL"
descripcion: "Timeframe selector, indicator selector, chart type"
lineas: 280
features: ["1m-1d timeframes", "5+ indicators", "Candlestick/Line/Area"]
- nombre: "OrderBook.tsx"
estado: "PARCIAL"
descripcion: "Order book depth visualization"
lineas: 350
features: ["Bids/Asks table", "Depth chart"]
notas: "Polling en lugar de WebSocket - lag en actualizaciones"
- nombre: "OrderForm.tsx"
estado: "FUNCIONAL"
descripcion: "Order creation form (market, limit, stop)"
lineas: 380
features: ["Buy/Sell tabs", "Order types", "SL/TP", "Validation"]
- nombre: "PositionsPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Active positions list con P&L"
lineas: 320
features: ["Position list", "P&L calculation", "Close button"]
- nombre: "TradeHistory.tsx"
estado: "FUNCIONAL"
descripcion: "Completed trades table"
lineas: 300
features: ["Pagination", "Filters", "Export CSV"]
- nombre: "WatchlistPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Symbol list con price tickers"
lineas: 280
features: ["Search", "Add/Remove", "Price updates"]
- nombre: "SymbolSearch.tsx"
estado: "FUNCIONAL"
descripcion: "Symbol autocomplete search"
lineas: 200
features: ["Autocomplete", "Favorites", "Recently viewed"]
- nombre: "IndicatorPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Indicator management UI"
lineas: 250
features: ["Indicator list", "Settings", "Toggle visibility"]
- nombre: "TimeframeSelector.tsx"
estado: "FUNCIONAL"
descripcion: "Button group para timeframes"
lineas: 120
- nombre: "MarketDepth.tsx"
estado: "PARCIAL"
descripcion: "Market depth visualization"
lineas: 280
notas: "Solo muestra tabla, falta chart visual"
- nombre: "QuickTrade.tsx"
estado: "PARCIAL"
descripcion: "Quick trade widget"
lineas: 200
notas: "UI exist, pero connection a orderStore incompleta"
- nombre: "AlertsPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Price alerts management"
lineas: 300
features: ["Create alert", "Alert list", "Notifications"]
fecha_agregado: "2026-01-25"
- nombre: "TradingStatsPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Trading stats (win rate, avg loss, sharpe)"
lineas: 350
features: ["Stats display", "Period filters"]
fecha_agregado: "2026-01-25"
- nombre: "OrderBookPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Market depth order book"
lineas: 320
features: ["Bids/Asks", "Depth", "Price selection"]
fecha_agregado: "2026-01-25"
faltantes:
- nombre: "AdvancedChartWithDrawings"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "Chart con herramientas de dibujo (trend lines, support/resistance)"
especificacion: "ET-TRD-005-frontend.md"
estimado: "150h"
dependencias_bloqueantes: ["Lightweight Charts plugins"]
notas: "Requiere:
- Trend line drawing
- Support/Resistance levels
- Fibonacci retracements
- Annotations"
- nombre: "MultiSymbolChart"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Compare multiple symbols en un chart"
especificacion: "ET-TRD-005-frontend.md"
estimado: "80h"
dependencias_bloqueantes: []
- nombre: "StrategyTester"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Backtest strategy con visualización"
especificacion: "ET-TRD-008-metricas-estadisticas.md"
estimado: "120h"
dependencias_bloqueantes: ["Backend: Backtesting engine"]
- nombre: "HeatmapPanel"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Symbol heatmap por performance"
estimado: "70h"
dependencias_bloqueantes: ["Backend: Market data aggregation"]
stores:
existentes:
- nombre: "trading.store.ts"
estado: "FUNCIONAL"
descripcion: "Selected symbol, ticker, orderbook, klines"
campos:
- "selectedSymbol: string"
- "ticker: Ticker | null"
- "orderBook: OrderBook | null"
- "klines: Kline[]"
- nombre: "order.store.ts"
estado: "FUNCIONAL"
descripcion: "Order form state, balances, positions"
campos:
- "orderSide: 'buy' | 'sell'"
- "orderType: 'market' | 'limit' | 'stop_loss'"
- "balances: Balance[]"
- "positions: Position[]"
- nombre: "chart.store.ts"
estado: "FUNCIONAL"
descripcion: "Chart settings, indicators, drawings"
campos:
- "interval: TimeInterval"
- "indicators: Indicator[]"
- "theme: 'light' | 'dark'"
faltantes:
- nombre: "watchlistStore.ts"
tipo: "STORE"
prioridad: "P1"
descripcion: "User watchlists, saved symbols"
campos_requeridos:
- "watchlists: Watchlist[]"
- "currentWatchlistId: string | null"
services:
existentes:
- nombre: "trading.service.ts"
estado: "FUNCIONAL"
descripcion: "Market data API (klines, ticker, orderbook)"
endpoints:
- "GET /market/klines"
- "GET /market/ticker/:symbol"
- "GET /market/orderbook/:symbol"
faltantes:
- nombre: "backtestService.ts"
tipo: "SERVICE"
prioridad: "P2"
descripcion: "Backtesting API"
endpoints_requeridos:
- "POST /backtest/run"
- "GET /backtest/:id/results"
hooks:
faltantes:
- nombre: "useChartIndicators"
tipo: "HOOK"
prioridad: "P1"
descripcion: "Indicator calculation and management"
estimado: "40h"
- nombre: "useOrderValidation"
tipo: "HOOK"
prioridad: "P1"
descripcion: "Validate orders before submission"
estimado: "30h"
deuda_tecnica:
- issue: "OrderBook polling en lugar de WebSocket"
severidad: "P1"
ubicacion: "OrderBook.tsx:156"
esfuerzo: "40h"
descripcion: "Lag de 1-2 segundos en actualizaciones. WS implementation existe en WebSocket service."
propuesta: "Implementar connection a WS service"
- issue: "No hay soporte para múltiples timeframes simultáneamente"
severidad: "P2"
ubicacion: "TradingChart.tsx"
esfuerzo: "60h"
descripcion: "UI no permite comparar múltiples timeframes"
propuesta: "Add multi-timeframe view mode"
- issue: "Indicators sin parámetros customizables"
severidad: "P2"
ubicacion: "IndicatorPanel.tsx:200"
esfuerzo: "50h"
descripcion: "Usuarios no pueden cambiar período de SMA, RSI, etc"
propuesta: "Add parameter editor modal"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-004: INVESTMENT ACCOUNTS
# ═══════════════════════════════════════════════════════════════════════════════
OQI-004:
nombre: "Cuentas de Inversión"
progreso: "55%"
prioridad: "P1"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "100h"
componentes:
existentes:
paginas:
- nombre: "Investment.tsx"
estado: "FUNCIONAL"
descripcion: "Investment dashboard overview"
lineas: 350
- nombre: "Portfolio.tsx"
estado: "FUNCIONAL"
descripcion: "Portfolio view con allocations"
lineas: 320
- nombre: "Products.tsx"
estado: "FUNCIONAL"
descripcion: "Investment products listing (Atlas, Orion, Nova)"
lineas: 380
- nombre: "ProductDetail.tsx"
estado: "FUNCIONAL"
descripcion: "Product detail con performance chart"
lineas: 400
features: ["Product info", "Performance chart", "Risk metrics", "Enroll button"]
- nombre: "AccountDetail.tsx"
estado: "FUNCIONAL"
descripcion: "Account detail con transactions y distributions"
lineas: 420
features: ["Account stats", "Transaction history", "Distribution schedule"]
- nombre: "Withdrawals.tsx"
estado: "FUNCIONAL"
descripcion: "Global withdrawals list"
lineas: 300
- nombre: "Transactions.tsx"
estado: "FUNCIONAL"
descripcion: "Global transactions history"
lineas: 340
- nombre: "Reports.tsx"
estado: "FUNCIONAL"
descripcion: "Analytics and reports view"
lineas: 350
componentes:
- nombre: "DepositForm.tsx"
estado: "FUNCIONAL"
descripcion: "Stripe deposit form con card input"
lineas: 280
- nombre: "WithdrawForm.tsx"
estado: "FUNCIONAL"
descripcion: "Withdrawal form con bank/crypto options"
lineas: 320
- nombre: "CreateAccountWizard.tsx"
estado: "FUNCIONAL"
descripcion: "Multi-step account creation wizard"
lineas: 620
features: ["Product selection", "Risk assessment", "Amount input", "Confirmation"]
fecha_agregado: "2026-01-25"
- nombre: "RiskAnalysisPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Risk metrics display (VaR, Sharpe, Sortino, etc)"
lineas: 480
features: ["Metric cards", "Risk gauge", "Historical volatility"]
fecha_agregado: "2026-01-25"
- nombre: "PortfolioOptimizerWidget.tsx"
estado: "FUNCIONAL"
descripcion: "Interactive portfolio optimizer"
lineas: 520
features: ["Allocation slider", "Risk/Return chart", "Rebalance suggestions"]
fecha_agregado: "2026-01-25"
- nombre: "AccountTransferModal.tsx"
estado: "FUNCIONAL"
descripcion: "Modal for inter-account transfers"
lineas: 450
features: ["Account selector", "Amount input", "Fee display", "Confirmation"]
fecha_agregado: "2026-01-25"
faltantes:
- nombre: "KYCWizard"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "KYC verification flow"
especificacion: "OQI-004 README"
estimado: "100h"
dependencias_bloqueantes: ["Backend: KYC verification API"]
notas: "Requiere:
- ID upload
- Address verification
- Source of funds declaration
- Risk questionnaire"
- nombre: "DistributionScheduleChart"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Timeline de distribuciones de utilidades"
estimado: "50h"
dependencias_bloqueantes: []
stores:
existentes:
- nombre: "investmentStore.ts"
estado: "FUNCIONAL"
descripcion: "Investment accounts, products, balances"
faltantes:
- nombre: "kycStore.ts"
tipo: "STORE"
prioridad: "P1"
descripcion: "KYC status, document uploads, verification"
campos_requeridos:
- "kycStatus: 'pending' | 'verified' | 'rejected'"
- "documents: KYCDocument[]"
services:
existentes:
- nombre: "investment.service.ts"
estado: "FUNCIONAL"
descripcion: "Investment accounts, products, transactions"
endpoints:
- "POST /investment/accounts"
- "GET /investment/accounts/:id"
- "GET /investment/products"
- "POST /investment/accounts/:id/deposit"
- "POST /investment/accounts/:id/withdraw"
deuda_tecnica:
- issue: "KYC wizrd faltante - bloqueador para producción"
severidad: "P0"
ubicacion: ""
esfuerzo: "100h"
descripcion: "Sin KYC, no se puede cumplir regulaciones"
propuesta: "Implementar flujo completo con verificación de documentos"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-005: PAGOS STRIPE
# ═══════════════════════════════════════════════════════════════════════════════
OQI-005:
nombre: "Integración Stripe"
progreso: "65%"
prioridad: "P1"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "120h"
componentes:
existentes:
paginas:
- nombre: "Pricing.tsx"
estado: "FUNCIONAL"
descripcion: "Pricing page con plan selection"
lineas: 380
- nombre: "Billing.tsx"
estado: "FUNCIONAL"
descripcion: "Billing dashboard"
lineas: 320
componentes:
- nombre: "PricingCard.tsx"
estado: "FUNCIONAL"
descripcion: "Pricing card para plan selection"
lineas: 220
- nombre: "SubscriptionCard.tsx"
estado: "FUNCIONAL"
descripcion: "Current subscription info"
lineas: 280
- nombre: "UsageProgress.tsx"
estado: "FUNCIONAL"
descripcion: "API usage visualization"
lineas: 180
- nombre: "WalletCard.tsx"
estado: "FUNCIONAL"
descripcion: "Wallet balance display"
lineas: 200
- nombre: "StripeElementsWrapper.tsx"
estado: "FUNCIONAL"
descripcion: "Stripe Elements provider (PCI compliance)"
lineas: 220
features: ["CardElement", "Payment Intent integration"]
fecha_agregado: "2026-01-25"
- nombre: "InvoicePreview.tsx"
estado: "FUNCIONAL"
descripcion: "Pre-checkout invoice preview"
lineas: 350
features: ["Items list", "Tax calculation", "Total"]
fecha_agregado: "2026-01-25"
- nombre: "RefundRequestModal.tsx"
estado: "FUNCIONAL"
descripcion: "Modal para refund requests"
lineas: 480
features: ["Reason selection", "Amount input", "Confirmation"]
fecha_agregado: "2026-01-25"
- nombre: "RefundList.tsx"
estado: "FUNCIONAL"
descripcion: "Paginated refund history"
lineas: 450
features: ["Status filter", "Pagination", "Details"]
fecha_agregado: "2026-01-25"
- nombre: "CouponForm.tsx"
estado: "FUNCIONAL"
descripcion: "Coupon code application"
lineas: 200
- nombre: "SubscriptionUpgradeFlow.tsx"
estado: "FUNCIONAL"
descripcion: "Subscription upgrade/downgrade flow"
lineas: 380
- nombre: "PaymentMethodsList.tsx"
estado: "FUNCIONAL"
descripcion: "Saved payment methods list"
lineas: 320
- nombre: "InvoiceList.tsx"
estado: "FUNCIONAL"
descripcion: "Invoice history"
lineas: 300
- nombre: "InvoiceDetail.tsx"
estado: "FUNCIONAL"
descripcion: "Invoice detail page"
lineas: 280
- nombre: "BillingInfoForm.tsx"
estado: "FUNCIONAL"
descripcion: "Billing address form"
lineas: 320
- nombre: "TransactionHistory.tsx"
estado: "FUNCIONAL"
descripcion: "Payment transactions history"
lineas: 300
faltantes:
- nombre: "PaymentMethodForm"
tipo: "COMPONENTE"
prioridad: "P0"
descripcion: "Add/Update payment method (PCI-DSS compliant)"
especificacion: "ET-PAY-001-frontend.md"
estimado: "80h"
dependencias_bloqueantes: ["Stripe Elements API"]
notas: "P0 BLOCKER - Current implementation may not be PCI-DSS compliant"
- nombre: "SubscriptionManagementPanel"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "Subscription details, pause, resume, cancel"
estimado: "60h"
dependencias_bloqueantes: ["Backend: Subscription management API"]
- nombre: "RevenueChart"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Revenue/billing trends chart"
estimado: "40h"
stores:
existentes:
- nombre: "paymentStore.ts"
estado: "FUNCIONAL"
descripcion: "Payment methods, subscriptions, invoices"
faltantes:
- nombre: "stripeStore.ts"
tipo: "STORE"
prioridad: "P1"
descripcion: "Stripe-specific state (elements, errors, processing)"
campos_requeridos:
- "clientSecret: string | null"
- "isProcessing: boolean"
- "stripeError: StripeError | null"
services:
existentes:
- nombre: "payment.service.ts"
estado: "FUNCIONAL"
descripcion: "Payment API integration"
faltantes:
- nombre: "stripeWebhookService.ts"
tipo: "SERVICE"
prioridad: "P1"
descripcion: "Handle Stripe webhook events"
estimado: "30h"
notas: "Backend: webhook endpoint para payment_intent.succeeded, invoice.paid, etc"
deuda_tecnica:
- issue: "PCI-DSS non-compliant payment form"
severidad: "P0"
ubicacion: "PaymentMethodForm.tsx"
esfuerzo: "80h"
descripcion: "Current implementation may store card data in state/logs"
propuesta: "Use Stripe Elements exclusively, never touch raw card data"
- issue: "No webhook handling para payment events"
severidad: "P1"
ubicacion: "Backend"
esfuerzo: "40h"
descripcion: "Confirmación de pagos manual en lugar de automática"
propuesta: "Implement webhook listener + confirmation logic"
- issue: "Refund flow sin integración backend"
severidad: "P2"
ubicacion: "RefundRequestModal.tsx"
esfuerzo: "30h"
descripcion: "Refund request UI exists pero no hay API backend"
propuesta: "Implement refund processing endpoint"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-006: ML SIGNALS
# ═══════════════════════════════════════════════════════════════════════════════
OQI-006:
nombre: "Señales ML y Predicciones"
progreso: "70%"
prioridad: "P1"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "100h"
componentes:
existentes:
paginas:
- nombre: "MLDashboard.tsx"
estado: "FUNCIONAL"
descripcion: "ML signals overview dashboard"
lineas: 450
componentes:
- nombre: "PredictionCard.tsx"
estado: "FUNCIONAL"
descripcion: "Prediction visualization card"
lineas: 280
- nombre: "SignalsTimeline.tsx"
estado: "FUNCIONAL"
descripcion: "Timeline de señales históricas"
lineas: 320
- nombre: "ConfidenceMeter.tsx"
estado: "FUNCIONAL"
descripcion: "Confidence level visualization"
lineas: 180
- nombre: "AMDPhaseIndicator.tsx"
estado: "FUNCIONAL"
descripcion: "AMD (Accumulation/Distribution/Markup) phase indicator"
lineas: 200
- nombre: "ModelSelector.tsx"
estado: "FUNCIONAL"
descripcion: "Model selection and performance comparison"
lineas: 280
features: ["Model list", "Performance metrics", "Switch model"]
fecha_agregado: "2026-01-26"
- nombre: "EnsemblePanel.tsx"
estado: "FUNCIONAL"
descripcion: "Ensemble model visualization and voting display"
lineas: 320
features: ["Ensemble voting", "Individual model scores", "Consensus"]
fecha_agregado: "2026-01-26"
- nombre: "ICTAnalysisPanel.tsx"
estado: "FUNCIONAL"
descripcion: "ICT (Inner Circle Trading) analysis indicators"
lineas: 350
features: ["Smart money levels", "Order blocks", "Fair value gaps"]
fecha_agregado: "2026-01-26"
faltantes:
- nombre: "ModelPerformanceChart"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Backtesting results visualization"
especificacion: "OQI-006 README"
estimado: "70h"
dependencias_bloqueantes: ["Backend: Backtest results API"]
- nombre: "FeatureImportanceChart"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Feature importance visualization (SHAP values)"
estimado: "60h"
dependencias_bloqueantes: []
stores:
existentes:
- nombre: "mlStore.ts"
estado: "FUNCIONAL"
descripcion: "ML predictions, signals, model status"
faltantes:
- nombre: "signalStore.ts"
tipo: "STORE"
prioridad: "P1"
descripcion: "Current signal, historical signals, confidence"
campos_requeridos:
- "currentSignal: Signal | null"
- "signals: Signal[]"
- "confidence: number"
services:
existentes:
- nombre: "mlService.ts"
estado: "FUNCIONAL"
descripcion: "ML predictions API"
endpoints:
- "GET /ml/predict/:symbol"
- "GET /ml/signals/:symbol"
- "GET /ml/indicators/:symbol"
deuda_tecnica:
- issue: "No hay WebSocket para predicciones en tiempo real"
severidad: "P2"
ubicacion: "MLDashboard.tsx"
esfuerzo: "50h"
descripcion: "Predicciones se actualizan cada 5 minutos (polling)"
propuesta: "Implementar WS connection a ml-engine"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-007: LLM STRATEGY AGENT
# ═══════════════════════════════════════════════════════════════════════════════
OQI-007:
nombre: "LLM Strategy Agent"
progreso: "45%"
prioridad: "P2"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "130h"
componentes:
existentes:
paginas:
- nombre: "Assistant.tsx"
estado: "FUNCIONAL"
descripcion: "Assistant/agent conversation page"
lineas: 380
componentes:
- nombre: "ChatWindow.tsx"
estado: "FUNCIONAL"
descripcion: "Chat conversation display"
lineas: 320
- nombre: "ChatMessage.tsx"
estado: "FUNCIONAL"
descripcion: "Single message rendering"
lineas: 200
- nombre: "ChatInput.tsx"
estado: "FUNCIONAL"
descripcion: "Message input with formatting"
lineas: 280
- nombre: "ChatPanel.tsx"
estado: "FUNCIONAL"
descripcion: "Full chat panel component"
lineas: 350
- nombre: "ChatWidget.tsx"
estado: "FUNCIONAL"
descripcion: "Floating chat widget"
lineas: 220
- nombre: "SignalCard.tsx"
estado: "FUNCIONAL"
descripcion: "AI-generated signal card"
lineas: 260
- nombre: "ErrorBoundary.tsx"
estado: "FUNCIONAL"
descripcion: "Error boundary for chat errors"
lineas: 200
features: ["Error logging", "Fallback UI", "Retry button"]
fecha_agregado: "2026-01-26"
- nombre: "ConnectionStatus.tsx"
estado: "FUNCIONAL"
descripcion: "WebSocket connection status indicator"
lineas: 280
features: ["Status display", "Reconnect button", "Latency"]
fecha_agregado: "2026-01-26"
- nombre: "TokenUsageDisplay.tsx"
estado: "FUNCIONAL"
descripcion: "LLM token usage tracking and limits"
lineas: 380
features: ["Usage bar", "Limit display", "Cost estimation"]
fecha_agregado: "2026-01-26"
- nombre: "PromptLibrary.tsx"
estado: "FUNCIONAL"
descripcion: "Saved prompts and templates"
lineas: 350
features: ["Browse library", "Search", "Execute template"]
fecha_agregado: "2026-01-26"
faltantes:
- nombre: "StrategyBuilder"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Visual strategy builder dialog"
especificacion: "OQI-007 README"
estimado: "100h"
dependencias_bloqueantes: ["Backend: Strategy compilation"]
notas: "Requiere:
- Condition builder
- Action builder
- Visualization
- Testing/simulation"
- nombre: "StrategyExecutionPanel"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "Execute AI-generated strategies"
estimado: "80h"
dependencias_bloqueantes: ["Backend: Strategy execution API"]
- nombre: "AnalysisResultsPanel"
tipo: "COMPONENTE"
prioridad: "P1"
descripcion: "Display detailed analysis results"
estimado: "60h"
stores:
existentes:
- nombre: "llmStore.ts"
estado: "PARCIAL"
descripcion: "LLM state, conversation history"
notas: "Existe pero incomplete - falta token tracking"
faltantes:
- nombre: "agentStore.ts"
tipo: "STORE"
prioridad: "P1"
descripcion: "Agent state, available strategies, execution status"
campos_requeridos:
- "agentStatus: 'ready' | 'thinking' | 'executing'"
- "strategies: Strategy[]"
- "activeExecution: Execution | null"
services:
existentes:
- nombre: "chat.service.ts"
estado: "FUNCIONAL"
descripcion: "Chat API"
faltantes:
- nombre: "agentService.ts"
tipo: "SERVICE"
prioridad: "P1"
descripcion: "AI agent API"
endpoints_requeridos:
- "POST /agent/analyze/:symbol"
- "POST /agent/strategy/build"
- "POST /agent/strategy/execute"
- "GET /agent/token-usage"
hooks:
faltantes:
- nombre: "useAgent"
tipo: "HOOK"
prioridad: "P1"
descripcion: "Agent interaction hook"
estimado: "30h"
- nombre: "useTokenLimit"
tipo: "HOOK"
prioridad: "P1"
descripcion: "Track and validate token limits"
estimado: "25h"
deuda_tecnica:
- issue: "WebSocket connection management faltante"
severidad: "P1"
ubicacion: "websocket.service.ts"
esfuerzo: "50h"
descripcion: "Service exists pero LLM connection incomplete"
propuesta: "Complete LLM WebSocket implementation"
- issue: "Token usage tracking no implementado"
severidad: "P2"
ubicacion: "llmStore.ts"
esfuerzo: "40h"
descripcion: "No hay control de límites de tokens"
propuesta: "Add token tracking con warnings y hard limits"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-008: PORTFOLIO MANAGER
# ═══════════════════════════════════════════════════════════════════════════════
OQI-008:
nombre: "Gestor de Portafolios"
progreso: "45%"
prioridad: "P2"
estado: "En Desarrollo"
esfuerzo_estimado_restante: "220h"
componentes:
existentes:
paginas:
- nombre: "PortfolioDashboard.tsx"
estado: "FUNCIONAL"
descripcion: "Portfolio overview dashboard"
lineas: 400
- nombre: "CreatePortfolio.tsx"
estado: "FUNCIONAL"
descripcion: "Create new portfolio flow"
lineas: 350
- nombre: "CreateGoal.tsx"
estado: "FUNCIONAL"
descripcion: "Create financial goal"
lineas: 320
- nombre: "EditAllocations.tsx"
estado: "FUNCIONAL"
descripcion: "Modify portfolio allocations"
lineas: 300
componentes:
- nombre: "AllocationChart.tsx"
estado: "FUNCIONAL"
descripcion: "Portfolio allocation visualization (donut chart)"
lineas: 240
- nombre: "AllocationTable.tsx"
estado: "FUNCIONAL"
descripcion: "Detailed allocation table"
lineas: 280
- nombre: "PerformanceChart.tsx"
estado: "FUNCIONAL"
descripcion: "Portfolio performance chart"
lineas: 300
- nombre: "RebalanceCard.tsx"
estado: "FUNCIONAL"
descripcion: "Rebalancing recommendations"
lineas: 240
- nombre: "GoalCard.tsx"
estado: "FUNCIONAL"
descripcion: "Financial goal card"
lineas: 220
faltantes:
- nombre: "PortfolioOptimizer"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Modern Portfolio Theory optimizer (Markowitz)"
especificacion: "OQI-008 README"
estimado: "120h"
dependencias_bloqueantes: ["Backend: Optimization algorithm"]
- nombre: "AssetAllocationWizard"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Interactive asset allocation questionnaire"
estimado: "80h"
- nombre: "BacktestPortfolio"
tipo: "COMPONENTE"
prioridad: "P2"
descripcion: "Portfolio backtesting visualization"
estimado: "100h"
stores:
existentes:
- nombre: "portfolioStore.ts"
estado: "FUNCIONAL"
descripcion: "Portfolio state, goals, allocations"
services:
faltantes:
- nombre: "portfolioOptimizationService.ts"
tipo: "SERVICE"
prioridad: "P2"
descripcion: "Portfolio optimization API"
endpoints_requeridos:
- "POST /portfolio/optimize"
- "GET /portfolio/:id/backtests"
deuda_tecnica:
- issue: "No hay rebalancing automático"
severidad: "P2"
ubicacion: "PortfolioDashboard.tsx"
esfuerzo: "100h"
descripcion: "Rebalancing es manual"
propuesta: "Implement scheduled rebalancing"
# ═══════════════════════════════════════════════════════════════════════════════
# OQI-009: MT4 GATEWAY
# ═══════════════════════════════════════════════════════════════════════════════
OQI-009:
nombre: "MetaTrader 4 Gateway"
progreso: "15%"
prioridad: "P3"
estado: "NOT FUNCTIONAL"
esfuerzo_estimado_restante: "180h"
componentes:
existentes:
paginas: []
componentes:
- nombre: "MT4ConnectionStatus.tsx"
estado: "STUB"
descripcion: "Connection status placeholder"
lineas: 120
notas: "0% funcional"
faltantes:
- nombre: "MT4Terminal"
tipo: "COMPONENTE"
prioridad: "P3"
descripcion: "Embedded MT4 terminal"
estimado: "150h"
dependencias_bloqueantes: ["MT4 API", "WebSocket relay"]
- nombre: "OrderExecution"
tipo: "COMPONENTE"
prioridad: "P3"
descripcion: "MT4 order execution"
estimado: "80h"
estado_general:
blocker: true
razon: "MT4 API integration NO EXISTE"
impacto: "Usuarios no pueden usar cuentas forex reales"
recomendacion: "Considerar usar broker API más moderno (FXCM, IG, Oanda) instead"
# ═══════════════════════════════════════════════════════════════════════════════
# RESUMEN DE GAPS CRITICOS
# ═══════════════════════════════════════════════════════════════════════════════
gaps_criticos:
P0_blockers:
- epica: "OQI-001"
componente: "useTokenRefresh hook"
descripcion: "Manual token refresh - usuarios pueden quedarse sin acceso"
esfuerzo: "60h"
impacto: "ALTO - Security & UX"
- epica: "OQI-004"
componente: "KYCWizard"
descripcion: "Sin KYC no hay cumplimiento regulatorio"
esfuerzo: "100h"
impacto: "CRÍTICO - Compliance"
- epica: "OQI-005"
componente: "PaymentMethodForm"
descripcion: "PCI-DSS non-compliant"
esfuerzo: "80h"
impacto: "CRÍTICO - Compliance & Security"
- epica: "OQI-009"
componente: "MT4Gateway"
descripcion: "0% funcional, bloqueador principal"
esfuerzo: "180h"
impacto: "CRÍTICO - Feature"
P1_high:
- epica: "OQI-002"
componente: "VideoProgressPlayer"
descripcion: "Video upload sin streaming, speed controls faltantes"
esfuerzo: "80h"
impacto: "ALTO - UX"
- epica: "OQI-003"
componente: "AdvancedChartWithDrawings"
descripcion: "Sin herramientas de dibujo, traders limitados"
esfuerzo: "150h"
impacto: "ALTO - Feature"
- epica: "OQI-003"
componente: "OrderBook WebSocket"
descripcion: "Polling lag, no real-time"
esfuerzo: "40h"
impacto: "MEDIO - UX"
- epica: "OQI-007"
componente: "StrategyExecutionPanel"
descripcion: "LLM strategies no se pueden ejecutar"
esfuerzo: "80h"
impacto: "ALTO - Feature"
# ═══════════════════════════════════════════════════════════════════════════════
# ESTIMACIONES TOTALES
# ═══════════════════════════════════════════════════════════════════════════════
estimaciones:
total_componentes_faltantes: 41
total_componentes_parciales: 18
esfuerzo_total_estimado: "2870h"
breakdown_por_epica:
OQI-001: "140h"
OQI-002: "200h"
OQI-003: "420h"
OQI-004: "100h"
OQI-005: "120h"
OQI-006: "100h"
OQI-007: "130h"
OQI-008: "220h"
OQI-009: "180h"
breakdown_por_prioridad:
P0: "240h" # Token refresh (60h) + KYC (100h) + PaymentForm (80h)
P1: "930h" # Videos (80h) + Charts (150h) + OrderBook (40h) + Investment (100h) + Investment/KYC (100h) + Payments (120h) + LLM (80h) + Portfolio (220h) + etc
P2: "1100h" # Advanced features, optimization
P3: "180h" # MT4 Gateway
roadmap_propuesto:
q1_2026:
items:
- "P0 Blockers (Token refresh, Payment PCI, KYC): 240h"
- "Auth sessions management: 30h"
total: "270h"
q2_2026:
items:
- "Video streaming & advanced features: 80h"
- "Trading chart drawings & multi-timeframe: 150h"
- "OrderBook WebSocket: 40h"
- "Strategy execution: 80h"
total: "350h"
q3_2026:
items:
- "Advanced features (portfolio optimizer, etc): 400h"
- "LLM improvements: 130h"
total: "530h"
q4_2026:
items:
- "MT4 Gateway (if deemed necessary): 180h"
- "Edge cases & polish: 300h"
total: "480h"
# ═══════════════════════════════════════════════════════════════════════════════
# FIN COMPONENTS-BY-EPIC.yml
# ═══════════════════════════════════════════════════════════════════════════════