Traducción. Autoritativo: fs-core-0001-platform-catalogs.md.
Contexto
Tres conjuntos cerrados son genuinamente transversales: monedas, tipos de documento y canales de notificación. Todo lo demás pertenece a su propio schema (DEC-B3). Esta es la primera entrega de toda la suite por una razón mecánica. Las filasis_system de un
catálogo paramétrico son la única fuente que genera los union types de Zod y TypeScript en
packages/core; nada que referencie un currency_code o un channel_code puede compilar antes de
que existan.
DEC-A2 hace de national_id_types el más grande de los tres y el único con lógica real: todos los
países de Sudamérica, cada uno con sus formatos, normalizadores y algoritmos de dígito verificador,
aplicables a personas y a empresas.
Alcance (normativo)
core.countries: ISO 3166-1 alpha-2, el ancla de los tipos de documento.core.currencies: ISO 4217 conminor_unit— el exponente que hace correcta la aritmética en unidades menores.core.national_id_types: por país y por tipo de contacto, con regex de formato, id de normalizador e id de algoritmo de DV.core.notification_channels:email,in_app,webhook,push,sms,whatsapp,live_activity— la fila existe desde el día 1 aunque el adaptador llegue después (DEC-E1).- El pipeline semilla→union: las filas
is_systemproducen los esquemas Zod y los tipos TS. - La caché de catálogos: memoria de proceso más Redis, para que los caminos calientes nunca unan.
Fuera de alcance (normativo)
- Validar un documento. Esto entrega el catálogo; aplicar su regex y su dígito verificador a un valor es FS-CORE-0002.
- Enviar por un canal. La fila es una declaración de que el canal existe.
- Tipos de cambio. F1 es mono-moneda por tenant (DEC-B6).
Comportamiento (normativo)
- Todo catálogo sigue el estándar paramétrico exactamente:
codeTEXT PK,label,is_system,is_active,sort_order,metadataJSONB. Sin excepciones y sin forma extra. - Estos tres no son extensibles por tenant. Un tenant no puede inventar una moneda ni un canal: ambos gobiernan lógica del sistema (DEC-B4).
- Las filas
is_systemse siembran en migraciones y son inmutables por API. Una semilla cambia por migración, nunca por un endpoint. - Las semillas generan los unions TS/Zod en build. Una divergencia entre los códigos de la base y el union generado falla CI (TS-005) — ese chequeo es lo que mantiene honesto al catálogo.
currencies.minor_unites obligatorio. CLP es 0, USD es 2, y la aritmética de dinero está mal sin él — vale decirlo porque “montos en centavos” asume silenciosamente 2.- Un código nunca se borra ni se reutiliza. Retirarlo es
is_active = false, porque filas históricas todavía lo referencian. - Los caminos calientes leen de caché. PROHIBIDO: unir un catálogo dentro de un request de clase Runtime.
- Las filas de
national_id_typesdeclaran a quécontact_kindaplican — un RUT aplica a persona y a empresa en Chile, un CPF solo a persona en Brasil.
Datos (normativo)
Los
national_id_types sembrados cubren todo país sudamericano según DEC-A2: CL (RUT) · AR (DNI,
CUIT, CUIL) · BR (CPF, CNPJ) · UY (CI, RUT) · PY (CI, RUC) · BO (CI, NIT) · PE (DNI, RUC, CE) ·
EC (CI, RUC) · CO (CC, CE, NIT) · VE (CI, RIF) · GY y SR genéricos — más PASSPORT y FOREIGN_ID.
Ninguna tabla aquí se particiona; todas son pequeñas, regulares y cacheadas.
API (normativo)
Solo lectura. No existe endpoint de escritura para un catálogo de sistema, y esa ausencia es la
feature.
Eventos (normativo)
Ninguno. Un catálogo es dato de referencia; un cambio de semilla es una migración.Criterios de aceptación (normativo)
- Las migraciones siembran cada catálogo de forma idempotente: correrlas dos veces no produce duplicados ni errores.
- El union TS generado para
notification_channelscontiene exactamente los códigosis_systemsembrados, ypackages/corecompila contra él. - La divergencia de semillas se detecta: quitar un código de la semilla dejándolo en la base falla el chequeo de CI con un mensaje que lo nombra.
minor_unites correcto para una moneda con 0 (CLP) y otra con 2 (USD).- Todo
national_id_typesembrado con algoritmo de DV lo tiene implementado — una fila apuntando a una implementación inexistente falla CI. - Las lecturas de catálogo se sirven de caché: un request Runtime hace cero uniones de catálogo.
- Negativo: ninguna ruta de API modifica una fila
is_system.