workspace-v1/orchestration/directivas/simco/SIMCO-ALINEACION.md
rckrdmrd 66161b1566 feat: Workspace-v1 complete migration with NEXUS v3.4
Sistema NEXUS v3.4 migrado con:

Estructura principal:
- core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles)
- core/catalog: Catalogo de funcionalidades reutilizables
- shared/knowledge-base: Base de conocimiento compartida
- devtools/scripts: Herramientas de desarrollo
- control-plane/registries: Control de servicios y CI/CD
- orchestration/: Configuracion de orquestacion de agentes

Proyectos incluidos (11):
- gamilit (submodule -> GitHub)
- trading-platform (OrbiquanTIA)
- erp-suite con 5 verticales:
  - erp-core, construccion, vidrio-templado
  - mecanicas-diesel, retail, clinicas
- betting-analytics
- inmobiliaria-analytics
- platform_marketing_content
- pos-micro, erp-basico

Configuracion:
- .gitignore completo para Node.js/Python/Docker
- gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git)
- Sistema de puertos estandarizado (3005-3199)

Generated with NEXUS v3.4 Migration System
EPIC-010: Configuracion Git y Repositorios
2026-01-04 03:37:42 -06:00

15 KiB

SIMCO-ALINEACION

Versión: 1.0.0 Fecha: 2025-12-08 Sistema: SIMCO + CCA + CAPVED + Niveles + Economía de Tokens Propósito: Protocolo de validación de alineación entre capas (DDL ↔ Entity ↔ DTO ↔ Types)


PROBLEMA QUE RESUELVE

Cuando multiples agentes trabajan en capas diferentes de la misma HU:

  • Database-Agent crea tabla con 7 columnas
  • Backend-Agent crea Entity con 6 columnas (olvido una)
  • Frontend-Agent crea Types basados en DTO incompleto

Resultado: Bugs de integracion que se descubren tarde.

Este protocolo define QUIEN valida QUE y CUANDO.


PRINCIPIO FUNDAMENTAL

╔═══════════════════════════════════════════════════════════════════════╗
║  LA CAPA INFERIOR ES LA FUENTE DE VERDAD                              ║
║                                                                        ║
║  DDL (Database) → Entity (Backend) → DTO (Backend) → Types (Frontend) ║
║       ▲                                                                ║
║       │                                                                ║
║  SIEMPRE verificar contra la capa anterior antes de crear              ║
╚═══════════════════════════════════════════════════════════════════════╝

MATRIZ DE RESPONSABILIDADES

Alineacion Responsable Cuando Como
DDL ↔ Entity Backend-Agent ANTES de crear Entity Leer DDL, verificar campos
Entity ↔ DTO Backend-Agent ANTES de crear DTO Verificar contra Entity
DTO ↔ Types Frontend-Agent ANTES de crear Types Leer Swagger/DTO
API Contract Orquestador Gate Fase V Validacion cruzada

PROTOCOLO POR CAPA

1. Database-Agent crea tabla

ANTES de crear DDL:
  - [ ] Verificar que NO existe tabla con mismo nombre
  - [ ] Verificar convenciones de nomenclatura
  - [ ] Documentar TODOS los campos con tipos exactos

AL crear DDL:
  - [ ] Usar tipos PostgreSQL correctos
  - [ ] Documentar constraints (NOT NULL, DEFAULT, UNIQUE)
  - [ ] Documentar relaciones (FK)
  - [ ] Agregar COMMENT ON para documentar

DESPUES de crear DDL:
  - [ ] Ejecutar carga limpia ✓
  - [ ] Registrar en DATABASE_INVENTORY.yml
  - [ ] Documentar en TRAZA-TAREAS-DATABASE.md
  - [ ] Notificar campos a Backend-Agent (si delegacion)

Formato de notificacion a Backend:

tabla_creada:
  schema: auth
  nombre: notifications
  columnas:
    - nombre: id
      tipo: UUID
      constraint: PRIMARY KEY, DEFAULT gen_random_uuid()
    - nombre: user_id
      tipo: UUID
      constraint: NOT NULL, FK → auth.users(id)
    - nombre: title
      tipo: VARCHAR(255)
      constraint: NOT NULL
    - nombre: message
      tipo: TEXT
      constraint: NULL
    - nombre: read
      tipo: BOOLEAN
      constraint: DEFAULT false
    - nombre: created_at
      tipo: TIMESTAMPTZ
      constraint: DEFAULT NOW()
    - nombre: updated_at
      tipo: TIMESTAMPTZ
      constraint: NULL

2. Backend-Agent crea Entity

ANTES de crear Entity:
  - [ ] LEER el DDL de la tabla
  - [ ] Contar columnas: DDL tiene N, Entity debe tener N
  - [ ] Verificar mapeo de tipos (ver tabla abajo)
  - [ ] Verificar constraints

AL crear Entity:
  - [ ] Nombre de tabla exacto (schema.table)
  - [ ] TODOS los campos del DDL presentes
  - [ ] Decoradores correctos (@Column, @PrimaryColumn, etc.)
  - [ ] Tipos TypeScript correctos
  - [ ] Relaciones decoradas (@ManyToOne, @OneToMany)

DESPUES de crear Entity:
  - [ ] Build pasa ✓
  - [ ] Registrar en BACKEND_INVENTORY.yml

Tabla de mapeo de tipos PostgreSQL → TypeScript:

┌─────────────────────┬───────────────────┬─────────────────────────────┐
│ PostgreSQL          │ TypeScript        │ Decorador TypeORM           │
├─────────────────────┼───────────────────┼─────────────────────────────┤
│ UUID                │ string            │ @Column('uuid')             │
│ VARCHAR(n)          │ string            │ @Column({ length: n })      │
│ TEXT                │ string            │ @Column('text')             │
│ INTEGER             │ number            │ @Column('int')              │
│ BIGINT              │ string | bigint   │ @Column('bigint')           │
│ NUMERIC(p,s)        │ string | number   │ @Column('decimal')          │
│ BOOLEAN             │ boolean           │ @Column('boolean')          │
│ TIMESTAMPTZ         │ Date              │ @Column('timestamptz')      │
│ DATE                │ Date | string     │ @Column('date')             │
│ JSONB               │ Record<string,any>│ @Column('jsonb')            │
│ ARRAY               │ T[]               │ @Column('simple-array')     │
│ ENUM                │ enum              │ @Column({ type: 'enum' })   │
└─────────────────────┴───────────────────┴─────────────────────────────┘

Ejemplo de validacion:

// DDL tiene:
// id UUID PRIMARY KEY DEFAULT gen_random_uuid()
// user_id UUID NOT NULL REFERENCES auth.users(id)
// title VARCHAR(255) NOT NULL
// message TEXT
// read BOOLEAN DEFAULT false
// created_at TIMESTAMPTZ DEFAULT NOW()
// updated_at TIMESTAMPTZ

// Entity DEBE tener:
@Entity('notifications', { schema: 'auth' })
export class NotificationEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;                           // ✓ UUID → string

  @Column('uuid')
  user_id: string;                      // ✓ UUID → string

  @Column({ length: 255 })
  title: string;                        // ✓ VARCHAR(255) → string

  @Column('text', { nullable: true })
  message: string;                      // ✓ TEXT nullable

  @Column('boolean', { default: false })
  read: boolean;                        // ✓ BOOLEAN

  @CreateDateColumn()
  created_at: Date;                     // ✓ TIMESTAMPTZ

  @Column('timestamptz', { nullable: true })
  updated_at: Date;                     // ✓ TIMESTAMPTZ nullable

  // Relacion
  @ManyToOne(() => UserEntity)
  @JoinColumn({ name: 'user_id' })
  user: UserEntity;
}
// Total: 7 columnas ✓ (igual que DDL)

3. Backend-Agent crea DTO

ANTES de crear DTO:
  - [ ] Entity existe y esta validada
  - [ ] Identificar campos para cada DTO

AL crear DTOs:
  CreateDto:
    - [ ] Excluir: id, created_at, updated_at (autogenerados)
    - [ ] Incluir: campos requeridos para creacion
    - [ ] Decoradores de validacion (@IsString, @IsUUID, etc.)

  UpdateDto:
    - [ ] Todos los campos opcionales (PartialType)
    - [ ] Excluir: id (no se actualiza)
    - [ ] Excluir: campos no-actualizables

  ResponseDto:
    - [ ] Todos los campos que se exponen
    - [ ] Incluir relaciones si se devuelven

DESPUES de crear DTOs:
  - [ ] Swagger los documenta correctamente

Ejemplo:

// CreateNotificationDto
export class CreateNotificationDto {
  @IsUUID()
  user_id: string;              // Requerido

  @IsString()
  @MaxLength(255)
  title: string;                // Requerido

  @IsString()
  @IsOptional()
  message?: string;             // Opcional (NULL en DDL)
}
// Excluidos: id, read, created_at, updated_at (autogenerados/default)

// UpdateNotificationDto
export class UpdateNotificationDto extends PartialType(CreateNotificationDto) {
  @IsBoolean()
  @IsOptional()
  read?: boolean;               // Se puede actualizar
}

// NotificationResponseDto
export class NotificationResponseDto {
  id: string;
  user_id: string;
  title: string;
  message: string | null;
  read: boolean;
  created_at: Date;
  updated_at: Date | null;
}

4. Frontend-Agent crea Types

ANTES de crear Types:
  - [ ] Leer Swagger o DTOs del backend
  - [ ] Verificar nombres de campos exactos
  - [ ] Verificar tipos

AL crear Types:
  - [ ] Nombres en camelCase (si backend usa snake_case, transformar)
  - [ ] Tipos TypeScript correctos
  - [ ] Optional (?) donde backend tiene null

DESPUES de crear Types:
  - [ ] Build pasa ✓
  - [ ] Tipos son importables desde componentes

Ejemplo:

// Notification.types.ts

// Basado en NotificationResponseDto
export interface Notification {
  id: string;
  userId: string;               // Transformado de user_id
  title: string;
  message: string | null;
  read: boolean;
  createdAt: Date;              // Transformado de created_at
  updatedAt: Date | null;
}

// Basado en CreateNotificationDto
export interface CreateNotificationInput {
  userId: string;
  title: string;
  message?: string;
}

// Basado en UpdateNotificationDto
export interface UpdateNotificationInput {
  userId?: string;
  title?: string;
  message?: string;
  read?: boolean;
}

CHECKLIST DE VALIDACION CRUZADA

Pre-Integracion (Antes de marcar HU como Done)

## Validacion DDL ↔ Entity

- [ ] Todas las columnas en DDL existen en Entity
- [ ] Numero de columnas coincide
- [ ] Tipos PostgreSQL mapeados correctamente a TypeScript
- [ ] Constraints (NOT NULL) reflejados como required
- [ ] DEFAULT reflejados en decoradores
- [ ] FK tienen relacion definida

## Validacion Entity ↔ DTO

- [ ] CreateDto tiene campos necesarios para crear
- [ ] CreateDto NO tiene campos autogenerados
- [ ] UpdateDto tiene campos actualizables
- [ ] ResponseDto expone todos los campos publicos
- [ ] Validadores (@IsString, @IsUUID) presentes

## Validacion DTO ↔ Types (Frontend)

- [ ] Types frontend matchean DTOs
- [ ] Transformacion de nomenclatura correcta (snake_case → camelCase)
- [ ] Optional fields coinciden
- [ ] Enums sincronizados entre backend y frontend

## Validacion API

- [ ] Swagger documenta todos los endpoints
- [ ] Request bodies matchean DTOs
- [ ] Response bodies matchean DTOs
- [ ] Codigos de status documentados

PROCESO DE VALIDACION

Quien ejecuta esta validacion

Escenario A: Agente individual crea DDL + Entity + DTO
  Responsable: El mismo agente
  Cuando: Despues de crear cada capa

Escenario B: Diferentes agentes por capa (delegacion)
  Responsable: Orquestador en Gate Fase V
  Cuando: Antes de marcar HU como Done
  Como: Verificar que:
    - Database-Agent documento campos correctamente
    - Backend-Agent creo Entity alineada
    - Frontend-Agent creo Types alineados

Escenario C: Validacion post-hoc (revisar existente)
  Responsable: Architecture-Analyst (cuando exista)
  Cuando: Auditorias periodicas

Herramienta de validacion (futuro)

# Script conceptual (a implementar)
./validate-alignment.sh --table auth.notifications

Output:
  DDL columns: 7
  Entity columns: 7 ✓
  DTO fields: OK ✓
  Frontend types: OK ✓

  Mismatches found: 0

ERRORES COMUNES Y SOLUCION

Error 1: Entity con menos columnas que DDL

Problema:
  DDL tiene: id, user_id, title, message, read, created_at, updated_at (7)
  Entity tiene: id, userId, title, message, read, createdAt (6)
  Falta: updated_at

Causa: Olvido al transcribir

Solucion:
  1. Backend-Agent DEBE leer DDL antes de crear Entity
  2. Contar columnas explicitamente
  3. Usar checklist de validacion

Error 2: Tipos incompatibles

Problema:
  DDL: NUMERIC(10,2)
  Entity: number
  Resultado: Perdida de precision en decimales grandes

Solucion:
  - NUMERIC → usar string o Decimal.js
  - Documentar en Entity con comentario

Error 3: Nombres transformados incorrectamente

Problema:
  DDL: user_id (snake_case)
  Entity: userId (camelCase)
  Frontend: userid (lowercase)

Causa: Transformacion inconsistente

Solucion:
  - Definir convencion por proyecto
  - Backend usa snake_case o camelCase (consistente)
  - Frontend transforma de forma predecible

Error 4: Nullable no propagado

Problema:
  DDL: message TEXT (nullable por defecto)
  Entity: message: string (required)
  Resultado: Error al insertar con message = null

Solucion:
  - DDL explicito: TEXT NULL o TEXT NOT NULL
  - Entity: message: string | null
  - DTO: message?: string

QUICK REFERENCE

┌─────────────────────────────────────────────────────────────────────┐
│                 VALIDACION DE ALINEACION                             │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ANTES de crear Entity:                                             │
│    1. Leer DDL de la tabla                                          │
│    2. Contar columnas (deben coincidir)                             │
│    3. Mapear tipos (ver tabla de mapeo)                             │
│    4. Verificar constraints (NOT NULL, DEFAULT)                     │
│                                                                      │
│  ANTES de crear DTO:                                                │
│    1. Verificar Entity existe                                        │
│    2. CreateDto: excluir autogenerados (id, timestamps)             │
│    3. UpdateDto: hacer campos opcionales                            │
│    4. Agregar validadores                                           │
│                                                                      │
│  ANTES de crear Types (Frontend):                                   │
│    1. Leer Swagger o DTOs                                           │
│    2. Transformar nomenclatura consistentemente                     │
│    3. Verificar optional fields                                     │
│                                                                      │
│  Gate de validacion:                                                │
│    - DDL columns == Entity columns                                  │
│    - Tipos mapeados correctamente                                   │
│    - Nullable propagado                                             │
│    - Build pasa en todas las capas                                  │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘

REFERENCIAS

  • SIMCO-DDL.md - Directivas de base de datos
  • SIMCO-BACKEND.md - Directivas de backend
  • SIMCO-FRONTEND.md - Directivas de frontend
  • SIMCO-VALIDAR.md - Validacion general
  • CHECKLIST-CODE-REVIEW-API.md - Checklist de revision

Sistema SIMCO v2.2.0 Creado: 2025-12-08