# ═══════════════════════════════════════════════════════════════════════════════
# 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
# ═══════════════════════════════════════════════════════════════════════════════
