> ## 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.

# Identity — modelo de datos

> Las 19 tablas del schema identity, cada una con su forma, su objetivo y el feature spec que la crea. Sin excepciones: los catálogos y las intermedias también.

Schema `identity`. **No tiene ninguna FK entre schemas**: es una fundación que nadie lee directamente
([ADR-022](/adr/adr-022-identity-bounded-context)). Los demás módulos reciben un contexto de
autorización ya resuelto desde la capa de API.

La columna **Forma** es la de [ADR-024](/adr/adr-024-table-naming-and-base-structure): **A** dominio
con alcance de tenant · **B** append-only · **C** catálogo paramétrico. La definición completa de
cada tabla vive en [Schemas](/schemas/overview).

## Organización y personas

| Tabla          | Forma | De qué es dueña                                                                                                                                                                   | Spec        |
| -------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `organization` | A     | La empresa cliente dentro de un tenant. Una agencia que administra varias marcas tiene varias organizaciones                                                                      | FS-IDN-0001 |
| `user`         | A     | La persona del equipo del cliente. **No es un contacto**: son poblaciones distintas con posición regulatoria distinta — acá Softcrum es responsable, con el contacto es encargado | FS-IDN-0001 |
| `membership`   | A     | La pertenencia de un usuario a una organización. Tabla intermedia N-M, y tiene entidad propia porque lleva estado: desde cuándo, con qué rol por defecto                          | FS-IDN-0001 |
| `invitation`   | A     | La invitación pendiente, con su token y su vencimiento. Separada de `membership` porque una invitación puede no aceptarse nunca                                                   | FS-IDN-0001 |

## Permisos y roles

| Tabla             | Forma | De qué es dueña                                                                                                                                         | Spec        |
| ----------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `permission`      | C     | El registro **global** de permisos con la forma `{módulo}.{recurso}.{acción}`. Cada módulo lo consume como constante de build, nunca como FK de runtime | FS-IDN-0002 |
| `role`            | A     | El rol que agrupa permisos. Los roles cruzan módulos: uno que no puede, no es un rol                                                                    | FS-IDN-0002 |
| `role_permission` | A     | Qué permisos tiene un rol. Tabla intermedia N-M pura                                                                                                    | FS-IDN-0002 |
| `role_assignment` | A     | Qué rol tiene quién, y en qué organización. Aplica igual a personas y a máquinas: una API key lleva roles como los lleva un usuario (DEC-D5)            | FS-IDN-0002 |

## Autenticación

| Tabla                | Forma | De qué es dueña                                                                                                                       | Spec        |
| -------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `auth_account`       | A     | El método de autenticación de un usuario: contraseña, proveedor social, SSO. Separada de `user` porque una persona puede tener varios | FS-IDN-0003 |
| `verification_token` | A     | Tokens de un solo uso: verificar correo, restablecer contraseña. Vencen, y el cron los limpia                                         | FS-IDN-0003 |
| `session`            | A     | La sesión activa y su dispositivo. Revocable individualmente, que es lo que hace útil la pantalla de dispositivos                     | FS-IDN-0004 |
| `mfa_factor`         | A     | El segundo factor registrado: TOTP, y más adelante otros                                                                              | FS-IDN-0005 |
| `mfa_recovery_code`  | A     | Los códigos de recuperación, guardados con hash. Se consumen de a uno                                                                 | FS-IDN-0005 |

## Credenciales de máquina

| Tabla                 | Forma | De qué es dueña                                                                                                 | Spec        |
| --------------------- | ----- | --------------------------------------------------------------------------------------------------------------- | ----------- |
| `api_key`             | A     | La credencial de un sistema externo. Guarda solo el hash: el secreto se muestra una vez y no se puede recuperar | FS-IDN-0006 |
| `oauth_client`        | A     | El cliente OAuth2 registrado por un tenant para integrar contra nosotros                                        | FS-IDN-0007 |
| `oauth_authorization` | A     | El consentimiento que un usuario le dio a un cliente OAuth2, y sobre qué alcances                               | FS-IDN-0007 |
| `oauth_code`          | A     | El código de autorización de vida corta del flujo. Un solo uso, vencimiento en minutos                          | FS-IDN-0007 |
| `sso_connection`      | A     | La conexión SSO empresarial de una organización                                                                 | FS-IDN-0008 |

## Soporte

| Tabla           | Forma | De qué es dueña                                                                                                                                                                                | Spec        |
| --------------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| `impersonation` | **B** | Cada sesión en que alguien de Softcrum entró como un usuario del cliente: quién, sobre quién, por qué y hasta cuándo. Append-only porque es evidencia, y acotada en el tiempo por construcción | FS-IDN-0009 |

## Lo que este schema **no** tiene

* **Ninguna sesión de member.** El realm de member vive en `core` (FS-CORE-0009): un member es un
  contacto autenticado y el contacto pertenece a `core`. Los dos realms **nunca se superponen**, y
  un token de uno no puede satisfacer al otro por construcción, no por verificación.
* **Ningún permiso efectivo calculado.** `identity` dice qué roles tiene alguien; qué puede hacer con
  ellos lo decide cada módulo contra el registro de permisos.
* **Ninguna FK hacia otro schema.** Ni siquiera hacia `core`.
