trading-platform/orchestration/analisis/coherencia/GAPS-TRACKING.yml
Adrian Flores Cortes 92b1009fe8 [TASK-2026-02-03-ANALISIS-DDL-MODELADO] docs: Add comprehensive DDL analysis and planning
Phase C (Context) and A (Analysis) complete:
- Analyzed 11 schemas, ~90 tables, 68+ enums
- Identified 15 gaps (4 P0, 4 P1, 7 P2)
- Detected 5 conflicts and 3 duplicities
- Created validation matrix DDL vs requirements

Phase P (Planning) in progress:
- 7-phase execution plan with CAPVED compliance
- Subtask delegation plan for parallel execution
- Estimated effort: 126h (without MT4)

Key findings:
- GAP-002: financial.refunds missing (P0 - Stripe blocker)
- GAP-003: education.instructors missing (P0)
- CONF-001: transaction_type enum conflict
- DUP-001: timeframe enum duplicated

Deliverables created:
- 01-CAPTURA.md, 02-ANALISIS.md, 03-PLANIFICACION.md
- DDL-GAPS-REGISTRY.yml
- DDL-CONFLICTS-REGISTRY.yml
- DDL-VALIDATION-MATRIX.yml
- DELEGATION-PLAN.yml

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 23:40:28 -06:00

608 lines
20 KiB
YAML

# ==============================================================================
# Gaps Tracking - Trading Platform
# Generated: 2026-01-27
# Updated: 2026-02-03
# ==============================================================================
version: "1.1.0"
project: "trading-platform"
total_gaps: 24
completed_gaps: 0
in_progress_gaps: 6
# ==============================================================================
# CONFLICTOS DDL (Nuevo - 2026-02-03)
# ==============================================================================
ddl_conflicts:
- id: CONFLICT-C1
title: "Catálogos Duplicados: trading.symbols vs market_data.tickers"
priority: "P1"
status: "analizado"
description: |
Dos tablas de catálogo de símbolos con propósitos similares pero IDs diferentes:
- trading.symbols: UUID, price_precision, min_quantity, max_quantity, exchange
- market_data.tickers: SERIAL, is_ml_enabled, polygon_ticker, supported_timeframes
recommendation: |
Consolidar en trading.symbols como tabla maestra.
Agregar campos ML de tickers (is_ml_enabled, polygon_ticker).
market_data puede referenciar trading.symbols via FK.
created_at: "2026-02-03"
- id: CONFLICT-C2
title: "Sistemas de Transacciones Paralelos"
priority: "P2"
status: "analizado"
description: |
financial.wallet_transactions (9 tipos) vs investment.transactions (3 tipos).
Son COMPLEMENTARIOS, no duplicados:
- wallet_transactions: Movimientos de wallet genéricos
- investment.transactions: Operaciones PAMM específicas
recommendation: |
MANTENER separados. Documentar patrón.
Opcional: Agregar FK de investment.transactions → wallet_transactions.
created_at: "2026-02-03"
- id: CONFLICT-C5
title: "Enums Duplicados: risk_profile, timeframe divergente"
priority: "P2"
status: "analizado"
description: |
- investment.risk_profile = portfolio.risk_profile (IDÉNTICOS)
- trading.timeframe tiene '1M', market_data.timeframe NO lo tiene
recommendation: |
- Considerar consolidar risk_profile en shared schema
- Agregar '1M' a market_data.timeframe
created_at: "2026-02-03"
# ==============================================================================
# GAPS DDL NUEVOS (2026-02-03)
# ==============================================================================
new_ddl_gaps:
- id: GAP-DDL-001
title: "education.instructors - Tabla faltante"
priority: "P1"
status: "in_progress"
epic: "OQI-002"
description: |
courses.instructor_id referencia auth.users directamente.
Falta tabla dedicada con bio, avatar, specialties, rating.
ddl_propuesto: |
CREATE TABLE education.instructors (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id),
bio TEXT,
avatar_url VARCHAR(500),
specialties VARCHAR[],
rating DECIMAL(3,2),
courses_count INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW()
);
estimated_hours: 4
created_at: "2026-02-03"
- id: GAP-DDL-002
title: "education.courses.tags - Campo faltante"
priority: "P2"
status: "in_progress"
epic: "OQI-002"
description: "Campo tags faltante para búsqueda/filtrado de cursos"
ddl_propuesto: |
ALTER TABLE education.courses ADD COLUMN tags VARCHAR[] DEFAULT '{}';
CREATE INDEX idx_courses_tags ON education.courses USING GIN(tags);
estimated_hours: 2
created_at: "2026-02-03"
- id: GAP-DDL-003
title: "trading.price_alerts - Tabla faltante"
priority: "P1"
status: "in_progress"
epic: "OQI-003"
description: "Falta tabla para alertas de precio y notificaciones de usuario"
ddl_propuesto: |
CREATE TABLE trading.price_alerts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id),
symbol_id UUID REFERENCES trading.symbols(id),
condition VARCHAR(10) NOT NULL,
target_price DECIMAL(20,8) NOT NULL,
is_active BOOLEAN DEFAULT true,
triggered_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
estimated_hours: 4
created_at: "2026-02-03"
- id: GAP-DDL-004
title: "financial.refunds - Tabla faltante"
priority: "P1"
status: "in_progress"
epic: "OQI-005"
description: |
Refunds embebidos en payments como campos.
Para compliance y partial refunds se necesita tabla dedicada.
ddl_propuesto: |
CREATE TABLE financial.refunds (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
payment_id UUID REFERENCES financial.payments(id),
amount DECIMAL(20,8) NOT NULL,
reason VARCHAR(255),
status VARCHAR(20) DEFAULT 'pending',
stripe_refund_id VARCHAR(255),
created_at TIMESTAMPTZ DEFAULT NOW(),
processed_at TIMESTAMPTZ
);
estimated_hours: 4
created_at: "2026-02-03"
- id: GAP-DDL-005
title: "investment.agent_executions - Tabla faltante"
priority: "P1"
status: "in_progress"
epic: "OQI-004"
description: "Falta tracking de ejecuciones de trading agents (Atlas, Orion, Nova)"
ddl_propuesto: |
CREATE TABLE investment.agent_executions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
account_id UUID REFERENCES investment.accounts(id),
agent_type VARCHAR(20) NOT NULL,
execution_type VARCHAR(20),
trade_details JSONB,
pnl DECIMAL(20,8),
executed_at TIMESTAMPTZ DEFAULT NOW()
);
estimated_hours: 4
created_at: "2026-02-03"
- id: GAP-DDL-006
title: "ml.predictions.overlay_data - Campo faltante"
priority: "P3"
status: "in_progress"
epic: "OQI-006"
description: "Campo específico para overlay_data de charts ML"
ddl_propuesto: |
ALTER TABLE ml.predictions ADD COLUMN overlay_data JSONB;
estimated_hours: 1
created_at: "2026-02-03"
# ==============================================================================
# P1 - Gaps Críticos (Acción Inmediata)
# ==============================================================================
p1_gaps:
- id: GAP-001
title: "Market Data OHLCV Service"
priority: "P1"
status: "pending"
schema: "market_data"
tables:
- market_data.ohlcv_5m
- market_data.ohlcv_15m
description: |
Las tablas OHLCV no tienen servicios backend. Los charts del frontend
necesitan consultar estos datos via API REST.
impact: "alto"
effort: "medio"
estimated_hours: 16
assigned_to: null
created_at: "2026-01-27"
due_date: null
deliverables:
- file: "apps/backend/src/modules/market-data/services/marketData.service.ts"
type: "service"
methods:
- getOHLCV(symbol, timeframe, limit?)
- getLatestCandles(symbol, timeframe)
- getHistoricalData(symbol, from, to)
- getCandlesByRange(symbol, timeframe, start, end)
- file: "apps/backend/src/modules/market-data/types/market-data.types.ts"
type: "interfaces"
interfaces:
- OHLCV
- Timeframe
- CandleQueryOptions
- file: "apps/backend/src/modules/market-data/controllers/market-data.controller.ts"
type: "controller"
endpoints:
- "GET /api/market-data/ohlcv/:symbol/:timeframe"
- "GET /api/market-data/historical/:symbol"
- file: "apps/backend/src/modules/market-data/market-data.module.ts"
type: "module"
tests:
- file: "apps/backend/src/modules/market-data/services/marketData.service.spec.ts"
- file: "apps/backend/src/modules/market-data/controllers/market-data.controller.spec.ts"
dependencies:
- market_data schema debe estar poblado con datos
- Integración con data-service Python (opcional)
acceptance_criteria:
- "[ ] Servicio puede consultar ohlcv_5m y ohlcv_15m"
- "[ ] Endpoint REST responde en <500ms para 100 candles"
- "[ ] Tipos TypeScript correctamente definidos"
- "[ ] Tests unitarios cubren >80%"
- "[ ] Documentación Swagger completa"
- "[ ] Frontend puede consumir endpoints"
- id: GAP-002
title: "Notification Service y Push Tokens"
priority: "P1"
status: "pending"
schema: "auth"
tables:
- auth.notifications
- auth.user_push_tokens
description: |
Sistema de notificaciones existe en DDL pero sin servicios backend.
Usuarios no pueden consultar ni gestionar notificaciones.
impact: "alto"
effort: "medio"
estimated_hours: 20
assigned_to: null
created_at: "2026-01-27"
due_date: null
deliverables:
- file: "apps/backend/src/modules/notifications/services/notification.service.ts"
type: "service"
methods:
- getUserNotifications(userId, filters?)
- markAsRead(notificationId)
- markAllAsRead(userId)
- deleteNotification(notificationId)
- sendNotification(userId, notification)
- file: "apps/backend/src/modules/notifications/services/push.service.ts"
type: "service"
methods:
- registerPushToken(userId, token, platform)
- unregisterPushToken(tokenId)
- sendPushNotification(userId, payload)
- sendBulkPushNotifications(userIds, payload)
- file: "apps/backend/src/modules/notifications/types/notification.types.ts"
type: "interfaces"
interfaces:
- Notification
- NotificationType
- PushToken
- PushPayload
- file: "apps/backend/src/modules/notifications/controllers/notification.controller.ts"
type: "controller"
endpoints:
- "GET /api/notifications"
- "POST /api/notifications/:id/read"
- "DELETE /api/notifications/:id"
- "POST /api/notifications/push-token"
- file: "apps/backend/src/modules/notifications/notifications.module.ts"
type: "module"
tests:
- file: "apps/backend/src/modules/notifications/services/notification.service.spec.ts"
- file: "apps/backend/src/modules/notifications/services/push.service.spec.ts"
dependencies:
- Firebase Cloud Messaging o OneSignal para push
- WebSocket para notificaciones en tiempo real (opcional)
acceptance_criteria:
- "[ ] Usuarios pueden ver sus notificaciones"
- "[ ] Usuarios pueden marcar como leídas"
- "[ ] Push tokens se registran correctamente"
- "[ ] Push notifications se envían vía FCM/OneSignal"
- "[ ] Tests cubren casos principales"
- "[ ] Frontend notifica en tiempo real"
# ==============================================================================
# P2 - Gaps Importantes (Corto Plazo)
# ==============================================================================
p2_gaps:
- id: GAP-003
title: "Audit Service - Consultas de Logs"
priority: "P2"
status: "pending"
schema: "audit"
tables:
- audit.audit_logs
- audit.security_events
- audit.trading_audit
- audit.api_request_logs
description: |
Sistema de auditoría registra logs via triggers/middleware pero no
hay servicios para consultarlos. Admin dashboard necesita estos datos.
impact: "medio"
effort: "grande"
estimated_hours: 32
assigned_to: null
created_at: "2026-01-27"
due_date: null
deliverables:
- file: "apps/backend/src/modules/audit/services/audit.service.ts"
type: "service"
methods:
- getAuditLogs(filters)
- getSecurityEvents(filters)
- getTradingAudit(botId, filters)
- getAPIRequestLogs(filters)
- exportAuditReport(from, to)
- file: "apps/backend/src/modules/audit/types/audit.types.ts"
type: "interfaces"
- file: "apps/backend/src/modules/audit/controllers/audit.controller.ts"
type: "controller"
endpoints:
- "GET /api/audit/logs"
- "GET /api/audit/security-events"
- "GET /api/audit/trading/:botId"
- "GET /api/audit/export"
acceptance_criteria:
- "[ ] Admin puede consultar audit logs"
- "[ ] Filtros por fecha, usuario, tipo de evento"
- "[ ] Paginación para grandes volúmenes"
- "[ ] Export a CSV/JSON"
- "[ ] Endpoints protegidos (admin only)"
- id: GAP-004
title: "Currency Exchange Service"
priority: "P2"
status: "pending"
schema: "financial"
tables:
- financial.currency_exchange_rates
description: |
Sistema multi-moneda (USD, MXN, EUR) necesita servicio de conversión
con sincronización automática de tasas de cambio.
impact: "medio"
effort: "medio"
estimated_hours: 16
assigned_to: null
created_at: "2026-01-27"
due_date: null
deliverables:
- file: "apps/backend/src/modules/financial/services/currencyExchange.service.ts"
type: "service"
methods:
- getExchangeRate(from, to, date?)
- convertAmount(amount, from, to)
- syncRatesFromAPI()
- getHistoricalRates(from, to, startDate, endDate)
- file: "apps/backend/src/modules/financial/types/currency.types.ts"
type: "interfaces"
dependencies:
- API externa: CoinGecko, ExchangeRate-API, o similar
- Cron job para sincronización diaria
acceptance_criteria:
- "[ ] Conversión USD <-> MXN <-> EUR"
- "[ ] Sync automático de tasas diarias"
- "[ ] Fallback a tasas anteriores si API falla"
- "[ ] Cache de tasas recientes"
- id: GAP-005
title: "Risk Assessment Service"
priority: "P2"
status: "pending"
schema: "investment"
tables:
- investment.risk_questionnaire
description: |
Usuarios completan cuestionario de riesgo pero no hay servicio
para gestionar respuestas ni calcular perfil.
impact: "medio"
effort: "medio"
estimated_hours: 12
assigned_to: null
created_at: "2026-01-27"
due_date: null
deliverables:
- file: "apps/backend/src/modules/investment/services/riskAssessment.service.ts"
type: "service"
methods:
- submitQuestionnaire(userId, answers)
- calculateRiskProfile(answers)
- getUserRiskProfile(userId)
- retakeQuestionnaire(userId)
acceptance_criteria:
- "[ ] Usuarios pueden completar cuestionario"
- "[ ] Perfil de riesgo se calcula automáticamente"
- "[ ] Resultados se almacenan en risk_questionnaire table"
- "[ ] Validación de respuestas"
- id: GAP-006
title: "Course Reviews"
priority: "P2"
status: "pending"
schema: "education"
tables:
- education.course_reviews
description: |
Tabla de reviews existe pero no hay endpoints para crear/consultar.
impact: "bajo"
effort: "pequeño"
estimated_hours: 6
assigned_to: null
created_at: "2026-01-27"
due_date: null
deliverables:
- file: "apps/backend/src/modules/education/services/course.service.ts"
type: "service"
methods:
- createReview(userId, courseId, rating, review)
- getCourseReviews(courseId, pagination)
- updateReview(reviewId, data)
- deleteReview(reviewId)
acceptance_criteria:
- "[ ] Usuarios pueden crear reviews"
- "[ ] Reviews se muestran en curso"
- "[ ] Rating promedio se calcula"
- "[ ] Validación: 1 review por usuario por curso"
- id: GAP-007
title: "Login Attempts Tracking"
priority: "P2"
status: "pending"
schema: "auth"
tables:
- auth.login_attempts
description: |
Tabla registra intentos de login pero no hay consultas para
análisis de seguridad.
impact: "bajo"
effort: "pequeño"
estimated_hours: 4
assigned_to: null
created_at: "2026-01-27"
due_date: null
deliverables:
- file: "apps/backend/src/modules/auth/services/token.service.ts"
type: "service"
methods:
- getLoginAttempts(email?, ip?, limit)
- getFailedAttempts(userId)
- analyzeLoginPatterns(userId)
acceptance_criteria:
- "[ ] Admin puede consultar login attempts"
- "[ ] Filtros por email, IP, fecha"
- "[ ] Detección de patrones sospechosos"
# ==============================================================================
# P3 - Gaps Menores (Largo Plazo)
# ==============================================================================
p3_gaps:
- id: GAP-008
title: "Distribution Runs Admin"
priority: "P3"
status: "pending"
schema: "investment"
tables:
- investment.distribution_runs
description: "Admin endpoint para gestionar distribution runs"
impact: "bajo"
effort: "pequeño"
estimated_hours: 4
- id: GAP-009
title: "System Events Queries"
priority: "P3"
status: "pending"
schema: "audit"
tables:
- audit.system_events
- audit.data_access_logs
description: "Consultas de system events en audit.service.ts"
impact: "bajo"
effort: "pequeño"
estimated_hours: 4
- id: GAP-010
title: "Compliance Service (KYC/AML)"
priority: "P3"
status: "pending"
schema: "audit"
tables:
- audit.compliance_logs
description: "Futuro compliance.service.ts para KYC/AML"
impact: "bajo"
effort: "grande"
estimated_hours: 40
- id: GAP-011
title: "Rate Limiting Config Admin"
priority: "P3"
status: "pending"
schema: "auth"
tables:
- auth.rate_limiting_config
description: "Admin endpoint para configurar rate limits"
impact: "bajo"
effort: "pequeño"
estimated_hours: 4
# ==============================================================================
# Estadísticas
# ==============================================================================
statistics:
by_priority:
P1: 6 # +4 nuevos DDL gaps
P2: 7 # +2 conflictos
P3: 5 # +1 gap menor
by_status:
pending: 11
in_progress: 6 # 6 gaps DDL nuevos
analizado: 3 # 3 conflictos
completed: 0
by_effort:
pequeño: 8
medio: 6
grande: 1
total_estimated_hours: 181 # +19 horas para nuevos gaps
# ==============================================================================
# Notas de Tracking
# ==============================================================================
tracking_notes: |
Este archivo debe actualizarse cuando:
- Se inicia trabajo en un gap (status: in_progress)
- Se completa un gap (status: completed)
- Se reasigna prioridad de un gap
- Se asigna desarrollador a un gap
- Se estima nueva fecha de entrega
Para marcar un gap como completado:
1. Cambiar status a "completed"
2. Agregar completed_at con fecha
3. Agregar pull_request con URL del PR
4. Validar que todos los acceptance_criteria estén cumplidos
Formato para gaps completados:
- id: GAP-XXX
status: "completed"
completed_at: "2026-XX-XX"
completed_by: "Developer Name"
pull_request: "https://github.com/org/repo/pull/XXX"
review_status: "approved"
last_updated: "2026-02-03"
next_review: "2026-02-10"
# ==============================================================================
# Análisis 2026-02-03 - Resumen
# ==============================================================================
analysis_2026_02_03:
agent: "Claude Code"
archivos_analizados: 15
conflictos_identificados: 3
gaps_nuevos: 6
recomendaciones:
- "Consolidar catálogos en trading.symbols"
- "Mantener transaction systems separados (by design)"
- "Considerar consolidar risk_profile en shared schema"
- "Agregar 6 tablas/campos faltantes para cerrar gaps"
coherencia_actual:
ddl_backend: "85%"
ddl_requerimientos: "72%"
coherencia_objetivo:
ddl_backend: "90%"
ddl_requerimientos: "85%"