> ## Documentation Index
> Fetch the complete documentation index at: https://internal.softcrum.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Modelo de objetos reservado

> Cuando esto se entregue, los deals y pipelines se podrán agregar después sin migración de datos — y nada en v1 los usa.

> Traducción. Autoritativo: [`fs-crm-0005-object-model.md`](/modules/crm/features/fs-crm-0005-object-model).

## Contexto

Esta es una feature cuyo valor entero es que no se construye.

Los no-objetivos del CRM dicen sin pipeline, sin deals, sin forecasting en v1: construirlos significa
competir con herramientas que nuestros clientes ya pagan, con una versión peor. Pero "nunca" tampoco es
la respuesta — un CRM guiado por fidelización con dos años de historia de comportamiento es un buen
lugar para que los deals terminen viviendo.

El costo de equivocarse es asimétrico en cada dirección. Construir deals ahora cuesta meses y compite
mal. No reservar el modelo cuesta una migración contra datos de producción después, que es exactamente
el tipo de migración del que hablaba el razonamiento original de DEC-H2 — y que ADR-021 nos recordó que
es la cara.

Entonces: schema, reglas de dependency-cruiser y tipos generados existen. Sin endpoint, sin consola,
sin documentación para un tenant. Es una costura, y las costuras no cuestan nada hasta que se usan.

## Alcance *(normativo)*

* `crm.object_definitions`: un tipo de objeto definido por el tenant con campos tipados.
* `crm.object_records`: instancias, relacionadas con contactos.
* Tipos TypeScript generados para que las tablas sean usables el día que se necesiten.
* Reglas de dependencia que impiden su uso accidental.

## Fuera de alcance *(normativo)*

* **Cualquier endpoint.** Explícitamente ninguno. Agregar uno es un feature spec nuevo, y ese spec es
  donde los deals se diseñan bien.
* Superficie de consola. Un tenant no puede ver que estas tablas existen.
* Pipelines, etapas, probabilidades, forecasting — todo eso es la conversación de F2 para la que esto
  reserva espacio.
* Migrar datos existentes hacia ellas. No hay ninguno.

## Comportamiento *(normativo)*

1. Las tablas existen con RLS, alcance por tenant y las columnas estándar de la plataforma, **y ningún
   camino de código escribe en ellas en F1**.
2. Una definición de objeto es por tenant con campos tipados, reusando el patrón de
   `core.attribute_definitions` en vez de inventar un segundo.
3. Un registro de objeto se relaciona con cero o más contactos, para que un deal futuro pueda involucrar
   a varias personas — la forma que duele agregar después.
4. CI **falla ante cualquier import** de estas tablas desde el código de aplicación. Una costura
   reservada que se usa por accidente no está reservada; es una feature indocumentada.
5. Las tablas aparecen en el diagrama ER marcadas como **reservadas**, para que nadie las redescubra y
   las dé por muertas.
6. Cuando lleguen los deals, llegarán como su propio feature spec que cambia el estado de este a
   superseded — no empezando a usar estas tablas en silencio.

## Datos *(normativo)*

| Tabla                    | Invariantes clave                                                                                                                                         |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `crm.object_definitions` | `tenant_id`; `code` único por tenant; `label`; `fields` esquema JSONB tipado; `is_active`; **sin escrituras en F1**                                       |
| `crm.object_records`     | `tenant_id`, FK definición; `values` JSONB validado contra la definición; `related_contact_ids`; columnas estándar de auditoría; **sin escrituras en F1** |

## API *(normativo)*

**Ninguna, deliberadamente.** Agregar un endpoint acá está fuera del alcance de este spec y exige el suyo.

## Eventos *(normativo)*

Ninguno.

## Criterios de aceptación *(normativo)*

1. Las migraciones crean ambas tablas con RLS y alcance por tenant.
2. Los tipos TypeScript generados existen y compilan.
3. CI falla si el código de aplicación importa estas tablas — probado con un fixture que falla.
4. El diagrama ER las muestra marcadas como reservadas.
5. Ningún endpoint, ruta de consola ni documentación pública las referencia.
6. **Negativo:** ningún camino de código escribe en ninguna de las dos tablas en F1.

## Ejecución

Parte de la migración fundacional del CRM. Solo schema, más la regla de lint que lo mantiene sin uso.

## Preguntas abiertas

Ninguna. Ese es el punto de la feature.

## Changelog

| Versión | Fecha      | Cambio           | Por qué | Autor                  |
| ------- | ---------- | ---------------- | ------- | ---------------------- |
| 0.1.0   | 2026-08-17 | Borrador inicial | —       | daniel + claude-opus-5 |

## Registro de entrega

*Aún no implementado.*
