[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>
This commit is contained in:
parent
e57c71d84f
commit
92b1009fe8
@ -1,21 +1,61 @@
|
||||
# ==============================================================================
|
||||
# DDL Complete Matrix - Trading Platform
|
||||
# Generated: 2026-01-27
|
||||
# Updated: 2026-02-03
|
||||
# Total Schemas: 10
|
||||
# Total Tables: 89
|
||||
# Total Tables: 93 (+4 nuevas)
|
||||
# ==============================================================================
|
||||
version: "1.0.0"
|
||||
version: "1.1.0"
|
||||
project: "trading-platform"
|
||||
generated_at: "2026-01-27T12:00:00Z"
|
||||
updated_at: "2026-02-03T10:00:00Z"
|
||||
database: "trading_platform"
|
||||
user: "trading_user"
|
||||
|
||||
summary:
|
||||
total_schemas: 10
|
||||
total_tables: 89
|
||||
total_tables: 93 # +4: instructors, price_alerts, refunds, agent_executions
|
||||
total_enums: 65
|
||||
total_functions: 7
|
||||
total_triggers: 2
|
||||
migrations_pending: 2 # courses.tags, predictions.overlay_data
|
||||
|
||||
# ==============================================================================
|
||||
# NUEVAS TABLAS (2026-02-03)
|
||||
# ==============================================================================
|
||||
new_tables_2026_02_03:
|
||||
- schema: education
|
||||
table: instructors
|
||||
file: "17-instructors.sql"
|
||||
gap: "GAP-DDL-001"
|
||||
|
||||
- schema: trading
|
||||
table: price_alerts
|
||||
file: "11-price_alerts.sql"
|
||||
gap: "GAP-DDL-003"
|
||||
|
||||
- schema: financial
|
||||
table: refunds
|
||||
file: "11-refunds.sql"
|
||||
gap: "GAP-DDL-004"
|
||||
|
||||
- schema: investment
|
||||
table: agent_executions
|
||||
file: "10-agent_executions.sql"
|
||||
gap: "GAP-DDL-005"
|
||||
|
||||
migrations_pending:
|
||||
- schema: education
|
||||
table: courses
|
||||
column: tags
|
||||
file: "migrations/001-add-courses-tags.sql"
|
||||
gap: "GAP-DDL-002"
|
||||
|
||||
- schema: ml
|
||||
table: predictions
|
||||
column: overlay_data
|
||||
file: "migrations/001-add-predictions-overlay.sql"
|
||||
gap: "GAP-DDL-006"
|
||||
|
||||
schemas:
|
||||
audit:
|
||||
|
||||
@ -1,12 +1,167 @@
|
||||
# ==============================================================================
|
||||
# Gaps Tracking - Trading Platform
|
||||
# Generated: 2026-01-27
|
||||
# Updated: 2026-02-03
|
||||
# ==============================================================================
|
||||
version: "1.0.0"
|
||||
version: "1.1.0"
|
||||
project: "trading-platform"
|
||||
total_gaps: 18
|
||||
total_gaps: 24
|
||||
completed_gaps: 0
|
||||
in_progress_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)
|
||||
@ -388,18 +543,19 @@ p3_gaps:
|
||||
|
||||
statistics:
|
||||
by_priority:
|
||||
P1: 2
|
||||
P2: 5
|
||||
P3: 4
|
||||
P1: 6 # +4 nuevos DDL gaps
|
||||
P2: 7 # +2 conflictos
|
||||
P3: 5 # +1 gap menor
|
||||
by_status:
|
||||
pending: 11
|
||||
in_progress: 0
|
||||
in_progress: 6 # 6 gaps DDL nuevos
|
||||
analizado: 3 # 3 conflictos
|
||||
completed: 0
|
||||
by_effort:
|
||||
pequeño: 5
|
||||
medio: 5
|
||||
pequeño: 8
|
||||
medio: 6
|
||||
grande: 1
|
||||
total_estimated_hours: 162
|
||||
total_estimated_hours: 181 # +19 horas para nuevos gaps
|
||||
|
||||
# ==============================================================================
|
||||
# Notas de Tracking
|
||||
@ -427,5 +583,25 @@ tracking_notes: |
|
||||
pull_request: "https://github.com/org/repo/pull/XXX"
|
||||
review_status: "approved"
|
||||
|
||||
last_updated: "2026-01-27"
|
||||
next_review: "2026-02-15"
|
||||
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%"
|
||||
|
||||
@ -0,0 +1,316 @@
|
||||
# Reporte de Análisis DDL - Trading Platform
|
||||
|
||||
**Fecha:** 2026-02-03
|
||||
**Agente:** Claude Code
|
||||
**Tipo:** ANALYSIS (C+A+P)
|
||||
**Estado:** FASE 1-2 COMPLETADAS
|
||||
|
||||
---
|
||||
|
||||
## 1. RESUMEN EJECUTIVO
|
||||
|
||||
Se completó el análisis de conflictos DDL y gaps entre el modelado de datos y los requerimientos.
|
||||
|
||||
### Métricas Clave
|
||||
|
||||
| Métrica | Valor Actual | Objetivo | Delta |
|
||||
|---------|--------------|----------|-------|
|
||||
| Schemas PostgreSQL | 10 | 10 | ✓ |
|
||||
| Tablas DDL | 89 | ~95 | +6 nuevas |
|
||||
| Coherencia DDL-Backend | 85% | 90% | +5% |
|
||||
| Coherencia DDL-Requerimientos | 72% | 85% | +13% |
|
||||
|
||||
### Hallazgos Principales
|
||||
|
||||
- **3 conflictos** identificados (2 no requieren cambios)
|
||||
- **6 gaps DDL** confirmados
|
||||
- **0 tablas** a eliminar
|
||||
- **6 tablas/campos** a agregar
|
||||
|
||||
---
|
||||
|
||||
## 2. ANÁLISIS DE CONFLICTOS
|
||||
|
||||
### C1: Catálogos Duplicados ⚠️
|
||||
|
||||
**Problema:** `trading.symbols` vs `market_data.tickers`
|
||||
|
||||
| Aspecto | trading.symbols | market_data.tickers |
|
||||
|---------|-----------------|---------------------|
|
||||
| ID Type | UUID | SERIAL |
|
||||
| Columnas | 13 | 11 |
|
||||
| Precisión | price_precision, quantity_precision | - |
|
||||
| ML | - | is_ml_enabled, polygon_ticker |
|
||||
| FK | Referenciada por watchlist_items | No referenciada |
|
||||
|
||||
**Recomendación:** Consolidar en `trading.symbols` como tabla maestra.
|
||||
- Agregar `is_ml_enabled BOOLEAN DEFAULT true`
|
||||
- Agregar `polygon_ticker VARCHAR(20)`
|
||||
- Agregar `supported_timeframes VARCHAR[]`
|
||||
- Deprecar `market_data.tickers` gradualmente
|
||||
|
||||
**Impacto:** Medio - Requiere migración de FK en market_data queries.
|
||||
|
||||
---
|
||||
|
||||
### C2: Sistemas de Transacciones Paralelos ✓
|
||||
|
||||
**Problema:** `financial.wallet_transactions` vs `investment.transactions`
|
||||
|
||||
| Aspecto | financial.wallet_transactions | investment.transactions |
|
||||
|---------|-------------------------------|-------------------------|
|
||||
| Tipos | 9 (deposit, withdrawal, transfer_in/out, fee, refund, earning, distribution, bonus) | 3 (deposit, withdrawal, distribution) |
|
||||
| Propósito | Movimientos de wallet genéricos | Operaciones PAMM específicas |
|
||||
| Precisión | DECIMAL(20,8) | DECIMAL(15,2) |
|
||||
|
||||
**Análisis:** Son sistemas **COMPLEMENTARIOS**, no duplicados.
|
||||
- `wallet_transactions`: Operaciones a nivel de wallet (cualquier tipo)
|
||||
- `investment.transactions`: Operaciones específicas de cuentas PAMM
|
||||
|
||||
**Recomendación:** MANTENER separados. Documentar patrón en arquitectura.
|
||||
- Opcional: FK `investment.transactions.wallet_transaction_id → wallet_transactions.id`
|
||||
|
||||
**Impacto:** Ninguno - Diseño intencional.
|
||||
|
||||
---
|
||||
|
||||
### C3: Enums transaction_type Divergentes ✓
|
||||
|
||||
**Problema:** Mismo nombre de enum, valores diferentes
|
||||
|
||||
| Schema | Valores |
|
||||
|--------|---------|
|
||||
| financial | deposit, withdrawal, transfer_in, transfer_out, fee, refund, earning, distribution, bonus |
|
||||
| investment | deposit, withdrawal, distribution |
|
||||
|
||||
**Análisis:** Intencional por dominio. Cada schema maneja su propio conjunto de tipos de transacción.
|
||||
|
||||
**Recomendación:** MANTENER separados. Documentar en ADR como "domain-specific by design".
|
||||
|
||||
**Impacto:** Ninguno.
|
||||
|
||||
---
|
||||
|
||||
### C5: Enums Duplicados ⚠️
|
||||
|
||||
**Problema 1:** `risk_profile` duplicado
|
||||
|
||||
```sql
|
||||
-- investment.risk_profile
|
||||
CREATE TYPE investment.risk_profile AS ENUM ('conservative', 'moderate', 'aggressive');
|
||||
|
||||
-- portfolio.risk_profile (IDÉNTICO)
|
||||
CREATE TYPE portfolio.risk_profile AS ENUM ('conservative', 'moderate', 'aggressive');
|
||||
```
|
||||
|
||||
**Recomendación:** Considerar consolidar en `public.risk_profile` compartido.
|
||||
|
||||
**Problema 2:** `timeframe` divergente
|
||||
|
||||
| Schema | Valores |
|
||||
|--------|---------|
|
||||
| trading | 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w, **1M** |
|
||||
| market_data | 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w |
|
||||
|
||||
**Recomendación:** Agregar `'1M'` a `market_data.timeframe`.
|
||||
|
||||
**Impacto:** Bajo - Cambios menores.
|
||||
|
||||
---
|
||||
|
||||
## 3. GAPS DDL IDENTIFICADOS
|
||||
|
||||
### GAP-DDL-001: education.instructors ⭐ P1
|
||||
|
||||
**Épica:** OQI-002 (Educativo)
|
||||
**Estado Actual:** courses.instructor_id → auth.users (sin metadata de instructor)
|
||||
|
||||
**DDL Propuesto:**
|
||||
```sql
|
||||
CREATE TABLE education.instructors (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES auth.users(id),
|
||||
bio TEXT,
|
||||
avatar_url VARCHAR(500),
|
||||
specialties VARCHAR[],
|
||||
rating DECIMAL(3,2) CHECK (rating >= 0 AND rating <= 5),
|
||||
courses_count INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_instructors_user ON education.instructors(user_id);
|
||||
CREATE INDEX idx_instructors_rating ON education.instructors(rating);
|
||||
|
||||
-- Actualizar courses para usar instructors
|
||||
ALTER TABLE education.courses
|
||||
DROP COLUMN instructor_name,
|
||||
ADD CONSTRAINT fk_courses_instructor
|
||||
FOREIGN KEY (instructor_id) REFERENCES education.instructors(id);
|
||||
```
|
||||
|
||||
**Impacto:** RF-EDU-001 (Instructors) cubierto al 100%.
|
||||
|
||||
---
|
||||
|
||||
### GAP-DDL-002: education.courses.tags ⭐ P2
|
||||
|
||||
**DDL Propuesto:**
|
||||
```sql
|
||||
ALTER TABLE education.courses
|
||||
ADD COLUMN tags VARCHAR[] DEFAULT '{}';
|
||||
|
||||
CREATE INDEX idx_courses_tags ON education.courses USING GIN(tags);
|
||||
|
||||
COMMENT ON COLUMN education.courses.tags IS 'Tags para búsqueda y filtrado de cursos';
|
||||
```
|
||||
|
||||
**Impacto:** Mejora búsqueda y filtrado de cursos.
|
||||
|
||||
---
|
||||
|
||||
### GAP-DDL-003: trading.price_alerts ⭐ P1
|
||||
|
||||
**Épica:** OQI-003 (Trading)
|
||||
|
||||
**DDL Propuesto:**
|
||||
```sql
|
||||
CREATE TABLE trading.price_alerts (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES auth.users(id),
|
||||
symbol_id UUID NOT NULL REFERENCES trading.symbols(id),
|
||||
condition VARCHAR(10) NOT NULL CHECK (condition IN ('above', 'below', 'crosses')),
|
||||
target_price DECIMAL(20,8) NOT NULL,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
triggered_at TIMESTAMPTZ,
|
||||
notification_sent BOOLEAN DEFAULT false,
|
||||
created_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(is_active) WHERE is_active = true;
|
||||
|
||||
COMMENT ON TABLE trading.price_alerts IS 'Alertas de precio configuradas por usuarios';
|
||||
```
|
||||
|
||||
**Impacto:** Habilita notificaciones de precio para usuarios.
|
||||
|
||||
---
|
||||
|
||||
### GAP-DDL-004: financial.refunds ⭐ P1
|
||||
|
||||
**Épica:** OQI-005 (Pagos)
|
||||
|
||||
**DDL Propuesto:**
|
||||
```sql
|
||||
CREATE TABLE financial.refunds (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
payment_id UUID NOT NULL REFERENCES financial.payments(id),
|
||||
amount DECIMAL(20,8) NOT NULL CHECK (amount > 0),
|
||||
reason VARCHAR(255),
|
||||
status financial.payment_status DEFAULT 'pending',
|
||||
stripe_refund_id VARCHAR(255),
|
||||
requested_by UUID REFERENCES auth.users(id),
|
||||
approved_by UUID REFERENCES auth.users(id),
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
processed_at TIMESTAMPTZ,
|
||||
|
||||
CONSTRAINT refund_amount_valid CHECK (amount > 0)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_refunds_payment ON financial.refunds(payment_id);
|
||||
CREATE INDEX idx_refunds_status ON financial.refunds(status);
|
||||
CREATE INDEX idx_refunds_stripe ON financial.refunds(stripe_refund_id);
|
||||
|
||||
COMMENT ON TABLE financial.refunds IS 'Registro de reembolsos para compliance y tracking';
|
||||
```
|
||||
|
||||
**Impacto:** Compliance para partial refunds y auditoría.
|
||||
|
||||
---
|
||||
|
||||
### GAP-DDL-005: investment.agent_executions ⭐ P1
|
||||
|
||||
**Épica:** OQI-004 (Inversiones)
|
||||
|
||||
**DDL Propuesto:**
|
||||
```sql
|
||||
CREATE TABLE investment.agent_executions (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
account_id UUID NOT NULL REFERENCES investment.accounts(id),
|
||||
agent_type investment.trading_agent NOT NULL,
|
||||
execution_type VARCHAR(20) NOT NULL CHECK (execution_type IN ('trade', 'rebalance', 'distribution', 'stop_loss')),
|
||||
symbol VARCHAR(20),
|
||||
side VARCHAR(4) CHECK (side IN ('buy', 'sell')),
|
||||
quantity DECIMAL(20,8),
|
||||
price DECIMAL(20,8),
|
||||
trade_details JSONB,
|
||||
pnl DECIMAL(20,8),
|
||||
executed_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_agent_exec_account ON investment.agent_executions(account_id);
|
||||
CREATE INDEX idx_agent_exec_type ON investment.agent_executions(agent_type);
|
||||
CREATE INDEX idx_agent_exec_date ON investment.agent_executions(executed_at DESC);
|
||||
|
||||
COMMENT ON TABLE investment.agent_executions IS 'Tracking de ejecuciones de trading agents (Atlas, Orion, Nova)';
|
||||
```
|
||||
|
||||
**Impacto:** Trazabilidad completa de operaciones de agents.
|
||||
|
||||
---
|
||||
|
||||
### GAP-DDL-006: ml.predictions.overlay_data ⭐ P3
|
||||
|
||||
**DDL Propuesto:**
|
||||
```sql
|
||||
ALTER TABLE ml.predictions
|
||||
ADD COLUMN overlay_data JSONB;
|
||||
|
||||
COMMENT ON COLUMN ml.predictions.overlay_data IS 'Datos de overlay para visualización en charts';
|
||||
```
|
||||
|
||||
**Impacto:** Menor - Mejora visualización ML en frontend.
|
||||
|
||||
---
|
||||
|
||||
## 4. DOCUMENTACIÓN A ARCHIVAR
|
||||
|
||||
### Archivos Obsoletos Identificados
|
||||
|
||||
| Archivo | Estado | Recomendación |
|
||||
|---------|--------|---------------|
|
||||
| Análisis previos en _archive/ | Ya archivados | Verificar |
|
||||
| TASK-2026-01-25-FRONTEND-MODULE-DOCS | Sin progreso | Evaluar cancelación |
|
||||
| TASK-2026-01-27-BLOCKER-001-TOKEN-REFRESH | Postergada | Mantener postergada |
|
||||
|
||||
---
|
||||
|
||||
## 5. PRÓXIMOS PASOS
|
||||
|
||||
### Fase 3: Implementación DDL
|
||||
|
||||
1. [ ] Crear archivos DDL para nuevas tablas
|
||||
2. [ ] Agregar campos faltantes a tablas existentes
|
||||
3. [ ] Actualizar enums (timeframe)
|
||||
4. [ ] Recrear BD en WSL para validar
|
||||
|
||||
### Fase 4: Validación
|
||||
|
||||
1. [ ] Ejecutar `unified-recreate-db.sh trading-platform --drop`
|
||||
2. [ ] Verificar 0 errores
|
||||
3. [ ] Actualizar inventarios
|
||||
4. [ ] Medir coherencia final
|
||||
|
||||
---
|
||||
|
||||
## 6. ARCHIVOS MODIFICADOS
|
||||
|
||||
- `orchestration/analisis/coherencia/GAPS-TRACKING.yml` - Actualizado
|
||||
- `orchestration/tareas/2026-02-03/TASK-2026-02-03-DDL-VALIDATION/METADATA.yml` - Creado
|
||||
- `orchestration/tareas/2026-02-03/TASK-2026-02-03-DDL-VALIDATION/ANALYSIS-REPORT.md` - Creado
|
||||
|
||||
---
|
||||
|
||||
*Reporte generado por Claude Code - Sistema SIMCO v4.0.0*
|
||||
@ -0,0 +1,272 @@
|
||||
# METADATA.yml - TASK-2026-02-03-DDL-VALIDATION
|
||||
# Análisis y Validación del Modelado de Datos - Trading Platform
|
||||
version: "1.0.0"
|
||||
created_at: "2026-02-03T10:00:00Z"
|
||||
updated_at: "2026-02-03T10:00:00Z"
|
||||
|
||||
task:
|
||||
id: "TASK-2026-02-03-DDL-VALIDATION"
|
||||
title: "Análisis y Validación del Modelado de Datos"
|
||||
type: "ANALYSIS"
|
||||
mode: "@ANALYSIS"
|
||||
project: "trading-platform"
|
||||
priority: "P1"
|
||||
status: "in_progress"
|
||||
|
||||
context:
|
||||
descripcion: >
|
||||
Plan de análisis y validación del modelado de base de datos para trading-platform.
|
||||
Identificación de conflictos críticos, gaps DDL vs requerimientos, y limpieza
|
||||
de documentación obsoleta.
|
||||
|
||||
metricas_iniciales:
|
||||
schemas: 10
|
||||
tablas: 89
|
||||
enums: 65
|
||||
coherencia_ddl_backend: "85%"
|
||||
coherencia_ddl_requerimientos: "72%"
|
||||
|
||||
objetivos:
|
||||
- "Resolver 3 conflictos críticos en modelado DDL"
|
||||
- "Cerrar 8 gaps DDL vs requerimientos"
|
||||
- "Alcanzar 90% coherencia DDL-Backend"
|
||||
- "Alcanzar 85% coherencia DDL-Requerimientos"
|
||||
|
||||
analysis:
|
||||
# CONFLICTO C1: Catálogos Duplicados
|
||||
c1_catalogos:
|
||||
descripcion: "trading.symbols (UUID) vs market_data.tickers (SERIAL)"
|
||||
hallazgo: |
|
||||
- trading.symbols: UUID, 13 columnas, incluye price_precision, min_quantity, exchange
|
||||
- market_data.tickers: SERIAL, 11 columnas, incluye is_ml_enabled, polygon_ticker
|
||||
- Sin FK entre ellas
|
||||
- Campos similares: symbol, name, base_asset/base_currency, is_active
|
||||
recomendacion: >
|
||||
Consolidar en trading.symbols como tabla maestra, agregar campos ML de tickers.
|
||||
market_data.tickers debería referenciar trading.symbols o deprecarse.
|
||||
status: "analizado"
|
||||
|
||||
# CONFLICTO C2: Transacciones Paralelas
|
||||
c2_transacciones:
|
||||
descripcion: "financial.wallet_transactions vs investment.transactions"
|
||||
hallazgo: |
|
||||
- financial.wallet_transactions: 9 tipos (deposit, withdrawal, transfer_in/out, fee, refund, earning, distribution, bonus)
|
||||
- investment.transactions: 3 tipos (deposit, withdrawal, distribution)
|
||||
- Son sistemas complementarios, NO duplicados
|
||||
- wallet_transactions = movimientos de wallet
|
||||
- investment.transactions = operaciones PAMM específicas
|
||||
recomendacion: >
|
||||
Mantener separados pero documentar el patrón. NO son duplicados.
|
||||
Agregar FK opcional de investment.transactions → wallet_transactions para trazabilidad.
|
||||
status: "analizado"
|
||||
|
||||
# CONFLICTO C3: Enums transaction_type
|
||||
c3_enums_transaction:
|
||||
descripcion: "financial.transaction_type (9 valores) vs investment.transaction_type (3 valores)"
|
||||
hallazgo: |
|
||||
- financial.transaction_type: deposit, withdrawal, transfer_in, transfer_out, fee, refund, earning, distribution, bonus
|
||||
- investment.transaction_type: deposit, withdrawal, distribution
|
||||
- Diferencia intencional por dominio
|
||||
recomendacion: >
|
||||
MANTENER separados - son domain-specific by design.
|
||||
Documentar en ADR que esto es intencional.
|
||||
status: "analizado"
|
||||
|
||||
# CONFLICTO C4: Funciones Duplicadas
|
||||
c4_funciones:
|
||||
descripcion: "update_updated_at() potencialmente duplicada"
|
||||
hallazgo: |
|
||||
- DDL-COMPLETE-MATRIX.yml indica función en auth schema
|
||||
- No se encontraron duplicados explícitos en education o portfolio
|
||||
- auth tiene: update_updated_at, log_auth_event, cleanup_expired_sessions, create_user_profile_trigger
|
||||
recomendacion: >
|
||||
VERIFICAR existencia real de duplicados. Si existen, consolidar en public schema.
|
||||
status: "requiere_verificacion"
|
||||
|
||||
# CONFLICTO C5: Enums Duplicados
|
||||
c5_enums_duplicados:
|
||||
descripcion: "risk_profile duplicado, timeframe divergente"
|
||||
hallazgo: |
|
||||
- investment.risk_profile: conservative, moderate, aggressive
|
||||
- portfolio.risk_profile: conservative, moderate, aggressive (IDÉNTICOS)
|
||||
- trading.timeframe: 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w, 1M
|
||||
- market_data.timeframe: 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w (FALTA 1M)
|
||||
recomendacion: |
|
||||
- risk_profile: Considerar consolidar en shared/public schema
|
||||
- timeframe: Agregar '1M' a market_data.timeframe para consistencia
|
||||
status: "analizado"
|
||||
|
||||
gaps:
|
||||
# GAP-EDU-001: Instructors
|
||||
gap_edu_001:
|
||||
tabla: "education.instructors"
|
||||
descripcion: "Falta tabla dedicada para instructores"
|
||||
hallazgo: |
|
||||
- courses.instructor_id referencia auth.users directamente
|
||||
- courses.instructor_name denormalizado para performance
|
||||
- NO existe tabla instructors con bio, avatar, specialties, rating
|
||||
impacto: "RF-EDU-001 parcialmente cubierto"
|
||||
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()
|
||||
);
|
||||
status: "gap_confirmado"
|
||||
|
||||
# GAP-EDU-002: Course Tags
|
||||
gap_edu_002:
|
||||
tabla: "education.courses"
|
||||
campo: "tags"
|
||||
descripcion: "Campo tags faltante para búsqueda/filtrado"
|
||||
hallazgo: |
|
||||
- courses tiene: category_id, difficulty_level, prerequisites
|
||||
- NO tiene: tags/keywords para búsqueda
|
||||
ddl_propuesto: |
|
||||
ALTER TABLE education.courses ADD COLUMN tags VARCHAR[] DEFAULT '{}';
|
||||
CREATE INDEX idx_courses_tags ON education.courses USING GIN(tags);
|
||||
status: "gap_confirmado"
|
||||
|
||||
# GAP-TRD-001: Price Alerts
|
||||
gap_trd_001:
|
||||
tabla: "trading.price_alerts"
|
||||
descripcion: "Falta tabla para alertas de precio"
|
||||
hallazgo: |
|
||||
- trading tiene: symbols, watchlists, orders, positions
|
||||
- NO tiene: price_alerts para 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, -- above, below, equals
|
||||
target_price DECIMAL(20,8) NOT NULL,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
triggered_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
status: "gap_confirmado"
|
||||
|
||||
# GAP-TRD-002: ML Overlay
|
||||
gap_trd_002:
|
||||
tabla: "ml.predictions"
|
||||
campo: "overlay_data"
|
||||
descripcion: "Campos ML overlay faltantes"
|
||||
hallazgo: |
|
||||
- ml.predictions tiene: model_output JSONB genérico
|
||||
- NO tiene campo específico para overlay_data de charts
|
||||
ddl_propuesto: |
|
||||
ALTER TABLE ml.predictions ADD COLUMN overlay_data JSONB;
|
||||
status: "gap_menor"
|
||||
|
||||
# GAP-PAY-001: Refunds
|
||||
gap_pay_001:
|
||||
tabla: "financial.refunds"
|
||||
descripcion: "Refunds embebidos en payments, no tabla dedicada"
|
||||
hallazgo: |
|
||||
- financial.payments tiene: refunded, refund_amount, refund_reason, refunded_at
|
||||
- Suficiente para casos simples
|
||||
- Tabla dedicada necesaria para compliance y partial refunds
|
||||
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
|
||||
);
|
||||
status: "gap_confirmado"
|
||||
|
||||
# GAP-INV-001: Agent Executions
|
||||
gap_inv_001:
|
||||
tabla: "investment.agent_executions"
|
||||
descripcion: "Falta tracking de ejecuciones de trading agents"
|
||||
hallazgo: |
|
||||
- investment tiene: products (con agent type), accounts, distributions
|
||||
- NO tiene tracking de trades ejecutados por agents
|
||||
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()
|
||||
);
|
||||
status: "gap_confirmado"
|
||||
|
||||
plan:
|
||||
fase_1_conflictos:
|
||||
status: "completada"
|
||||
tareas:
|
||||
- id: "C1"
|
||||
descripcion: "Analizar duplicidad catálogos"
|
||||
resultado: "Analizado - Recomendar consolidación en trading.symbols"
|
||||
- id: "C2"
|
||||
descripcion: "Analizar transacciones paralelas"
|
||||
resultado: "Analizado - Son complementarios, NO duplicados"
|
||||
- id: "C3"
|
||||
descripcion: "Analizar enums transaction_type"
|
||||
resultado: "Analizado - Intencional por dominio"
|
||||
- id: "C4"
|
||||
descripcion: "Verificar funciones duplicadas"
|
||||
resultado: "Pendiente verificación física"
|
||||
- id: "C5"
|
||||
descripcion: "Analizar enums duplicados"
|
||||
resultado: "risk_profile duplicado, timeframe divergente"
|
||||
|
||||
fase_2_gaps:
|
||||
status: "en_progreso"
|
||||
tareas:
|
||||
- id: "GAP-EDU-001"
|
||||
descripcion: "Instructors table"
|
||||
status: "confirmado"
|
||||
- id: "GAP-EDU-002"
|
||||
descripcion: "Course tags"
|
||||
status: "confirmado"
|
||||
- id: "GAP-TRD-001"
|
||||
descripcion: "Price alerts"
|
||||
status: "confirmado"
|
||||
- id: "GAP-TRD-002"
|
||||
descripcion: "ML overlay"
|
||||
status: "menor"
|
||||
- id: "GAP-PAY-001"
|
||||
descripcion: "Refunds table"
|
||||
status: "confirmado"
|
||||
- id: "GAP-INV-001"
|
||||
descripcion: "Agent executions"
|
||||
status: "confirmado"
|
||||
|
||||
fase_3_documentacion:
|
||||
status: "pendiente"
|
||||
tareas:
|
||||
- "Archivar análisis obsoletos"
|
||||
- "Actualizar inventarios"
|
||||
- "Actualizar GAPS-TRACKING.yml"
|
||||
|
||||
verificacion:
|
||||
ddl_integrity: "pendiente"
|
||||
coherence_check: "pendiente"
|
||||
|
||||
traceability:
|
||||
agent: "Claude Code"
|
||||
session: "2026-02-03"
|
||||
archivos_analizados:
|
||||
- "apps/database/ddl/schemas/trading/tables/01-symbols.sql"
|
||||
- "apps/database/ddl/schemas/market_data/tables/01-tickers.sql"
|
||||
- "apps/database/ddl/schemas/financial/tables/02-wallet_transactions.sql"
|
||||
- "apps/database/ddl/schemas/investment/tables/05-transactions.sql"
|
||||
- "apps/database/ddl/schemas/education/tables/02-courses.sql"
|
||||
- "apps/database/ddl/schemas/ml/tables/03-predictions.sql"
|
||||
- "apps/database/ddl/schemas/financial/tables/05-payments.sql"
|
||||
- "apps/database/ddl/schemas/*/00-enums.sql"
|
||||
- "orchestration/analisis/coherencia/DDL-COMPLETE-MATRIX.yml"
|
||||
@ -0,0 +1,213 @@
|
||||
# 01-CAPTURA (C) - Contexto de la Tarea
|
||||
|
||||
**Tarea:** TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
**Fase:** Contexto (C)
|
||||
**Estado:** COMPLETADO
|
||||
**Fecha:** 2026-02-03
|
||||
|
||||
---
|
||||
|
||||
## 1. VINCULACIÓN
|
||||
|
||||
| Campo | Valor |
|
||||
|-------|-------|
|
||||
| **Proyecto** | trading-platform |
|
||||
| **Módulo** | Database / DDL |
|
||||
| **Epic** | Transversal (afecta OQI-001 a OQI-009) |
|
||||
| **Tipo** | analysis |
|
||||
| **Origen** | user-request |
|
||||
|
||||
---
|
||||
|
||||
## 2. CLASIFICACIÓN
|
||||
|
||||
### 2.1 Tipo de Tarea
|
||||
|
||||
```yaml
|
||||
tipo: analysis
|
||||
subtipo: validacion-modelado-datos
|
||||
alcance:
|
||||
- DDL completo (11 schemas)
|
||||
- Coherencia con requerimientos
|
||||
- Coherencia con backend/frontend
|
||||
- Purga documentación obsoleta
|
||||
```
|
||||
|
||||
### 2.2 Modo de Ejecución
|
||||
|
||||
```yaml
|
||||
modo: "@ANALYSIS"
|
||||
fases_activas:
|
||||
- C: Contexto (COMPLETADO)
|
||||
- A: Análisis (COMPLETADO)
|
||||
- P: Planeación (EN PROGRESO)
|
||||
- V: Validación (pendiente)
|
||||
# E y D solo si se requieren cambios
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. DOCUMENTOS SIMCO RELEVANTES
|
||||
|
||||
### 3.1 Directivas Cargadas
|
||||
|
||||
| Directiva | Propósito |
|
||||
|-----------|-----------|
|
||||
| @CAPVED | Ciclo de vida obligatorio |
|
||||
| @ESTANDAR-DATABASE | Estándares de base de datos |
|
||||
| @PRINCIPIO-NORMALIZACION | Reglas de normalización |
|
||||
| @SIMCO-DDL-UNIFIED | Operaciones DDL unificadas |
|
||||
| @SIMCO-SUBAGENTES | Delegación a subagentes |
|
||||
| @TRIGGER-COHERENCIA-CAPAS | Validación coherencia |
|
||||
|
||||
### 3.2 Inventarios de Referencia
|
||||
|
||||
| Inventario | Ubicación |
|
||||
|------------|-----------|
|
||||
| DATABASE_INVENTORY.yml | orchestration/inventarios/ |
|
||||
| BACKEND_INVENTORY.yml | orchestration/inventarios/ |
|
||||
| FRONTEND_INVENTORY.yml | orchestration/inventarios/ |
|
||||
| MASTER_INVENTORY.yml | orchestration/inventarios/ |
|
||||
|
||||
### 3.3 Documentación Épicas
|
||||
|
||||
| Épica | Ubicación Base |
|
||||
|-------|----------------|
|
||||
| OQI-001 Auth | docs/02-definicion-modulos/OQI-001-fundamentos-auth/ |
|
||||
| OQI-002 Education | docs/02-definicion-modulos/OQI-002-education/ |
|
||||
| OQI-003 Trading | docs/02-definicion-modulos/OQI-003-trading-charts/ |
|
||||
| OQI-004 Investment | docs/02-definicion-modulos/OQI-004-cuentas-inversion/ |
|
||||
| OQI-005 Payments | docs/02-definicion-modulos/OQI-005-pagos-stripe/ |
|
||||
| OQI-006 ML | docs/02-definicion-modulos/OQI-006-senales-ml/ |
|
||||
| OQI-007 LLM | docs/02-definicion-modulos/OQI-007-llm-strategy-agent/ |
|
||||
| OQI-008 Portfolio | docs/02-definicion-modulos/OQI-008-portfolio-manager/ |
|
||||
| OQI-009 MT4 | docs/02-definicion-modulos/OQI-009-mt4-gateway/ |
|
||||
|
||||
---
|
||||
|
||||
## 4. ALCANCE DE LA TAREA
|
||||
|
||||
### 4.1 Dentro del Alcance
|
||||
|
||||
```yaml
|
||||
incluido:
|
||||
DDL:
|
||||
- Validar todos los 11 schemas
|
||||
- Verificar ~90 tablas
|
||||
- Validar 68+ enums
|
||||
- Verificar 102+ foreign keys
|
||||
- Validar 200+ índices
|
||||
- Identificar gaps vs requerimientos
|
||||
- Detectar conflictos/duplicidades
|
||||
|
||||
Documentación:
|
||||
- Purgar docs obsoletas de tareas previas
|
||||
- Integrar definiciones faltantes
|
||||
- Ordenar backlog de tareas DDL
|
||||
- Crear matriz de validación
|
||||
|
||||
Coherencia:
|
||||
- DDL ↔ Backend entities
|
||||
- DDL ↔ Épicas documentadas
|
||||
- DDL ↔ Historias de usuario
|
||||
```
|
||||
|
||||
### 4.2 Fuera del Alcance
|
||||
|
||||
```yaml
|
||||
excluido:
|
||||
- Implementación de cambios en DDL
|
||||
- Modificación de código backend
|
||||
- Modificación de código frontend
|
||||
- Recreación de base de datos
|
||||
- Migraciones
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. CONTEXTO TÉCNICO
|
||||
|
||||
### 5.1 Estado Actual DDL
|
||||
|
||||
```yaml
|
||||
base_datos: trading_platform
|
||||
credenciales:
|
||||
usuario: trading_user
|
||||
password: trading_dev_2026
|
||||
puerto: 5432
|
||||
host: localhost (WSL)
|
||||
|
||||
schemas: 11
|
||||
- auth
|
||||
- trading
|
||||
- financial
|
||||
- investment
|
||||
- portfolio
|
||||
- market_data
|
||||
- ml
|
||||
- education
|
||||
- llm
|
||||
- audit
|
||||
- feature_flags
|
||||
|
||||
archivos_ddl: 134
|
||||
ubicacion: apps/database/ddl/
|
||||
```
|
||||
|
||||
### 5.2 Épicas y Completitud
|
||||
|
||||
| Épica | DDL % | Backend % | Frontend % | Total % |
|
||||
|-------|-------|-----------|------------|---------|
|
||||
| OQI-001 Auth | 100% | 90% | 70% | 85% |
|
||||
| OQI-002 Education | 100% | 40% | 80% | 55% |
|
||||
| OQI-003 Trading | 100% | 50% | 90% | 60% |
|
||||
| OQI-004 Investment | 100% | 35% | 35% | 55% |
|
||||
| OQI-005 Payments | 100% | 50% | 80% | 65% |
|
||||
| OQI-006 ML | 100% | 70% | 95% | 75% |
|
||||
| OQI-007 LLM | 100% | 40% | 45% | 45% |
|
||||
| OQI-008 Portfolio | 100% | 45% | 0% | 45% |
|
||||
| OQI-009 MT4 | 0% | 0% | 0% | 15% |
|
||||
|
||||
---
|
||||
|
||||
## 6. TAREAS RELACIONADAS
|
||||
|
||||
### 6.1 Tareas Activas
|
||||
|
||||
| Tarea | Estado | Relación |
|
||||
|-------|--------|----------|
|
||||
| TASK-2026-02-03-ANALISIS-FRONTEND-UXUI | 60% | Complementaria |
|
||||
| TASK-2026-01-27-BLOCKER-001-TOKEN-REFRESH | Postergada | Puede requerir DDL |
|
||||
|
||||
### 6.2 Tareas Completadas Relevantes
|
||||
|
||||
| Tarea | Fecha | Hallazgos DDL |
|
||||
|-------|-------|---------------|
|
||||
| TASK-2026-01-30-ANALISIS-INTEGRACION | Completada | TP es standalone |
|
||||
| TASK-2026-01-25-002-FRONTEND-AUDIT | Completada | 55 gaps identificados |
|
||||
|
||||
---
|
||||
|
||||
## 7. CRITERIOS DE ÉXITO
|
||||
|
||||
```yaml
|
||||
criterios:
|
||||
- Matriz de validación DDL completa
|
||||
- 100% schemas validados contra requerimientos
|
||||
- Conflictos documentados con resolución propuesta
|
||||
- Gaps documentados con prioridad
|
||||
- Plan de subtareas CAPVED-compliant
|
||||
- Documentación purgada de obsoletos
|
||||
- Orden de ejecución lógico sin dependencias circulares
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. PRÓXIMA FASE
|
||||
|
||||
→ **Continuar a:** `02-ANALISIS.md` (Completado)
|
||||
→ **Fase actual:** `03-PLANIFICACION.md` (En progreso)
|
||||
|
||||
---
|
||||
|
||||
**Fase C COMPLETADA** | Fecha: 2026-02-03 | Agente: claude-opus-4.5
|
||||
@ -0,0 +1,374 @@
|
||||
# 02-ANÁLISIS (A) - Análisis del Modelado de Datos
|
||||
|
||||
**Tarea:** TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
**Fase:** Análisis (A)
|
||||
**Estado:** COMPLETADO
|
||||
**Fecha:** 2026-02-03
|
||||
|
||||
---
|
||||
|
||||
## 1. RESUMEN EJECUTIVO
|
||||
|
||||
Se realizó un análisis exhaustivo del modelado de datos del proyecto trading-platform:
|
||||
|
||||
| Métrica | Valor |
|
||||
|---------|-------|
|
||||
| Schemas analizados | 11 |
|
||||
| Tablas identificadas | ~90 |
|
||||
| Tipos ENUM | 68+ |
|
||||
| Foreign Keys | 102+ |
|
||||
| Índices | 200+ |
|
||||
| Triggers/Funciones | 40+ |
|
||||
| Archivos DDL | 134 |
|
||||
| **Gaps identificados** | 15 |
|
||||
| **Conflictos detectados** | 5 |
|
||||
| **Duplicidades** | 3 |
|
||||
|
||||
---
|
||||
|
||||
## 2. INVENTARIO DE SCHEMAS
|
||||
|
||||
### 2.1 Distribución por Schema
|
||||
|
||||
| Schema | Tablas | Enums | FK | Índices | Estado |
|
||||
|--------|--------|-------|-----|---------|--------|
|
||||
| auth | 12 | 6 | 8 | 25 | ✅ Completo |
|
||||
| education | 17 | 6 | 15 | 30 | ⚠️ Gaps menores |
|
||||
| trading | 11 | 8 | 10 | 22 | ⚠️ Gaps menores |
|
||||
| investment | 10 | 6 | 8 | 18 | ✅ Completo |
|
||||
| financial | 11 | 12 | 9 | 24 | ✅ Completo |
|
||||
| portfolio | 5 | 4 | 5 | 12 | ✅ Completo |
|
||||
| market_data | 4 | 2 | 2 | 8 | ✅ Completo |
|
||||
| ml | 11 | 6 | 8 | 20 | ⚠️ Gaps menores |
|
||||
| llm | 5 | 7 | 4 | 12 | ✅ Completo |
|
||||
| audit | 7 | 5 | 5 | 18 | ✅ Completo |
|
||||
| feature_flags | 3 | 2 | 1 | 6 | ✅ Completo |
|
||||
|
||||
### 2.2 Relaciones Principales
|
||||
|
||||
```
|
||||
auth.users (CENTRO)
|
||||
├── auth.user_profiles (1:1)
|
||||
├── auth.oauth_accounts (1:N)
|
||||
├── auth.sessions (1:N)
|
||||
├── trading.bots (1:N)
|
||||
├── trading.orders (1:N)
|
||||
├── trading.positions (1:N)
|
||||
├── financial.wallets (1:N)
|
||||
├── investment.accounts (1:N)
|
||||
├── portfolio.portfolios (1:N)
|
||||
├── education.enrollments (1:N)
|
||||
├── llm.conversations (1:N)
|
||||
└── audit.audit_logs (1:N)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. GAPS IDENTIFICADOS
|
||||
|
||||
### 3.1 Gaps Críticos (P0)
|
||||
|
||||
| ID | Schema | Gap | Impacto | Épica |
|
||||
|----|--------|-----|---------|-------|
|
||||
| GAP-001 | trading | Tabla `price_alerts` sin FK a symbols | Integridad referencial | OQI-003 |
|
||||
| GAP-002 | financial | Tabla `refunds` no existe | Funcionalidad Stripe | OQI-005 |
|
||||
| GAP-003 | education | Tabla `instructors` sin definir | Videos/Cursos | OQI-002 |
|
||||
| GAP-004 | ml | Overlay predicciones incompleto | Señales ML | OQI-006 |
|
||||
|
||||
### 3.2 Gaps Moderados (P1)
|
||||
|
||||
| ID | Schema | Gap | Impacto | Épica |
|
||||
|----|--------|-----|---------|-------|
|
||||
| GAP-005 | education | Falta `course_tags` para búsqueda | SEO/UX | OQI-002 |
|
||||
| GAP-006 | trading | `drawing_tools` no tiene tablas | Herramientas dibujo | OQI-003 |
|
||||
| GAP-007 | investment | `agent_executions` incompleta | Tracking agentes | OQI-004 |
|
||||
| GAP-008 | ml | Falta índice compuesto symbol+timeframe+created | Performance | OQI-006 |
|
||||
|
||||
### 3.3 Gaps Menores (P2)
|
||||
|
||||
| ID | Schema | Gap | Impacto | Épica |
|
||||
|----|--------|-----|---------|-------|
|
||||
| GAP-009 | auth | Falta índice en `locked_until` | Performance | OQI-001 |
|
||||
| GAP-010 | education | `course_reviews` sin soft delete | Gestión datos | OQI-002 |
|
||||
| GAP-011 | audit | Falta particionamiento | Escalabilidad | Transversal |
|
||||
| GAP-012 | llm | Falta índice GIN en `tags` | Búsqueda | OQI-007 |
|
||||
|
||||
### 3.4 Gaps de Documentación (P2)
|
||||
|
||||
| ID | Ubicación | Gap |
|
||||
|----|-----------|-----|
|
||||
| GAP-DOC-001 | OQI-003 | ET-TRD-003-database.md desactualizado |
|
||||
| GAP-DOC-002 | OQI-005 | Falta documentación tabla refunds |
|
||||
| GAP-DOC-003 | Inventarios | DATABASE_INVENTORY.yml desactualizado |
|
||||
|
||||
---
|
||||
|
||||
## 4. CONFLICTOS DETECTADOS
|
||||
|
||||
### 4.1 Conflictos de Nomenclatura
|
||||
|
||||
| ID | Conflicto | Detalle | Resolución Propuesta |
|
||||
|----|-----------|---------|---------------------|
|
||||
| CONF-001 | `transaction_type` duplicado | Existe en `financial` e `investment` | Renombrar a `financial_tx_type` / `investment_tx_type` |
|
||||
| CONF-002 | `transaction_status` duplicado | Mismos schemas | Unificar en tipo compartido |
|
||||
|
||||
### 4.2 Conflictos de Diseño
|
||||
|
||||
| ID | Conflicto | Detalle | Resolución Propuesta |
|
||||
|----|-----------|---------|---------------------|
|
||||
| CONF-003 | Catálogo símbolos duplicado | `trading.symbols` vs referencias hardcoded en ML | Usar FK a trading.symbols |
|
||||
| CONF-004 | Wallet types inconsistentes | Enum `wallet_type` vs columnas específicas | Mantener enum (actual correcto) |
|
||||
| CONF-005 | Timestamps inconsistentes | Algunos `timestamp`, otros `timestamptz` | Estandarizar a `timestamptz` |
|
||||
|
||||
---
|
||||
|
||||
## 5. DUPLICIDADES DETECTADAS
|
||||
|
||||
| ID | Tipo | Ubicación 1 | Ubicación 2 | Acción |
|
||||
|----|------|-------------|-------------|--------|
|
||||
| DUP-001 | Enum | `trading.timeframe` | `market_data.timeframe` | Unificar en schema `public` |
|
||||
| DUP-002 | Tabla concepto | `trading.signals` | `ml.predictions` | Mantener separados (propósitos diferentes) |
|
||||
| DUP-003 | Función | `update_updated_at()` | Definida en múltiples schemas | Mover a schema `public` |
|
||||
|
||||
---
|
||||
|
||||
## 6. VALIDACIÓN POR ÉPICA
|
||||
|
||||
### 6.1 OQI-001: Auth (85%)
|
||||
|
||||
```yaml
|
||||
estado: COMPLETO
|
||||
tablas_ddl: 12
|
||||
tablas_doc: 12
|
||||
match: 100%
|
||||
gaps:
|
||||
- Falta índice locked_until (P2)
|
||||
conflictos: ninguno
|
||||
```
|
||||
|
||||
### 6.2 OQI-002: Education (55%)
|
||||
|
||||
```yaml
|
||||
estado: GAPS MENORES
|
||||
tablas_ddl: 17
|
||||
tablas_doc: 14
|
||||
match: 82%
|
||||
gaps:
|
||||
- instructors sin definir (P0)
|
||||
- course_tags faltante (P1)
|
||||
- review soft delete (P2)
|
||||
conflictos: ninguno
|
||||
```
|
||||
|
||||
### 6.3 OQI-003: Trading (60%)
|
||||
|
||||
```yaml
|
||||
estado: GAPS MODERADOS
|
||||
tablas_ddl: 11
|
||||
tablas_doc: 12
|
||||
match: 92%
|
||||
gaps:
|
||||
- price_alerts FK (P0)
|
||||
- drawing_tools (P1)
|
||||
- indicadores técnicos no tienen tablas (por diseño - calculados)
|
||||
conflictos: ninguno
|
||||
```
|
||||
|
||||
### 6.4 OQI-004: Investment (55%)
|
||||
|
||||
```yaml
|
||||
estado: COMPLETO CON GAPS
|
||||
tablas_ddl: 10
|
||||
tablas_doc: 10
|
||||
match: 100%
|
||||
gaps:
|
||||
- agent_executions incompleta (P1)
|
||||
conflictos: ninguno
|
||||
```
|
||||
|
||||
### 6.5 OQI-005: Payments/Financial (65%)
|
||||
|
||||
```yaml
|
||||
estado: GAP CRITICO
|
||||
tablas_ddl: 11
|
||||
tablas_doc: 12
|
||||
match: 92%
|
||||
gaps:
|
||||
- refunds no existe (P0 - BLOQUEANTE)
|
||||
conflictos: ninguno
|
||||
```
|
||||
|
||||
### 6.6 OQI-006: ML (75%)
|
||||
|
||||
```yaml
|
||||
estado: GAPS MENORES
|
||||
tablas_ddl: 11
|
||||
tablas_doc: 11
|
||||
match: 100%
|
||||
gaps:
|
||||
- overlay predicciones (P0)
|
||||
- índice compuesto (P1)
|
||||
conflictos:
|
||||
- símbolos referenciados como strings, no FK
|
||||
```
|
||||
|
||||
### 6.7 OQI-007: LLM (45%)
|
||||
|
||||
```yaml
|
||||
estado: COMPLETO
|
||||
tablas_ddl: 5
|
||||
tablas_doc: 5
|
||||
match: 100%
|
||||
gaps:
|
||||
- índice GIN tags (P2)
|
||||
conflictos: ninguno
|
||||
```
|
||||
|
||||
### 6.8 OQI-008: Portfolio (45%)
|
||||
|
||||
```yaml
|
||||
estado: COMPLETO
|
||||
tablas_ddl: 5
|
||||
tablas_doc: 5
|
||||
match: 100%
|
||||
gaps: ninguno
|
||||
conflictos: ninguno
|
||||
```
|
||||
|
||||
### 6.9 OQI-009: MT4 (15%)
|
||||
|
||||
```yaml
|
||||
estado: NO EXISTE DDL
|
||||
tablas_ddl: 0
|
||||
tablas_doc: TBD
|
||||
match: 0%
|
||||
gaps:
|
||||
- Schema completo no existe (P0 - BLOQUEANTE decisión)
|
||||
conflictos: N/A
|
||||
nota: Requiere decisión MetaAPI vs Local Terminal
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. COHERENCIA ENTRE CAPAS
|
||||
|
||||
### 7.1 DDL ↔ Backend
|
||||
|
||||
| Schema | Entities Backend | Match |
|
||||
|--------|------------------|-------|
|
||||
| auth | 12 entities | 100% |
|
||||
| education | 14 entities | 82% (faltan 3) |
|
||||
| trading | 10 entities | 91% |
|
||||
| investment | 8 entities | 80% |
|
||||
| financial | 9 entities | 82% |
|
||||
| portfolio | 4 entities | 80% |
|
||||
| market_data | 3 entities | 75% |
|
||||
| ml | 6 entities | 55% |
|
||||
| llm | 4 entities | 80% |
|
||||
| audit | 5 entities | 71% |
|
||||
|
||||
**Promedio coherencia DDL↔Backend:** 80%
|
||||
|
||||
### 7.2 Gaps de Coherencia
|
||||
|
||||
| Tabla DDL | Entity Backend | Gap |
|
||||
|-----------|----------------|-----|
|
||||
| education.instructors | No existe | Crear entity |
|
||||
| financial.refunds | No existe | Crear tabla + entity |
|
||||
| trading.price_alerts | Parcial | Completar relaciones |
|
||||
| ml.feature_store | No existe | Crear entity |
|
||||
| audit.compliance_logs | No existe | Crear entity |
|
||||
|
||||
---
|
||||
|
||||
## 8. DOCUMENTACIÓN A PURGAR
|
||||
|
||||
### 8.1 Tareas Obsoletas
|
||||
|
||||
| Archivo | Motivo | Acción |
|
||||
|---------|--------|--------|
|
||||
| TASK-2025-* | Año anterior | Archivar |
|
||||
| docs/99-analisis/obsoletos/ | Análisis superados | Eliminar |
|
||||
| orchestration/tareas/_archive/pre-2026/ | Histórico | Mantener comprimido |
|
||||
|
||||
### 8.2 Especificaciones Desactualizadas
|
||||
|
||||
| Archivo | Estado | Acción |
|
||||
|---------|--------|--------|
|
||||
| ET-TRD-003-database.md | Desactualizado | Actualizar |
|
||||
| ET-EDU-001-database.md | Parcialmente actualizado | Completar |
|
||||
| ET-AUTH-003-database.sql | Correcto | Mantener |
|
||||
|
||||
---
|
||||
|
||||
## 9. DEPENDENCIAS IDENTIFICADAS
|
||||
|
||||
### 9.1 Dependencias Internas
|
||||
|
||||
```yaml
|
||||
orden_creacion_schemas:
|
||||
1. auth (base - usuarios)
|
||||
2. trading (depende de auth)
|
||||
3. financial (depende de auth)
|
||||
4. investment (depende de auth, financial)
|
||||
5. portfolio (depende de auth, trading)
|
||||
6. market_data (independiente)
|
||||
7. ml (depende de trading, market_data)
|
||||
8. education (depende de auth)
|
||||
9. llm (depende de auth)
|
||||
10. audit (depende de todos)
|
||||
11. feature_flags (independiente)
|
||||
```
|
||||
|
||||
### 9.2 Dependencias Circulares
|
||||
|
||||
```yaml
|
||||
detectadas: 0
|
||||
nota: Diseño limpio sin ciclos
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. RIESGOS IDENTIFICADOS
|
||||
|
||||
| ID | Riesgo | Probabilidad | Impacto | Mitigación |
|
||||
|----|--------|--------------|---------|------------|
|
||||
| R-001 | OQI-009 sin DDL bloquea MT4 | Alta | Alto | Decisión stakeholder |
|
||||
| R-002 | Refunds faltante = PCI issues | Alta | Crítico | Implementar P0 |
|
||||
| R-003 | Inconsistencias timestamp | Media | Bajo | Migración controlada |
|
||||
| R-004 | Duplicidad enums | Baja | Bajo | Unificar gradualmente |
|
||||
|
||||
---
|
||||
|
||||
## 11. RECOMENDACIONES
|
||||
|
||||
### 11.1 Acciones Inmediatas (P0)
|
||||
|
||||
1. **Crear tabla `financial.refunds`** - Bloqueante para Stripe
|
||||
2. **Definir tabla `education.instructors`** - Bloqueante para videos
|
||||
3. **Agregar FK a `trading.price_alerts`** - Integridad
|
||||
4. **Decisión MT4** - Define si se crea DDL para OQI-009
|
||||
|
||||
### 11.2 Acciones Corto Plazo (P1)
|
||||
|
||||
1. Unificar `timeframe` enum en schema público
|
||||
2. Agregar índices faltantes identificados
|
||||
3. Completar `agent_executions`
|
||||
4. Crear `course_tags`
|
||||
|
||||
### 11.3 Acciones Mediano Plazo (P2)
|
||||
|
||||
1. Estandarizar todos los timestamps a `timestamptz`
|
||||
2. Mover funciones comunes a schema `public`
|
||||
3. Considerar particionamiento en `audit`
|
||||
4. Documentar todas las decisiones en ADRs
|
||||
|
||||
---
|
||||
|
||||
## 12. PRÓXIMA FASE
|
||||
|
||||
→ **Continuar a:** `03-PLANIFICACION.md`
|
||||
|
||||
---
|
||||
|
||||
**Fase A COMPLETADA** | Fecha: 2026-02-03 | Agente: claude-opus-4.5
|
||||
@ -0,0 +1,579 @@
|
||||
# 03-PLANIFICACIÓN (P) - Plan de Subtareas
|
||||
|
||||
**Tarea:** TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
**Fase:** Planificación (P)
|
||||
**Estado:** EN PROGRESO
|
||||
**Fecha:** 2026-02-03
|
||||
|
||||
---
|
||||
|
||||
## 1. ESTRUCTURA JERÁRQUICA DE TAREAS
|
||||
|
||||
```
|
||||
TASK-2026-02-03-ANALISIS-DDL-MODELADO (RAÍZ)
|
||||
│
|
||||
├── FASE-1: GAPS CRÍTICOS (P0) ──────────────────────────────────────
|
||||
│ │
|
||||
│ ├── 1.1 FINANCIAL-REFUNDS
|
||||
│ │ ├── 1.1.1 Diseñar tabla refunds (DDL)
|
||||
│ │ ├── 1.1.2 Crear entity backend
|
||||
│ │ ├── 1.1.3 Documentar especificación
|
||||
│ │ └── 1.1.4 Actualizar inventarios
|
||||
│ │
|
||||
│ ├── 1.2 EDUCATION-INSTRUCTORS
|
||||
│ │ ├── 1.2.1 Diseñar tabla instructors (DDL)
|
||||
│ │ ├── 1.2.2 Crear entity backend
|
||||
│ │ ├── 1.2.3 Agregar FK a courses
|
||||
│ │ └── 1.2.4 Documentar
|
||||
│ │
|
||||
│ ├── 1.3 TRADING-PRICE-ALERTS-FK
|
||||
│ │ ├── 1.3.1 Agregar FK symbol_id
|
||||
│ │ ├── 1.3.2 Migración datos existentes
|
||||
│ │ └── 1.3.3 Actualizar entity
|
||||
│ │
|
||||
│ └── 1.4 ML-OVERLAY-PREDICCIONES
|
||||
│ ├── 1.4.1 Diseñar estructura overlay
|
||||
│ ├── 1.4.2 Crear tablas auxiliares
|
||||
│ └── 1.4.3 Documentar
|
||||
│
|
||||
├── FASE-2: CONFLICTOS Y DUPLICIDADES ───────────────────────────────
|
||||
│ │
|
||||
│ ├── 2.1 UNIFICAR-ENUMS-TIMEFRAME
|
||||
│ │ ├── 2.1.1 Crear enum público trading_timeframe
|
||||
│ │ ├── 2.1.2 Migrar referencias trading
|
||||
│ │ ├── 2.1.3 Migrar referencias market_data
|
||||
│ │ └── 2.1.4 Eliminar duplicados
|
||||
│ │
|
||||
│ ├── 2.2 RESOLVER-TRANSACTION-TYPE-CONFLICT
|
||||
│ │ ├── 2.2.1 Renombrar financial.transaction_type
|
||||
│ │ ├── 2.2.2 Renombrar investment.transaction_type
|
||||
│ │ └── 2.2.3 Actualizar referencias backend
|
||||
│ │
|
||||
│ └── 2.3 UNIFICAR-FUNCIONES-COMUNES
|
||||
│ ├── 2.3.1 Mover update_updated_at() a public
|
||||
│ ├── 2.3.2 Actualizar triggers
|
||||
│ └── 2.3.3 Eliminar duplicados
|
||||
│
|
||||
├── FASE-3: GAPS MODERADOS (P1) ─────────────────────────────────────
|
||||
│ │
|
||||
│ ├── 3.1 EDUCATION-COURSE-TAGS
|
||||
│ │ ├── 3.1.1 Diseñar tabla course_tags
|
||||
│ │ ├── 3.1.2 Crear tabla course_tag_assignments (M:N)
|
||||
│ │ └── 3.1.3 Agregar índices GIN
|
||||
│ │
|
||||
│ ├── 3.2 TRADING-DRAWING-TOOLS
|
||||
│ │ ├── 3.2.1 Diseñar tabla drawing_tools
|
||||
│ │ ├── 3.2.2 Diseñar tabla user_drawings
|
||||
│ │ └── 3.2.3 Crear entity backend
|
||||
│ │
|
||||
│ ├── 3.3 INVESTMENT-AGENT-EXECUTIONS
|
||||
│ │ ├── 3.3.1 Completar columnas faltantes
|
||||
│ │ ├── 3.3.2 Agregar índices performance
|
||||
│ │ └── 3.3.3 Actualizar entity
|
||||
│ │
|
||||
│ └── 3.4 ML-INDICES-COMPUESTOS
|
||||
│ ├── 3.4.1 Crear índice symbol+timeframe+created
|
||||
│ └── 3.4.2 Optimizar queries existentes
|
||||
│
|
||||
├── FASE-4: GAPS MENORES (P2) ───────────────────────────────────────
|
||||
│ │
|
||||
│ ├── 4.1 AUTH-INDICE-LOCKED-UNTIL
|
||||
│ │
|
||||
│ ├── 4.2 EDUCATION-REVIEW-SOFT-DELETE
|
||||
│ │
|
||||
│ ├── 4.3 AUDIT-PARTICIONAMIENTO
|
||||
│ │
|
||||
│ ├── 4.4 LLM-INDICE-GIN-TAGS
|
||||
│ │
|
||||
│ └── 4.5 ESTANDARIZAR-TIMESTAMPS
|
||||
│
|
||||
├── FASE-5: COHERENCIA BACKEND ──────────────────────────────────────
|
||||
│ │
|
||||
│ ├── 5.1 CREAR-ENTITIES-FALTANTES
|
||||
│ │ ├── 5.1.1 education.instructors entity
|
||||
│ │ ├── 5.1.2 ml.feature_store entity
|
||||
│ │ └── 5.1.3 audit.compliance_logs entity
|
||||
│ │
|
||||
│ └── 5.2 ACTUALIZAR-ENTITIES-EXISTENTES
|
||||
│ ├── 5.2.1 Sincronizar auth entities
|
||||
│ ├── 5.2.2 Sincronizar trading entities
|
||||
│ └── 5.2.3 Sincronizar financial entities
|
||||
│
|
||||
├── FASE-6: DOCUMENTACIÓN ───────────────────────────────────────────
|
||||
│ │
|
||||
│ ├── 6.1 ACTUALIZAR-ESPECIFICACIONES
|
||||
│ │ ├── 6.1.1 ET-TRD-003-database.md
|
||||
│ │ ├── 6.1.2 ET-EDU-001-database.md
|
||||
│ │ └── 6.1.3 ET-FIN-001-database.md (crear)
|
||||
│ │
|
||||
│ ├── 6.2 ACTUALIZAR-INVENTARIOS
|
||||
│ │ ├── 6.2.1 DATABASE_INVENTORY.yml
|
||||
│ │ ├── 6.2.2 BACKEND_INVENTORY.yml
|
||||
│ │ └── 6.2.3 MASTER_INVENTORY.yml
|
||||
│ │
|
||||
│ └── 6.3 PURGAR-OBSOLETOS
|
||||
│ ├── 6.3.1 Archivar tareas 2025
|
||||
│ ├── 6.3.2 Eliminar análisis superados
|
||||
│ └── 6.3.3 Limpiar duplicados docs
|
||||
│
|
||||
└── FASE-7: MT4 (CONDICIONAL) ───────────────────────────────────────
|
||||
│
|
||||
└── 7.1 OQI-009-DDL (si se aprueba)
|
||||
├── 7.1.1 Diseñar schema mt4
|
||||
├── 7.1.2 Crear tablas conexiones
|
||||
├── 7.1.3 Crear tablas ejecuciones
|
||||
└── 7.1.4 Documentar
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. DETALLE DE SUBTAREAS NIVEL 1
|
||||
|
||||
### FASE-1: GAPS CRÍTICOS (P0)
|
||||
|
||||
#### 1.1 FINANCIAL-REFUNDS
|
||||
|
||||
```yaml
|
||||
id: "ST-1.1"
|
||||
nombre: "Implementar tabla financial.refunds"
|
||||
tipo: "DDL + Backend"
|
||||
prioridad: P0
|
||||
esfuerzo: 8h
|
||||
bloquea: ["OQI-005 Stripe refunds"]
|
||||
bloqueada_por: []
|
||||
|
||||
subtareas:
|
||||
1.1.1:
|
||||
nombre: "Diseñar tabla refunds (DDL)"
|
||||
esfuerzo: 2h
|
||||
entregable: "ddl/schemas/financial/tables/11-refunds.sql"
|
||||
criterios:
|
||||
- Campos: id, payment_id FK, amount, reason, status, stripe_refund_id
|
||||
- Índices: payment_id, status, created_at
|
||||
- Constraints: amount > 0, status enum
|
||||
|
||||
1.1.2:
|
||||
nombre: "Crear entity backend"
|
||||
esfuerzo: 3h
|
||||
entregable: "apps/backend/src/modules/payments/entities/refund.entity.ts"
|
||||
depende_de: ["1.1.1"]
|
||||
criterios:
|
||||
- TypeORM entity completa
|
||||
- Relación con Payment
|
||||
- Validaciones DTO
|
||||
|
||||
1.1.3:
|
||||
nombre: "Documentar especificación"
|
||||
esfuerzo: 2h
|
||||
entregable: "docs/02-definicion-modulos/OQI-005-pagos-stripe/especificaciones/ET-PAY-005-refunds.md"
|
||||
depende_de: ["1.1.1"]
|
||||
|
||||
1.1.4:
|
||||
nombre: "Actualizar inventarios"
|
||||
esfuerzo: 1h
|
||||
entregable: "orchestration/inventarios/*.yml"
|
||||
depende_de: ["1.1.2", "1.1.3"]
|
||||
|
||||
capved:
|
||||
C: Vincular a OQI-005
|
||||
A: Gap confirmado en análisis
|
||||
P: Este plan
|
||||
V: Build + lint + test
|
||||
E: Ejecutar 1.1.1 → 1.1.4
|
||||
D: Actualizar inventarios
|
||||
```
|
||||
|
||||
#### 1.2 EDUCATION-INSTRUCTORS
|
||||
|
||||
```yaml
|
||||
id: "ST-1.2"
|
||||
nombre: "Implementar tabla education.instructors"
|
||||
tipo: "DDL + Backend"
|
||||
prioridad: P0
|
||||
esfuerzo: 10h
|
||||
bloquea: ["OQI-002 Video upload"]
|
||||
bloqueada_por: []
|
||||
|
||||
subtareas:
|
||||
1.2.1:
|
||||
nombre: "Diseñar tabla instructors (DDL)"
|
||||
esfuerzo: 2h
|
||||
entregable: "ddl/schemas/education/tables/17-instructors.sql"
|
||||
criterios:
|
||||
- Campos: id, user_id FK, display_name, bio, avatar_url, expertise, social_links JSONB
|
||||
- Índices: user_id unique
|
||||
- Relación 1:1 con auth.users
|
||||
|
||||
1.2.2:
|
||||
nombre: "Crear entity backend"
|
||||
esfuerzo: 3h
|
||||
entregable: "apps/backend/src/modules/education/entities/instructor.entity.ts"
|
||||
depende_de: ["1.2.1"]
|
||||
|
||||
1.2.3:
|
||||
nombre: "Agregar FK instructor_id a courses"
|
||||
esfuerzo: 3h
|
||||
entregable: "Migración courses"
|
||||
depende_de: ["1.2.1"]
|
||||
|
||||
1.2.4:
|
||||
nombre: "Documentar"
|
||||
esfuerzo: 2h
|
||||
entregable: "ET-EDU-001-database.md actualizado"
|
||||
depende_de: ["1.2.2", "1.2.3"]
|
||||
```
|
||||
|
||||
#### 1.3 TRADING-PRICE-ALERTS-FK
|
||||
|
||||
```yaml
|
||||
id: "ST-1.3"
|
||||
nombre: "Agregar FK a trading.price_alerts"
|
||||
tipo: "DDL + Migration"
|
||||
prioridad: P0
|
||||
esfuerzo: 6h
|
||||
bloquea: []
|
||||
bloqueada_por: []
|
||||
|
||||
subtareas:
|
||||
1.3.1:
|
||||
nombre: "Agregar FK symbol_id"
|
||||
esfuerzo: 2h
|
||||
entregable: "Migración DDL"
|
||||
|
||||
1.3.2:
|
||||
nombre: "Migrar datos existentes"
|
||||
esfuerzo: 2h
|
||||
entregable: "Script migración"
|
||||
depende_de: ["1.3.1"]
|
||||
|
||||
1.3.3:
|
||||
nombre: "Actualizar entity"
|
||||
esfuerzo: 2h
|
||||
entregable: "price-alert.entity.ts"
|
||||
depende_de: ["1.3.2"]
|
||||
```
|
||||
|
||||
#### 1.4 ML-OVERLAY-PREDICCIONES
|
||||
|
||||
```yaml
|
||||
id: "ST-1.4"
|
||||
nombre: "Completar overlay predicciones ML"
|
||||
tipo: "DDL"
|
||||
prioridad: P0
|
||||
esfuerzo: 8h
|
||||
bloquea: ["OQI-006 señales overlay"]
|
||||
bloqueada_por: []
|
||||
|
||||
subtareas:
|
||||
1.4.1:
|
||||
nombre: "Diseñar estructura overlay"
|
||||
esfuerzo: 3h
|
||||
entregable: "Especificación técnica"
|
||||
|
||||
1.4.2:
|
||||
nombre: "Crear tablas auxiliares"
|
||||
esfuerzo: 3h
|
||||
entregable: "DDL files"
|
||||
depende_de: ["1.4.1"]
|
||||
|
||||
1.4.3:
|
||||
nombre: "Documentar"
|
||||
esfuerzo: 2h
|
||||
entregable: "ET-ML-003-overlay.md"
|
||||
depende_de: ["1.4.2"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### FASE-2: CONFLICTOS Y DUPLICIDADES
|
||||
|
||||
#### 2.1 UNIFICAR-ENUMS-TIMEFRAME
|
||||
|
||||
```yaml
|
||||
id: "ST-2.1"
|
||||
nombre: "Unificar enum timeframe en schema público"
|
||||
tipo: "DDL + Migration"
|
||||
prioridad: P1
|
||||
esfuerzo: 8h
|
||||
bloquea: []
|
||||
bloqueada_por: ["ST-1.3", "ST-1.4"]
|
||||
|
||||
subtareas:
|
||||
2.1.1:
|
||||
nombre: "Crear enum público trading_timeframe"
|
||||
esfuerzo: 1h
|
||||
entregable: "ddl/00-types.sql"
|
||||
|
||||
2.1.2:
|
||||
nombre: "Migrar referencias trading"
|
||||
esfuerzo: 3h
|
||||
entregable: "Migración trading schema"
|
||||
depende_de: ["2.1.1"]
|
||||
|
||||
2.1.3:
|
||||
nombre: "Migrar referencias market_data"
|
||||
esfuerzo: 3h
|
||||
entregable: "Migración market_data schema"
|
||||
depende_de: ["2.1.1"]
|
||||
|
||||
2.1.4:
|
||||
nombre: "Eliminar duplicados"
|
||||
esfuerzo: 1h
|
||||
entregable: "DDL cleanup"
|
||||
depende_de: ["2.1.2", "2.1.3"]
|
||||
```
|
||||
|
||||
#### 2.2 RESOLVER-TRANSACTION-TYPE-CONFLICT
|
||||
|
||||
```yaml
|
||||
id: "ST-2.2"
|
||||
nombre: "Resolver conflicto transaction_type"
|
||||
tipo: "DDL + Backend"
|
||||
prioridad: P1
|
||||
esfuerzo: 6h
|
||||
|
||||
subtareas:
|
||||
2.2.1:
|
||||
nombre: "Renombrar financial.transaction_type → financial_tx_type"
|
||||
esfuerzo: 2h
|
||||
|
||||
2.2.2:
|
||||
nombre: "Renombrar investment.transaction_type → investment_tx_type"
|
||||
esfuerzo: 2h
|
||||
|
||||
2.2.3:
|
||||
nombre: "Actualizar referencias backend"
|
||||
esfuerzo: 2h
|
||||
depende_de: ["2.2.1", "2.2.2"]
|
||||
```
|
||||
|
||||
#### 2.3 UNIFICAR-FUNCIONES-COMUNES
|
||||
|
||||
```yaml
|
||||
id: "ST-2.3"
|
||||
nombre: "Mover funciones comunes a public"
|
||||
tipo: "DDL"
|
||||
prioridad: P2
|
||||
esfuerzo: 4h
|
||||
|
||||
subtareas:
|
||||
2.3.1:
|
||||
nombre: "Mover update_updated_at() a public"
|
||||
esfuerzo: 1h
|
||||
|
||||
2.3.2:
|
||||
nombre: "Actualizar triggers"
|
||||
esfuerzo: 2h
|
||||
depende_de: ["2.3.1"]
|
||||
|
||||
2.3.3:
|
||||
nombre: "Eliminar duplicados en schemas"
|
||||
esfuerzo: 1h
|
||||
depende_de: ["2.3.2"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### FASE-3: GAPS MODERADOS (P1)
|
||||
|
||||
```yaml
|
||||
subtareas:
|
||||
3.1: "EDUCATION-COURSE-TAGS" (6h)
|
||||
3.2: "TRADING-DRAWING-TOOLS" (12h)
|
||||
3.3: "INVESTMENT-AGENT-EXECUTIONS" (4h)
|
||||
3.4: "ML-INDICES-COMPUESTOS" (2h)
|
||||
|
||||
total_fase: 24h
|
||||
depende_de: ["FASE-1", "FASE-2"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### FASE-4: GAPS MENORES (P2)
|
||||
|
||||
```yaml
|
||||
subtareas:
|
||||
4.1: "AUTH-INDICE-LOCKED-UNTIL" (1h)
|
||||
4.2: "EDUCATION-REVIEW-SOFT-DELETE" (2h)
|
||||
4.3: "AUDIT-PARTICIONAMIENTO" (8h)
|
||||
4.4: "LLM-INDICE-GIN-TAGS" (1h)
|
||||
4.5: "ESTANDARIZAR-TIMESTAMPS" (4h)
|
||||
|
||||
total_fase: 16h
|
||||
depende_de: ["FASE-3"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### FASE-5: COHERENCIA BACKEND
|
||||
|
||||
```yaml
|
||||
subtareas:
|
||||
5.1: "CREAR-ENTITIES-FALTANTES" (12h)
|
||||
5.2: "ACTUALIZAR-ENTITIES-EXISTENTES" (8h)
|
||||
|
||||
total_fase: 20h
|
||||
depende_de: ["FASE-1", "FASE-2", "FASE-3"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### FASE-6: DOCUMENTACIÓN
|
||||
|
||||
```yaml
|
||||
subtareas:
|
||||
6.1: "ACTUALIZAR-ESPECIFICACIONES" (8h)
|
||||
6.2: "ACTUALIZAR-INVENTARIOS" (4h)
|
||||
6.3: "PURGAR-OBSOLETOS" (4h)
|
||||
|
||||
total_fase: 16h
|
||||
ejecutar: "Paralelo con FASE-4 y FASE-5"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### FASE-7: MT4 (CONDICIONAL)
|
||||
|
||||
```yaml
|
||||
condicion: "Si stakeholder aprueba implementación MT4"
|
||||
subtareas:
|
||||
7.1: "OQI-009-DDL" (40h)
|
||||
|
||||
total_fase: 40h (condicional)
|
||||
depende_de: ["Decisión stakeholder"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. ORDEN DE EJECUCIÓN
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ FASE-1 │ ← Gaps Críticos (P0)
|
||||
│ 32h │ Paralelo: 1.1 || 1.2 || 1.3 || 1.4
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ FASE-2 │ ← Conflictos
|
||||
│ 18h │ Secuencial: 2.1 → 2.2 → 2.3
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ FASE-3 │ ← Gaps Moderados (P1)
|
||||
│ 24h │ Paralelo: 3.1 || 3.2 || 3.3 || 3.4
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────┴──────┐
|
||||
│ │
|
||||
▼ ▼
|
||||
┌─────────┐ ┌─────────┐
|
||||
│ FASE-4 │ │ FASE-5 │ ← Paralelo
|
||||
│ 16h │ │ 20h │
|
||||
└────┬────┘ └────┬────┘
|
||||
│ │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ FASE-6 │ ← Documentación (paralelo parcial)
|
||||
│ 16h │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼ (condicional)
|
||||
┌─────────────┐
|
||||
│ FASE-7 │ ← MT4 (si aprobado)
|
||||
│ 40h │
|
||||
└─────────────┘
|
||||
|
||||
TOTAL SIN MT4: ~126h (~16 días-hombre)
|
||||
TOTAL CON MT4: ~166h (~21 días-hombre)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. ASIGNACIÓN DE SUBAGENTES
|
||||
|
||||
### 4.1 Por Fase
|
||||
|
||||
| Fase | Subagente | Tipo | Ejecución |
|
||||
|------|-----------|------|-----------|
|
||||
| FASE-1 | 4 subagentes | Explore + Plan | Paralelo |
|
||||
| FASE-2 | 1 subagente | Bash (DDL) | Secuencial |
|
||||
| FASE-3 | 4 subagentes | Explore + Plan | Paralelo |
|
||||
| FASE-4 | 2 subagentes | Bash (DDL) | Paralelo |
|
||||
| FASE-5 | 2 subagentes | Explore + Edit | Paralelo |
|
||||
| FASE-6 | 3 subagentes | Explore + Edit | Paralelo |
|
||||
| FASE-7 | 1 subagente | Plan | Condicional |
|
||||
|
||||
### 4.2 Configuración Subagentes
|
||||
|
||||
```yaml
|
||||
subagentes:
|
||||
ddl-specialist:
|
||||
tipo: "Bash"
|
||||
herramientas: ["Read", "Write", "Bash", "Grep"]
|
||||
permisos: ["apps/database/**"]
|
||||
|
||||
backend-sync:
|
||||
tipo: "Explore"
|
||||
herramientas: ["Read", "Grep", "Glob"]
|
||||
permisos: ["apps/backend/**"]
|
||||
|
||||
doc-updater:
|
||||
tipo: "Edit"
|
||||
herramientas: ["Read", "Edit", "Write"]
|
||||
permisos: ["docs/**", "orchestration/**"]
|
||||
|
||||
inventory-sync:
|
||||
tipo: "Edit"
|
||||
herramientas: ["Read", "Edit"]
|
||||
permisos: ["orchestration/inventarios/**"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. CRITERIOS DE ACEPTACIÓN GLOBALES
|
||||
|
||||
```yaml
|
||||
validaciones_obligatorias:
|
||||
- DDL ejecuta sin errores en PostgreSQL 16+
|
||||
- Backend compila (npm run build)
|
||||
- Lint pasa (npm run lint)
|
||||
- Inventarios actualizados y coherentes
|
||||
- Especificaciones técnicas actualizadas
|
||||
- No quedan gaps P0 abiertos
|
||||
|
||||
gates:
|
||||
FASE-1_done: "Todos los gaps P0 cerrados"
|
||||
FASE-2_done: "Cero conflictos de nomenclatura"
|
||||
FASE-3_done: "Todos los gaps P1 cerrados"
|
||||
FASE-4_done: "Todos los gaps P2 cerrados"
|
||||
FASE-5_done: "100% coherencia DDL↔Backend"
|
||||
FASE-6_done: "Inventarios 100% sincronizados"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. RIESGOS Y MITIGACIÓN
|
||||
|
||||
| Riesgo | Probabilidad | Impacto | Mitigación |
|
||||
|--------|--------------|---------|------------|
|
||||
| Migración datos rompe integridad | Media | Alto | Ejecutar en BD de prueba primero |
|
||||
| Backend no compila post-cambios | Media | Alto | Ejecutar build incremental |
|
||||
| Conflictos en parallel execution | Baja | Medio | Coordinar via ACTIVE-FILES.yml |
|
||||
| MT4 aprobado sin recursos | Media | Medio | Estimar recursos antes de aprobar |
|
||||
|
||||
---
|
||||
|
||||
## 7. PRÓXIMOS PASOS
|
||||
|
||||
1. **VALIDACIÓN (V):** Revisar este plan con stakeholders
|
||||
2. **APROBACIÓN:** Confirmar prioridades y orden
|
||||
3. **EJECUCIÓN (E):** Iniciar FASE-1 con subagentes paralelos
|
||||
4. **DOCUMENTACIÓN (D):** Actualizar al cierre de cada fase
|
||||
|
||||
---
|
||||
|
||||
**Fase P EN PROGRESO** | Fecha: 2026-02-03 | Agente: claude-opus-4.5
|
||||
@ -0,0 +1,90 @@
|
||||
---
|
||||
# METADATA - Tarea de Análisis y Validación de Modelado de Datos
|
||||
# TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
|
||||
tarea:
|
||||
id: "TASK-2026-02-03-ANALISIS-DDL-MODELADO"
|
||||
nombre: "Análisis y Validación del Modelado de Datos DDL"
|
||||
proyecto: "trading-platform"
|
||||
tipo: "analysis"
|
||||
modo: "@ANALYSIS"
|
||||
prioridad: "P0"
|
||||
|
||||
perfil_agente:
|
||||
tipo: "especialista-database"
|
||||
competencias:
|
||||
- modelado-datos
|
||||
- normalizacion-bd
|
||||
- validacion-ddl
|
||||
- analisis-dependencias
|
||||
- coherencia-capas
|
||||
|
||||
descripcion: |
|
||||
Análisis exhaustivo y validación del modelado de datos del proyecto
|
||||
trading-platform para verificar:
|
||||
- Correctitud del diseño según requerimientos
|
||||
- Completitud de objetos (tablas, índices, constraints, enums)
|
||||
- Ausencia de conflictos o duplicidades
|
||||
- Coherencia con las 9 épicas OQI-001 a OQI-009
|
||||
- Alineación DDL ↔ Backend ↔ Frontend
|
||||
|
||||
origen: "user-request"
|
||||
fecha_creacion: "2026-02-03"
|
||||
fecha_actualizacion: "2026-02-03"
|
||||
|
||||
estado:
|
||||
fase_actual: "P" # Planificación
|
||||
progreso_global: 35%
|
||||
fases:
|
||||
C_contexto:
|
||||
estado: "completado"
|
||||
fecha: "2026-02-03"
|
||||
A_analisis:
|
||||
estado: "completado"
|
||||
fecha: "2026-02-03"
|
||||
P_planeacion:
|
||||
estado: "en_progreso"
|
||||
fecha: "2026-02-03"
|
||||
V_validacion:
|
||||
estado: "pendiente"
|
||||
E_ejecucion:
|
||||
estado: "pendiente"
|
||||
D_documentacion:
|
||||
estado: "pendiente"
|
||||
|
||||
metricas:
|
||||
schemas_analizados: 11
|
||||
tablas_identificadas: 90
|
||||
enums_definidos: 68
|
||||
foreign_keys: 102
|
||||
indices: 200
|
||||
gaps_identificados: 15
|
||||
conflictos_detectados: 5
|
||||
|
||||
dependencias:
|
||||
bloquea: []
|
||||
bloqueada_por: []
|
||||
|
||||
tareas_relacionadas:
|
||||
- "TASK-2026-02-03-ANALISIS-FRONTEND-UXUI"
|
||||
- "TASK-2026-01-30-ANALISIS-INTEGRACION"
|
||||
|
||||
entregables:
|
||||
- "01-CAPTURA.md"
|
||||
- "02-ANALISIS.md"
|
||||
- "03-PLANIFICACION.md"
|
||||
- "04-VALIDACION.md"
|
||||
- "inventarios/DDL-VALIDATION-MATRIX.yml"
|
||||
- "inventarios/DDL-CONFLICTS-REGISTRY.yml"
|
||||
- "inventarios/DDL-GAPS-REGISTRY.yml"
|
||||
- "subagentes/DELEGATION-PLAN.yml"
|
||||
|
||||
agentes_asignados:
|
||||
orquestador: "claude-opus-4.5"
|
||||
subagentes:
|
||||
- tipo: "Explore"
|
||||
area: "estructura-ddl"
|
||||
- tipo: "Explore"
|
||||
area: "documentacion-requerimientos"
|
||||
- tipo: "Plan"
|
||||
area: "planificacion-subtareas"
|
||||
@ -0,0 +1,170 @@
|
||||
# DDL-CONFLICTS-REGISTRY.yml
|
||||
# Registro de conflictos y duplicidades en DDL
|
||||
# Tarea: TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
|
||||
metadata:
|
||||
fecha_creacion: "2026-02-03"
|
||||
fecha_actualizacion: "2026-02-03"
|
||||
total_conflictos: 5
|
||||
total_duplicidades: 3
|
||||
|
||||
conflictos_nomenclatura:
|
||||
- id: "CONF-001"
|
||||
tipo: "enum_duplicado"
|
||||
nombre: "transaction_type"
|
||||
ubicaciones:
|
||||
- schema: "financial"
|
||||
archivo: "ddl/schemas/financial/00-enums.sql"
|
||||
valores: ["deposit", "withdrawal", "transfer_in", "transfer_out", "fee", "refund", "earning", "distribution", "bonus"]
|
||||
- schema: "investment"
|
||||
archivo: "ddl/schemas/investment/00-enums.sql"
|
||||
valores: ["deposit", "withdrawal", "distribution"]
|
||||
problema: "Mismo nombre, diferentes contextos"
|
||||
resolucion:
|
||||
propuesta: "Renombrar a financial_tx_type e investment_tx_type"
|
||||
esfuerzo: "3h"
|
||||
impacto: "Backend requiere actualización"
|
||||
prioridad: "P1"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "CONF-002"
|
||||
tipo: "enum_duplicado"
|
||||
nombre: "transaction_status"
|
||||
ubicaciones:
|
||||
- schema: "financial"
|
||||
archivo: "ddl/schemas/financial/00-enums.sql"
|
||||
- schema: "investment"
|
||||
archivo: "ddl/schemas/investment/00-enums.sql"
|
||||
problema: "Duplicación de estados"
|
||||
resolucion:
|
||||
propuesta: "Unificar en tipo compartido o renombrar"
|
||||
esfuerzo: "2h"
|
||||
impacto: "Menor"
|
||||
prioridad: "P2"
|
||||
estado: "pendiente"
|
||||
|
||||
conflictos_diseno:
|
||||
- id: "CONF-003"
|
||||
tipo: "referencia_inconsistente"
|
||||
descripcion: "Símbolos referenciados como strings en ML, no como FK"
|
||||
ubicaciones:
|
||||
- schema: "ml"
|
||||
tabla: "predictions"
|
||||
columna: "symbol (VARCHAR)"
|
||||
- schema: "trading"
|
||||
tabla: "symbols"
|
||||
columna: "id (UUID)"
|
||||
problema: "Integridad referencial no garantizada"
|
||||
resolucion:
|
||||
propuesta: "Agregar FK a trading.symbols o mantener como diseño intencional (performance)"
|
||||
decision_requerida: true
|
||||
esfuerzo: "4h si se cambia"
|
||||
prioridad: "P1"
|
||||
estado: "pendiente_decision"
|
||||
|
||||
- id: "CONF-004"
|
||||
tipo: "tipo_dato_inconsistente"
|
||||
descripcion: "Timestamps inconsistentes"
|
||||
ubicaciones:
|
||||
- algunos_usan: "TIMESTAMP"
|
||||
- otros_usan: "TIMESTAMPTZ"
|
||||
problema: "Potencial confusión con zonas horarias"
|
||||
resolucion:
|
||||
propuesta: "Estandarizar a TIMESTAMPTZ"
|
||||
esfuerzo: "4h"
|
||||
impacto: "Migraciones requeridas"
|
||||
prioridad: "P2"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "CONF-005"
|
||||
tipo: "decision_pendiente"
|
||||
descripcion: "wallet_type enum vs columnas específicas"
|
||||
contexto: |
|
||||
La tabla financial.wallets usa enum wallet_type (trading, investment, earnings, referral).
|
||||
Esto es el diseño correcto y unificado.
|
||||
problema: "Ninguno - verificación confirma diseño correcto"
|
||||
resolucion:
|
||||
propuesta: "Mantener diseño actual"
|
||||
esfuerzo: "0h"
|
||||
prioridad: "N/A"
|
||||
estado: "resuelto"
|
||||
|
||||
duplicidades:
|
||||
- id: "DUP-001"
|
||||
tipo: "enum_duplicado"
|
||||
nombre: "timeframe"
|
||||
ubicaciones:
|
||||
- schema: "trading"
|
||||
archivo: "ddl/schemas/trading/00-enums.sql"
|
||||
valores: ["1m", "5m", "15m", "30m", "1h", "4h", "1d", "1w", "1M"]
|
||||
- schema: "market_data"
|
||||
archivo: "ddl/schemas/market_data/00-enums.sql"
|
||||
valores: ["1m", "5m", "15m", "30m", "1h", "4h", "1d", "1w"]
|
||||
problema: "Duplicación innecesaria"
|
||||
resolucion:
|
||||
propuesta: "Mover a schema public como trading_timeframe"
|
||||
esfuerzo: "4h"
|
||||
pasos:
|
||||
- "Crear enum en public"
|
||||
- "Migrar trading a usar public.trading_timeframe"
|
||||
- "Migrar market_data a usar public.trading_timeframe"
|
||||
- "Eliminar enums duplicados"
|
||||
prioridad: "P1"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "DUP-002"
|
||||
tipo: "tabla_concepto"
|
||||
descripcion: "signals vs predictions"
|
||||
ubicaciones:
|
||||
- schema: "trading"
|
||||
tabla: "signals"
|
||||
proposito: "Señales de trading para usuarios"
|
||||
- schema: "ml"
|
||||
tabla: "predictions"
|
||||
proposito: "Predicciones de modelos ML"
|
||||
analisis: |
|
||||
Aunque parecen duplicados, sirven propósitos diferentes:
|
||||
- trading.signals: Señales presentadas al usuario
|
||||
- ml.predictions: Datos crudos de modelos
|
||||
problema: "Ninguno - diferentes propósitos"
|
||||
resolucion:
|
||||
propuesta: "Mantener separados, documentar relación"
|
||||
esfuerzo: "0h"
|
||||
prioridad: "N/A"
|
||||
estado: "resuelto"
|
||||
|
||||
- id: "DUP-003"
|
||||
tipo: "funcion_duplicada"
|
||||
nombre: "update_updated_at()"
|
||||
ubicaciones:
|
||||
- schema: "auth"
|
||||
archivo: "ddl/schemas/auth/functions/01-triggers.sql"
|
||||
- schema: "trading"
|
||||
archivo: "ddl/schemas/trading/functions/01-triggers.sql"
|
||||
- schema: "financial"
|
||||
archivo: "ddl/schemas/financial/functions/01-triggers.sql"
|
||||
- schema: "education"
|
||||
archivo: "ddl/schemas/education/functions/01-triggers.sql"
|
||||
problema: "Función idéntica repetida en múltiples schemas"
|
||||
resolucion:
|
||||
propuesta: "Mover a schema public, actualizar triggers"
|
||||
esfuerzo: "3h"
|
||||
pasos:
|
||||
- "Crear función en public"
|
||||
- "Actualizar triggers para usar public.update_updated_at()"
|
||||
- "Eliminar funciones duplicadas"
|
||||
prioridad: "P2"
|
||||
estado: "pendiente"
|
||||
|
||||
resumen_acciones:
|
||||
inmediatas:
|
||||
- "CONF-001: Renombrar transaction_type enums"
|
||||
- "DUP-001: Unificar timeframe"
|
||||
|
||||
corto_plazo:
|
||||
- "CONF-003: Decidir sobre FK símbolos en ML"
|
||||
- "DUP-003: Unificar funciones comunes"
|
||||
|
||||
mediano_plazo:
|
||||
- "CONF-004: Estandarizar timestamps"
|
||||
- "CONF-002: Unificar transaction_status"
|
||||
@ -0,0 +1,193 @@
|
||||
# DDL-GAPS-REGISTRY.yml
|
||||
# Registro de gaps identificados en el modelado DDL
|
||||
# Tarea: TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
|
||||
metadata:
|
||||
fecha_creacion: "2026-02-03"
|
||||
fecha_actualizacion: "2026-02-03"
|
||||
total_gaps: 15
|
||||
por_prioridad:
|
||||
P0: 4
|
||||
P1: 4
|
||||
P2: 7
|
||||
|
||||
gaps_criticos_P0:
|
||||
- id: "GAP-001"
|
||||
schema: "trading"
|
||||
objeto: "price_alerts"
|
||||
tipo: "missing_fk"
|
||||
descripcion: "Tabla price_alerts sin FK a trading.symbols"
|
||||
impacto: "Integridad referencial comprometida"
|
||||
epica: "OQI-003"
|
||||
resolucion:
|
||||
accion: "Agregar FK symbol_id"
|
||||
esfuerzo: "2h"
|
||||
prioridad: "P0"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-002"
|
||||
schema: "financial"
|
||||
objeto: "refunds"
|
||||
tipo: "missing_table"
|
||||
descripcion: "Tabla refunds no existe - requerida para Stripe"
|
||||
impacto: "Funcionalidad refunds bloqueada"
|
||||
epica: "OQI-005"
|
||||
resolucion:
|
||||
accion: "Crear tabla completa"
|
||||
esfuerzo: "8h"
|
||||
prioridad: "P0"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-003"
|
||||
schema: "education"
|
||||
objeto: "instructors"
|
||||
tipo: "missing_table"
|
||||
descripcion: "Tabla instructors no definida"
|
||||
impacto: "Videos y cursos sin autor"
|
||||
epica: "OQI-002"
|
||||
resolucion:
|
||||
accion: "Crear tabla + FK en courses"
|
||||
esfuerzo: "10h"
|
||||
prioridad: "P0"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-004"
|
||||
schema: "ml"
|
||||
objeto: "overlay_predictions"
|
||||
tipo: "incomplete_design"
|
||||
descripcion: "Overlay predicciones incompleto"
|
||||
impacto: "Señales ML no se muestran en charts"
|
||||
epica: "OQI-006"
|
||||
resolucion:
|
||||
accion: "Completar diseño overlay"
|
||||
esfuerzo: "8h"
|
||||
prioridad: "P0"
|
||||
estado: "pendiente"
|
||||
|
||||
gaps_moderados_P1:
|
||||
- id: "GAP-005"
|
||||
schema: "education"
|
||||
objeto: "course_tags"
|
||||
tipo: "missing_table"
|
||||
descripcion: "Falta tabla para tags de cursos"
|
||||
impacto: "Búsqueda y SEO limitados"
|
||||
epica: "OQI-002"
|
||||
resolucion:
|
||||
accion: "Crear tabla + tabla M:N"
|
||||
esfuerzo: "6h"
|
||||
prioridad: "P1"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-006"
|
||||
schema: "trading"
|
||||
objeto: "drawing_tools"
|
||||
tipo: "missing_tables"
|
||||
descripcion: "Tablas para herramientas de dibujo no existen"
|
||||
impacto: "Feature drawing tools huérfana"
|
||||
epica: "OQI-003"
|
||||
resolucion:
|
||||
accion: "Diseñar e implementar tablas"
|
||||
esfuerzo: "12h"
|
||||
prioridad: "P1"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-007"
|
||||
schema: "investment"
|
||||
objeto: "agent_executions"
|
||||
tipo: "incomplete_table"
|
||||
descripcion: "Tabla agent_executions incompleta"
|
||||
impacto: "Tracking agentes limitado"
|
||||
epica: "OQI-004"
|
||||
resolucion:
|
||||
accion: "Agregar columnas faltantes"
|
||||
esfuerzo: "4h"
|
||||
prioridad: "P1"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-008"
|
||||
schema: "ml"
|
||||
objeto: "predictions"
|
||||
tipo: "missing_index"
|
||||
descripcion: "Falta índice compuesto symbol+timeframe+created"
|
||||
impacto: "Performance queries degradada"
|
||||
epica: "OQI-006"
|
||||
resolucion:
|
||||
accion: "Crear índice compuesto"
|
||||
esfuerzo: "2h"
|
||||
prioridad: "P1"
|
||||
estado: "pendiente"
|
||||
|
||||
gaps_menores_P2:
|
||||
- id: "GAP-009"
|
||||
schema: "auth"
|
||||
objeto: "users"
|
||||
tipo: "missing_index"
|
||||
descripcion: "Falta índice en locked_until"
|
||||
impacto: "Performance menor"
|
||||
epica: "OQI-001"
|
||||
resolucion:
|
||||
accion: "Agregar índice"
|
||||
esfuerzo: "1h"
|
||||
prioridad: "P2"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-010"
|
||||
schema: "education"
|
||||
objeto: "course_reviews"
|
||||
tipo: "missing_column"
|
||||
descripcion: "Sin soft delete (deleted_at)"
|
||||
impacto: "Gestión datos limitada"
|
||||
epica: "OQI-002"
|
||||
resolucion:
|
||||
accion: "Agregar columna deleted_at"
|
||||
esfuerzo: "2h"
|
||||
prioridad: "P2"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-011"
|
||||
schema: "audit"
|
||||
objeto: "audit_logs"
|
||||
tipo: "missing_partitioning"
|
||||
descripcion: "Sin particionamiento por fecha"
|
||||
impacto: "Escalabilidad futura"
|
||||
epica: "Transversal"
|
||||
resolucion:
|
||||
accion: "Implementar particionamiento"
|
||||
esfuerzo: "8h"
|
||||
prioridad: "P2"
|
||||
estado: "pendiente"
|
||||
|
||||
- id: "GAP-012"
|
||||
schema: "llm"
|
||||
objeto: "conversations"
|
||||
tipo: "missing_index"
|
||||
descripcion: "Falta índice GIN en tags"
|
||||
impacto: "Búsqueda por tags lenta"
|
||||
epica: "OQI-007"
|
||||
resolucion:
|
||||
accion: "Agregar índice GIN"
|
||||
esfuerzo: "1h"
|
||||
prioridad: "P2"
|
||||
estado: "pendiente"
|
||||
|
||||
gaps_documentacion:
|
||||
- id: "GAP-DOC-001"
|
||||
ubicacion: "docs/02-definicion-modulos/OQI-003-trading-charts/especificaciones/"
|
||||
archivo: "ET-TRD-003-database.md"
|
||||
problema: "Desactualizado vs DDL actual"
|
||||
accion: "Actualizar con tablas actuales"
|
||||
prioridad: "P2"
|
||||
|
||||
- id: "GAP-DOC-002"
|
||||
ubicacion: "docs/02-definicion-modulos/OQI-005-pagos-stripe/especificaciones/"
|
||||
archivo: "ET-PAY-005-refunds.md"
|
||||
problema: "No existe"
|
||||
accion: "Crear cuando se implemente tabla"
|
||||
prioridad: "P0"
|
||||
|
||||
- id: "GAP-DOC-003"
|
||||
ubicacion: "orchestration/inventarios/"
|
||||
archivo: "DATABASE_INVENTORY.yml"
|
||||
problema: "Desactualizado"
|
||||
accion: "Sincronizar con DDL actual"
|
||||
prioridad: "P1"
|
||||
@ -0,0 +1,643 @@
|
||||
# DDL-VALIDATION-MATRIX.yml
|
||||
# Matriz de validación DDL vs Requerimientos
|
||||
# Tarea: TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
|
||||
metadata:
|
||||
fecha_creacion: "2026-02-03"
|
||||
fecha_actualizacion: "2026-02-03"
|
||||
total_schemas: 11
|
||||
total_tablas: 90
|
||||
coherencia_global: "87%"
|
||||
|
||||
resumen_validacion:
|
||||
schemas_completos: 7
|
||||
schemas_con_gaps: 3
|
||||
schema_sin_ddl: 1 # MT4 (decisión pendiente)
|
||||
|
||||
metricas:
|
||||
tablas_ddl: 90
|
||||
tablas_documentadas: 82
|
||||
match_rate: "91%"
|
||||
|
||||
enums_ddl: 68
|
||||
enums_usados: 65
|
||||
enums_huerfanos: 3
|
||||
|
||||
fk_definidas: 102
|
||||
fk_faltantes: 4
|
||||
|
||||
indices_definidos: 200
|
||||
indices_sugeridos: 12
|
||||
|
||||
validacion_por_schema:
|
||||
|
||||
auth:
|
||||
estado: "COMPLETO"
|
||||
completitud: "100%"
|
||||
tablas:
|
||||
- nombre: "users"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
indices: ["email", "status", "role", "last_login"]
|
||||
notas: "Falta índice locked_until (P2)"
|
||||
|
||||
- nombre: "user_profiles"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "oauth_accounts"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "sessions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "email_verifications"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "phone_verifications"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "password_reset_tokens"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "auth_logs"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "login_attempts"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "rate_limiting_config"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "notifications"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "user_push_tokens"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
enums_validados:
|
||||
- user_status: true
|
||||
- user_role: true
|
||||
- oauth_provider: true
|
||||
- phone_channel: true
|
||||
- mfa_method: true
|
||||
- auth_event_type: true
|
||||
|
||||
education:
|
||||
estado: "GAPS MENORES"
|
||||
completitud: "82%"
|
||||
gaps:
|
||||
- "instructors no existe (P0)"
|
||||
- "course_tags no existe (P1)"
|
||||
- "course_reviews sin soft delete (P2)"
|
||||
tablas:
|
||||
- nombre: "categories"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "courses"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
notas: "Falta FK instructor_id"
|
||||
|
||||
- nombre: "modules"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "lessons"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "enrollments"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "progress"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "quizzes"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "quiz_questions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "quiz_attempts"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "certificates"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "user_achievements"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "user_gamification_profile"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "user_activity_log"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "course_reviews"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
notas: "Falta deleted_at"
|
||||
|
||||
- nombre: "videos"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "review_helpful_votes"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "instructors"
|
||||
existe_ddl: false
|
||||
existe_entity: false
|
||||
gap: "P0"
|
||||
|
||||
trading:
|
||||
estado: "GAPS MODERADOS"
|
||||
completitud: "91%"
|
||||
gaps:
|
||||
- "price_alerts sin FK symbol_id (P0)"
|
||||
- "drawing_tools no existe (P1)"
|
||||
tablas:
|
||||
- nombre: "symbols"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "watchlists"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "watchlist_items"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "bots"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "orders"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "positions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "trades"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "signals"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "trading_metrics"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "paper_balances"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "price_alerts"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: false
|
||||
gap: "Falta FK symbol_id"
|
||||
|
||||
financial:
|
||||
estado: "GAP CRÍTICO"
|
||||
completitud: "91%"
|
||||
gaps:
|
||||
- "refunds no existe (P0 - BLOQUEANTE)"
|
||||
tablas:
|
||||
- nombre: "wallets"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "wallet_transactions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "subscriptions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "invoices"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "payments"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "wallet_audit_log"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "currency_exchange_rates"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "wallet_limits"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "customers"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "payment_methods"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "refunds"
|
||||
existe_ddl: false
|
||||
existe_entity: false
|
||||
gap: "P0 - BLOQUEANTE"
|
||||
|
||||
investment:
|
||||
estado: "COMPLETO CON GAPS"
|
||||
completitud: "90%"
|
||||
gaps:
|
||||
- "agent_executions incompleta (P1)"
|
||||
tablas:
|
||||
- nombre: "products"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "risk_questionnaire"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "accounts"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "distributions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "transactions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "withdrawal_requests"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "daily_performance"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "distribution_history"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "distribution_runs"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "agent_executions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: false
|
||||
gap: "Columnas faltantes"
|
||||
|
||||
portfolio:
|
||||
estado: "COMPLETO"
|
||||
completitud: "100%"
|
||||
tablas:
|
||||
- nombre: "portfolios"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "portfolio_allocations"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "portfolio_goals"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "rebalance_history"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "portfolio_snapshots"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
market_data:
|
||||
estado: "COMPLETO"
|
||||
completitud: "100%"
|
||||
tablas:
|
||||
- nombre: "ohlcv_5m"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "ohlcv_15m"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "staging"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
ml:
|
||||
estado: "GAPS MENORES"
|
||||
completitud: "82%"
|
||||
gaps:
|
||||
- "overlay predicciones incompleto (P0)"
|
||||
- "índice compuesto faltante (P1)"
|
||||
- "símbolos como strings, no FK"
|
||||
tablas:
|
||||
- nombre: "models"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "model_versions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "predictions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
notas: "Falta índice compuesto"
|
||||
|
||||
- nombre: "prediction_outcomes"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "feature_store"
|
||||
existe_ddl: true
|
||||
existe_entity: false
|
||||
gap: "Entity faltante"
|
||||
|
||||
- nombre: "llm_predictions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "llm_prediction_outcomes"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "llm_decisions"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "risk_events"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "backtest_runs"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "llm_signals"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
llm:
|
||||
estado: "COMPLETO"
|
||||
completitud: "100%"
|
||||
gaps:
|
||||
- "índice GIN en tags (P2)"
|
||||
tablas:
|
||||
- nombre: "conversations"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "messages"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "user_preferences"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "user_memory"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "embeddings"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
audit:
|
||||
estado: "COMPLETO"
|
||||
completitud: "86%"
|
||||
gaps:
|
||||
- "compliance_logs sin entity (P2)"
|
||||
- "particionamiento pendiente (P2)"
|
||||
tablas:
|
||||
- nombre: "audit_logs"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "security_events"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "system_events"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "trading_audit"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "api_request_logs"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "data_access_logs"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "compliance_logs"
|
||||
existe_ddl: true
|
||||
existe_entity: false
|
||||
gap: "Entity faltante"
|
||||
|
||||
feature_flags:
|
||||
estado: "COMPLETO"
|
||||
completitud: "100%"
|
||||
tablas:
|
||||
- nombre: "flags"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "user_flags"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
- nombre: "evaluations"
|
||||
existe_ddl: true
|
||||
existe_entity: true
|
||||
campos_match: true
|
||||
|
||||
mt4:
|
||||
estado: "NO EXISTE"
|
||||
completitud: "0%"
|
||||
nota: "Decisión pendiente MetaAPI vs Local Terminal"
|
||||
dependencia: "OQI-009"
|
||||
|
||||
acciones_requeridas:
|
||||
P0_inmediato:
|
||||
- schema: "financial"
|
||||
accion: "Crear tabla refunds"
|
||||
esfuerzo: "8h"
|
||||
|
||||
- schema: "education"
|
||||
accion: "Crear tabla instructors"
|
||||
esfuerzo: "10h"
|
||||
|
||||
- schema: "trading"
|
||||
accion: "Agregar FK a price_alerts"
|
||||
esfuerzo: "6h"
|
||||
|
||||
- schema: "ml"
|
||||
accion: "Completar overlay predicciones"
|
||||
esfuerzo: "8h"
|
||||
|
||||
P1_corto_plazo:
|
||||
- schema: "education"
|
||||
accion: "Crear tabla course_tags"
|
||||
esfuerzo: "6h"
|
||||
|
||||
- schema: "trading"
|
||||
accion: "Crear tablas drawing_tools"
|
||||
esfuerzo: "12h"
|
||||
|
||||
- schema: "investment"
|
||||
accion: "Completar agent_executions"
|
||||
esfuerzo: "4h"
|
||||
|
||||
- schema: "ml"
|
||||
accion: "Crear índice compuesto"
|
||||
esfuerzo: "2h"
|
||||
|
||||
P2_mediano_plazo:
|
||||
- schema: "auth"
|
||||
accion: "Índice locked_until"
|
||||
|
||||
- schema: "education"
|
||||
accion: "Soft delete en reviews"
|
||||
|
||||
- schema: "audit"
|
||||
accion: "Particionamiento"
|
||||
|
||||
- schema: "llm"
|
||||
accion: "Índice GIN tags"
|
||||
|
||||
- schema: "*"
|
||||
accion: "Estandarizar timestamps"
|
||||
@ -0,0 +1,295 @@
|
||||
# DELEGATION-PLAN.yml
|
||||
# Plan de delegación a subagentes para ejecución de la tarea
|
||||
# Tarea: TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
|
||||
metadata:
|
||||
fecha_creacion: "2026-02-03"
|
||||
orquestador: "claude-opus-4.5"
|
||||
total_subagentes: 12
|
||||
estrategia: "paralelo_por_fase"
|
||||
|
||||
# Configuración de tipos de subagentes disponibles
|
||||
tipos_subagentes:
|
||||
ddl_specialist:
|
||||
tipo: "Bash"
|
||||
descripcion: "Especialista en operaciones DDL"
|
||||
herramientas: ["Read", "Write", "Bash", "Grep", "Glob"]
|
||||
permisos:
|
||||
- "apps/database/**"
|
||||
- "scripts/database/**"
|
||||
comandos_permitidos:
|
||||
- "psql"
|
||||
- "pg_dump"
|
||||
- "npm run db:*"
|
||||
|
||||
backend_sync:
|
||||
tipo: "Explore"
|
||||
descripcion: "Sincronización DDL-Backend"
|
||||
herramientas: ["Read", "Grep", "Glob"]
|
||||
permisos:
|
||||
- "apps/backend/src/**"
|
||||
solo_lectura: true
|
||||
|
||||
backend_edit:
|
||||
tipo: "general-purpose"
|
||||
descripcion: "Edición de código backend"
|
||||
herramientas: ["Read", "Edit", "Write", "Grep", "Glob"]
|
||||
permisos:
|
||||
- "apps/backend/src/**"
|
||||
|
||||
doc_updater:
|
||||
tipo: "general-purpose"
|
||||
descripcion: "Actualización de documentación"
|
||||
herramientas: ["Read", "Edit", "Write"]
|
||||
permisos:
|
||||
- "docs/**"
|
||||
- "orchestration/**"
|
||||
|
||||
inventory_sync:
|
||||
tipo: "general-purpose"
|
||||
descripcion: "Sincronización de inventarios"
|
||||
herramientas: ["Read", "Edit"]
|
||||
permisos:
|
||||
- "orchestration/inventarios/**"
|
||||
|
||||
# Plan de delegación por fase
|
||||
delegacion_por_fase:
|
||||
|
||||
FASE_1:
|
||||
nombre: "Gaps Críticos P0"
|
||||
estrategia: "paralelo"
|
||||
subagentes:
|
||||
- id: "SA-1.1"
|
||||
tarea: "ST-1.1 FINANCIAL-REFUNDS"
|
||||
tipo: "ddl_specialist"
|
||||
prompt: |
|
||||
Implementar tabla financial.refunds con las siguientes especificaciones:
|
||||
|
||||
1. Crear archivo: apps/database/ddl/schemas/financial/tables/11-refunds.sql
|
||||
2. Campos requeridos:
|
||||
- id UUID PK DEFAULT gen_random_uuid()
|
||||
- payment_id UUID FK NOT NULL REFERENCES financial.payments(id)
|
||||
- amount DECIMAL(18,8) NOT NULL CHECK (amount > 0)
|
||||
- reason VARCHAR(500)
|
||||
- status financial.refund_status NOT NULL DEFAULT 'pending'
|
||||
- stripe_refund_id VARCHAR(100) UNIQUE
|
||||
- refunded_by UUID FK REFERENCES auth.users(id)
|
||||
- created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
- updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
3. Crear enum refund_status si no existe: pending, processing, succeeded, failed
|
||||
4. Índices: payment_id, status, created_at
|
||||
5. Trigger update_updated_at
|
||||
|
||||
Validar DDL con: psql -f <archivo> --dry-run
|
||||
|
||||
- id: "SA-1.2"
|
||||
tarea: "ST-1.2 EDUCATION-INSTRUCTORS"
|
||||
tipo: "ddl_specialist"
|
||||
prompt: |
|
||||
Implementar tabla education.instructors con las siguientes especificaciones:
|
||||
|
||||
1. Crear archivo: apps/database/ddl/schemas/education/tables/17-instructors.sql
|
||||
2. Campos:
|
||||
- id UUID PK
|
||||
- user_id UUID FK UNIQUE NOT NULL REFERENCES auth.users(id)
|
||||
- display_name VARCHAR(100) NOT NULL
|
||||
- bio TEXT
|
||||
- avatar_url VARCHAR(500)
|
||||
- expertise TEXT[]
|
||||
- social_links JSONB DEFAULT '{}'
|
||||
- total_courses INTEGER DEFAULT 0
|
||||
- total_students INTEGER DEFAULT 0
|
||||
- average_rating DECIMAL(3,2)
|
||||
- is_verified BOOLEAN DEFAULT false
|
||||
- created_at, updated_at TIMESTAMPTZ
|
||||
3. Índices: user_id (unique), is_verified
|
||||
4. Agregar FK instructor_id a courses si no existe
|
||||
|
||||
- id: "SA-1.3"
|
||||
tarea: "ST-1.3 TRADING-PRICE-ALERTS-FK"
|
||||
tipo: "ddl_specialist"
|
||||
prompt: |
|
||||
Agregar FK a trading.price_alerts:
|
||||
|
||||
1. Verificar estructura actual de price_alerts
|
||||
2. Crear migración para agregar columna symbol_id UUID
|
||||
3. Agregar FK REFERENCES trading.symbols(id)
|
||||
4. Crear índice en symbol_id
|
||||
5. Script de migración de datos existentes (si hay)
|
||||
|
||||
- id: "SA-1.4"
|
||||
tarea: "ST-1.4 ML-OVERLAY-PREDICCIONES"
|
||||
tipo: "ddl_specialist"
|
||||
prompt: |
|
||||
Completar diseño overlay predicciones ML:
|
||||
|
||||
1. Revisar estructura actual en ml.predictions
|
||||
2. Agregar columnas para overlay si faltan:
|
||||
- overlay_data JSONB
|
||||
- chart_config JSONB
|
||||
- display_priority INTEGER
|
||||
3. Crear tabla ml.prediction_overlays si es necesario
|
||||
4. Documentar estructura final
|
||||
|
||||
FASE_2:
|
||||
nombre: "Conflictos y Duplicidades"
|
||||
estrategia: "secuencial"
|
||||
depende_de: ["FASE_1"]
|
||||
subagentes:
|
||||
- id: "SA-2.1"
|
||||
tarea: "ST-2.1 UNIFICAR-ENUMS-TIMEFRAME"
|
||||
tipo: "ddl_specialist"
|
||||
prompt: |
|
||||
Unificar enum timeframe en schema público:
|
||||
|
||||
1. Crear enum public.trading_timeframe con valores:
|
||||
1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w, 1M
|
||||
2. Crear migraciones para trading schema
|
||||
3. Crear migraciones para market_data schema
|
||||
4. Eliminar enums duplicados
|
||||
5. Validar integridad post-migración
|
||||
|
||||
- id: "SA-2.2"
|
||||
tarea: "ST-2.2 RESOLVER-TRANSACTION-TYPE"
|
||||
tipo: "ddl_specialist"
|
||||
depende_de: ["SA-2.1"]
|
||||
prompt: |
|
||||
Resolver conflicto transaction_type:
|
||||
|
||||
1. Renombrar financial.transaction_type → financial_tx_type
|
||||
2. Renombrar investment.transaction_type → investment_tx_type
|
||||
3. Actualizar referencias en tablas
|
||||
4. Documentar cambios
|
||||
|
||||
- id: "SA-2.3"
|
||||
tarea: "ST-2.3 UNIFICAR-FUNCIONES"
|
||||
tipo: "ddl_specialist"
|
||||
depende_de: ["SA-2.2"]
|
||||
prompt: |
|
||||
Mover funciones comunes a public:
|
||||
|
||||
1. Crear public.update_updated_at()
|
||||
2. Actualizar triggers en todos los schemas
|
||||
3. Eliminar funciones duplicadas
|
||||
4. Validar triggers funcionan
|
||||
|
||||
FASE_3:
|
||||
nombre: "Gaps Moderados P1"
|
||||
estrategia: "paralelo"
|
||||
depende_de: ["FASE_2"]
|
||||
subagentes:
|
||||
- id: "SA-3.1"
|
||||
tarea: "ST-3.1 EDUCATION-COURSE-TAGS"
|
||||
tipo: "ddl_specialist"
|
||||
|
||||
- id: "SA-3.2"
|
||||
tarea: "ST-3.2 TRADING-DRAWING-TOOLS"
|
||||
tipo: "ddl_specialist"
|
||||
|
||||
- id: "SA-3.3"
|
||||
tarea: "ST-3.3 INVESTMENT-AGENT-EXECUTIONS"
|
||||
tipo: "ddl_specialist"
|
||||
|
||||
- id: "SA-3.4"
|
||||
tarea: "ST-3.4 ML-INDICES-COMPUESTOS"
|
||||
tipo: "ddl_specialist"
|
||||
|
||||
FASE_5:
|
||||
nombre: "Coherencia Backend"
|
||||
estrategia: "paralelo"
|
||||
depende_de: ["FASE_1", "FASE_2", "FASE_3"]
|
||||
subagentes:
|
||||
- id: "SA-5.1"
|
||||
tarea: "ST-5.1 CREAR-ENTITIES-FALTANTES"
|
||||
tipo: "backend_edit"
|
||||
prompt: |
|
||||
Crear entities TypeORM faltantes:
|
||||
|
||||
1. education.instructors → instructor.entity.ts
|
||||
2. ml.feature_store → feature-store.entity.ts
|
||||
3. audit.compliance_logs → compliance-log.entity.ts
|
||||
|
||||
Seguir patrones existentes en el proyecto.
|
||||
Incluir decoradores, validaciones y relaciones.
|
||||
|
||||
- id: "SA-5.2"
|
||||
tarea: "ST-5.2 ACTUALIZAR-ENTITIES"
|
||||
tipo: "backend_edit"
|
||||
prompt: |
|
||||
Actualizar entities existentes para sincronizar con DDL:
|
||||
|
||||
1. Verificar auth entities vs DDL
|
||||
2. Verificar trading entities vs DDL
|
||||
3. Verificar financial entities vs DDL
|
||||
4. Agregar campos/relaciones faltantes
|
||||
|
||||
FASE_6:
|
||||
nombre: "Documentación"
|
||||
estrategia: "paralelo"
|
||||
depende_de: ["FASE_5"]
|
||||
subagentes:
|
||||
- id: "SA-6.1"
|
||||
tarea: "ST-6.1 ACTUALIZAR-ESPECIFICACIONES"
|
||||
tipo: "doc_updater"
|
||||
prompt: |
|
||||
Actualizar especificaciones técnicas:
|
||||
|
||||
1. ET-TRD-003-database.md con tablas actuales
|
||||
2. ET-EDU-001-database.md con instructors
|
||||
3. Crear ET-FIN-001-database.md (refunds)
|
||||
|
||||
- id: "SA-6.2"
|
||||
tarea: "ST-6.2 ACTUALIZAR-INVENTARIOS"
|
||||
tipo: "inventory_sync"
|
||||
prompt: |
|
||||
Sincronizar inventarios:
|
||||
|
||||
1. DATABASE_INVENTORY.yml con todos los cambios
|
||||
2. BACKEND_INVENTORY.yml con nuevas entities
|
||||
3. MASTER_INVENTORY.yml consolidado
|
||||
|
||||
- id: "SA-6.3"
|
||||
tarea: "ST-6.3 PURGAR-OBSOLETOS"
|
||||
tipo: "doc_updater"
|
||||
prompt: |
|
||||
Purgar documentación obsoleta:
|
||||
|
||||
1. Archivar tareas 2025 a _archive/
|
||||
2. Eliminar análisis superados en docs/99-analisis/
|
||||
3. Limpiar duplicados en docs/
|
||||
|
||||
# Coordinación entre subagentes
|
||||
coordinacion:
|
||||
archivo_bloqueo: "orchestration/trazas/ACTIVE-FILES.yml"
|
||||
notificacion_completado: true
|
||||
validacion_cruzada: true
|
||||
|
||||
# Criterios de éxito por subagente
|
||||
criterios_exito:
|
||||
ddl_specialist:
|
||||
- "DDL ejecuta sin errores"
|
||||
- "Índices creados correctamente"
|
||||
- "Constraints validados"
|
||||
|
||||
backend_edit:
|
||||
- "npm run build pasa"
|
||||
- "npm run lint pasa"
|
||||
- "Entity exportada en index"
|
||||
|
||||
doc_updater:
|
||||
- "Documentos coherentes con DDL"
|
||||
- "Links internos funcionan"
|
||||
- "Formato markdown correcto"
|
||||
|
||||
inventory_sync:
|
||||
- "YAML válido"
|
||||
- "Conteos actualizados"
|
||||
- "Referencias correctas"
|
||||
|
||||
# Rollback plan
|
||||
rollback:
|
||||
estrategia: "git_revert_por_fase"
|
||||
checkpoints:
|
||||
- "post-FASE-1"
|
||||
- "post-FASE-2"
|
||||
- "post-FASE-3"
|
||||
@ -6,9 +6,9 @@ created: "2026-01-24"
|
||||
updated: "2026-02-03"
|
||||
|
||||
resumen:
|
||||
total_tareas_activas: 1
|
||||
total_tareas_activas: 3
|
||||
completadas_archivadas: 25
|
||||
en_progreso: 1
|
||||
en_progreso: 3
|
||||
pendientes: 0
|
||||
postergadas: 1
|
||||
canceladas: 1
|
||||
@ -28,6 +28,55 @@ formato_id:
|
||||
|
||||
tareas_activas:
|
||||
en_progreso:
|
||||
- id: TASK-2026-02-03-ANALISIS-DDL-MODELADO
|
||||
titulo: "Análisis y Validación Integral del Modelado de Datos DDL"
|
||||
estado: EN_PROGRESO
|
||||
tipo: ANALYSIS
|
||||
prioridad: P0
|
||||
modulo: apps/database/ddl
|
||||
progreso: "35%"
|
||||
fase_actual: "P (Planificación)"
|
||||
ubicacion: "TASK-2026-02-03-ANALISIS-DDL-MODELADO/"
|
||||
fecha_inicio: "2026-02-03"
|
||||
schemas_analizados: 11
|
||||
tablas_analizadas: 90
|
||||
gaps_identificados: 15
|
||||
conflictos_detectados: 5
|
||||
duplicidades: 3
|
||||
subtareas_planificadas: 7
|
||||
esfuerzo_estimado: "126h (sin MT4)"
|
||||
perfil_agente: "especialista-database"
|
||||
descripcion: |
|
||||
Análisis exhaustivo del modelado de datos DDL del proyecto trading-platform.
|
||||
Incluye: validación de schemas, identificación de gaps, conflictos y duplicidades,
|
||||
coherencia DDL-Backend, plan de corrección con subtareas CAPVED-compliant,
|
||||
y plan de delegación a subagentes para ejecución paralela.
|
||||
entregables:
|
||||
- "01-CAPTURA.md (C) - Contexto"
|
||||
- "02-ANALISIS.md (A) - Análisis completo"
|
||||
- "03-PLANIFICACION.md (P) - Plan de subtareas"
|
||||
- "inventarios/DDL-GAPS-REGISTRY.yml"
|
||||
- "inventarios/DDL-CONFLICTS-REGISTRY.yml"
|
||||
- "inventarios/DDL-VALIDATION-MATRIX.yml"
|
||||
- "subagentes/DELEGATION-PLAN.yml"
|
||||
|
||||
- id: TASK-2026-02-03-DDL-VALIDATION
|
||||
titulo: "Análisis y Validación del Modelado de Datos DDL (legacy)"
|
||||
estado: SUPERSEDIDA
|
||||
tipo: ANALYSIS
|
||||
prioridad: P1
|
||||
modulo: apps/database/ddl
|
||||
progreso: "75%"
|
||||
fase_actual: "SUPERSEDIDA por TASK-2026-02-03-ANALISIS-DDL-MODELADO"
|
||||
ubicacion: "2026-02-03/TASK-2026-02-03-DDL-VALIDATION/"
|
||||
fecha_inicio: "2026-02-03"
|
||||
conflictos_analizados: 3
|
||||
gaps_identificados: 6
|
||||
nota: "Absorbida por tarea más comprehensiva"
|
||||
descripcion: |
|
||||
Análisis de conflictos DDL, gaps entre modelado y requerimientos,
|
||||
y plan de corrección para alcanzar 90% coherencia DDL-Backend.
|
||||
|
||||
- id: TASK-2026-02-03-ANALISIS-FRONTEND-UXUI
|
||||
titulo: "Análisis y Planificación Frontend UX/UI - Trading Platform"
|
||||
estado: EN_PROGRESO
|
||||
|
||||
Loading…
Reference in New Issue
Block a user