Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-MIG-03: 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-03.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-MIG-03-migracion-inicial-de-productos.md.
En 30 segundos
Los cerca de 3.4 millones de productos vivos de P360 tienen que pasar al Nuevo PIM sin perder nada y sin bloquear lo que hoy se vende. Esta épica los extrae de P360, arma cada familia con sus variantes, valores, imágenes y clasificaciones, la carga en Producto con su estado y su estado por canal, manda a cuarentena lo dudoso y concilia todo contra P360 antes de firmar.
- Módulo dueño: MS-03 Migración y convivencia. También participan: MS-02 Producto, MS-05 Auditoría, MS-08 Adaptadores de salida, MS-11 Activos digitales, MS-12 Estudio fotográfico.
- Etapa M · Migración. Recibe «PE-C · Catálogo vigente» y entrega «PE-M · Producto migrado».
- APIs: construye 3 y usa 11 que construyen otras épicas.
- Eventos: publica 0 y consume 0.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| FT-MIG-01 · Perfilado y limpieza previa | Las reglas firmadas de la ola: qué productos pasan, cuáles van a cuarentena y cuáles se excluyen. |
| FT-MIG-02 · Migración de plantillas, atributos y listas de valores | Las plantillas conciliadas y firmadas en MS-01. |
| PE-C · Catálogo vigente | El catálogo vigente con el que se valida cada familia: plantillas, listas y reglas de salida. |
| FT-PRD-01 · Modelo canónico de producto | La forma del documento, las reglas de integridad y la derivación del tipo con que se carga lo migrado. |
| FT-ARQ-01 · Núcleo headless | La carga interna por llave de negocio y sin eventos (API-02-056) para la migración inicial. |
| FT-INT-01 · Publicación a e-commerce | El ensayo sin envío (API-08-005) para comparar lo publicable contra la tienda. |
| FT-ACT-02 · Registro, congelado y publicación de URLs de activos | La carga de activos migrados (API-11-016): cada URL de trabajo y congelada de P360 queda una vez en Activos, sin copiar archivos ni cambiar URL. |
| FT-ACT-05 · Servicios para Foro Fotográfico | La carga de las decisiones de tomar o no tomar de P360 como valor de lista del Estudio (API-12-013). |
Entrega
| A | Qué |
|---|---|
| PE-M · Producto migrado | Cada familia viva de P360 en Producto con su estado, su estado por canal sembrado y su historia de estados: entra al hilo en PE-8 o PE-9 sin repetir etapas. |
| FT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y… | La versión 1 de cada producto migrado, con su corrida, y la historia de estados de P360 y Omega (API-05-006). |
| FT-MIG-04 · Convivencia P360 ↔ nuevo PIM | La carga completa, conciliada y firmada antes de R2, que la convivencia mantiene al día. |
| FT-MIG-05 · Remediación | Lo migrado con su mapa de identificadores, base del cruce de faltantes. |
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 carga de productos con la política firmada | API-03-001 |
| 2 | MS-03 Migración y convivencia | P360 | Extrae por rangos la revisión 1 viva | — |
| 3 | MS-03 Migración y convivencia | Archivos e imágenes (almacén y CDN) | Deja la extracción cifrada en archivos | — |
| 4 | MS-03 Migración y convivencia | Base pim | Arma cada familia y aplica las reglas de la ola | — |
| 5 | MS-03 Migración y convivencia | MS-02 Producto | Carga la familia con SKU, EAN y estado por canal | API-02-056 |
| 6 | MS-03 Migración y convivencia | MS-11 Activos digitales | Registra sus imágenes sin copiar archivos | API-11-016 |
| 7 | MS-03 Migración y convivencia | MS-12 Estudio fotográfico | Carga su decisión de tomar o no tomar | API-12-013 |
| 8 | MS-03 Migración y convivencia | MS-05 Auditoría | Carga la historia de estados de P360 | API-05-006 |
| 9 | MS-03 Migración y convivencia | Base pim | Guarda mapa de identificadores, conteos y huellas | — |
| 10 | Entrada Única · Vendor Center | MS-03 Migración y convivencia (por el BFF) | Revisa diferencias por tipo, negocio y estado | API-03-003 |
| 11 | Entrada Única · Vendor Center | MS-03 Migración y convivencia (por el BFF) | Revisa la cuarentena con su motivo | API-03-004 |
| 12 | QA y Category | Entrada Única · Vendor Center | QA firma la conciliación de la carga | — |
| 13 | Entrada Única · Vendor Center | MS-03 Migración y convivencia (por el BFF) | Registra la firma: la ola queda migrada | API-03-011 |
3.1 Piloto de 10,000 familias
3.2 Cuarentena y liberación
3.3 Lo publicable igual que en la tienda
4. Si algo sale mal
- Dos productos del mismo negocio tienen el mismo EAN. El segundo no se carga como vivo: entra en cuarentena por choque de EAN junto con el primero y Gobierno de Producto decide quién conserva el código; al corregirlo en P360 se libera.
- Un genérico no tiene plantilla. Se carga con la marca de cuarentena: no se publica ni se ofrece como aprobable hasta que Gobierno de Producto le asigne plantilla.
- Un artículo no tiene padre o tiene varios. No forma un documento válido: va completo a las incidencias con sus filas de origen y el equipo de migración corrige el mapeo y lo vuelve a cargar.
- La extracción mide menos de 30 millones de filas por hora. Se pide al DBA una tabla plana nocturna o más lectores en paralelo, y la carga se parte en dos noches por rangos de ID.
- Una familia que hoy sale quedaría bloqueada por una regla. La conciliación de salida lista la regla que la bloquea; ninguna familia con envíos registrados puede quedar en cuarentena sin decisión antes de firmar.
5. APIs
Las que construye esta épica (3)
GET /api/v2/migration/quarantine · Cuarentena de la migración
| Campo | Valor |
|---|---|
| API | API-03-004 · MS-03 Migración y convivencia |
| Para qué | Las familias que entraron en cuarentena (sin plantilla, sin negocio, tipo no previsto, choque de SKU o EAN en un negocio, etiqueta sin código) y lo que ni siquiera formó un documento, con quién lo libera y si la familia tiene envíos registrados en algún canal. |
| En esta épica | Lista de cuarentena con su motivo |
| Quién la llama | BFF del portal |
| Permiso | MIG-ADMIN con Gobierno de Producto |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | code = EAN_COLLISION, business = MER, hasDeliveries = True, status = OPEN, page = 1, size = 50 |
| También la usan | FT-CAT-01, FT-MIG-05, FT-PRD-01 |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"id": "qr-1033301-EAN_COLLISION",
"productId": "PRD-0004812",
"legacy": {
"system": "P360",
"identifier": "1033301"
},
"code": "EAN_COLLISION",
"detail": "El EAN 7501234567909 también lo tiene la familia 1033412 en MER",
"releasedBy": "GOBIERNO_DE_PRODUCTO",
"hasDeliveries": true,
"runId": "run-prd-e1-0003",
"detectedAt": "2026-11-28T03:22:15Z",
"status": "OPEN"
}
],
"page": 1,
"size": 50,
"total": 1
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | El código de cuarentena no existe |
POST /api/v2/migration/quarantine/{id}/release · Liberar una cuarentena
| Campo | Valor |
|---|---|
| API | API-03-005 · MS-03 Migración y convivencia |
| Para qué | Pide liberar una cuarentena corrigiendo el dato, no apagando la marca: MS-03 vuelve a leer la familia de P360 (donde se corrige mientras P360 sea la fuente), Producto la revalida con sus reglas y se recarga sin la marca. Si sigue rota, responde qué regla falla. Descartar un registro exige la decisión de Gobierno de Producto. |
| En esta épica | Liberar una cuarentena revalidando la familia |
| Quién la llama | BFF del portal |
| Permiso | MIG-ADMIN con Gobierno de Producto; DISCARD sólo Gobierno de Producto |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Parámetros | id = qr-1033301-EAN_COLLISION |
| Escribe en | mig_issues |
Request
{
"action": "REVALIDATE",
"reason": "Gobierno de Producto dejó el EAN en la familia 1033301 y lo quitó de la 1033412 en P360",
"approvalRef": "TCK-0421"
}
Response · 202
{
"success": true,
"data": {
"requestId": "req-qr-0071",
"status": "ACCEPTED",
"receiptUrl": "/api/v2/migration/quarantine?id=qr-1033301-EAN_COLLISION"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | NOT_EDITABLE_IN_STATUS | La cuarentena ya se liberó o se descartó |
| 422 | BUSINESS_ERROR | La familia releída sigue rompiendo la regla; details dice cuál |
| 403 | AUTHORIZATION_ERROR | Se pide DISCARD sin el rol de Gobierno de Producto |
GET /api/v2/migration/id-map?legacyId=&system= · Mapa de identificadores heredados
| Campo | Valor |
|---|---|
| API | API-03-006 · MS-03 Migración y convivencia |
| Para qué | Traduce un ID de P360, de Omega o de Entrada Única a la llave del producto en el Nuevo PIM y dice cómo se resolvió: directo, por Identifier, ganó P360 o sin resolver. |
| En esta épica | Traducir un ID de P360, Omega o Entrada Única a su llave nueva |
| Quién la llama | BFF del portal, MS-02 Producto, MS-04 Reportes |
| Permiso | MIG-ADMIN y cuentas de servicio de MS-02 y MS-04 |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | legacyId = -4471, system = OMEGA |
| También la usan | FT-MIG-05 |
Request
null
Response · 200
{
"success": true,
"data": {
"legacyId": "-4471",
"system": "OMEGA",
"table": "PRODUCTO",
"identifier": "1033301",
"productId": "PRD-0004812",
"resolution": "P360_WINS",
"owner": "P360",
"firstSeenRun": "run-prd-e1-0003",
"lastSeenRun": "run-prd-e3-0001"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El ID no está en el mapa |
Las que usa y construye otra épica (11)
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-03-001 | POST /api/v2/migration/runs | Lanzar la carga o el piloto de productos | FT-MIG-01 · Perfilado y limpieza previa |
| API-03-002 | GET /api/v2/migration/runs/{runId} | Velocidad, tamaño y conteos del piloto | FT-MIG-01 · Perfilado y limpieza previa |
| API-03-003 | GET /api/v2/migration/reconciliation?runId= | Diferencias por tipo, negocio y estado | FT-MIG-02 · Migración de plantillas, atributos y listas de valores |
| API-03-011 | POST /api/v2/migration/runs/{runId}/signoffs | Firmar la conciliación de la ola | FT-MIG-01 · Perfilado y limpieza previa |
| API-02-056 | POST /internal/product/bulk-load/products | Cargar la familia por llave de negocio, sin eventos | FT-ARQ-01 · Núcleo headless |
| API-05-006 | POST /internal/audit/bulk-load/status-history | Cargar la historia de estados de P360 | FT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y… |
| API-11-016 | POST /internal/assets/bulk-load | Registrar en Activos las URL de trabajo y congeladas de P360 | FT-ACT-02 · Registro, congelado y publicación de URLs de activos |
| API-12-013 | POST /internal/studio/bulk-load/decisions | Cargar en el Estudio las decisiones de tomar o no tomar | FT-ACT-05 · Servicios para Foro Fotográfico |
| API-08-005 | POST /internal/egress/rehearsals | Armar sin mandar lo que recibiría la tienda | FT-INT-01 · Publicación a e-commerce |
| API-02-054 | GET /internal/product/products/{id}/publication-snapshot?version= | Foto del producto para el ensayo | FT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio |
| API-02-041 | POST /api/v2/publications/eligibility | Ver si una familia migrada es enviable y por qué no | FT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio |
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 |
mig_reconciliation | MS-03 | Las diferencias entre P360 y el Nuevo PIM durante la convivencia. | escribe |
mig_id_map | MS-03 | El mapa de identidad entre sistemas: cada ID heredado de P360, Omega o Entrada Única con su llave en el Nuevo PIM y cómo se resolvió, y los bloques de Identifier reservados en la secuencia de P360. | escribe |
products | MS-02 | La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos. | escribe |
identifier_registry | MS-02 | Unicidad de SKU y de EAN por negocio. | escribe |
product_delivery_status | MS-02 | El estado de publicación por producto y canal: Pendiente, Enviado, Publicado, Error o Retirado. | escribe |
audit_events | MS-05 | Quién cambió qué, cuándo, desde dónde, con el antes y el después. | escribe |
assets | MS-11 | Cada archivo una vez: a qué producto, variante y posición pertenece, su validación técnica, URL de trabajo y URL congelada. | escribe |
studio_work | MS-12 | Tomas, ediciones y capturas por SKU, con quién las tiene asignadas. | escribe |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-MIG-03·H1 · Piloto | P1 | flujo «Piloto de 10,000 familias»; API-03-001, API-03-002 |
| FT-MIG-03·H2 · Carga conciliada | P1 | pasos 4, 5, 6, 7, 9, 10, 11; flujo «Cuarentena y liberación»; API-03-003, API-03-004, API-03-005 |
| FT-MIG-03·H3 · Sin bloqueos nuevos | P1 | flujo «Lo publicable igual que en la tienda»; API-02-041, API-03-003 |
| FT-MIG-03·H4 · Lo publicable igual | P2 | flujo «Lo publicable igual que en la tienda»; API-08-005 |
| FT-MIG-03·H5 · Identidad y versión | P2 | pasos 5, 9; API-03-006, API-02-056 |
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-03-1. La fuente es el la base de P360 de P360, revisión 1 o nula y fila viva. Se extrae por rangos de ID a archivos cifrados de retención corta y cada familia (genérico con sus variantes) se arma como un solo documento. Por qué: Entrada Única no guarda los valores y la copia de Omega no es confiable; leer por rangos permite paralelo y reintento por rango. Se apoya en DEC-ARQ-06, DEC-PRD-05, DEC-PRD-09, RSG-43.
- D-MIG-03-2. Cada familia se carga con API-02-056: SKU y EAN en el registro de identificadores en la misma transacción, versión 1 con razón MIGRATION, estado por canal sembrado «en sincronía con legado» y sin eventos. La historia de estados va a Auditoría (API-05-006) y la de valores arranca en cero. Por qué: Publicar millones de altas que no son altas saturaría a los consumidores; sembrar el estado por canal evita republicar en el corte. Se apoya en DEC-PRD-04, DEC-PRD-06, DEC-ARQ-09, FT-ARQ-01.
- D-MIG-03-3. El ID del producto sigue la política de PD-16 (prefijo de negocio más el Identifier de P360, propuesta del 17-oct). El Identifier, el proposalId de P360 y los ID técnicos de Omega quedan como alias en el producto y en el mapa de MS-03 (API-03-006), nunca como llave. Por qué: Un ID estable con la llave de P360 deja seguir cada producto entre sistemas durante la convivencia. Se apoya en PD-16, DUD-18, DEC-PRD-01.
- D-MIG-03-4. La cuarentena es una marca en el producto: sin plantilla, sin negocio, tipo no previsto, choque de SKU o EAN y etiqueta sin código. Lo marcado no se publica ni se ofrece como aprobable, y se libera corrigiendo el dato en la fuente y revalidando (API-03-005), nunca apagando la marca. Por qué: El dato corregido queda bien para siempre y con traza; liberar con una bandera publicaría datos rotos. Se apoya en DMS-86, PD-19.
- D-MIG-03-5. Sin bloqueos nuevos: lo migrado se valida para salir con las reglas de salida de hoy y no con los obligatorios TO-BE. La conciliación de salida lista la regla que bloquearía a cada familia que hoy sale, y ninguna familia con envíos registrados queda en cuarentena sin decisión. Por qué: Lo que hoy se vende no puede dejar de venderse por migrarlo. Se apoya en RF-MIG-02, DEC-ARQ-12.
- D-MIG-03-6. Lo publicable igual: antes del corte, MS-08 arma sin mandar (API-08-005) el mensaje de un juego de referencia y MS-03 lo compara campo por campo con products y skus de la tienda; cada diferencia se atribuye al broker, al procesador o al PIM. Las fechas centinela no se propagan. Por qué: Es la única forma de saber que la tienda recibirá lo mismo sin el broker. Se apoya en PD-23, FT-INT-01.
- D-MIG-03-7. La carga completa de productos se hace antes de R2, cuando las pantallas de producto pasan al BFF. Desde ahí la convivencia (FT-MIG-04) mantiene la copia al día y las pantallas escriben en P360 por MS-03 hasta el corte de R3. Por qué: Las pantallas de R2 necesitan la copia completa desde su primer día, y P360 sigue siendo la fuente hasta R3. Se apoya en ADR-12, FT-MIG-04.
- D-MIG-03-8. Cada dato migrado va a su dueño: la familia a Producto, sus imágenes a Activos (API-11-016) sin copiar archivos ni cambiar URL, la decisión de tomar o no tomar al Estudio (API-12-013) como valor de su lista, y la historia de estados a Auditoría. Lo que un dueño no puede aparear o traducir queda como incidencia de la corrida. Por qué: Una sola base con un dueño por colección: MS-03 no escribe datos de negocio, sólo los entrega a quien los guarda. Se apoya en ADR-12, FT-ACT-02, FT-ACT-05.
Qué falta decidir
| ID | Qué falta |
|---|---|
| PD-19 | Qué grupos entran: genéricos sin plantilla, eliminados, rechazados, borradores y lo de dueño STEP. |
| PD-16 | Ratificar la política de identificadores y el prefijo de cada negocio (DUD-18). |
| PD-18 | Qué historia se migra además de la de estados. |
| PD-17 | Tipos de producto y su derivación para lo que llega sin tipo. |
| DUD-15 | Inventario de lo que sólo vive en Omega. |
También siguen abiertos: RSG-09, Conteo exacto del universo: las cifras de P360, del modelo y de la PAC no coinciden.
Fuentes
- [D]
trazabilidad/features/FT-MIG-03-migracion-inicial-de-productos.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.