← Arquitectura por épica

FT-RAC-06 · Métricas de tiempos por paso y clasificación de errores

Arquitectura del Nuevo PIM por épica · corte del 18-oct-2026

Propuesta del TL: no sustituye la spec de cada épica

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

DeQué
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-commerceEl 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 SAPLos 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 erroresLos reportes clasificados por tipo de error y paso del alta, para medir dónde se atoran los sellers.

Entrega

AQué
PE-T · Usuario con permisos y bitácoraTiempos 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íasLa 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 productoLa 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

Nuevo PIM · un solo sistema

Pantallas y sistemas

Personas

STATUS_CHANGED
TASK_CHANGED

STATUS_CHANGED
DELIVERY_RESULT
y 2 más

SAP_ARTICLE_FAILED

DELIVERY_RESULT

Tableros

Tarjetas fijas
Recalcular una tarjeta fija
y 6 más

Historia de estado

Responde cada paso con su unidad

bitácora

Administración del catálogo

Compras

Entrada Única · Vendor Center

BFF del portal

MS-02 Producto

★ MS-04 Reportes

MS-05 Auditoría

MS-07 Ingesta de archivos

MS-08 Adaptadores de salida

Base pim

Eventos

Contexto de FT-RAC-06

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.

Entrada Única · Vendor CenterMS-08 Adaptadores de salidaMS-07 Ingesta de archivosBase·pimMS-04 ReportesEventosMS-02 ProductoEntrada Única · Vendor CenterMS-08 Adaptadores de salidaMS-07 Ingesta de archivosBase·pimMS-04 ReportesEventosMS-02 ProductoAdministración del catálogoBFF1. Avisa cada cambio de estado y de tareaSTATUS_CHANGED2. Entrega el cambio a ReportesSTATUS_CHANGED3. Cierra el paso anterior y abre el nuevo4. Avisa los errores de SAP del programa 141SAP_ARTICLE_FAILED5. Avisa el acuse o el rechazo de cada canalDELIVERY_RESULT6. Entrega errores y acuses a ReportesDELIVERY_RESULT7. Clasifica cada error por punto de detección8. Abre los tableros de operación9. Pide el tablero compuesto de su perfilGET /bff/v1/dashboards10. Trae el último resultado de cada tarjetaGET /api/v2/dashboards/fixed11. Recalcula la tarjeta de tiempo por pasoPOST /api/v2/dashboards/fixed/{cardId}/runs12. Guarda el resultado, «sin dato» no es cero13. Lee el resultado con su unidadGET /api/v2/dashboards/fixed/{cardId}/resultAdministración del catálogoBFF
Flujo principal de FT-RAC-06
Los pasos en texto
PasoDeAQué haceAPI o evento
1MS-02 ProductoEventosAvisa cada cambio de estado y de tareacatalog.product.changed/STATUS_CHANGED
2EventosMS-04 ReportesEntrega el cambio a Reportescatalog.product.changed/STATUS_CHANGED
3MS-04 ReportesBase pimCierra el paso anterior y abre el nuevo—
4MS-07 Ingesta de archivosEventosAvisa los errores de SAP del programa 141catalog.sap.inbound/SAP_ARTICLE_FAILED
5MS-08 Adaptadores de salidaEventosAvisa el acuse o el rechazo de cada canalcatalog.delivery.result/DELIVERY_RESULT
6EventosMS-04 ReportesEntrega errores y acuses a Reportescatalog.delivery.result/DELIVERY_RESULT
7MS-04 ReportesBase pimClasifica cada error por punto de detección—
8Administración del catálogoEntrada Única · Vendor CenterAbre los tableros de operación—
9Entrada Única · Vendor CenterBFF del portalPide el tablero compuesto de su perfilAPI-BFF-509
10BFF del portalMS-04 ReportesTrae el último resultado de cada tarjetaAPI-04-005
11Entrada Única · Vendor CenterMS-04 Reportes (por el BFF)Recalcula la tarjeta de tiempo por pasoAPI-04-006
12MS-04 ReportesBase pimGuarda el resultado; «sin dato» no es cero—
13Entrada Única · Vendor CenterMS-04 Reportes (por el BFF)Lee el resultado con su unidadAPI-04-007

3.1 El recorrido de un producto

MS-05 AuditoríaMS-04 ReportesEntrada Única · Vendor CenterMS-05 AuditoríaMS-04 ReportesEntrada Única · Vendor CenterAdministración del catálogoBFF1. Abre los pasos de una propuesta atorada2. Pide entrada, salida, duración y visitasGET /api/v2/metrics/products/{productId}/steps3. Completa con la historia migrada de P360GET /api/v2/audit/entities/{entityType}/{entityId}/status-histo…4. Responde cada paso con su unidadAdministración del catálogoBFF
El recorrido de un producto

3.2 Revisión de Compras y aprobadas sin revisión

Entrada Única · Vendor CenterMS-04 ReportesEventosMS-02 ProductoEntrada Única · Vendor CenterMS-04 ReportesEventosMS-02 ProductoComprasBFF1. Avisa el visto bueno y quién lo dioTASK_CHANGED2. Entrega la tarea cerrada a ReportesTASK_CHANGED3. Entrega los cambios de Compras tras aceptarPRODUCT_UPDATED4. Revisa sus métricas por sección5. Pide la tarjeta de revisión de ComprasPOST /api/v2/dashboards/fixed/{cardId}/runs6. Lee recepción, promedio, aprobación y sin revisiónGET /api/v2/dashboards/fixed/{cardId}/resultComprasBFF
Revisión de Compras y aprobadas sin revisión

3.3 Tablero a medida con diagnóstico

MS-04 ReportesEntrada Única · Vendor CenterMS-04 ReportesEntrada Única · Vendor CenterAdministración del catálogoBFF1. Arma una tarjeta: material vacío por negocio2. Lee su perfil de tablerosGET /api/v2/dashboards/custom/profile3. Guarda su tablero con versiónPUT /api/v2/dashboards/custom/profile4. Calcula la tarjeta guardadaPOST /api/v2/dashboards/custom/cards/{cardId}/runs5. Enciende el diagnóstico para soporte6. Activa el diagnóstico del usuarioPUT /api/v2/dashboards/diagnosticsAdministración del catálogoBFF
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
CampoValor
APIAPI-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 épicaLas tarjetas fijas con su último resultado, sin recalcular
Quién la llamaBFF del portal
PermisoREP-L (CAT-L y ENT-L); cada tarjeta pide su capacidad
CabecerasAuthorization, X-Request-Id
Parámetrosbusiness = 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

HTTPCódigoCuándo
403AUTHORIZATION_ERRORQuien llama no tiene lectura de reportes
POST /api/v2/dashboards/fixed/{cardId}/runs · Recalcular una tarjeta fija
CampoValor
APIAPI-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 épicaRecalcular una tarjeta fija para un rango y un negocio
Quién la llamaBFF del portal
PermisoREP-L y la capacidad de la tarjeta
CabecerasAuthorization, X-Request-Id, Idempotency-Key
ParámetroscardId = STEP_TIMES
Escribe endashboard_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

HTTPCódigoCuándo
400VALIDATION_ERROREl rango pasa de 5 años o Desde es mayor que Hasta
423LOCKEDYa 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
CampoValor
APIAPI-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 épicaEl resultado de una tarjeta con su unidad y «sin dato»
Quién la llamaBFF del portal
PermisoREP-L y la capacidad de la tarjeta
CabecerasAuthorization, X-Request-Id
ParámetroscardId = 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

HTTPCódigoCuándo
404NOT_FOUNDLa tarjeta no existe o nunca se calculó para ese usuario
GET /api/v2/dashboards/custom/profile · Mis tableros a medida
CampoValor
APIAPI-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 épicaLeer el perfil de tableros a medida
Quién la llamaBFF del portal
PermisoREP-L, sobre su propio perfil
CabecerasAuthorization, 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

HTTPCódigoCuándo
404NOT_FOUNDEl usuario todavía no guarda tableros
PUT /api/v2/dashboards/custom/profile · Guardar mis tableros a medida
CampoValor
APIAPI-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 épicaGuardar el perfil de tableros a medida con versión
Quién la llamaBFF del portal
PermisoREP-L, sobre su propio perfil
CabecerasAuthorization, X-Request-Id, If-Match
Escribe endashboard_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

HTTPCódigoCuándo
409VERSION_CONFLICTEl perfil cambió en otra pestaña o sesión
400VALIDATION_ERRORPasa 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
CampoValor
APIAPI-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 épicaCalcular una tarjeta a medida
Quién la llamaBFF del portal
PermisoREP-L, sobre su propio perfil
CabecerasAuthorization, X-Request-Id, Idempotency-Key
ParámetroscardId = crd-11
Escribe endashboard_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

HTTPCódigoCuándo
409VERSION_CONFLICTLa tarjeta cambió durante el cálculo o no coincide con la guardada
404NOT_FOUNDLa tarjeta no está guardada
PUT /api/v2/dashboards/diagnostics · Diagnóstico de tableros
CampoValor
APIAPI-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 épicaEncender o apagar el diagnóstico de un usuario
Quién la llamaBFF del portal
PermisoEl propio usuario con REP-DIAG (soporte)
CabecerasAuthorization, X-Request-Id, Idempotency-Key
Escribe endashboard_profiles

Request

{
  "enabled": true
}

Response · 200

{
  "success": true,
  "data": {
    "enabled": true,
    "until": "2026-10-18T17:30:00Z"
  }
}

Errores

HTTPCódigoCuándo
403AUTHORIZATION_ERROREl usuario no tiene REP-DIAG
GET /api/v2/metrics/products/{productId}/steps · Pasos de un producto
CampoValor
APIAPI-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 épicaEl recorrido de un producto paso por paso
Quién la llamaBFF del portal
PermisoENT-L (proveedores y sellers, sólo sus productos)
CabecerasAuthorization, X-Request-Id
ParámetrosproductId = 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

HTTPCódigoCuándo
404NOT_FOUNDEl producto no existe o no es visible para quien llama
GET /bff/v1/dashboards · Tableros
CampoValor
APIAPI-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 épicaLa pantalla de tableros compuesta por perfil
Quién la llamaEntrada Única · Vendor Center (por el BFF)
PermisoREP-L; cada tarjeta se muestra sólo si el perfil tiene su capacidad
CabecerasX-Request-Id
Parámetrosbusiness = 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

HTTPCódigoCuándo
403AUTHORIZATION_ERROREl 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.

APIMétodo y rutaPara qué, aquíLa construye
API-05-002GET /api/v2/audit/entities/{entityType}/{entityId}/status-historyLa historia de estado migrada de P360FT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y…
API-02-121POST /internal/product/exports/pagesLeer la bandera de enriquecido de los publicados para su tarjetaFT-RAC-07 · Reportes, exportes, importes y búsquedas por atributos

6. Eventos

Consume

EventoPara quéQuién lo publica
catalog.product.changed/STATUS_CHANGEDAbrir y cerrar cada paso con su visita, y marcar cuándo un producto queda AprobadoFT-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_CHANGEDMedir 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_ADDEDContar rechazos de Compras y de reglas como errores de visto bueno o de reglasFT-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_UPDATEDVer cambios de Compras después de aceptar y medir la latencia de los calculadosFT-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_FAILEDClasificar el error como detectado en SAPFT-INT-03
catalog.delivery.result/DELIVERY_RESULTMedir de Aprobado a Publicado por canal y clasificar rechazos como detectados en publicación o en integraciónFT-CAT-02, FT-CAT-05, FT-INT-01, FT-INT-02, FT-INT-05, FT-INT-07, FT-PRD-02
catalog.validation.result/EVALUATION_DONEContar renglones rechazados de cargas masivas como detectados en reglasFT-FLU-03, FT-FLU-05, FT-REF-03
catalog.asset.changed/ASSET_REJECTEDClasificar el error como detectado en imágenesFT-ACT-01, FT-ACT-02, FT-ACT-03
catalog.ai.result/AI_QUALITY_READYClasificar lo que no alcanzó el umbral como detectado en calidadFT-IA-05, FT-RAC-03
catalog.studio.changed/SAMPLE_RETURNEDReportes 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ónDueñoQué guardaEsta épica
report_factsMS-04Los 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_resultsMS-04El último resultado de cada tarjeta.escribe
dashboard_profilesMS-04Los tableros personales de cada usuario.escribe
report_factsMS-04Los 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_resultsMS-04El último resultado de cada tarjeta.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-RAC-06·H1 · El tiempo de cada paso del alta por negocioP1pasos 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…P1flujo «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ónP2pasos 4, 5, 6, 7; API-04-007
FT-RAC-06·H4 · Medir el tiempo entre la aprobación y la publicación por canalP2pasos 5, 6; API-04-006, API-04-007
FT-RAC-06·H5 · Medir la latencia de atributos calculadosP3API-04-006, API-04-007
FT-RAC-06·H6 · Tableros de operaciónP2pasos 8, 9, 10, 11, 12, 13; flujo «Tablero a medida con diagnóstico»; API-BFF-509
FT-RAC-06·H7 · Cuántos enriquecidos hay publicadosP2API-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

IDQué falta
DUD-09Falta el catálogo de pasos TO-BE en una ERF; aquí los pasos son los estados y tareas del motor.
PD-18De la historia migrada depende cuánto hacia atrás se pueden medir los tiempos.
DUD-15Confirmar la paridad de los tableros de Omega que hoy corren fuera del programa.
DUD-31El BA escribe la sección de logs del sistema en la ERF; aquí los errores técnicos quedan en la observabilidad.

Fuentes

  1. [D] trazabilidad/features/FT-RAC-06-metricas-tiempos-paso-errores.md: la ficha de la épica, con sus historias, reglas y bloqueos.
  2. [D] ADR-12 · Un solo sistema: backend compartido y una sola base (sección 3.4).
  3. [D] docs/arquitectura/por-epica/base/: piezas, colecciones, eventos y el hilo de punta a punta.
  4. [D] docs/arquitectura/omega-a-pim-headless/contratos-api.md: convenciones y endpoints de partida.
  5. [D] docs/arquitectura/maquina-de-estados-to-be/propuesta-maquina-de-estados.md §7: estados, tareas y canales.
  6. [I] Las decisiones de la sección 9 son del TL sobre esas fuentes.