Traducción. Autoritativo: fs-crm-0005-object-model.md.
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)
- 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.
- Una definición de objeto es por tenant con campos tipados, reusando el patrón de
core.attribute_definitionsen vez de inventar un segundo. - 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.
- 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.
- Las tablas aparecen en el diagrama ER marcadas como reservadas, para que nadie las redescubra y las dé por muertas.
- 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)
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)
- Las migraciones crean ambas tablas con RLS y alcance por tenant.
- Los tipos TypeScript generados existen y compilan.
- CI falla si el código de aplicación importa estas tablas — probado con un fixture que falla.
- El diagrama ER las muestra marcadas como reservadas.
- Ningún endpoint, ruta de consola ni documentación pública las referencia.
- Negativo: ningún camino de código escribe en ninguna de las dos tablas en F1.