---
id: "DECISIONES-ARQUITECTONICAS"
title: "DECISIONES ARQUITECTÓNICAS - Trading Platform"
type: "Documentation"
project: "trading-platform"
version: "1.0.0"
updated_date: "2026-01-04"
---

# DECISIONES ARQUITECTÓNICAS - Trading Platform

**Fecha:** 2025-12-06
**Estado:** Aprobado
**Versión:** 1.0.0

---

## Resumen de Decisiones

Este documento consolida las decisiones arquitectónicas tomadas para resolver los conflictos identificados en el análisis de requisitos.

---

## DEC-001: Moneda Principal

### Contexto
Se detectó conflicto entre documentos que definían planes en USD ($19-99) vs MXN (499-999).

### Decisión
**Moneda principal: USD** con soporte para conversión a MXN.

### Justificación
- Plataforma internacional de trading requiere estándar USD
- Stripe maneja mejor USD como moneda base
- MXN se soporta mediante conversión en checkout

### Implementación
```yaml
Planes (USD):
  - Basic: $19/mes
  - Pro: $49/mes
  - Premium: $99/mes

Tabla currency_exchange_rates:
  - Actualización diaria de tipo de cambio
  - Mostrar precio en MXN en UI para usuarios mexicanos
```

---

## DEC-002: Fusión/Delimitación OQI-004 y OQI-008

### Contexto
Se detectó 70-85% de duplicación funcional entre:
- OQI-004: Cuentas de Inversión PAMM
- OQI-008: Portfolio Manager

### Decisión
**Delimitar responsabilidades** (no fusionar):

| Épica | Responsabilidad Exclusiva |
|-------|---------------------------|
| OQI-004 | Cuentas PAMM gestionadas por agentes (Atlas, Orion, Nova) |
| OQI-008 | Portfolio personal del usuario, cuestionario de riesgo, metas |

### Componentes Compartidos (en `financial` schema)
- Wallets unificadas
- Historial de transacciones
- Perfil de riesgo (calculado por cuestionario de OQI-008, usado por OQI-004)

### Implementación
- OQI-004 usa `investment` schema para PAMM específico
- OQI-008 funcionalidad de portfolio se integra en dashboard general
- Cuestionario de riesgo en `investment.risk_questionnaire`
- Perfil resultante alimenta selección de agente en PAMM

---

## DEC-003: Schema de Usuarios

### Contexto
Inconsistencia entre `public.users` y `auth.users` en referencias.

### Decisión
**Schema dedicado: `auth`** para todas las tablas de autenticación.

### Justificación
- Separación de concerns clara
- Facilita RLS (Row Level Security)
- Permite migración futura a servicio de auth separado

### Implementación
```sql
-- Schema auth contiene:
auth.users
auth.user_profiles
auth.oauth_accounts
auth.sessions
auth.email_verifications
auth.phone_verifications
auth.password_reset_tokens
auth.auth_logs
auth.login_attempts
auth.rate_limiting_config

-- Todas las FK de otros schemas referencian:
REFERENCES auth.users(id)
```

---

## DEC-004: Vector Database para LLM

### Contexto
OQI-007 (LLM Agent) requiere RAG/Vector Store pero no estaba especificado.

### Decisión
**pgvector** (extensión de PostgreSQL)

### Justificación
- No requiere infraestructura adicional
- Integración nativa con PostgreSQL existente
- Suficiente para volumen inicial (< 1M embeddings)
- Migración a Pinecone/Weaviate si escala necesario

### Implementación
```sql
CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE llm.embeddings (
  id UUID PRIMARY KEY,
  content_type VARCHAR(50),  -- 'lesson', 'article', 'faq'
  content_id UUID,
  embedding vector(1536),    -- OpenAI ada-002
  metadata JSONB,
  created_at TIMESTAMPTZ
);

CREATE INDEX idx_embeddings_vector ON llm.embeddings
  USING ivfflat (embedding vector_cosine_ops);
```

---

## DEC-005: Distribución PAMM

### Contexto
Ambigüedad sobre frecuencia de distribución de ganancias (80/20): ¿mensual o trimestral?

### Decisión
**Distribución mensual** con opción de reinversión.

### Justificación
- Mayor transparencia para inversionistas
- Alineado con ciclo de billing (suscripciones mensuales)
- Reinversión automática disponible para compounding

### Implementación
```sql
CREATE TYPE investment.distribution_frequency AS ENUM (
  'monthly',
  'quarterly'
);

-- Default: monthly
-- Usuario puede optar por quarterly con bonus de 2% extra
```

---

## DEC-006: Resolución de Dependencia Circular

### Contexto
OQI-003 (Trading) ↔ OQI-006 (ML Signals) tenían dependencia circular que bloqueaba MVP.

### Decisión
**Interfaz abstracta `trading.signals`** como punto de integración.

### Justificación
- Desacopla ambos módulos
- Trading puede desarrollarse con MockSignalProvider
- ML puede desarrollarse independientemente
- Integración mediante tabla compartida

### Implementación
```
trading.signals (tabla interfaz)
    ↑                    ↑
    │                    │
OQI-003             OQI-006
(consume)           (produce)
```

```sql
-- OQI-003 lee de trading.signals
-- OQI-006 escribe a trading.signals
-- No hay FK directa entre módulos
```

---

## DEC-007: Timestamps Estándar

### Contexto
Inconsistencia entre TIMESTAMP y TIMESTAMPTZ en definiciones.

### Decisión
**TIMESTAMPTZ en todas las columnas de fecha/hora**

### Justificación
- Plataforma internacional requiere timezone awareness
- PostgreSQL best practice
- Evita bugs de conversión de zonas horarias

### Implementación
```sql
-- SIEMPRE usar:
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()

-- NUNCA usar:
created_at TIMESTAMP  -- SIN timezone
```

---

## Matriz de Impacto

| Decisión | Épicas Impactadas | Archivos a Modificar |
|----------|-------------------|---------------------|
| DEC-001 | OQI-005 | ET-PAY-*.md, DDL financial |
| DEC-002 | OQI-004, OQI-008 | README.md de ambas, DDL investment |
| DEC-003 | TODAS | Todos los ET-*-database.md |
| DEC-004 | OQI-007 | ET-LLM-*.md, DDL llm |
| DEC-005 | OQI-004 | ET-INV-*.md, DDL investment |
| DEC-006 | OQI-003, OQI-006 | ET-TRD-*.md, ET-ML-*.md, DDL trading |
| DEC-007 | TODAS | Todos los DDL |

---

## Próximos Pasos

1. ✅ Documentar decisiones (este documento)
2. ✅ Crear ADRs formales (ADR-002 a ADR-006)
3. ✅ Actualizar DDLs según decisiones
4. ⏳ Actualizar especificaciones técnicas
5. ⏳ Validar con recreación de BD

---

*Documento generado por Requirements-Analyst Agent*
*Trading Platform - Trading Platform*
