Skip to content

Commit 016bedc

Browse files
committed
feat(auth-graph): enforce semantic client contract
1 parent b4999d1 commit 016bedc

58 files changed

Lines changed: 2963 additions & 184 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
# ADR-0081: Contrato Semantico del Auth Graph para Clientes — Code-First, ID-Optional
2+
3+
**Estado:** Aceptado
4+
**Fecha:** 2026-06-04
5+
**Responsable de Decisión:** Arquitectura
6+
**Relacionados:**
7+
- [ADR-0071: Motor de Auth Graph](./0071-auth-graph-engine.es.md)
8+
- [ADR-0074: Politica de Versionado del Schema del Auth Graph](./0074-auth-graph-schema-versioning.es.md)
9+
- [ADR-0080: Previsualizacion del Auth Graph — Pipeline Interno vs Externo](./0080-auth-graph-preview-internal-pipeline.es.md)
10+
11+
---
12+
13+
## Contexto
14+
15+
El objetivo de largo plazo de UMS es actuar como un **proveedor claro de grafo de autorizacion** para los sistemas cliente. Los clientes deben poder activar, desactivar, ejecutar o denegar opciones usando un contrato estable, legible por negocio y semantico.
16+
17+
El grafo actual ya contiene datos ricos de autorizacion, pero tambien expone identificadores tecnicos internos (`Guid`) en varias secciones. Esos identificadores son utiles dentro del backend, para correlacion y para flujos de diagnostico, pero no son ideales como contrato principal para sistemas cliente descendentes.
18+
19+
La direccion del producto es volver el grafo expuesto al cliente:
20+
21+
1. Semantico
22+
2. Estable a traves de la evolucion del schema
23+
3. Independiente de identificadores internos de base de datos
24+
4. Seguro para integraciones de larga duracion
25+
5. Facil de consumir por codigo de producto, guards de UI y politicas del lado del servicio
26+
27+
---
28+
29+
## Decision
30+
31+
UMS tratara el grafo de autorizacion para clientes como el contrato semantico actual y mantendra los IDs fuera de la superficie cliente por defecto.
32+
33+
### 1. El contrato cliente por defecto es code-first
34+
35+
El grafo expuesto a sistemas cliente debe apoyarse principalmente en:
36+
37+
- `code`
38+
- `value`
39+
- `description`
40+
- `effect`
41+
- `source`
42+
- `scope`
43+
- `validUntil`
44+
- `schemaVersion`
45+
46+
Los GUID tecnicos permanecen como detalles internos de implementacion salvo que un escenario de diagnostico o migracion los requiera.
47+
48+
### 2. Los identificadores internos no forman parte de la superficie normal de integracion
49+
50+
Los siguientes identificadores no deberian ser requeridos por clientes estandar:
51+
52+
- `user.id`
53+
- `tenant.id`
54+
- `systemSuite.id`
55+
- `role.id`
56+
- `profile.id`
57+
- `branch.id`
58+
- GUIDs de permisos y acciones
59+
60+
Estos valores pueden seguir existiendo en modelos internos, registros de auditoria y vistas administrativas internas, pero no deberian ser necesarios para decisiones normales de autorizacion.
61+
62+
### 3. El modo de diagnostico puede incluir IDs de forma explicita
63+
64+
Un contrato diagnostico opcional puede exponer GUIDs solo cuando:
65+
66+
- el llamador es un administrador interno o un operador de soporte autorizado
67+
- la solicitud se hace mediante un endpoint interno de previsualizacion o diagnostico
68+
- el llamador solicita explicitamente `includeIds=true` o una bandera equivalente de soporte
69+
70+
Este modo existe para troubleshooting, correlacion y soporte de migracion, no para consumo normal de clientes.
71+
72+
### 4. El significado de negocio se expresa mediante codigos estables
73+
74+
Los sistemas cliente deben usar codigos de negocio estables para interpretar el grafo:
75+
76+
- codigo de tenant
77+
- codigo de system suite
78+
- codigo de rol
79+
- codigo de branch
80+
- codigo de recurso
81+
- codigo de accion
82+
- efecto de permiso
83+
- string de scope
84+
85+
Esto mantiene la logica del cliente independiente de identificadores generados por la base de datos.
86+
87+
### 5. El refresh sigue siendo por sesion, no por un token de grafo
88+
89+
UMS no introduce un contrato separado de refresh token para el grafo semantico. El grafo sigue siendo valido hasta `validUntil`. Cuando expira, el cliente se autentica de nuevo y recibe un snapshot fresco del grafo.
90+
91+
Esto evita estados parciales donde un token se renueva pero el modelo de autorizacion queda desfasado o inconsistente.
92+
93+
### 6. El grafo semantico es la fuente de verdad del cliente para decisiones de acceso
94+
95+
Para los sistemas cliente, el grafo debe ser la carga util autorizada durante su ventana de validez. El cliente no deberia inferir acceso desde GUIDs de backend ni reconsultar UMS para cada accion.
96+
97+
---
98+
99+
## Forma del Payload
100+
101+
```json
102+
{
103+
"schemaVersion": "1.0.0",
104+
"graphId": "optional-support-correlation-id",
105+
"context": {
106+
"tenant": {
107+
"code": "TECHNO",
108+
"value": "Techno Logistics",
109+
"status": "ACTIVE",
110+
"isManagementOwner": false
111+
},
112+
"systemSuite": {
113+
"code": "WMS_SUITE",
114+
"value": "Warehouse Management Suite",
115+
"status": "PUBLISHED"
116+
},
117+
"role": {
118+
"code": "WAREHOUSE_SUPERVISOR",
119+
"value": "Warehouse Supervisor",
120+
"hierarchyLevel": 3
121+
},
122+
"profile": {
123+
"scope": "BranchScoped",
124+
"isActive": true
125+
},
126+
"branch": {
127+
"code": "LIM-01",
128+
"value": "Lima Main Branch"
129+
}
130+
},
131+
"permissions": [
132+
{
133+
"resourceCode": "INVENTORY",
134+
"actionCode": "VIEW",
135+
"effect": "Allow",
136+
"source": "Template"
137+
}
138+
],
139+
"scopes": [
140+
"INVENTORY.VIEW"
141+
],
142+
"featureFlags": [
143+
{
144+
"flagCode": "NEW_MENU_EXPERIMENT",
145+
"isEnabled": true
146+
}
147+
],
148+
"effectiveConfig": {
149+
"sessionTimeoutMinutes": 60,
150+
"accessTokenDurationMs": 3600000
151+
},
152+
"generatedAt": "2026-06-04T12:00:00Z",
153+
"validUntil": "2026-06-04T13:00:00Z"
154+
}
155+
```
156+
157+
La estructura exacta puede evolucionar, pero el contrato debe permanecer semantico y estable para los sistemas cliente.
158+
159+
---
160+
161+
## Estrategia de Implementacion
162+
163+
### Baseline actual
164+
165+
- Usar el contrato semantico del cliente como payload por defecto para todas las integraciones nuevas.
166+
- Mantener un modo diagnostico disponible para soporte y herramientas de previsualizacion.
167+
- Reservar los GUID internos solo para modelos backend y flujos de soporte.
168+
169+
---
170+
171+
## Consecuencias
172+
173+
### Positivas
174+
175+
- Las integraciones cliente seran mas faciles de entender y mantener
176+
- Producto y negocio podran razonar sobre accesos usando lenguaje estable
177+
- Los identificadores de base de datos ya no se filtraran como dependencias de integracion
178+
- La evolucion del schema sera mas segura porque los clientes dependeran de campos semanticos y no de claves sustitutas
179+
180+
### Compromisos
181+
182+
- Las herramientas de soporte pueden necesitar soporte explicito para modo diagnostico
183+
- El backend debe seguir conservando identificadores internos aunque el cliente no dependa de ellos
184+
185+
---
186+
187+
## Notas de Implementacion
188+
189+
| Area | Guia |
190+
|---|---|
191+
| Graph builder | Producir campos semanticos como proyeccion cliente por defecto |
192+
| Modelo interno | Mantener GUIDs en agregados backend y registros de auditoria |
193+
| Endpoints cliente | Preferir respuestas basadas en code/value/description |
194+
| Modo diagnostico | Exponer IDs solo a flujos internos autenticados de soporte |
195+
| SDKs | Consumir campos semanticos como superficie canonica de decision |
196+
| Documentacion | Mantener sincronizados los documentos de contrato en ingles y espanol |
197+
198+
---
199+
200+
**[Registro ADR](./index.md)**

0 commit comments

Comments
 (0)