Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-RAC-06: 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-RAC-06.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-RAC-06-metricas-tiempos-paso-errores.md.
En 30 segundos
Nadie sabe hoy dónde se atora un alta: no hay tiempos por paso, Compras aprueba sin ver y los errores no se clasifican por dónde se detectan. Esta épica hace que Reportes escuche los eventos del motor de estados, de SAP y de los canales, y guarde cuándo entra y sale cada producto de cada paso, cuántas veces vuelve y qué error tuvo. Con eso arma tarjetas de tiempos, de Compras, de errores y de publicación, donde «sin dato» nunca sale como cero.
- Módulo dueño: MS-04 Reportes. También participan: MS-02 Producto, MS-05 Auditoría, MS-07 Ingesta de archivos, MS-08 Adaptadores de salida.
- Etapa T · Transversal. Recibe de otras épicas y entrega «PE-T · Usuario con permisos y bitácora».
- APIs: construye 9 y usa 2 que construyen otras épicas.
- Eventos: publica 0 y consume 10.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… | La apertura y el cierre de cada tarea y cada cambio de estado del motor, con quién y cuándo. |
| FT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y… | La historia de estado, incluida la migrada de P360, para los pasos anteriores a la salida. |
| FT-INT-01 · Publicación a e-commerce | El acuse o el rechazo de cada canal (DELIVERY_RESULT), con su motivo, para medir de Aprobado a Publicado. |
| FT-INT-03 · Entrada de SKUs creados en SAP | Los errores de SAP del programa 141 que avisa MS-07, para clasificarlos como detectados en SAP. |
| FT-IA-06 · Asistente conversacional para que el seller reporte errores | Los reportes clasificados por tipo de error y paso del alta, para medir dónde se atoran los sellers. |
Entrega
| A | Qué |
|---|---|
| PE-T · Usuario con permisos y bitácora | Tiempos por paso, métricas de Compras y errores por punto de detección, consultables por negocio y por producto. |
| FT-PRD-04 · Propuesta del proveedor de Mercaderías | La antigüedad y el tiempo de la revisión de Compras, con los que se ratifican sus plazos. |
| FT-PLT-08 · Títulos, nombres y descripciones de producto | La latencia de los atributos calculados, como el título sin marca, para comprobar su meta. |
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 | MS-02 Producto | Eventos | Avisa cada cambio de estado y de tarea | catalog.product.changed/STATUS_CHANGED |
| 2 | Eventos | MS-04 Reportes | Entrega el cambio a Reportes | catalog.product.changed/STATUS_CHANGED |
| 3 | MS-04 Reportes | Base pim | Cierra el paso anterior y abre el nuevo | — |
| 4 | MS-07 Ingesta de archivos | Eventos | Avisa los errores de SAP del programa 141 | catalog.sap.inbound/SAP_ARTICLE_FAILED |
| 5 | MS-08 Adaptadores de salida | Eventos | Avisa el acuse o el rechazo de cada canal | catalog.delivery.result/DELIVERY_RESULT |
| 6 | Eventos | MS-04 Reportes | Entrega errores y acuses a Reportes | catalog.delivery.result/DELIVERY_RESULT |
| 7 | MS-04 Reportes | Base pim | Clasifica cada error por punto de detección | — |
| 8 | Administración del catálogo | Entrada Única · Vendor Center | Abre los tableros de operación | — |
| 9 | Entrada Única · Vendor Center | BFF del portal | Pide el tablero compuesto de su perfil | API-BFF-509 |
| 10 | BFF del portal | MS-04 Reportes | Trae el último resultado de cada tarjeta | API-04-005 |
| 11 | Entrada Única · Vendor Center | MS-04 Reportes (por el BFF) | Recalcula la tarjeta de tiempo por paso | API-04-006 |
| 12 | MS-04 Reportes | Base pim | Guarda el resultado; «sin dato» no es cero | — |
| 13 | Entrada Única · Vendor Center | MS-04 Reportes (por el BFF) | Lee el resultado con su unidad | API-04-007 |
3.1 El recorrido de un producto
3.2 Revisión de Compras y aprobadas sin revisión
3.3 Tablero a medida con diagnóstico
4. Si algo sale mal
- Un evento llega repetido o fuera de orden. Reportes lo descarta por su eventId y su versión; un paso cuya salida no ha llegado queda abierto, nunca se le inventa una fecha.
- Una tarjeta no tiene datos en el rango. Responde null con el motivo «sin dato», distinto de cero; si el cálculo falla, se conserva el último resultado bueno y se muestra el intento fallido.
- Un cálculo pasa de su presupuesto de tiempo. Queda FAILED con el motivo y no se relanza solo; el usuario lo pide otra vez y soporte puede encender el diagnóstico para ver por qué tardó.
- El producto viene de P360 y no hay historia previa. Sus pasos anteriores a la migración salen como «sin dato antes de la migración», o con la precisión de día si la historia migrada los trae.
5. APIs
Las que construye esta épica (9)
GET /api/v2/dashboards/fixed · Tarjetas fijas
| Campo | Valor |
|---|---|
| API | API-04-005 · MS-04 Reportes |
| Para qué | Las tarjetas fijas que el usuario puede ver con su último resultado guardado, sin recalcular: las 6 de Omega (completitud, creaciones, SKU, tiempo en Creación de SKU, tiempo entre estados, publicados y aprobados) y 6 nuevas (tiempo por paso, revisión de Compras, errores por punto de detección, de Aprobado a Publicado, calculados y publicados enriquecidos). |
| En esta épica | Las tarjetas fijas con su último resultado, sin recalcular |
| Quién la llama | BFF del portal |
| Permiso | REP-L (CAT-L y ENT-L); cada tarjeta pide su capacidad |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | business = MER |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"cardId": "COMPLETENESS",
"title": "Completitud obligatoria por estado y negocio",
"lastResult": {
"computedAt": "2026-10-18T07:00:00Z",
"from": null,
"to": null
},
"lastAttempt": {
"at": "2026-10-18T07:00:00Z",
"status": "OK"
}
},
{
"cardId": "STEP_TIMES",
"title": "Tiempo por paso",
"lastResult": {
"computedAt": "2026-10-18T07:00:00Z",
"from": "2026-09-18",
"to": "2026-10-18"
},
"lastAttempt": {
"at": "2026-10-18T07:00:00Z",
"status": "OK"
}
},
{
"cardId": "BUYER_REVIEW",
"title": "Revisión de Compras",
"lastResult": null,
"state": "SIN_DATO",
"lastAttempt": null
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | Quien llama no tiene lectura de reportes |
POST /api/v2/dashboards/fixed/{cardId}/runs · Recalcular una tarjeta fija
| Campo | Valor |
|---|---|
| API | API-04-006 · MS-04 Reportes |
| Para qué | Recalcula una tarjeta fija para un rango de hasta 5 años y un negocio, en segundo plano, con los hechos que Reportes ya armó con los eventos; si falla, conserva el último resultado bueno. |
| En esta épica | Recalcular una tarjeta fija para un rango y un negocio |
| Quién la llama | BFF del portal |
| Permiso | REP-L y la capacidad de la tarjeta |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Parámetros | cardId = STEP_TIMES |
| Escribe en | dashboard_results |
Request
{
"from": "2026-09-18",
"to": "2026-10-18",
"business": "MER"
}
Response · 202
{
"success": true,
"data": {
"jobId": "job-card-5521",
"status": "ACCEPTED",
"links": {
"result": "/api/v2/dashboards/fixed/STEP_TIMES/result"
}
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | El rango pasa de 5 años o Desde es mayor que Hasta |
| 423 | LOCKED | Ya hay un cálculo de esa tarjeta en curso para el mismo usuario |
GET /api/v2/dashboards/fixed/{cardId}/result · Resultado de una tarjeta fija
| Campo | Valor |
|---|---|
| API | API-04-007 · MS-04 Reportes |
| Para qué | El último resultado de una tarjeta, con su unidad explícita. «Sin dato» sale como null con su motivo, nunca como cero. |
| En esta épica | El resultado de una tarjeta con su unidad y «sin dato» |
| Quién la llama | BFF del portal |
| Permiso | REP-L y la capacidad de la tarjeta |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | cardId = STEP_TIMES, business = MER |
Request
null
Response · 200
{
"success": true,
"data": {
"cardId": "STEP_TIMES",
"from": "2026-09-18",
"to": "2026-10-18",
"business": "MER",
"computedAt": "2026-10-18T15:21:40Z",
"unit": "minutos",
"rows": [
{
"step": "EN_REVISION · VISTO_BUENO_COMPRAS",
"episodes": 412,
"avg": 5230,
"p50": 2880,
"p90": 14400,
"visitsAvg": 1.2
},
{
"step": "CREACION_SKU · SKU_EN_SAP",
"episodes": 388,
"avg": 41,
"p50": 18,
"p90": 95,
"visitsAvg": 1.0
},
{
"step": "EN_ENRIQUECIMIENTO · QA_MANUAL",
"episodes": 0,
"avg": null,
"p50": null,
"p90": null,
"state": "SIN_DATO",
"reason": "Ningún producto pasó por QA manual en el rango"
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | La tarjeta no existe o nunca se calculó para ese usuario |
GET /api/v2/dashboards/custom/profile · Mis tableros a medida
| Campo | Valor |
|---|---|
| API | API-04-008 · MS-04 Reportes |
| Para qué | El modelo de los tableros que armó el usuario: conjuntos, tarjetas por característica, métrica (nulos, más frecuentes, menos frecuentes o distintos), hasta 12 filtros que se pueden negar y la visual, con su versión. |
| En esta épica | Leer el perfil de tableros a medida |
| Quién la llama | BFF del portal |
| Permiso | REP-L, sobre su propio perfil |
| Cabeceras | Authorization, X-Request-Id |
Request
null
Response · 200
{
"success": true,
"data": {
"version": 4,
"model": {
"sets": [
{
"setId": "set-01",
"name": "Completitud de vestidos",
"cards": [
{
"cardId": "crd-11",
"entity": "PRODUCT",
"attribute": "MATERIAL",
"metric": "NULLS",
"n": 10,
"filters": [
{
"field": "Business",
"op": "EQ",
"value": "MER",
"negate": false
},
{
"field": "PrimaryProductTaxonomyGroup",
"op": "EQ",
"value": "EU4-0412",
"negate": false
}
],
"visual": "BARS"
}
]
}
]
}
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El usuario todavía no guarda tableros |
PUT /api/v2/dashboards/custom/profile · Guardar mis tableros a medida
| Campo | Valor |
|---|---|
| API | API-04-009 · MS-04 Reportes |
| Para qué | Guarda el modelo de tableros del usuario con control de versión: hasta 50 conjuntos, 300 tarjetas y 12 filtros por tarjeta. |
| En esta épica | Guardar el perfil de tableros a medida con versión |
| Quién la llama | BFF del portal |
| Permiso | REP-L, sobre su propio perfil |
| Cabeceras | Authorization, X-Request-Id, If-Match |
| Escribe en | dashboard_profiles |
Request
{
"version": 4,
"model": {
"sets": [
{
"setId": "set-01",
"name": "Completitud de vestidos",
"cards": [
{
"cardId": "crd-11",
"entity": "PRODUCT",
"attribute": "MATERIAL",
"metric": "NULLS",
"n": 10,
"filters": [
{
"field": "Business",
"op": "EQ",
"value": "MER",
"negate": false
}
],
"visual": "DONUT"
}
]
}
]
}
}
Response · 200
{
"success": true,
"data": {
"version": 5
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | VERSION_CONFLICT | El perfil cambió en otra pestaña o sesión |
| 400 | VALIDATION_ERROR | Pasa de 50 conjuntos, 300 tarjetas, 12 filtros o 1.5 MB, o un filtro no trae valor |
POST /api/v2/dashboards/custom/cards/{cardId}/runs · Calcular una tarjeta a medida
| Campo | Valor |
|---|---|
| API | API-04-010 · MS-04 Reportes |
| Para qué | Calcula una tarjeta a medida ya guardada sobre el universo vigente; compara las listas por código, no por etiqueta, y trata SKU, EAN e identificadores como texto. |
| En esta épica | Calcular una tarjeta a medida |
| Quién la llama | BFF del portal |
| Permiso | REP-L, sobre su propio perfil |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Parámetros | cardId = crd-11 |
| Escribe en | dashboard_results |
Request
{
"version": 5
}
Response · 200
{
"success": true,
"data": {
"cardId": "crd-11",
"metric": "NULLS",
"universe": 6230,
"withValue": 5118,
"nulls": 1112,
"nullsPct": 17.8486,
"computedAt": "2026-10-18T15:30:12Z"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | VERSION_CONFLICT | La tarjeta cambió durante el cálculo o no coincide con la guardada |
| 404 | NOT_FOUND | La tarjeta no está guardada |
PUT /api/v2/dashboards/diagnostics · Diagnóstico de tableros
| Campo | Valor |
|---|---|
| API | API-04-011 · MS-04 Reportes |
| Para qué | Enciende o apaga, para un usuario, el diagnóstico de sus cálculos (fases, tiempos y forma de la consulta, sin valores ni datos de productos), para que soporte vea por qué tarda o falla una tarjeta. Apagado por omisión; se apaga solo a las 2 horas. |
| En esta épica | Encender o apagar el diagnóstico de un usuario |
| Quién la llama | BFF del portal |
| Permiso | El propio usuario con REP-DIAG (soporte) |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | dashboard_profiles |
Request
{
"enabled": true
}
Response · 200
{
"success": true,
"data": {
"enabled": true,
"until": "2026-10-18T17:30:00Z"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | El usuario no tiene REP-DIAG |
GET /api/v2/metrics/products/{productId}/steps · Pasos de un producto
| Campo | Valor |
|---|---|
| API | API-04-016 · MS-04 Reportes |
| Para qué | El recorrido de un producto por el flujo: cada estado y tarea con su entrada, su salida, la duración en minutos y el número de visita; lo anterior al nuevo PIM sale de la historia migrada, con su precisión. |
| En esta épica | El recorrido de un producto paso por paso |
| Quién la llama | BFF del portal |
| Permiso | ENT-L (proveedores y sellers, sólo sus productos) |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | productId = PRD-0004812 |
Request
null
Response · 200
{
"success": true,
"data": {
"productId": "PRD-0004812",
"business": "MER",
"unit": "minutos",
"steps": [
{
"step": "BORRADOR",
"task": null,
"enteredAt": "2026-10-08T15:00:00Z",
"exitedAt": "2026-10-10T16:20:00Z",
"minutes": 2960,
"visit": 1
},
{
"step": "EN_REVISION",
"task": "VISTO_BUENO_COMPRAS",
"enteredAt": "2026-10-10T16:20:00Z",
"exitedAt": "2026-10-18T15:04:05Z",
"minutes": 11444,
"visit": 1
},
{
"step": "BORRADOR",
"task": "CORRECCION",
"enteredAt": "2026-10-18T15:04:05Z",
"exitedAt": null,
"minutes": null,
"visit": 2,
"state": "ABIERTO"
}
],
"migratedHistory": {
"source": "P360",
"precision": "DAY",
"until": null
}
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El producto no existe o no es visible para quien llama |
GET /bff/v1/dashboards · Tableros
| Campo | Valor |
|---|---|
| API | API-BFF-509 · BFF del portal |
| Para qué | La pantalla de tableros: las tarjetas fijas y a medida que el perfil puede ver, con su último resultado (MS-04), junto con las tareas abiertas del usuario (MS-02), sus avisos sin leer (MS-14) y las alertas de visibilidad activas (MS-04). No calcula nada. |
| En esta épica | La pantalla de tableros compuesta por perfil |
| Quién la llama | Entrada Única · Vendor Center (por el BFF) |
| Permiso | REP-L; cada tarjeta se muestra sólo si el perfil tiene su capacidad |
| Cabeceras | X-Request-Id |
| Parámetros | business = MER |
Request
null
Response · 200
{
"success": true,
"data": {
"fixedCards": [
{
"cardId": "STEP_TIMES",
"title": "Tiempo por paso",
"computedAt": "2026-10-18T07:00:00Z",
"state": "OK"
},
{
"cardId": "BUYER_REVIEW",
"title": "Revisión de Compras",
"computedAt": null,
"state": "SIN_DATO"
}
],
"customSets": [
{
"setId": "set-01",
"name": "Completitud de vestidos",
"cards": 3
}
],
"myTasks": [
{
"type": "VISTO_BUENO_COMPRAS",
"open": 12,
"oldestDays": 9
}
],
"unreadNotifications": 4,
"visibilityAlerts": [
{
"scope": "SELLER",
"sellerId": "SELLER-0001",
"date": "2026-09-23",
"changePct": -36.4
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | El perfil no tiene la pantalla de tableros |
Las que usa y construye otra épica (2)
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-05-002 | GET /api/v2/audit/entities/{entityType}/{entityId}/status-history | La historia de estado migrada de P360 | FT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y… |
| API-02-121 | POST /internal/product/exports/pages | Leer la bandera de enriquecido de los publicados para su tarjeta | FT-RAC-07 · Reportes, exportes, importes y búsquedas por atributos |
6. Eventos
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
catalog.product.changed/STATUS_CHANGED | Abrir y cerrar cada paso con su visita, y marcar cuándo un producto queda Aprobado | FT-CAT-03, FT-CAT-05, FT-FLU-01, FT-FLU-02, FT-FLU-04, FT-FLU-06, FT-FLU-07, FT-INT-03, FT-INT-05, FT-INT-06, FT-INT-07, FT-PRD-02, FT-PRD-03, FT-PRD-04, FT-PRD-05, FT-PRD-06, FT-PRD-07, FT-PRD-09, FT-PRD-10, FT-RAC-01, FT-RAC-02, FT-RAC-03, FT-RAC-05, FT-REF-02 |
catalog.product.changed/TASK_CHANGED | Medir cada tarea (visto bueno, SKU, foto, QA) y quién la tomó y la cerró | FT-ACT-02, FT-ACT-05, FT-ACT-06, FT-CAT-03, FT-CAT-04, FT-CAT-06, FT-FLU-01, FT-FLU-02, FT-FLU-04, FT-FLU-07, FT-IA-04, FT-IA-06, FT-INT-03, FT-INT-07, FT-PRD-02, FT-PRD-03, FT-PRD-04, FT-PRD-05, FT-PRD-06, FT-PRD-07, FT-PRD-08, FT-RAC-01, FT-RAC-02, FT-RAC-03, FT-RAC-04, FT-RAC-05, FT-REF-03 |
catalog.product.changed/REJECTION_ADDED | Contar rechazos de Compras y de reglas como errores de visto bueno o de reglas | FT-FLU-01, FT-INT-07, FT-PRD-02, FT-PRD-04, FT-PRD-05, FT-RAC-01, FT-RAC-03, FT-RAC-05 |
catalog.product.changed/PRODUCT_UPDATED | Ver cambios de Compras después de aceptar y medir la latencia de los calculados | FT-ACT-06, FT-ARQ-01, FT-ARQ-02, FT-FLU-04, FT-FLU-07, FT-IA-01, FT-IA-05, FT-INT-04, FT-INT-06, FT-INT-07, FT-MIG-04, FT-PLT-07, FT-PLT-08, FT-PRD-01, FT-PRD-03, FT-PRD-05, FT-PRD-07, FT-PRD-08, FT-PRD-09, FT-PRD-10, FT-RAC-01 |
catalog.sap.inbound/SAP_ARTICLE_FAILED | Clasificar el error como detectado en SAP | FT-INT-03 |
catalog.delivery.result/DELIVERY_RESULT | Medir de Aprobado a Publicado por canal y clasificar rechazos como detectados en publicación o en integración | FT-CAT-02, FT-CAT-05, FT-INT-01, FT-INT-02, FT-INT-05, FT-INT-07, FT-PRD-02 |
catalog.validation.result/EVALUATION_DONE | Contar renglones rechazados de cargas masivas como detectados en reglas | FT-FLU-03, FT-FLU-05, FT-REF-03 |
catalog.asset.changed/ASSET_REJECTED | Clasificar el error como detectado en imágenes | FT-ACT-01, FT-ACT-02, FT-ACT-03 |
catalog.ai.result/AI_QUALITY_READY | Clasificar lo que no alcanzó el umbral como detectado en calidad | FT-IA-05, FT-RAC-03 |
catalog.studio.changed/SAMPLE_RETURNED | Reportes cierra el tiempo que la muestra pasó en el estudio. | FT-ACT-05 |
7. Datos
Cada colección tiene un solo dueño, el único que escribe en ella.
| Colección | Dueño | Qué guarda | Esta épica |
|---|---|---|---|
report_facts | MS-04 | Los hechos que Reportes arma con los eventos de los demás módulos: entrada, salida y visitas de cada paso; errores por punto de detección; tiempo de Aprobado a Publicado por canal; latencia de calculados; uso de la API de terceros por minuto y conteos diarios de visibles. No es fuente de ningún dato de operación. | escribe |
dashboard_results | MS-04 | El último resultado de cada tarjeta. | escribe |
dashboard_profiles | MS-04 | Los tableros personales de cada usuario. | escribe |
report_facts | MS-04 | Los hechos que Reportes arma con los eventos de los demás módulos: entrada, salida y visitas de cada paso; errores por punto de detección; tiempo de Aprobado a Publicado por canal; latencia de calculados; uso de la API de terceros por minuto y conteos diarios de visibles. No es fuente de ningún dato de operación. | lee |
dashboard_results | MS-04 | El último resultado de cada tarjeta. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-RAC-06·H1 · El tiempo de cada paso del alta por negocio | P1 | pasos 1, 2, 3; flujo «El recorrido de un producto»; API-04-016 |
| FT-RAC-06·H2 · Conocer fecha de recepción, tiempo promedio, porcentaje de aprobación y… | P1 | flujo «Revisión de Compras y aprobadas sin revisión»; API-04-006, API-04-007 |
| FT-RAC-06·H3 · Los errores clasificados por punto de detección | P2 | pasos 4, 5, 6, 7; API-04-007 |
| FT-RAC-06·H4 · Medir el tiempo entre la aprobación y la publicación por canal | P2 | pasos 5, 6; API-04-006, API-04-007 |
| FT-RAC-06·H5 · Medir la latencia de atributos calculados | P3 | API-04-006, API-04-007 |
| FT-RAC-06·H6 · Tableros de operación | P2 | pasos 8, 9, 10, 11, 12, 13; flujo «Tablero a medida con diagnóstico»; API-BFF-509 |
| FT-RAC-06·H7 · Cuántos enriquecidos hay publicados | P2 | API-04-007, API-02-121 |
9. Decisiones de esta épica
Las tomó el TL como arquitecto; quedan como [Propuesta] hasta que el equipo de la épica las revise.
- D-RAC-06-1. Los tiempos se calculan con los eventos del motor (STATUS_CHANGED y TASK_CHANGED), nunca con fechas de modificación. Un paso es la estancia en un estado y en cada tarea abierta; se guardan entrada, salida, duración en minutos y número de visita. Lo anterior a la migración sale de la historia migrada de MS-05, con su precisión. Por qué: Hoy la duración de P360 no tiene unidad documentada y Omega calculaba con la historia de estado; la unidad explícita y las visitas son lo que pide H1. Se apoya en DUD-09, PD-18, RF-REP-02.
- D-RAC-06-2. Los puntos de detección son ocho: CAPTURA, REGLAS, VISTO_BUENO, SAP, IMAGENES, CALIDAD, PUBLICACION e INTEGRACION. Cada error trae su punto desde el evento que lo avisa (rechazo con su origen, error de SAP, rechazo o falta de acuse de un canal, imagen rechazada, renglón rechazado de una carga, calidad bajo el umbral). Los errores técnicos del portal los mide la observabilidad de la plataforma, no Reportes. Por qué: El catálogo de puntos no estaba en las fuentes; con el evento que ya existe, cada error se clasifica sin que nadie lo capture. Se apoya en RF-REP-02, DUD-31.
- D-RAC-06-3. Se conservan las 6 tarjetas fijas de Omega con sus definiciones y se suman 6: tiempo por paso, revisión de Compras, errores por punto de detección, de Aprobado a Publicado por canal, latencia de calculados y publicados enriquecidos. Un cálculo que falla conserva el último resultado bueno y no se relanza solo. Por qué: Las de Omega ya se usan; las nuevas son las métricas que piden las historias, en el mismo patrón de cálculo bajo demanda. Se apoya en RF-REP-03, PD-13, DUD-15.
- D-RAC-06-4. Cuenta como «aprobada sin revisión» la propuesta que Compras aceptó menos de 2 minutos después de tomar la tarea, o que Compras modificó en los 30 días siguientes a su visto bueno. Las cuatro métricas de Compras se ven por comprador y por sección. Por qué: El criterio no estaba definido; los dos supuestos son medibles con eventos que ya existen y Compras los puede ratificar. Se apoya en RF-REP-03.
- D-RAC-06-5. La latencia de un calculado se mide entre el cambio que lo dispara y su recálculo: MS-02 marca el evento del recálculo con el eventId que lo causó. El tiempo de Aprobado a Publicado se mide del STATUS_CHANGED a Aprobado al DELIVERY_RESULT de cada canal. Por qué: Sin la marca de causa no se puede saber qué recálculo corresponde a qué cambio; la meta de publicar en uno o dos minutos se verifica por canal. Se apoya en RF-REP-02, RF-PUB-01.
- D-RAC-06-6. La pantalla de tableros la compone el BFF (API-BFF-509): tarjetas de MS-04, las tareas abiertas de MS-02, los avisos de MS-14 y las alertas de visibilidad, y sólo muestra las tarjetas que el perfil puede ver. El cálculo vive en MS-04 y se hace sobre sus propios hechos, nunca sobre la base que opera. Por qué: La composición es del BFF por la decisión 19; calcular sobre los hechos evita los 14 minutos por tarjeta de Omega contra la base de operación. Se apoya en PD-30, PD-05.
- D-RAC-06-7. Los hechos de Reportes (report_facts) se arman sólo con eventos y no son fuente de ninguna operación: si falta un evento, el paso queda abierto o «sin dato», y nunca se corrige un producto con lo que diga un reporte. Por qué: Cada dato tiene un dueño; un reporte que se vuelve fuente es una copia que nadie concilia. Se apoya en ADR-12.
Qué falta decidir
| ID | Qué falta |
|---|---|
| DUD-09 | Falta el catálogo de pasos TO-BE en una ERF; aquí los pasos son los estados y tareas del motor. |
| PD-18 | De la historia migrada depende cuánto hacia atrás se pueden medir los tiempos. |
| DUD-15 | Confirmar la paridad de los tableros de Omega que hoy corren fuera del programa. |
| DUD-31 | El BA escribe la sección de logs del sistema en la ERF; aquí los errores técnicos quedan en la observabilidad. |
Fuentes
- [D]
trazabilidad/features/FT-RAC-06-metricas-tiempos-paso-errores.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.