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
| De | Qué |
|---|---|
| PE-T · Usuario con permisos y bitácora | Usuarios 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 vigente | La configuración destino de plantillas y atributos, para saber a dónde llega cada atributo de la matriz. |
Entrega
| A | Qué |
|---|---|
| FT-MIG-02 · Migración de plantillas, atributos y listas de valores | La 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 P360 | Las 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ón | Lo 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
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 | Entrada Única · Vendor Center | MS-03 Migración y convivencia (por el BFF) | Lanza la corrida de perfil con las reglas propuestas | API-03-001 |
| 2 | MS-03 Migración y convivencia | P360 | Lee el universo vivo de la revisión 1 | — |
| 3 | Archivos e imágenes (almacén y CDN) | MS-03 Migración y convivencia | Entrega el extracto de oferta activa del canal | — |
| 4 | MS-03 Migración y convivencia | Base pim | Cuenta por atributo y evalúa cada regla | — |
| 5 | MS-03 Migración y convivencia | Base pim | Deja lo que no pasa con su regla y destino | — |
| 6 | MS-03 Migración y convivencia | Archivos e imágenes (almacén y CDN) | Deja la completitud por producto en un archivo | — |
| 7 | Entrada Única · Vendor Center | MS-03 Migración y convivencia (por el BFF) | Consulta el perfil por atributo, negocio y oferta | API-03-012 |
| 8 | Entrada Única · Vendor Center | MS-03 Migración y convivencia (por el BFF) | Revisa conteos e incidencias por regla | API-03-002 |
| 9 | Administración del catálogo | Entrada Única · Vendor Center | Gobierno de Producto firma reglas y resultado | — |
| 10 | Entrada Única · Vendor Center | MS-03 Migración y convivencia (por el BFF) | Registra la firma: la ola queda definida | API-03-011 |
3.1 Matriz por atributo con su dueño
3.2 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
| Campo | Valor |
|---|---|
| API | API-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 épica | Lanzar la corrida de perfil con su juego de reglas y su matriz |
| Quién la llama | BFF del portal |
| Permiso | MIG-ADMIN (equipo de migración) |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | mig_runs |
| También la usan | FT-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
| HTTP | Código | Cuándo |
|---|---|---|
| 423 | LOCKED | Ya corre otra corrida del mismo tipo y alcance |
| 422 | BUSINESS_ERROR | La política o la carga de plantillas de la que depende no está firmada |
| 503 | DEPENDENCY_UNAVAILABLE | la base de P360 no responde o se pidió dentro de la ventana de 01:45 a 02:30 |
| 409 | IDEMPOTENCY_MISMATCH | Se repite la llave de idempotencia con otro tipo o alcance |
GET /api/v2/migration/runs/{runId} · Detalle de una corrida
| Campo | Valor |
|---|---|
| API | API-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 épica | Conteos e incidencias por regla de la corrida |
| Quién la llama | BFF del portal |
| Permiso | MIG-ADMIN; las áreas que firman la ven en sólo lectura |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | runId = run-prd-e1-0003 |
| También la usan | FT-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
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | La corrida no existe |
POST /api/v2/migration/runs/{runId}/signoffs · Firmar el resultado de una corrida
| Campo | Valor |
|---|---|
| API | API-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 épica | Firmar reglas, resultado y matriz de la ola |
| Quién la llama | BFF del portal |
| Permiso | El área que firma: Gobierno de Producto, Gobierno de Datos, QA o el comité de corte |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Parámetros | runId = run-prf-ola1-0002 |
| Escribe en | mig_runs |
| También la usan | FT-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
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | NOT_EDITABLE_IN_STATUS | La corrida no ha terminado o esa área ya firmó |
| 422 | VALIDATION_ERROR | Se aprueba una conciliación con diferencias sin explicar |
| 403 | AUTHORIZATION_ERROR | Quien firma no pertenece al área |
GET /api/v2/migration/runs/{runId}/profile · Perfil y completitud de una ola
| Campo | Valor |
|---|---|
| API | API-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 épica | Perfil por atributo y completitud con filtro de oferta activa |
| Quién la llama | BFF del portal |
| Permiso | MIG-ADMIN, Gobierno de Producto, Gobierno de Datos y Category |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | runId = 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
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | La 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ón | Dueño | Qué guarda | Esta épica |
|---|---|---|---|
mig_runs | MS-03 | Cada corrida de migración con sus conteos. | escribe |
mig_issues | MS-03 | Lo que no se pudo migrar y por qué. | escribe |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-MIG-01·H1 · Reglas por ola | P1 | pasos 1, 4, 5, 9, 10; API-03-001, API-03-011 |
| FT-MIG-01·H2 · Perfil antes de migrar | P1 | pasos 2, 4, 7; API-03-012 |
| FT-MIG-01·H3 · Completitud priorizada | P1 | pasos 3, 6, 7; API-03-012 |
| FT-MIG-01·H4 · Matriz por atributo | P2 | flujo «Matriz por atributo con su dueño»; API-03-012 |
| FT-MIG-01·H5 · Lo que no pasa | P2 | flujo «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
| ID | Qué falta |
|---|---|
| PD-19 | Que Gobierno de Producto con Entrada Única firme por grupo qué se migra, qué va a cuarentena y qué se excluye. |
| DUD-13 | Dueño formal de la limpieza y calendario de olas. |
| DUD-31 | Fuente de la oferta activa y qué mide la completitud. |
| DUD-14 | Ruta 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
- [D]
trazabilidad/features/FT-MIG-01-perfilado-politica-pasa-no-pasa.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.