Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-USR-02: qué piezas participan, en qué orden hablan, qué APIs hay que construir con su request y su response, y qué le entrega a la épica siguiente.
Para quién. Los equipos que van a construir la épica, QA y arquitectura.
Estado. [Propuesta] del TL del Nuevo PIM, 18-oct-2026, construida sobre ADR-12. La spec de cada épica dice el qué; estas páginas, el cómo.
Fuente. docs/arquitectura/por-epica/epicas/FT-USR-02.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-USR-02-matriz-de-roles-y-permisos.md.
En 30 segundos
Hoy cada sistema decide los permisos a su manera: el portal los tiene escritos en su código y casi ningún servicio los revisa. Esta épica carga como configuración la matriz de roles firmada por Seguridad y Gobierno de Producto. MS-13 guarda los roles, sus pantallas y quién tiene cada uno, con su negocio y sus secciones; cada módulo guarda qué puede hacer cada rol sobre sus datos y decide él mismo; el BFF arma el menú, y cada intento negado queda en la bitácora.
- Módulo dueño: MS-13 Identidad y acceso. También participan: MS-01 Catálogo, MS-02 Producto, MS-14 Avisos y ayuda, MS-05 Auditoría.
- Etapa T · Transversal. Recibe «PE-C · Catálogo vigente» y entrega «PE-T · Usuario con permisos y bitácora».
- APIs: construye 6 y usa 15 que construyen otras épicas.
- Eventos: publica 2 y consume 2.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| FT-USR-01 · Identidad y autenticación de usuarios internos… | Los usuarios del directorio con su tipo, negocios, proveedor o seller, áreas y secciones. |
| PE-C · Catálogo vigente | Las secciones con sus grupos de artículo vigentes en MS-01, que las membresías citan como alcance. |
| FT-PLT-04 · Grupos de atributos y mínimos de información por sistema… | Los grupos de atributos de tipo permiso (qué atributos van juntos), que la hoja del motor cita para decir qué rol ve o edita cada grupo. |
Entrega
| A | Qué |
|---|---|
| PE-T · Usuario con permisos y bitácora | Cada módulo sabe qué roles tiene quien llama, con su negocio, sección y vigencia, y decide con su propia tabla; lo negado responde 403 y queda en MS-05. |
| FT-USR-01 · Identidad y autenticación de usuarios internos… | El catálogo de roles y áreas, con las pantallas de cada uno, que la sesión devuelve. |
| FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… | Los roles y áreas que cita la tabla ROLE_MATRIX del motor, y quién integra cada uno para llenar las colas. |
| FT-PLT-01 · Fundamentos de gobierno de plantillas | Los roles que cita la hoja de permisos del catálogo: quién consulta, propone, aprueba o captura un ID. |
| FT-CAT-01 · Administración del árbol de categorías web | Los roles de Category con los que MS-01 decide quién crea, mueve, desliga y aprueba categorías. |
| FT-PRD-05 · Edición y aprobación por campo según el dueño del dato | Los roles y áreas con los que el motor expresa el dueño de cada grupo de campos. |
| FT-USR-03 · Control de acceso por API para terceros | Los roles de administración de terceros (PARTNER-ADMIN) y del administrador de cada tercero. |
2. Diagrama de contexto
Quién participa y cómo se conecta. Las pantallas llegan por el BFF del portal, que valida el token y compone; cada módulo vuelve a validar el token y decide sus permisos con los roles de MS-13.
🟩 Verde: nuevo, se construye · 🟦 Azul: ya existe y se queda, se reutiliza su código · 🟧 Naranja: temporal o se retira (se apaga en R3) · ⬜ Gris: sistema externo · ★ módulo dueño
3. Diagrama de flujo
El camino principal, paso por paso. Cuando una pantalla llama a un módulo se ven dos flechas: la pantalla al BFF y el BFF al módulo. Los eventos salen del outbox del módulo después de guardar; quien los consume ignora los repetidos.
Los pasos en texto
| Paso | De | A | Qué hace | API o evento |
|---|---|---|---|---|
| 1 | Administración del catálogo | Entrada Única · Vendor Center | Sube la hoja de roles de la matriz firmada | — |
| 2 | Entrada Única · Vendor Center | MS-13 Identidad y acceso (por el BFF) | Pide el plan de roles y pantallas, sin escribir | API-13-013 |
| 3 | Entrada Única · Vendor Center | MS-13 Identidad y acceso (por el BFF) | Confirma los roles | API-13-007 |
| 4 | MS-13 Identidad y acceso | Eventos | Avisa el cambio de roles | catalog.identity.changed/ROLE_CHANGED |
| 5 | Administración del catálogo | Entrada Única · Vendor Center | Sube la hoja de permisos del motor | — |
| 6 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Pide el plan de la tabla ROLE_MATRIX | API-02-031 |
| 7 | MS-02 Producto | MS-13 Identidad y acceso | Revisa que cada rol citado exista | API-13-005 |
| 8 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Confirma la tabla del motor | API-02-057 |
| 9 | Eventos | BFF del portal | Entrega el cambio para rehacer los menús | catalog.identity.changed/ROLE_CHANGED |
| 10 | Compras | Entrada Única · Vendor Center | Intenta aceptar una propuesta sin ese permiso | — |
| 11 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Pide el plan de la acción ACCEPT | API-02-028 |
| 12 | MS-02 Producto | MS-13 Identidad y acceso | Pide los roles efectivos del comprador | API-13-001 |
| 13 | MS-02 Producto | MS-05 Auditoría | Responde 403 y registra el intento negado | API-05-007 |
3.1 Asignar personas, secciones y pasos
3.2 Cada quien ve sólo lo suyo
3.3 Sólo perfiles autorizados cambian el catálogo
4. Si algo sale mal
- La hoja de roles cita una pantalla que no existe o retira un rol con miembros vigentes. El plan responde 422 con el renglón y el motivo; no se escribe nada hasta corregir la hoja o mover a los miembros.
- Una hoja de dominio cita un rol que no existe en el directorio. Su dueño (el motor de MS-02 o MS-01) rechaza ese renglón en la vista previa; Administración de accesos da de alta el rol primero.
- Alguien sin permiso intenta una acción. Recibe 403 AUTHORIZATION_ERROR, o 404 si el objeto es de otro proveedor o seller; el intento queda en MS-05 con la acción y el motivo, y Administración de accesos lo ve en el historial.
- Se pierde o se atrasa el aviso ROLE_CHANGED. La caché vence sola a los 5 minutos; cada respuesta de roles lleva su versión, así se sabe con cuál se decidió.
- La matriz firmada no llega antes de la UAT. Se arranca con el catálogo inicial traducido de los perfiles de hoy, marcado como provisional; lo que no conceda queda negado y Gobierno de Producto ve la lista de lo pendiente.
5. APIs
Las que construye esta épica (6)
POST /api/v2/roles/matrix/plans · Cargar la hoja de roles de la matriz firmada
| Campo | Valor |
|---|---|
| API | API-13-013 · MS-13 Identidad y acceso |
| Para qué | Recibe la hoja de roles de la matriz firmada por Seguridad y Gobierno de Producto (roles y áreas, pantallas de cada uno y alcance que piden), la compara con la vigente y dice qué nace, cambia o se retira y a cuántos usuarios afecta, sin escribir todavía. Las hojas de permisos de dominio se cargan en su dueño. |
| En esta épica | Cargar con vista previa la hoja de roles de la matriz firmada |
| Quién la llama | BFF del portal |
| Permiso | ACCESS-ADMIN |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
Request
{
"file": "(hoja ROLES de la matriz, XLSX en multipart)",
"matrixVersion": 8,
"signedBy": [
"SEGURIDAD",
"GOBIERNO_PRODUCTO"
],
"signedOn": "2026-11-20",
"effectiveFrom": "2026-12-01T06:00:00Z"
}
Response · 200
{
"success": true,
"data": {
"planId": "pln-c71d03",
"expiresAt": "2026-11-20T18:30:00Z",
"summary": {
"roles": 41,
"new": 3,
"changed": 12,
"retired": 2,
"usersAffected": 46
},
"items": [
{
"roleId": "EJECUTIVO_CATALOGACION",
"change": "NEW",
"screens": [
"PROPUESTAS",
"LOOKS"
]
},
{
"roleId": "PIM_CATALOG_ADMIN",
"change": "RETIRED",
"membersToMove": 0
}
],
"rejectedRows": [],
"domainSheets": [
{
"sheet": "MOTOR",
"owner": "MS-02",
"loadWith": "API-02-031 (ROLE_MATRIX y FIELD_OWNERS)"
},
{
"sheet": "CATALOGO",
"owner": "MS-01",
"loadWith": "permisos del catálogo de MS-01"
}
],
"applyUrl": "/api/v2/identity-plans/pln-c71d03/apply"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 422 | VALIDATION_ERROR | Un renglón cita una pantalla que no existe o retira un rol con miembros vigentes |
| 422 | UNKNOWN_COLUMN | La hoja trae una columna ajena; se rechaza completa |
| 409 | VERSION_CONFLICT | La hoja vigente cambió desde que se descargó |
GET /api/v2/roles/matrix · Descargar la hoja de roles vigente
| Campo | Valor |
|---|---|
| API | API-13-014 · MS-13 Identidad y acceso |
| Para qué | Entrega la hoja de roles vigente (roles, áreas, pantallas, alcance y miembros) con su versión, quién la firmó y desde cuándo vale, para revisarla y volverla a firmar. |
| En esta épica | Descargar la hoja de roles vigente para revisarla y firmarla |
| Quién la llama | BFF del portal |
| Permiso | ACCESS-ADMIN |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | format = JSON |
Request
null
Response · 200
{
"success": true,
"data": {
"matrixVersion": 7,
"effectiveFrom": "2026-10-01T06:00:00Z",
"signedBy": [
"SEGURIDAD",
"GOBIERNO_PRODUCTO"
],
"rows": [
{
"roleId": "COMPRAS",
"kind": "ROLE",
"name": "Compras",
"screens": [
"BANDEJA_VISTO_BUENO",
"PROPUESTAS",
"TABLEROS"
],
"scopeTypes": [
"businesses",
"sections",
"areas"
],
"members": 214
},
{
"roleId": "COMPRAS-HOGAR",
"kind": "AREA",
"name": "Compras Hogar",
"screens": [],
"scopeTypes": [],
"members": 31
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | Quien pide no tiene ACCESS-ADMIN |
GET /api/v2/roles · Roles y áreas
| Campo | Valor |
|---|---|
| API | API-13-005 · MS-13 Identidad y acceso |
| Para qué | Lista los roles y áreas vigentes: nombre, pantallas que ven, qué alcance piden (negocio, sección, proveedor o seller), cuántos usuarios tienen y de qué versión de la matriz salen. Los módulos dueños lo consultan para validar los roles que citan sus tablas de permisos. |
| En esta épica | Consultar roles y áreas; los dueños validan los roles que citan |
| Quién la llama | BFF del portal, MS-01 Catálogo, MS-02 Producto |
| Permiso | ACCESS-ADMIN; las cuentas de servicio de MS-01 y MS-02 |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | status = ACTIVE, kind = ROLE, q = QA |
| También la usan | FT-PLT-01 |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"roleId": "QA",
"kind": "ROLE",
"name": "QA de contenido",
"status": "ACTIVE",
"members": 23,
"matrixVersion": 7,
"screens": [
"BANDEJA_QA",
"TABLEROS",
"MIS_EXPORTES"
],
"scopeTypes": [
"businesses",
"sections"
]
}
],
"page": 1,
"size": 50,
"total": 1
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | Quien pide no tiene ACCESS-ADMIN ni es un módulo dueño |
POST /api/v2/roles/plans · Preparar el cambio de un rol
| Campo | Valor |
|---|---|
| API | API-13-006 · MS-13 Identidad y acceso |
| Para qué | Prepara el alta, el cambio o el retiro de un solo rol o área (nombre, pantallas y alcance que pide) y dice a cuántos usuarios afecta, sin escribir todavía. Para cambiar muchos a la vez se carga la hoja de roles de la matriz firmada. |
| En esta épica | Crear, cambiar o retirar un solo rol |
| Quién la llama | BFF del portal |
| Permiso | ACCESS-ADMIN |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key, If-Match |
Request
{
"operation": "CREATE",
"roleId": "EJECUTIVO_CATALOGACION",
"name": "Ejecutivo de catalogación",
"screens": [
"PROPUESTAS",
"LOOKS"
],
"scopeTypes": [
"businesses"
],
"reason": "La matriz firmada crea el rol que lleva un Conjunto Look a Publicación"
}
Response · 200
{
"success": true,
"data": {
"planId": "pln-0e7b52",
"expiresAt": "2026-10-18T15:14:05Z",
"impact": {
"users": 0,
"screensAdded": [
"LOOKS"
],
"screensRemoved": []
},
"applyUrl": "/api/v2/identity-plans/pln-0e7b52/apply"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 422 | VALIDATION_ERROR | Una pantalla no existe en el portal o el rol ya existe |
| 422 | BUSINESS_ERROR | Se retira un rol que todavía tiene miembros vigentes |
| 409 | VERSION_CONFLICT | El rol cambió desde que se leyó |
GET /internal/identity/groups/{code}/members · Quién integra un rol o un área
| Campo | Valor |
|---|---|
| API | API-13-015 · MS-13 Identidad y acceso |
| Para qué | Dice quién integra hoy un rol o un área, para un negocio y una sección, para que el motor de tareas llene la cola y los avisos lleguen a quien le toca. |
| En esta épica | Saber quién integra un rol o un área para colas y avisos |
| Quién la llama | MS-02 Producto, MS-14 Avisos y ayuda |
| Permiso | Sólo las cuentas de servicio de MS-02 y MS-14 |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | code = QA, business = MER, section = 2001 |
Request
null
Response · 200
{
"success": true,
"data": {
"code": "QA",
"kind": "ROLE",
"business": "MER",
"section": "2001",
"members": [
{
"userId": "USR-000318",
"displayName": "Analista QA 07",
"contact": "(correo del directorio)",
"validTo": "2027-10-31T23:59:59Z"
}
],
"total": 1
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El rol o el área no existen |
POST /internal/audit/security-events · Intentos negados y eventos de seguridad
| Campo | Valor |
|---|---|
| API | API-05-007 · MS-05 Auditoría |
| Para qué | Cada módulo, el BFF y el gateway mandan por lotes los intentos negados (403), los intentos de cambiar o borrar la bitácora y las cabeceras de identidad que no debían llegar. MS-05 los guarda para el historial de accesos. |
| En esta épica | Registrar cada intento negado |
| Quién la llama | MS-01 Catálogo, MS-02 Producto, MS-04 Reportes, MS-05 Auditoría, MS-06 Evaluación, MS-11 Activos digitales, MS-12 Estudio fotográfico, MS-13 Identidad y acceso, MS-14 Avisos y ayuda, MS-15 IA y enriquecimiento, BFF del portal, Gateway de terceros /partner/v1 |
| Permiso | Sólo cuentas de servicio del PIM |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | audit_events |
| También la usan | FT-ARQ-02 |
Request
{
"source": "MS-02",
"events": [
{
"type": "ACCESS_DENIED",
"at": "2026-10-17T22:31:40Z",
"subject": "idp|8b30fe21aa",
"userId": "USR-000318",
"action": "FLU-ACCEPT",
"resource": {
"type": "PRODUCT",
"id": "PRD-0004812"
},
"reason": "SIN_CAPACIDAD",
"requestId": "req-77ab10"
}
]
}
Response · 202
{
"success": true,
"data": {
"accepted": 1
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | No llama una cuenta de servicio del PIM |
| 422 | VALIDATION_ERROR | El lote pasa de 500 eventos o un evento no trae tipo |
Las que usa y construye otra épica (15)
Su request y su response están en la página de la épica que la construye.
| API | Método y ruta | Para qué, aquí | La construye |
|---|---|---|---|
| API-13-007 | POST /api/v2/identity-plans/{planId}/apply | Confirmar los planes de roles y membresías | FT-USR-01 · Identidad y autenticación de usuarios internos… |
| API-13-004 | POST /api/v2/users/plans | Cambiar membresías con alcance y vigencia | FT-USR-01 · Identidad y autenticación de usuarios internos… |
| API-13-001 | GET /internal/identity/permissions?userId= | Los roles efectivos con los que decide cada módulo | FT-USR-01 · Identidad y autenticación de usuarios internos… |
| API-BFF-503 | GET /bff/v1/session | La sesión con las secciones y pantallas del usuario | FT-USR-01 · Identidad y autenticación de usuarios internos… |
| API-02-031 | POST /api/v2/workflow/config/{type}/plans | Cargar la hoja del motor: ROLE_MATRIX y FIELD_OWNERS | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-030 | GET /api/v2/workflow/config/{type} | Leer la tabla de permisos del motor vigente | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-057 | POST /api/v2/product-plans/{planId}/apply | Confirmar el plan de la tabla del motor | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-028 | POST /api/v2/workflow/actions/plans | Ejemplo de acción negada por la tabla del motor | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-027 | GET /api/v2/workflow/capabilities?productIds= | Qué grupos de campos puede editar quien llama en un producto | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-001 | POST /api/v2/products/search | Búsqueda filtrada por el proveedor o seller del usuario | FT-PRD-01 · Modelo canónico de producto |
| API-02-002 | GET /api/v2/products/{id} | Ficha que responde 404 si el producto es de otro seller | FT-PRD-01 · Modelo canónico de producto |
| API-01-003 | POST /api/v2/attributes/plans | Ejemplo de cambio al catálogo que decide MS-01 | FT-PLT-02 · Catálogo de atributos |
| API-01-004 | POST /api/v2/catalog-plans/{planId}/apply | Confirmar el plan de permisos del catálogo | FT-PLT-01 · Fundamentos de gobierno de plantillas |
| API-01-022 | GET /api/v2/structures/{id}/leaves | Los grupos de artículo de una sección | FT-PLT-05 · Taxonomía de plantillas por familia, metadatos de… |
| API-01-110 | POST /api/v2/catalog-permissions/plans | Cargar la hoja de permisos del catálogo en MS-01 | FT-PLT-01 · Fundamentos de gobierno de plantillas |
6. Eventos
Publica
| Evento | Cuándo | Quién lo consume |
|---|---|---|
catalog.identity.changed/ROLE_CHANGED | Nace, cambia o se retira un rol o un área, o se carga la hoja de roles | FT-ARQ-02, FT-FLU-01 |
catalog.identity.changed/USER_CHANGED | Cambian las membresías, el alcance o la vigencia de un usuario | FT-PRD-06, FT-USR-01 |
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
catalog.identity.changed/ROLE_CHANGED | El BFF rehace los menús; MS-01 y MS-02 vacían su caché y revisan los roles que citan sus tablas; MS-05 lo guarda | esta misma épica |
catalog.identity.changed/USER_CHANGED | MS-02 regresa a la bolsa las tareas de quien dejó un rol o un área y los módulos vacían su caché | esta misma épica |
7. Datos
Cada colección tiene un solo dueño, el único que escribe en ella.
| Colección | Dueño | Qué guarda | Esta épica |
|---|---|---|---|
roles | MS-13 | Perfiles y roles, con sus membresías y su alcance (negocio, sección, proveedor o seller, vigencia). Los permisos de dominio los decide el servicio dueño con estos roles (decisión 19). | escribe |
users | MS-13 | Cada usuario interno, proveedor o seller, su liga con el proveedor de identidad y sus roles. | escribe |
identity_outbox | MS-13 | Los cambios de identidad que esperan salir como evento. | escribe |
identity_receipts | MS-13 | Los planes de identidad por confirmar (vencen a los 10 minutos) y el recibo de cada cambio confirmado de usuarios, roles y terceros, con lo que respondió el proveedor de identidad. | escribe |
audit_events | MS-05 | Quién cambió qué, cuándo, desde dónde, con el antes y el después. | escribe |
users | MS-13 | Cada usuario interno, proveedor o seller, su liga con el proveedor de identidad y sus roles. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-USR-02·H1 · Cargar la matriz firmada como configuración | P1 | pasos 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13; API-13-013, API-13-014, API-02-031, API-05-007 |
| FT-USR-02·H2 · Que sólo perfiles autorizados toquen la estructura global de atributos, las… | P1 | flujo «Sólo perfiles autorizados cambian el catálogo»; API-01-110, API-01-003 |
| FT-USR-02·H3 · Que el EAN sólo lo cambien Gobierno de Datos o el flujo de liberación, y que… | P1 | API-13-006, API-02-030. Fuera: Las acciones de cambiar un EAN y de llevar un Conjunto Look a Publicación son del motor de MS-02 y las construyen sus épicas (FT-PRD-03 para el EAN); aquí se crea el rol Ejecutivo de catalogación y se fija quién tiene cada acción (D-USR-02-8). |
| FT-USR-02·H4 · Editar directamente los campos de los que soy dueño y que lo demás pase por… | P2 | API-02-027, API-02-030. Fuera: Qué cambio va directo y cuál pasa a aprobación lo resuelve FT-PRD-05 con FIELD_OWNERS del motor; aquí sólo se fija que el dueño de cada grupo de campos se expresa con roles y áreas del directorio. |
| FT-USR-02·H5 · Ver y editar sólo mis productos | P2 | flujo «Cada quien ve sólo lo suyo»; API-13-001 |
| FT-USR-02·H6 · Asignar usuarios o grupos a cada paso | P2 | flujo «Asignar personas, secciones y pasos»; API-13-015, API-13-004 |
| FT-USR-02·H7 · Catalogar sólo en mis secciones | P1 | flujo «Asignar personas, secciones y pasos»; API-01-022, API-05-007 |
9. Decisiones de esta épica
Las tomó el TL como arquitecto; quedan como [Propuesta] hasta que el equipo de la épica las revise.
- D-USR-02-1. Cada parte de la matriz tiene un dueño y nada se repite. MS-13 guarda los roles y áreas, las pantallas de cada rol y las membresías con su alcance (negocio, sección, proveedor o seller, área) y su vigencia. El motor de MS-02 guarda rol × acción × tarea × negocio (ROLE_MATRIX) y el dueño de cada grupo de campos (FIELD_OWNERS); MS-01, rol × acción sobre el catálogo; MS-04 y MS-05, qué rol usa cada reporte y cada consulta de la bitácora. MS-13 no guarda permisos de dominio. Por qué: La decisión 18 pone el rol en el directorio y la matriz en el servicio dueño, y el motor ya la tomó así; si MS-13 guardara también acciones, habría dos tablas que reconciliar. Se apoya en DUD-22, DMS-71, DEC-PLT-09, FT-FLU-01.
- D-USR-02-2. La matriz firmada es un documento con una hoja por dueño: ROLES (MS-13), MOTOR (MS-02) y CATALOGO (MS-01). Cada hoja se carga con vista previa en su dueño, que valida contra MS-13 que los roles existan. Un perfil nuevo es una fila en ROLES y en las hojas que toque: no se despliega nada; sólo una pantalla o una acción nueva piden código. Por qué: Se aplican permisos sin cambiar código (H1) y cada dueño sigue siendo el único que escribe su tabla. Se apoya en DUD-22, DEC-PLT-09.
- D-USR-02-3. Falla cerrada: lo que una hoja no conceda está negado. Cada negación responde 403 AUTHORIZATION_ERROR (404 si revelaría que existe un objeto de otro proveedor o seller) y el módulo la manda a MS-05 por lotes (API-05-007) con la acción, el objeto y el motivo. Por qué: Sin matriz no se supone ningún permiso, y el intento negado tiene que quedar registrado, como piden H1 y H7. Se apoya en ADR-05, DUD-22.
- D-USR-02-4. Arranque: un catálogo inicial de roles traducido de los 15 perfiles de Entrada Única, los 15 perfiles y 19 roles de Foro, los grupos de workflow de P360 (sólo cuentan las membresías de tipo 2700) y los 8 roles que nombran las ERF. Las 26 autorizaciones concedidas de P360 son insumo y no se migran. Queda marcado como provisional hasta la firma. Por qué: El taller de la matriz necesita un punto de partida medido, y P360 es insumo, no fuente. Se apoya en DEC-PLT-09, DUD-22.
- D-USR-02-5. El aislamiento se hace en el servidor: MS-02 filtra búsquedas, fichas, exportes y la API de terceros por el proveedor o seller que da API-13-001; un producto ajeno responde 404. Los sellers entran en la fase que fije PD-02. Por qué: Hoy el portal marca a todo usuario como autorizado; filtrar en el navegador no protege nada. Se apoya en PD-02, RSG-36.
- D-USR-02-6. Las secciones van en el alcance de cada membresía. Las pantallas sólo ofrecen esas secciones y los grupos de artículo de cada una (MS-01), y MS-02 rechaza crear o aprobar fuera de ellas, también por API, con 403 y registro. Por qué: Así el filtro por sección vale igual en la pantalla, en la carga masiva y en la API. Se apoya en DUD-22.
- D-USR-02-7. El motor asigna cada tarea a un rol o un área (configuración de MS-02) y MS-13 dice quién lo integra hoy (API-13-015), para la cola y para los avisos. Asignar a alguien a un paso es cambiar su membresía, no el código. Por qué: Cada workflow de P360 tenía su grupo; aquí el grupo es un rol del directorio y la regla del paso vive en el motor. Se apoya en PEN-60, PD-29.
- D-USR-02-8. Cambiar un EAN fuera del flujo de liberación queda en la tabla del motor sólo para Gobierno de Datos, y llevar un Conjunto Look a Publicación sólo para el rol nuevo Ejecutivo de catalogación, que se crea en la hoja de roles porque hoy no existe en código. Por qué: Lo piden las ERF y ningún sistema lo controla hoy. Se apoya en DUD-22.
- D-USR-02-9. Cada rol lleva sus pantallas en el directorio y el BFF las aplica en el menú y en cada ruta /bff; se quitan las guardas escritas en el front. Por qué: El BFF no tiene base; si las pantallas fueran código del BFF, un perfil nuevo pediría un despliegue. Se apoya en PD-30, DUD-22.
Qué falta decidir
| ID | Qué falta |
|---|---|
| DUD-22 | Negocio con Seguridad firma la matriz (las tres hojas) en un taller antes del 27-nov; aquí se fija el marco y el arranque provisional. |
| PD-02 | Dirección y PM fijan si los sellers entran en la Fase 1; de eso depende cuándo se prueba su aislamiento. |
También siguen abiertos: PEN-60, Negocio define en qué casos se abre la tarea de Gobierno de Datos tras crear el SKU y para quién (propuesta en D-RAC-04-4); PEN-55, Negocio confirma cómo se identifica el negocio de cada alta de un proveedor híbrido.
Fuentes
- [D]
trazabilidad/features/FT-USR-02-matriz-de-roles-y-permisos.md: la ficha de la épica, con sus historias, reglas y bloqueos. - [D] ADR-12 · Un solo sistema: backend compartido y una sola base (sección 3.4).
- [D]
docs/arquitectura/por-epica/base/: piezas, colecciones, eventos y el hilo de punta a punta. - [D]
docs/arquitectura/omega-a-pim-headless/contratos-api.md: convenciones y endpoints de partida. - [D]
docs/arquitectura/maquina-de-estados-to-be/propuesta-maquina-de-estados.md§7: estados, tareas y canales. - [I] Las decisiones de la sección 9 son del TL sobre esas fuentes.