← Arquitectura por épica

FT-MIG-01 · Perfilado y limpieza previa

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-MIG-01: 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-MIG-01.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-MIG-01-perfilado-politica-pasa-no-pasa.md.

En 30 segundos

Antes de migrar hay que saber qué tan sucio está P360 y decidir qué entra. Esta épica perfila el universo vivo de P360, evalúa reglas de pasa o no pasa por entidad y negocio, prioriza la limpieza por oferta activa y deja, con la firma de Gobierno de Producto, qué entra en cada ola, qué va a cuarentena y qué se excluye, cada cosa con su motivo.

  • Módulo dueño: MS-03 Migración y convivencia.
  • Etapa M · Migración. Recibe «PE-T · Usuario con permisos y bitácora», «PE-C · Catálogo vigente» y entrega a otras épicas.
  • APIs: construye 4 y usa 0 que construyen otras épicas.
  • Eventos: publica 0 y consume 0.

1. Dónde encaja

Recibe

DeQué
PE-T · Usuario con permisos y bitácoraUsuarios con permisos y bitácora: el equipo de migración opera con MIG-ADMIN y cada firma queda registrada con su área.
PE-C · Catálogo vigenteLa configuración destino de plantillas y atributos, para saber a dónde llega cada atributo de la matriz.

Entrega

AQué
FT-MIG-02 · Migración de plantillas, atributos y listas de valoresLa corrida de perfil firmada: qué plantillas pasan, las que no tienen atributos con su destino y la matriz por atributo.
FT-MIG-03 · Migración inicial de productos desde P360Las reglas firmadas de la ola: qué productos pasan, cuáles van a cuarentena y cuáles se excluyen, con su regla.
FT-MIG-05 · RemediaciónLo que no pasa, con su regla y su destino, para decidir si se remedia desde otra fuente.

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

Sistemas externos

Nuevo PIM · un solo sistema

Pantallas y sistemas

Personas

Lanzar una corrida de migración
Perfil y completitud de una ola
y 2 más

Lee el universo vivo de la revisión 1

Entrega el extracto de oferta activa…

Deja la completitud por producto en u…

Administración del catálogo

Gobierno de Datos

Áreas con sección

QA y Category

Entrada Única · Vendor Center

BFF del portal

★ MS-03 Migración y convivencia

Archivos e imágenes

Base pim

P360

Contexto de FT-MIG-01

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.

Base·pimArchivosP360MS-03 Migración y convivenciaEntrada Única · Vendor CenterBase·pimArchivosP360MS-03 Migración y convivenciaEntrada Única · Vendor CenterBFFAdministración del catálogo1. Lanza la corrida de perfil con las reglas propuestasPOST /api/v2/migration/runs2. Lee el universo vivo de la revisión 13. Entrega el extracto de oferta activa del canal4. Cuenta por atributo y evalúa cada regla5. Deja lo que no pasa con su regla y destino6. Deja la completitud por producto en un archivo7. Consulta el perfil por atributo, negocio y ofertaGET /api/v2/migration/runs/{runId}/profile8. Revisa conteos e incidencias por reglaGET /api/v2/migration/runs/{runId}9. Gobierno de Producto firma reglas y resultado10. Registra la firma: la ola queda definidaPOST /api/v2/migration/runs/{runId}/signoffsBFFAdministración del catálogo
Flujo principal de FT-MIG-01
Los pasos en texto
PasoDeAQué haceAPI o evento
1Entrada Única · Vendor CenterMS-03 Migración y convivencia (por el BFF)Lanza la corrida de perfil con las reglas propuestasAPI-03-001
2MS-03 Migración y convivenciaP360Lee el universo vivo de la revisión 1—
3Archivos e imágenes (almacén y CDN)MS-03 Migración y convivenciaEntrega el extracto de oferta activa del canal—
4MS-03 Migración y convivenciaBase pimCuenta por atributo y evalúa cada regla—
5MS-03 Migración y convivenciaBase pimDeja lo que no pasa con su regla y destino—
6MS-03 Migración y convivenciaArchivos e imágenes (almacén y CDN)Deja la completitud por producto en un archivo—
7Entrada Única · Vendor CenterMS-03 Migración y convivencia (por el BFF)Consulta el perfil por atributo, negocio y ofertaAPI-03-012
8Entrada Única · Vendor CenterMS-03 Migración y convivencia (por el BFF)Revisa conteos e incidencias por reglaAPI-03-002
9Administración del catálogoEntrada Única · Vendor CenterGobierno de Producto firma reglas y resultado—
10Entrada Única · Vendor CenterMS-03 Migración y convivencia (por el BFF)Registra la firma: la ola queda definidaAPI-03-011

3.1 Matriz por atributo con su dueño

MS-03 Migración y convivenciaEntrada Única · Vendor CenterMS-03 Migración y convivenciaEntrada Única · Vendor CenterBFFÁreas con sección1. Carga la matriz con dueño, etapa y fuentePOST /api/v2/migration/runs2. Cada área marca sus atributos o «sin uso»3. Consulta qué atributos siguen sin dueñoGET /api/v2/migration/runs/{runId}/profile4. Cada área firma su parte de la matrizPOST /api/v2/migration/runs/{runId}/signoffsBFFÁreas con sección
Matriz por atributo con su dueño

3.2 Compuertas de la ola

MS-03 Migración y convivenciaEntrada Única · Vendor CenterMS-03 Migración y convivenciaEntrada Única · Vendor CenterGobierno de DatosBFFQA y Category1. Revisa lo que no pasa y su destino2. Pide las incidencias por regla y negocioGET /api/v2/migration/runs/{runId}3. QA certifica las interfaces de la ola4. Registra la confirmación escrita del negocioPOST /api/v2/migration/runs/{runId}/signoffsGobierno de DatosBFFQA y Category
Compuertas de la ola

4. Si algo sale mal

  • Una regla deja fuera algo que hoy sale a la tienda. La corrida lo marca aparte: lo que tiene envíos registrados no puede quedar «no pasa» sin decisión. Gobierno de Producto lo ve primero y decide cuarentena o excepción antes de firmar.
  • La ola no alcanza el umbral firmado (por ejemplo 99 %). La ola no arranca con esa regla: se limpia primero en P360 lo que tiene oferta activa o se firma un umbral distinto, con su motivo.
  • la base de P360 no responde o es la ventana de 01:45 a 02:30. La corrida espera; nunca lee en esa ventana y retoma por rangos sin repetir lo ya leído.
  • Falta el extracto de oferta activa. El perfil sale completo, sin el filtro, y lo dice; la oferta activa no se inventa.

5. APIs

Las que construye esta épica (4)

POST /api/v2/migration/runs · Lanzar una corrida de migración
CampoValor
APIAPI-03-001 · MS-03 Migración y convivencia
Para quéLanza una corrida de un tipo y alcance: perfil y política de la ola (PROFILE), catálogo (TEMPLATES, CATALOGS, CATEGORIES), usuarios (USERS), productos (PRODUCTS), lo que sólo vive en Omega (OMEGA_ONLY), historia de estados (STATUS_HISTORY), estado de entrega (DELIVERY_STATUS), trabajo vivo (LIVE_WORK: tareas, borradores y tableros), cruce de faltantes (CROSS_CHECK) o remediación (REMEDIATION). Con dryRun=true arma y concilia todo sin cargar.
En esta épicaLanzar la corrida de perfil con su juego de reglas y su matriz
Quién la llamaBFF del portal
PermisoMIG-ADMIN (equipo de migración)
CabecerasAuthorization, X-Request-Id, Idempotency-Key
Escribe enmig_runs
También la usanFT-CAT-01, FT-MIG-02, FT-MIG-03, FT-MIG-05, FT-USR-01

Request

{
  "type": "PRODUCTS",
  "rehearsal": "E1",
  "dryRun": false,
  "scope": {
    "wave": "OLA-1",
    "businesses": [
      "MER",
      "MKP",
      "SUB"
    ],
    "idRange": {
      "from": "1000000",
      "to": "1999999"
    }
  },
  "dependsOn": {
    "policyRunId": "run-prf-ola1-0002",
    "templatesRunId": "run-tpl-e1-0001"
  }
}

Response · 202

{
  "success": true,
  "data": {
    "runId": "run-prd-e1-0003",
    "status": "ACCEPTED",
    "links": {
      "self": "/api/v2/migration/runs/run-prd-e1-0003",
      "reconciliation": "/api/v2/migration/reconciliation?runId=run-prd-e1-0003"
    }
  }
}

Errores

HTTPCódigoCuándo
423LOCKEDYa corre otra corrida del mismo tipo y alcance
422BUSINESS_ERRORLa política o la carga de plantillas de la que depende no está firmada
503DEPENDENCY_UNAVAILABLEla base de P360 no responde o se pidió dentro de la ventana de 01:45 a 02:30
409IDEMPOTENCY_MISMATCHSe repite la llave de idempotencia con otro tipo o alcance
GET /api/v2/migration/runs/{runId} · Detalle de una corrida
CampoValor
APIAPI-03-002 · MS-03 Migración y convivencia
Para quéConteos de una corrida, versión del transformador, filas por segundo por tabla, tamaño de los documentos, incidencias por código y las firmas que ya tiene.
En esta épicaConteos e incidencias por regla de la corrida
Quién la llamaBFF del portal
PermisoMIG-ADMIN; las áreas que firman la ven en sólo lectura
CabecerasAuthorization, X-Request-Id
ParámetrosrunId = run-prd-e1-0003
También la usanFT-MIG-02, FT-MIG-03, FT-MIG-05

Request

null

Response · 200

{
  "success": true,
  "data": {
    "runId": "run-prd-e1-0003",
    "type": "PRODUCTS",
    "rehearsal": "E1",
    "status": "COMPLETED",
    "dryRun": false,
    "transformerVersion": "mig-prd 1.4.0",
    "startedAt": "2026-11-28T03:00:00Z",
    "finishedAt": "2026-11-28T03:41:10Z",
    "throughput": [
      {
        "table": "ArticleCharactValue",
        "rowsPerSecond": 52300
      },
      {
        "table": "ArticleRevision",
        "rowsPerSecond": 8100
      }
    ],
    "documents": {
      "avgKb": 41,
      "maxKb": 3900
    },
    "counts": {
      "read": 10000,
      "loaded": 9871,
      "quarantined": 104,
      "issues": 25,
      "unchangedOnRepeat": null
    },
    "issuesByCode": [
      {
        "code": "NO_TEMPLATE",
        "count": 97
      },
      {
        "code": "EAN_COLLISION",
        "count": 7
      },
      {
        "code": "VARIANT_WITHOUT_PARENT",
        "count": 25
      }
    ],
    "signoffs": [
      {
        "signoffId": "sgn-0418",
        "area": "QA",
        "decision": "APPROVED",
        "at": "2026-11-28T16:02:00Z",
        "evidenceRef": "TCK-0418"
      }
    ]
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDLa corrida no existe
POST /api/v2/migration/runs/{runId}/signoffs · Firmar el resultado de una corrida
CampoValor
APIAPI-03-011 · MS-03 Migración y convivencia
Para quéRegistra la firma del área dueña sobre una corrida: las reglas y el perfil de una ola, la conciliación de una carga, la confirmación escrita antes de una remediación o un criterio del go/no-go. Sin la firma, la corrida que depende de ella no arranca.
En esta épicaFirmar reglas, resultado y matriz de la ola
Quién la llamaBFF del portal
PermisoEl área que firma: Gobierno de Producto, Gobierno de Datos, QA o el comité de corte
CabecerasAuthorization, X-Request-Id, Idempotency-Key
ParámetrosrunId = run-prf-ola1-0002
Escribe enmig_runs
También la usanFT-MIG-02, FT-MIG-03, FT-MIG-04, FT-MIG-05

Request

{
  "area": "GOBIERNO_DE_PRODUCTO",
  "scope": "POLICY",
  "decision": "APPROVED",
  "comment": "Reglas de la ola 1: pasa lo que tiene completos los obligatorios de hoy en P360; umbral 99 %",
  "evidenceRef": "TCK-0412"
}

Response · 200

{
  "success": true,
  "data": {
    "runId": "run-prf-ola1-0002",
    "signoffId": "sgn-0412",
    "area": "GOBIERNO_DE_PRODUCTO",
    "decision": "APPROVED",
    "at": "2026-11-20T18:30:00Z",
    "runStatus": "SIGNED"
  }
}

Errores

HTTPCódigoCuándo
409NOT_EDITABLE_IN_STATUSLa corrida no ha terminado o esa área ya firmó
422VALIDATION_ERRORSe aprueba una conciliación con diferencias sin explicar
403AUTHORIZATION_ERRORQuien firma no pertenece al área
GET /api/v2/migration/runs/{runId}/profile · Perfil y completitud de una ola
CampoValor
APIAPI-03-012 · MS-03 Migración y convivencia
Para quéEl resultado de una corrida PROFILE: por atributo y negocio, cuántos productos tienen el dato (conteo real), su dueño, etapa y fuente según la matriz, y la completitud por producto con filtro de oferta activa. El detalle por producto se descarga como archivo.
En esta épicaPerfil por atributo y completitud con filtro de oferta activa
Quién la llamaBFF del portal
PermisoMIG-ADMIN, Gobierno de Producto, Gobierno de Datos y Category
CabecerasAuthorization, X-Request-Id
ParámetrosrunId = run-prf-ola1-0002, business = MER, activeOffer = True, page = 1, size = 50

Request

null

Response · 200

{
  "success": true,
  "data": {
    "runId": "run-prf-ola1-0002",
    "business": "MER",
    "activeOffer": true,
    "universe": {
      "families": 1450000,
      "withActiveOffer": 611000
    },
    "items": [
      {
        "attribute": "ALTO_EMPAQUE",
        "label": "Alto del empaque",
        "owner": "LOGISTICA",
        "stage": "CAPTURA",
        "source": "PROVEEDOR",
        "withValue": 412300,
        "withoutValue": 198700,
        "completeness": 0.675
      },
      {
        "attribute": "COLOR_PROVEEDOR",
        "label": "Color del proveedor",
        "owner": null,
        "stage": null,
        "source": "STIBO",
        "usage": "UNUSED",
        "decidedBy": "GOBIERNO_DE_PRODUCTO",
        "withValue": 12,
        "withoutValue": 610988,
        "completeness": 0.0
      }
    ],
    "templates": {
      "total": 4082,
      "withoutAttributes": 758,
      "eavPairsOutsideCategories": 0.105
    },
    "detailFile": {
      "path": "mig/profile/run-prf-ola1-0002/completitud_MER_oferta.csv",
      "rows": 611000
    },
    "page": 1,
    "size": 50,
    "total": 2996
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDLa corrida no existe o no es de tipo PROFILE

Las que usa y construye otra épica (0)

Su request y su response están en la página de la épica que la construye.

Ninguna.

6. Eventos

Esta épica no publica ni consume eventos.

7. Datos

Cada colección tiene un solo dueño, el único que escribe en ella.

ColecciónDueñoQué guardaEsta épica
mig_runsMS-03Cada corrida de migración con sus conteos.escribe
mig_issuesMS-03Lo que no se pudo migrar y por qué.escribe

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-MIG-01·H1 · Reglas por olaP1pasos 1, 4, 5, 9, 10; API-03-001, API-03-011
FT-MIG-01·H2 · Perfil antes de migrarP1pasos 2, 4, 7; API-03-012
FT-MIG-01·H3 · Completitud priorizadaP1pasos 3, 6, 7; API-03-012
FT-MIG-01·H4 · Matriz por atributoP2flujo «Matriz por atributo con su dueño»; API-03-012
FT-MIG-01·H5 · Lo que no pasaP2flujo «Compuertas de la ola»; API-03-002, API-03-011

9. Decisiones de esta épica

Las tomó el TL como arquitecto; quedan como [Propuesta] hasta que el equipo de la épica las revise.

  • D-MIG-01-1. La política es datos: cada corrida de perfil lleva su juego de reglas versionado (entidad, negocio, regla, umbral y destino: migrar, cuarentena o excluir) y su resultado por registro. Gobierno de Producto firma la corrida y la carga de una ola sólo arranca contra una política firmada. Por qué: Sin regla escrita y firmada no se distingue «no pasa» de «se olvidó»; la firma es la confirmación escrita que pidió el taller. Se apoya en RF-MIG-01, PEN-105, DEC-96.
  • D-MIG-01-2. La ola 1 no exige más obligatorios que P360: «pasa» se mide contra lo que hoy pide P360 para salir. Los obligatorios TO-BE sólo aplican a los cambios nuevos. Por qué: Lo migrado no debe bloquearse como hoy con la regla 776; las mejoras que aprobó Dirección no se cobran a lo que ya se vende. Se apoya en RF-MIG-02, DEC-ARQ-12, PD-01.
  • D-MIG-01-3. Lo dudoso entra a cuarentena (no se publica), lo excluido se archiva y nada se borra. El genérico sin plantilla es la primera regla de cuarentena. Por qué: Así lo propone la decisión de negocio del 17-oct para PD-19 y conserva la traza de todo lo que no entra. Se apoya en PD-19, DMS-86.
  • D-MIG-01-4. El perfil cuenta de verdad, sin filtros de fecha y sobre el universo vivo de la revisión 1; las cifras aproximadas sólo dimensionan. Por qué: Un filtro de fecha dejó productos fuera en una corrección anterior y la estadística de la base de P360 dio un fantasma de 460 millones. Se apoya en DEC-93, DUD-26.
  • D-MIG-01-5. La oferta activa se toma de un extracto del canal que entrega Prod Ecommerce en el almacén; MS-03 lo cruza y no la calcula. La completitud por producto sale en archivo y el resumen por atributo se consulta en API-03-012. Por qué: MS-03 sólo toca la base de P360 y no tiene la oferta; un archivo de 2.8 millones de filas no se pagina en pantalla. Se apoya en DUD-31, RF-MIG-03.
  • D-MIG-01-6. Lo que se limpia antes del corte se limpia en P360, que es la fuente; MS-03 no repara datos al cargarlos. Lo que no se alcance a limpiar entra en cuarentena con su regla. Por qué: Reparar al cargar crearía una tercera versión del dato que nadie puede conciliar contra P360. Se apoya en PEN-67, PEN-106.
  • D-MIG-01-7. Una ola es una carga completa con cuarentena, no cargas sucesivas con P360 como maestro de lo que falta: cada ola libera lo que ya cumple y lo demás espera en cuarentena dentro del PIM. Por qué: Mantiene un solo maestro por dato y evita convivir con dos dueños del mismo producto. Se apoya en PD-19, DMS-86.

Qué falta decidir

IDQué falta
PD-19Que Gobierno de Producto con Entrada Única firme por grupo qué se migra, qué va a cuarentena y qué se excluye.
DUD-13Dueño formal de la limpieza y calendario de olas.
DUD-31Fuente de la oferta activa y qué mide la completitud.
DUD-14Ruta de sólo lectura de el clúster a la base de P360 para correr el perfil.

También siguen abiertos: PEN-105, Umbral de la ola y su unidad (el 99 % es un ejemplo).

Fuentes

  1. [D] trazabilidad/features/FT-MIG-01-perfilado-politica-pasa-no-pasa.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.