trading-platform/orchestration/tareas/TASK-2026-02-04-ANALISIS-PLANIFICACION-INTEGRAL/03-PLANIFICACION.md
Adrian Flores Cortes b9098ca91c [TASK-2026-02-05-ANALISIS-VALIDACION-MODELADO-BD] docs: Complete 6-phase database modeling analysis
Comprehensive analysis of 101 DDL tables across 11 schemas:
- Phase 1-2: Schema validation, 37 gaps cataloged (3 resolved)
- Phase 3: Integrity audit (80 FKs, 89 CHECKs, 17 issues: 2 CRIT/5 HIGH)
- Phase 4: DDL-Backend mapping (84% interfaces, 75% services, 61% controllers)
- Phase 5: Documentation purge catalog (201 files analyzed)
- Phase 6: Remediation plan (4 sprints, 204h)

Key finding: Backend uses raw SQL + pg Pool (NOT TypeORM).
13 deliverables + updated inventories to v2.0.0.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-05 16:48:45 -06:00

637 lines
17 KiB
Markdown

# 03-PLANIFICACION - Análisis y Planeación Integral
**Tarea:** TASK-2026-02-04-ANALISIS-PLANIFICACION-INTEGRAL
**Fase:** P (Planificación)
**Estado:** EN PROGRESO
**Fecha:** 2026-02-04
**Agente:** Claude Code (Opus 4.5)
---
## 1. ESTRUCTURA DEL PLAN MAESTRO
### 1.1 Organización Jerárquica
```
PLAN-MAESTRO-TRADING-PLATFORM-2026-Q1
├── FASE-0: PREPARACIÓN (8h)
│ ├── SUBTAREA-0.1: Purga documentación obsoleta
│ ├── SUBTAREA-0.2: Sincronización inventarios
│ └── SUBTAREA-0.3: Actualización PROJECT-STATUS
├── FASE-1: DDL GAPS (16h)
│ ├── SUBTAREA-1.1: education.instructors table
│ ├── SUBTAREA-1.2: education.course_tags field
│ ├── SUBTAREA-1.3: trading.price_alerts table
│ └── SUBTAREA-1.4: Validación DDL post-cambios
├── FASE-2: BACKEND SERVICES (48h)
│ ├── SUBTAREA-2.1: Market Data OHLCV Service (P0)
│ ├── SUBTAREA-2.2: Notifications Complete Service (P1)
│ ├── SUBTAREA-2.3: User Profile Service (P0)
│ ├── SUBTAREA-2.4: Audit Service (P2)
│ └── SUBTAREA-2.5: 2FA Complete Flow (P1)
├── FASE-3: BACKEND API (24h)
│ ├── SUBTAREA-3.1: Market Data Endpoints
│ ├── SUBTAREA-3.2: Notifications Endpoints
│ ├── SUBTAREA-3.3: User Profile Endpoints
│ ├── SUBTAREA-3.4: Trading Agents Endpoints
│ └── SUBTAREA-3.5: 2FA Setup Endpoints
├── FASE-4: FRONTEND INTEGRATION (180h)
│ ├── SPRINT-FE-1: Fundamentos (17 SP)
│ ├── SPRINT-FE-2: Trading Core (60 SP)
│ ├── SPRINT-FE-3: Investment (81 SP)
│ ├── SPRINT-FE-4: Advanced Features (128 SP)
│ └── SPRINT-FE-5: Growth (55 SP)
├── FASE-5: ARCHITECTURE REFACTOR (24h)
│ ├── SUBTAREA-5.1: Proxy Python Services (ARCH-001)
│ └── SUBTAREA-5.2: Standardize apiClient (ARCH-002)
├── FASE-6: TESTING (40h)
│ ├── SUBTAREA-6.1: Unit Tests Backend
│ ├── SUBTAREA-6.2: Unit Tests Frontend
│ ├── SUBTAREA-6.3: Integration Tests
│ └── SUBTAREA-6.4: E2E Tests
└── FASE-7: DOCUMENTACIÓN (16h)
├── SUBTAREA-7.1: Guías desarrollo
├── SUBTAREA-7.2: API Documentation
└── SUBTAREA-7.3: Actualización inventarios final
```
---
## 2. DETALLE DE SUBTAREAS - FASE 0: PREPARACIÓN
### SUBTAREA-0.1: Purga Documentación Obsoleta
**ID:** ST-0.1
**Prioridad:** P0
**Esfuerzo:** 2h
**Perfil:** PERFIL-ORQUESTADOR
**Parallelizable:**
**CAPVED:**
- **C:** Identificar documentos obsoletos listados en 01-CAPTURA.md
- **A:** Verificar que no hay referencias activas
- **P:** Plan de archivado/eliminación
- **V:** No aplica (no código)
- **E:** Mover/eliminar archivos
- **D:** Actualizar _INDEX.yml
**Acciones:**
1. Mover `TASK-2026-02-03-DDL-VALIDATION/` a `_archive/2026-02/`
2. Eliminar `docs/90-transversal/gaps/ANALISIS-GAPS-DOCUMENTACION.md`
3. Decidir sobre `95-guias-desarrollo/` vacíos
**Criterios Aceptación:**
- [ ] No existen archivos obsoletos identificados
- [ ] _INDEX.yml actualizado
- [ ] Sin referencias rotas
---
### SUBTAREA-0.2: Sincronización Inventarios
**ID:** ST-0.2
**Prioridad:** P0
**Esfuerzo:** 4h
**Perfil:** PERFIL-ORQUESTADOR
**Parallelizable:** Parcial
**CAPVED:**
- **C:** Leer inventarios actuales y código real
- **A:** Identificar discrepancias específicas
- **P:** Lista de correcciones por inventario
- **V:** Verificar conteos con grep/find
- **E:** Actualizar YAML files
- **D:** Commit con changelog
**Acciones:**
1. BACKEND_INVENTORY.yml: Actualizar conteo 57→79 endpoints
2. FRONTEND_INVENTORY.yml: Actualizar conteo 90→146 componentes
3. DATABASE_INVENTORY.yml: Resolver duplicación notifications
**Criterios Aceptación:**
- [ ] Todos los inventarios >95% sincronizados
- [ ] Sin duplicaciones en DDL registry
- [ ] Conteos verificados automáticamente
---
### SUBTAREA-0.3: Actualización PROJECT-STATUS
**ID:** ST-0.3
**Prioridad:** P0
**Esfuerzo:** 2h
**Perfil:** PERFIL-ORQUESTADOR
**Parallelizable:**
**CAPVED:**
- **C:** Leer PROJECT-STATUS.md actual (2026-01-30)
- **A:** Comparar con estado real del proyecto
- **P:** Lista de secciones a actualizar
- **V:** No aplica
- **E:** Editar PROJECT-STATUS.md y PROXIMA-ACCION.md
- **D:** Commit
**Criterios Aceptación:**
- [ ] PROJECT-STATUS.md con fecha actual
- [ ] PROXIMA-ACCION.md refleja tarea actual
- [ ] Métricas actualizadas
---
## 3. DETALLE DE SUBTAREAS - FASE 1: DDL GAPS
### SUBTAREA-1.1: education.instructors Table
**ID:** ST-1.1
**Prioridad:** P1
**Esfuerzo:** 4h
**Perfil:** PERFIL-DATABASE-POSTGRESQL
**Parallelizable:** Sí (con ST-1.2, ST-1.3)
**Depende de:** ST-0.2
**CAPVED:**
- **C:** Revisar requerimientos OQI-002 para instructores
- **A:** Diseñar schema de tabla con campos necesarios
- **P:** DDL script con constraints y índices
- **V:** Validar FK hacia auth.user_profiles
- **E:** Crear DDL y ejecutar en WSL
- **D:** Actualizar DATABASE_INVENTORY.yml
**DDL Propuesto:**
```sql
CREATE TABLE education.instructors (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.user_profiles(id),
bio TEXT,
specializations TEXT[],
rating DECIMAL(3,2) DEFAULT 0,
total_courses INTEGER DEFAULT 0,
total_students INTEGER DEFAULT 0,
is_verified BOOLEAN DEFAULT false,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_instructors_user_id ON education.instructors(user_id);
CREATE INDEX idx_instructors_rating ON education.instructors(rating DESC);
```
**Criterios Aceptación:**
- [ ] Tabla creada en schema education
- [ ] FK válida hacia auth.user_profiles
- [ ] Índices creados
- [ ] DDL documentado en apps/database/
---
### SUBTAREA-1.2: education.course_tags Field
**ID:** ST-1.2
**Prioridad:** P1
**Esfuerzo:** 2h
**Perfil:** PERFIL-DATABASE-POSTGRESQL
**Parallelizable:** Sí (con ST-1.1, ST-1.3)
**Depende de:** ST-0.2
**CAPVED:**
- **C:** Revisar OQI-002 para filtrado por tags
- **A:** Decidir: campo TEXT[] o tabla de relación
- **P:** DDL para campo o tabla
- **V:** Compatibilidad con queries existentes
- **E:** Ejecutar DDL en WSL
- **D:** Actualizar inventario
**Decisión Arquitectural:**
Usar tabla de relación `education.course_tag_assignments` (ya existe tag.service.ts)
**Criterios Aceptación:**
- [ ] Tags pueden asignarse a cursos
- [ ] Queries de filtrado funcionan
- [ ] Coherencia con tag.service.ts existente
---
### SUBTAREA-1.3: trading.price_alerts Table
**ID:** ST-1.3
**Prioridad:** P0
**Esfuerzo:** 4h
**Perfil:** PERFIL-DATABASE-POSTGRESQL
**Parallelizable:** Sí (con ST-1.1, ST-1.2)
**Depende de:** ST-0.2
**CAPVED:**
- **C:** Revisar OQI-003 para alertas de precio
- **A:** Diseñar schema con tipos de alerta
- **P:** DDL con enum y tabla
- **V:** FK hacia trading.symbols
- **E:** Ejecutar DDL
- **D:** Documentar
**DDL Propuesto:**
```sql
CREATE TYPE trading.alert_type AS ENUM ('price_above', 'price_below', 'percent_change', 'volume_spike');
CREATE TYPE trading.alert_status AS ENUM ('active', 'triggered', 'expired', 'cancelled');
CREATE TABLE trading.price_alerts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.user_profiles(id),
symbol_id UUID NOT NULL REFERENCES trading.symbols(id),
alert_type trading.alert_type NOT NULL,
target_price DECIMAL(18,8),
percent_threshold DECIMAL(5,2),
status trading.alert_status DEFAULT 'active',
triggered_at TIMESTAMPTZ,
expires_at TIMESTAMPTZ,
notification_channels TEXT[] DEFAULT ARRAY['push', 'email'],
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_price_alerts_user ON trading.price_alerts(user_id);
CREATE INDEX idx_price_alerts_symbol ON trading.price_alerts(symbol_id);
CREATE INDEX idx_price_alerts_active ON trading.price_alerts(status) WHERE status = 'active';
```
**Criterios Aceptación:**
- [ ] Tabla creada con enums
- [ ] FKs válidas
- [ ] Índice parcial para alertas activas
- [ ] Compatible con notification service
---
### SUBTAREA-1.4: Validación DDL Post-Cambios
**ID:** ST-1.4
**Prioridad:** P0
**Esfuerzo:** 2h
**Perfil:** PERFIL-DATABASE-POSTGRESQL
**Parallelizable:** No
**Depende de:** ST-1.1, ST-1.2, ST-1.3
**CAPVED:**
- **C:** Lista de cambios DDL realizados
- **A:** Verificar integridad referencial
- **P:** Script de validación
- **V:** Ejecutar validaciones
- **E:** Corregir si hay errores
- **D:** Actualizar DDL-VALIDATION-MATRIX.yml
**Criterios Aceptación:**
- [ ] Todas las FK válidas
- [ ] Índices optimizados
- [ ] Sin conflictos de nombres
- [ ] Script recreate-db funciona
---
## 4. DETALLE DE SUBTAREAS - FASE 2: BACKEND SERVICES
### SUBTAREA-2.1: Market Data OHLCV Service (CRÍTICO)
**ID:** ST-2.1
**Prioridad:** P0
**Esfuerzo:** 16h
**Perfil:** PERFIL-BACKEND-NESTJS
**Parallelizable:** No (bloquea CHAIN-001)
**Depende de:** ST-1.4
**CAPVED:**
- **C:** Leer especificaciones OQI-003 para datos de mercado
- **A:** Diseñar service con cache Redis
- **P:** Estructura de archivos y endpoints
- **V:** Validar contra DDL market_data
- **E:** Implementar service + controller
- **D:** Swagger docs
**Estructura:**
```
apps/backend/src/modules/market-data/
├── market-data.module.ts
├── market-data.controller.ts
├── market-data.service.ts
├── interfaces/
│ ├── ohlcv.interface.ts
│ └── ticker.interface.ts
├── dto/
│ ├── get-ohlcv.dto.ts
│ └── get-ticker.dto.ts
└── index.ts
```
**Endpoints:**
- GET /api/market-data/ohlcv/:symbol
- GET /api/market-data/tickers
- GET /api/market-data/ticker/:symbol
- WS /ws/market-data/stream
**Criterios Aceptación:**
- [ ] Service implementado con caching
- [ ] Endpoints funcionando
- [ ] WebSocket stream activo
- [ ] Swagger documentado
- [ ] Tests unitarios
---
### SUBTAREA-2.2: Notifications Complete Service
**ID:** ST-2.2
**Prioridad:** P1
**Esfuerzo:** 12h
**Perfil:** PERFIL-BACKEND-NESTJS
**Parallelizable:** Sí (con ST-2.3)
**Depende de:** ST-1.4
**CAPVED:**
- **C:** Revisar notification.service.ts existente (parcial)
- **A:** Identificar funcionalidad faltante
- **P:** Completar service + controller + push
- **V:** Validar contra DDL auth.notifications
- **E:** Implementar
- **D:** Documentar
**Funcionalidad Faltante:**
- Push notifications (web push)
- Email notifications
- In-app notifications API
- User preferences
**Criterios Aceptación:**
- [ ] Push notifications funcionando
- [ ] Preferences guardadas
- [ ] API completa
- [ ] Tests
---
### SUBTAREA-2.3: User Profile Service
**ID:** ST-2.3
**Prioridad:** P0
**Esfuerzo:** 6h
**Perfil:** PERFIL-BACKEND-NESTJS
**Parallelizable:** Sí (con ST-2.2)
**Depende de:** NINGUNA
**CAPVED:**
- **C:** Revisar auth.user_profiles DDL
- **A:** Diseñar CRUD operations
- **P:** Service + Controller
- **V:** Validar auth guards
- **E:** Implementar
- **D:** Swagger
**Estructura:**
```
apps/backend/src/modules/users/
├── users.module.ts
├── users.controller.ts
├── users.service.ts
├── dto/
│ ├── update-profile.dto.ts
│ └── change-password.dto.ts
└── index.ts
```
**Criterios Aceptación:**
- [ ] CRUD de perfil
- [ ] Cambio de password
- [ ] Avatar upload
- [ ] Guards aplicados
---
### SUBTAREA-2.4: Audit Service
**ID:** ST-2.4
**Prioridad:** P2
**Esfuerzo:** 8h
**Perfil:** PERFIL-BACKEND-NESTJS
**Parallelizable:**
**Depende de:** ST-1.4
**CAPVED:**
- **C:** Revisar audit.service.ts existente (parcial)
- **A:** Evaluar reutilización de template-saas
- **P:** Completar queries y endpoints
- **V:** Validar DDL audit schema
- **E:** Implementar
- **D:** Documentar
**Criterios Aceptación:**
- [ ] Log de eventos
- [ ] Queries por usuario/fecha
- [ ] Export capability
- [ ] Admin endpoints
---
### SUBTAREA-2.5: 2FA Complete Flow
**ID:** ST-2.5
**Prioridad:** P1
**Esfuerzo:** 8h
**Perfil:** PERFIL-BACKEND-NESTJS
**Parallelizable:**
**Depende de:** NINGUNA
**CAPVED:**
- **C:** Revisar twofa.service.ts existente
- **A:** Identificar endpoints faltantes
- **P:** Setup + Verify + Backup codes
- **V:** Tests de seguridad
- **E:** Implementar endpoints
- **D:** Documentar flujo
**Endpoints Faltantes:**
- POST /api/auth/2fa/setup
- POST /api/auth/2fa/verify
- POST /api/auth/2fa/disable
- GET /api/auth/2fa/backup-codes
**Criterios Aceptación:**
- [ ] Setup con QR code
- [ ] Verify con TOTP
- [ ] Backup codes generados
- [ ] Disable con password confirm
---
## 5. DETALLE DE SUBTAREAS - FASE 3: BACKEND API
(Resumen - detalles similares a FASE 2)
| ID | Subtarea | Esfuerzo | Depende de |
|----|----------|----------|------------|
| ST-3.1 | Market Data Endpoints | 4h | ST-2.1 |
| ST-3.2 | Notifications Endpoints | 4h | ST-2.2 |
| ST-3.3 | User Profile Endpoints | 4h | ST-2.3 |
| ST-3.4 | Trading Agents Endpoints | 8h | DDL trading |
| ST-3.5 | 2FA Setup Endpoints | 4h | ST-2.5 |
---
## 6. DETALLE DE SUBTAREAS - FASE 4: FRONTEND
### SPRINT-FE-1: Fundamentos (17 SP)
| ID | Subtarea | SP | Depende de |
|----|----------|-----|------------|
| SUBTASK-001 | Routing y Huérfanos | 4 | NINGUNA |
| SUBTASK-002 | OQI-001 Auth Completar | 13 | ST-2.5, ST-3.3 |
### SPRINT-FE-2: Trading Core (60 SP)
| ID | Subtarea | SP | Depende de |
|----|----------|-----|------------|
| SUBTASK-003 | OQI-003 Trading | 44 | ST-3.1, ST-3.4 |
| SUBTASK-004 | OQI-006 ML | 16 | ST-3.1 |
### SPRINT-FE-3: Investment (81 SP)
| ID | Subtarea | SP | Depende de |
|----|----------|-----|------------|
| SUBTASK-005 | OQI-004 Investment | 68 | Backend investment |
| SUBTASK-006 | OQI-005 Payments | 13 | Backend payments |
### SPRINT-FE-4: Advanced Features (128 SP)
| ID | Subtarea | SP | Depende de |
|----|----------|-----|------------|
| SUBTASK-007 | OQI-002 Education | 21 | ST-1.1, ST-1.2 |
| SUBTASK-008 | OQI-007 LLM | 44 | Backend LLM |
| SUBTASK-009 | OQI-008 Portfolio | 63 | Backend portfolio |
### SPRINT-FE-5: Growth (55 SP)
| ID | Subtarea | SP | Depende de |
|----|----------|-----|------------|
| SUBTASK-010 | OQI-009 Marketplace | 42 | Docs OQI-009 |
| SUBTASK-011 | Migración Docs | 8 | NINGUNA |
| SUBTASK-012 | Inventarios Sync | 5 | NINGUNA |
---
## 7. PLAN DE EJECUCIÓN ORDENADO
### Semana 1: Preparación + DDL
| Día | Subtareas | Paralelismo | Horas |
|-----|-----------|-------------|-------|
| D1 | ST-0.1, ST-0.2, ST-0.3 | 3 parallel | 8h |
| D2 | ST-1.1, ST-1.2, ST-1.3 | 3 parallel | 8h |
| D3 | ST-1.4 | Secuencial | 2h |
**Entregables Semana 1:**
- Documentación purgada
- Inventarios sincronizados
- DDL gaps resueltos
### Semana 2-3: Backend Services
| Día | Subtareas | Paralelismo | Horas |
|-----|-----------|-------------|-------|
| D4-D5 | ST-2.1 (Market Data) | Critical path | 16h |
| D6 | ST-2.2, ST-2.3 | 2 parallel | 12h |
| D7 | ST-2.4, ST-2.5 | 2 parallel | 16h |
| D8 | ST-3.1, ST-3.2 | 2 parallel | 8h |
| D9 | ST-3.3, ST-3.4, ST-3.5 | 3 parallel | 16h |
**Entregables Semana 2-3:**
- Market Data Service completo (CHAIN-001 desbloqueado)
- Notifications completo
- User Profile completo
- 2FA completo
### Semana 4-8: Frontend Sprints
| Sprint | Duración | Subtareas | Paralelismo |
|--------|----------|-----------|-------------|
| FE-1 | 3 días | SUBTASK-001, 002 | 2 parallel |
| FE-2 | 5 días | SUBTASK-003, 004 | 2 parallel |
| FE-3 | 6 días | SUBTASK-005, 006 | 2 parallel |
| FE-4 | 10 días | SUBTASK-007-009 | 3 parallel |
| FE-5 | 4 días | SUBTASK-010-012 | 3 parallel |
### Semana 9-10: Refactor + Testing
| Día | Subtareas | Horas |
|-----|-----------|-------|
| D1-D2 | ST-5.1 (ARCH-001) | 16h |
| D3 | ST-5.2 (ARCH-002) | 8h |
| D4-D7 | ST-6.1-6.4 Tests | 40h |
| D8-D9 | ST-7.1-7.3 Docs | 16h |
---
## 8. ASIGNACIÓN DE PERFILES POR SUBTAREA
| Subtarea | Perfil Principal | Perfil Backup |
|----------|------------------|---------------|
| ST-0.* | PERFIL-ORQUESTADOR | - |
| ST-1.* | PERFIL-DATABASE-POSTGRESQL | PERFIL-DATABASE-COMPACT |
| ST-2.* | PERFIL-BACKEND-NESTJS | PERFIL-BACKEND-COMPACT |
| ST-3.* | PERFIL-BACKEND-NESTJS | - |
| SUBTASK-* | PERFIL-FRONTEND-REACT | PERFIL-GENERIC-SUBAGENT |
| ST-5.* | PERFIL-BACKEND-NESTJS | - |
| ST-6.* | PERFIL-QA-TESTER | PERFIL-BACKEND-NESTJS |
| ST-7.* | PERFIL-DOCUMENTACION | PERFIL-ORQUESTADOR |
---
## 9. CRITERIOS DE ÉXITO DEL PLAN
### Métricas Objetivo
| Métrica | Actual | Objetivo | Incremento |
|---------|--------|----------|------------|
| Coherencia Global | 81.25% | 95% | +13.75% |
| DDL-Backend | 85% | 98% | +13% |
| Backend-Frontend | 77.5% | 92% | +14.5% |
| Test Coverage | 15% | 40% | +25% |
| Gaps P0 | 3 | 0 | -3 |
| Gaps P1 | 6 | 2 | -4 |
### Hitos de Validación
| Hito | Semana | Criterio |
|------|--------|----------|
| M1 | 1 | DDL 100% sincronizado |
| M2 | 3 | CHAIN-001 desbloqueado |
| M3 | 5 | Frontend Sprint 2 completado |
| M4 | 8 | Frontend MVP completado |
| M5 | 10 | Tests 40%+ coverage |
---
## 10. PLAN DE CONTINGENCIA
### Riesgos y Mitigaciones
| Riesgo | Trigger | Mitigación |
|--------|---------|------------|
| Bloqueo en Market Data | >3 días delay | Usar mock service temporal |
| Tests lentos | >8h por suite | Paralelizar CI |
| Dependencia externa | API down | Cache agresivo |
| Scope creep | +20% SP | Congelar scope Sprint |
### Escalation Path
1. Blocker técnico → Consultar ARCH-001/002 solutions
2. Blocker de dependencia → Reordenar subtareas
3. Blocker de recurso → Solicitar subagente adicional
---
**Siguiente Fase:** E (Ejecución) - Delegación a subagentes