# Tabla: types

Almacena tipos algebraicos. Los tipos son el contrato entre funciones — permiten al agente razonar sobre composabilidad sin leer implementaciones.

---

## Tipos algebraicos

**Tipo producto** — todos los campos siempre presentes. Modela datos y entidades (struct). Número de valores posibles = N₁ × N₂ × ... × Nₙ

**Tipo suma** — un caso activo a la vez. Modela estados, resultados y alternativas (interface/union). Número de valores posibles = N₁ + N₂ + ... + Nₙ

---

## Campos

| Campo | Tipo | Descripción | Notas / Restricciones |
|---|---|---|---|
| `id` | string | Identificador único generado. | Formato: `{name}_{lang}_{domain}` ej: `ohlcv_go_finance` |
| `name` | string | Nombre del tipo. | Obligatorio. PascalCase recomendado. |
| `lang` | enum | Lenguaje de implementación. | `go` \| `python` \| `sql` \| ... (mismo enum controlado que `functions`) |
| `domain` | string | Namespace o área de dominio. | Ej: `finance`, `dsp`, `core`. Alineado con el `domain` de las funciones que lo usan. |
| `version` | string | Versión semántica del tipo. | Semver: `1.0.0`. Cambios de campo rompen contratos en `functions.uses_types`. |
| `algebraic` | enum | Categoría algebraica del tipo. | `product`: todos los campos siempre presentes (struct). `sum`: alternativas excluyentes (union/interface). |
| `definition` | text | Definición completa del tipo. | Struct, interface, union, type alias. Código real. |
| `description` | text | Qué concepto del dominio modela, por qué existe y cuándo usarlo. | Obligatorio. |
| `tags` | []string | Etiquetas libres para búsqueda. | Dominio, patrón, utilidad. |
| `uses_types` | []string | IDs de otros tipos del registry que este tipo compone. | Solo IDs existentes en la tabla `types`. Sin referencias huérfanas. |
| `file_path` | string | Ruta relativa al archivo de implementación. | Relativa a la raíz del registry. |
| `created_at` | datetime | Fecha de creación de la entrada. | ISO 8601. Generado automáticamente. |
| `updated_at` | datetime | Fecha de última modificación. | ISO 8601. Actualizado automáticamente al indexar. |

---

## Reglas de integridad

| Condición | Regla |
|---|---|
| `algebraic: product` | Todos los campos siempre presentes. Modela datos. Número de valores posibles = producto de sus partes. |
| `algebraic: sum` | Un caso activo a la vez. Modela estados o resultados. Número de valores posibles = suma de sus partes. |
| `uses_types[]` | Todos los IDs deben existir en la tabla `types`. Sin auto-referencias ni referencias huérfanas. |
| `lang` | Debe pertenecer al enum controlado de lenguajes registrados. |
| `file_path` | Relativa a raíz del registry. Nunca absoluta. |
| `id` | Único global. Formato: `{name}_{lang}_{domain}`. Colisiones rechazadas. |

---

## Ejemplos

### Tipo producto — OHLCV

```go
type OHLCV struct {
    Open   float64
    High   float64
    Low    float64
    Close  float64
    Volume float64
}
```

Todos los campos siempre presentes. Modela una vela de mercado.

### Tipo suma — OrderResult

```go
type OrderResult interface{ orderResult() }

type Filled   struct { Price float64; Qty float64 }
type Rejected struct { Reason string }
type Pending  struct { ID string }

func (Filled)   orderResult() {}
func (Rejected) orderResult() {}
func (Pending)  orderResult() {}
```

Un caso activo a la vez. Modela todos los estados posibles de una orden.
