← Arquitectura por épica

FT-FLU-05 · Reglas de negocio en la carga masiva

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-FLU-05: 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-FLU-05.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-FLU-05-reglas-por-renglon-carga-masiva.md.

En 30 segundos

Un seller puede subir cientos o miles de productos en un archivo. Esta épica aplica a cada renglón las mismas reglas del alta individual (lista negra, coincidencia por EAN con la marca y decisión por negocio), sin imagen, URL ni IA para no frenar la carga, y deja en el reporte la acción de cada renglón: crear, crear multioferta o no se puede. Después de crear los productos, cada uno recibe su calificación con sugerencias para mejorarla.

  • Módulo dueño: MS-06 Evaluación. También participan: MS-01 Catálogo, MS-02 Producto.
  • Etapa 0 · Entrada. Recibe de otras épicas y entrega «PE-1 · Propuesta en Borrador», «PE-2 · Sin duplicado».
  • APIs: construye 3 y usa 9 que construyen otras épicas.
  • Eventos: publica 2 y consume 1.

1. Dónde encaja

Recibe

DeQué
FT-FLU-04 · Carga masiva de productos por archivoLos renglones ya revisados en estructura, tipos y listas, en bloques de hasta 500 con su rowRef, su negocio, su plantilla y su dueño.
FT-REF-02 · Blacklist de Marketplace por marca, negocio y grupo de…La lista negra vigente, la misma del alta individual.
FT-REF-03 · Servicio de matchingLa búsqueda de coincidencias por EAN con la marca como campo de peso, con los mismos pesos y bandas.
FT-FLU-03 · Decisión por negocio ante coincidenciaLa tabla de decisión por negocio y el texto de cada acción para el reporte.
FT-CAT-03 · Categorización de productosEl cálculo de la categoría de cada renglón por el mapeo de su plantilla, que es una de las cuatro reglas.

Entrega

AQué
FT-FLU-04 · Carga masiva de productos por archivoLa acción y el texto de cada renglón para el reporte: crear, crear multioferta porque existe en Marketplace o en Liverpool, EAN duplicado o no se puede catalogar.
PE-1 · Propuesta en BorradorLos renglones que siguen, creados en Borrador con origen BULK y su evaluación guardada.
PE-2 · Sin duplicadoEsos mismos renglones ya sin duplicado: su evaluación dice CONTINUE.
FT-INT-05 · Multioferta y stock outLos renglones que ya existen, con su acción (multioferta o stock out) y el SKU sobre el que puede ofertar el seller.
FT-PRD-10 · Catalogación por API del proveedor o sellerLas mismas reglas por renglón para los lotes que llegan por la API de terceros.
FT-IA-05 · Enriquecimiento continuo después de crear el SKU y después…Los productos creados sin IA, que se enriquecen después de tener SKU.

Cambios de estado que hace

TransiciónDe → aCuándo
T01Inicio → BorradorEl proveedor o seller guarda por primera vez (pantalla, archivo, plantilla en línea o API).

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

Subir una carga masiva de producto
Reporte por renglón de una carga
y 2 más

Evaluar los renglones de una carga ma…
Resultado de una evaluación masiva
y 1 más

Consultar reglas
Vista efectiva de una plantilla por n…

POST /internal/product/match-candidat…
Foto del producto para publicar

EVALUATION_DONE

EVALUATION_DONE

PRODUCT_CREATED

Detalle de una evaluación

Seller

Proveedor

Entrada Única · Vendor Center

BFF del portal

MS-01 Catálogo

MS-02 Producto

★ MS-06 Evaluación

Base pim

Eventos

Contexto de FT-FLU-05

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.

EventosBase·pimMS-01 CatálogoMS-06 EvaluaciónMS-02 ProductoEntrada Única · Vendor CenterEventosBase·pimMS-01 CatálogoMS-06 EvaluaciónMS-02 ProductoEntrada Única · Vendor CenterSellerBFF1. Sube su archivo de carga masiva2. Sube el archivo para revisarlo sin escribirPOST /api/v2/product-imports3. Manda los renglones en bloques de 500POST /api/v2/evaluations/batches4. Consulta la lista negra vigenteGET /api/v2/rules?type=5. Pide candidatos por EAN de cada renglónPOST /internal/product/match-candidates6. Aplica la tabla y guarda la acción por renglón7. Avisa que terminó el bloqueEVALUATION_DONE8. Entrega el aviso del bloqueEVALUATION_DONE9. Lee la acción de cada renglónGET /api/v2/evaluations/batches/{batchId}10. Muestra el reporte con la acción por renglónGET /api/v2/product-imports/{id}/report11. Confirma la cargaPOST /api/v2/product-imports/{id}/apply12. Crea en Borrador sólo los renglones que siguen13. Avisa las propuestas nuevasPRODUCT_CREATEDSellerBFF
Flujo principal de FT-FLU-05
Los pasos en texto
PasoDeAQué haceAPI o evento
1SellerEntrada Única · Vendor CenterSube su archivo de carga masiva—
2Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Sube el archivo para revisarlo sin escribirAPI-02-046
3MS-02 ProductoMS-06 EvaluaciónManda los renglones en bloques de 500API-06-002
4MS-06 EvaluaciónMS-01 CatálogoConsulta la lista negra vigenteAPI-01-016
5MS-06 EvaluaciónMS-02 ProductoPide candidatos por EAN de cada renglónAPI-02-123
6MS-06 EvaluaciónBase pimAplica la tabla y guarda la acción por renglón—
7MS-06 EvaluaciónEventosAvisa que terminó el bloquecatalog.validation.result/EVALUATION_DONE
8EventosMS-02 ProductoEntrega el aviso del bloquecatalog.validation.result/EVALUATION_DONE
9MS-02 ProductoMS-06 EvaluaciónLee la acción de cada renglónAPI-06-003
10Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Muestra el reporte con la acción por renglónAPI-02-205
11Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Confirma la cargaAPI-02-047
12MS-02 ProductoBase pimCrea en Borrador sólo los renglones que siguen—
13MS-02 ProductoEventosAvisa las propuestas nuevascatalog.product.changed/PRODUCT_CREATED

3.1 Renglones que ya existen o están vetados

Entrada Única · Vendor CenterMS-02 ProductoBase·pimMS-06 EvaluaciónEntrada Única · Vendor CenterMS-02 ProductoBase·pimMS-06 EvaluaciónSellerBFF1. EAN de otro seller en Marketplace: crear multioferta2. EAN de Liverpool: multioferta por stock out3. Marca vetada: no se puede catalogar4. No crea esos renglones y guarda su acción5. Baja el reporte con la acción de cada renglón6. Pide el SKU sobre el que puede ofertarGET /api/v2/offer-targets/{sku}SellerBFF
Renglones que ya existen o están vetados

3.2 Proveedor de Mercaderías: EAN duplicado

Base·pimMS-06 EvaluaciónMS-02 ProductoEntrada Única · Vendor CenterBase·pimMS-06 EvaluaciónMS-02 ProductoEntrada Única · Vendor CenterProveedorBFF1. Sube su archivo de Mercaderías2. Sube el archivo para revisarloPOST /api/v2/product-imports3. Manda los renglones, sin lista negraPOST /api/v2/evaluations/batches4. Pide candidatos por EAN en MercaderíasPOST /internal/product/match-candidates5. Marca DUPLICATE el renglón con EAN ya usado6. Muestra «EAN duplicado» en el reporteGET /api/v2/product-imports/{id}/reportProveedorBFF
Proveedor de Mercaderías: EAN duplicado

3.3 Calificación después de la carga

Entrada Única · Vendor CenterEventosBase·pimMS-01 CatálogoMS-06 EvaluaciónMS-02 ProductoEntrada Única · Vendor CenterEventosBase·pimMS-01 CatálogoMS-06 EvaluaciónMS-02 ProductoSellerBFF1. Pide calificar hasta 100 productos creadosPOST /api/v2/scores2. Lee cada producto con sus valoresGET /internal/product/products/{id}/publication-snapshot?versio…3. Lee los niveles de la plantilla por negocioGET /api/v2/taxonomies/PRODUCT/nodes/{id}/effective4. Guarda la calificación con sugerencias5. Avisa que terminó el loteEVALUATION_DONE6. Entrega las calificacionesEVALUATION_DONE7. Ve su calificación y qué completar8. Pide el detalle de lo que le faltaGET /api/v2/evaluations/{evaluationId}SellerBFF
Calificación después de la carga

4. Si algo sale mal

  • Un renglón coincide sólo con Suburbia. Sale «no se puede catalogar» con la explicación de la tabla de decisión; cuando se decida la regla de Suburbia se cambia la fila sin tocar código.
  • MS-06 no termina un bloque. MS-02 lo reintenta con la misma llave de idempotencia: lo ya evaluado no se repite. El reporte muestra esos renglones «en revisión» y el resto sigue.
  • Cambió la lista negra entre la revisión y la confirmación. Al confirmar, MS-02 vuelve a evaluar sólo los renglones de evaluaciones vencidas o hechas con otra versión de reglas; un renglón que quedó vetado no se crea y el reporte lo dice.
  • El archivo trae 20,000 renglones. Son 40 bloques que MS-06 atiende en paralelo con tope; el reporte se llena por bloque y el seller ve el avance.

5. APIs

Las que construye esta épica (3)

POST /api/v2/evaluations/batches · Evaluar los renglones de una carga masiva
CampoValor
APIAPI-06-002 · MS-06 Evaluación
Para quéEvalúa un bloque de hasta 500 renglones de una carga masiva con las mismas reglas del alta individual: lista negra, coincidencia por EAN con la marca como campo de peso y decisión por negocio, sin imagen, URL ni IA. Cada renglón se identifica por su rowRef, nunca por su posición. Responde 202 y avisa con EVALUATION_DONE cuando termina el bloque.
En esta épicaEvaluar un bloque de hasta 500 renglones con las reglas del alta individual
Quién la llamaMS-02 Producto
PermisoSólo MS-02 (cuenta de servicio)
CabecerasAuthorization, X-Request-Id, Idempotency-Key
Escribe envalidation_results
Publicacatalog.validation.result/EVALUATION_DONE
También la usanFT-FLU-04, FT-FLU-06, FT-PRD-10, FT-REF-02, FT-REF-03

Request

{
  "importId": "imp-0000042",
  "chunk": 1,
  "business": "MKP",
  "owner": {
    "type": "SELLER",
    "id": "SELLER-0001"
  },
  "templateId": "EU4-0412",
  "rows": [
    {
      "rowRef": "SEL-001-PB20",
      "brandCode": "MARCA01",
      "model": "PB-20",
      "ean": "7501234567893",
      "productType": "BATERIA_EXTERNA"
    },
    {
      "rowRef": "SEL-001-PB10",
      "brandCode": "MARCA01",
      "model": "PB-10",
      "ean": "7501234500012",
      "productType": "BATERIA_EXTERNA"
    },
    {
      "rowRef": "SEL-001-AUD7",
      "brandCode": "MARCA09",
      "model": "AUD-7",
      "ean": "7501234500029",
      "productType": "AUDIFONOS"
    }
  ]
}

Response · 202

{
  "success": true,
  "data": {
    "batchId": "evb-0000318",
    "status": "ACCEPTED",
    "rows": 3,
    "links": {
      "self": "/api/v2/evaluations/batches/evb-0000318"
    }
  }
}

Errores

HTTPCódigoCuándo
422VALIDATION_ERRORMás de 500 renglones, o un renglón sin rowRef o con rowRef repetido
409IDEMPOTENCY_MISMATCHEl mismo bloque llega otra vez con contenido distinto
503DEPENDENCY_UNAVAILABLENo hay lista negra vigente ni en caché; el bloque queda en espera y MS-02 reintenta
GET /api/v2/evaluations/batches/{batchId} · Resultado de una evaluación masiva
CampoValor
APIAPI-06-003 · MS-06 Evaluación
Para quéDevuelve, renglón por renglón, la acción que corresponde (crear, crear multioferta, stock out, no se puede catalogar, revisar) con el texto que verá el seller en el reporte.
En esta épicaLeer la acción y el texto de cada renglón
Quién la llamaMS-02 Producto, Entrada Única · Vendor Center (por el BFF)
PermisoMS-02, y el seller o proveedor dueño de la carga
CabecerasAuthorization, X-Request-Id
ParámetrosbatchId = evb-0000318, page = 1, size = 500
También la usanFT-FLU-03, FT-FLU-04, FT-REF-02, FT-REF-03

Request

null

Response · 200

{
  "success": true,
  "data": {
    "batchId": "evb-0000318",
    "importId": "imp-0000042",
    "status": "DONE",
    "finishedAt": "2026-10-18T16:05:40Z",
    "summary": {
      "CONTINUE": 1,
      "MULTI_OFFER": 1,
      "BLOCK": 1
    },
    "items": [
      {
        "rowRef": "SEL-001-PB20",
        "evaluationId": "evl-0000901",
        "action": "MULTI_OFFER",
        "reasonCode": "EXISTS_IN_MKP",
        "message": "Crear multioferta porque existe en Marketplace",
        "targetSku": "1000004812",
        "confidence": 1.0
      },
      {
        "rowRef": "SEL-001-PB10",
        "evaluationId": "evl-0000902",
        "action": "CONTINUE",
        "reasonCode": "NO_MATCH",
        "message": "Producto nuevo: se crea la propuesta",
        "targetSku": null,
        "confidence": 0.41
      },
      {
        "rowRef": "SEL-001-AUD7",
        "evaluationId": "evl-0000903",
        "action": "BLOCK",
        "reasonCode": "BRAND_BLOCKED",
        "message": "No se puede catalogar: la marca es de productos que comercializa Liverpool (1P o Mercaderías)",
        "targetSku": null,
        "confidence": null
      }
    ],
    "page": 1,
    "size": 500,
    "total": 3
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDEl bloque no existe o no es de quien llama
409NOT_EDITABLE_IN_STATUSEl bloque sigue en proceso: todavía no hay resultado
POST /internal/product/match-candidates · La misma ruta interna que pide FT-REF-03: candidatos por EAN
CampoValor
APIAPI-02-123 · MS-02 Producto
Para quéLa misma ruta interna que pide FT-REF-03: candidatos por EAN exacto y por marca y modelo normalizados, para varias consultas a la vez (hasta 500 por llamada en la carga masiva).
En esta épicaPedir a MS-02 candidatos por EAN de cada renglón
También la usanFT-REF-03

Request

{
  "businesses": [
    "MER",
    "MKP",
    "SUB"
  ],
  "maxPerQuery": 5,
  "statuses": [
    "EN_REVISION",
    "CREACION_SKU",
    "EN_ENRIQUECIMIENTO",
    "APROBADO",
    "EN_MODIFICACION"
  ],
  "queries": [
    {
      "ref": "SEL-001-PB20",
      "ean": "7501234567893",
      "brandCode": "MARCA01"
    },
    {
      "ref": "SEL-001-PB10",
      "ean": "7501234500012",
      "brandCode": "MARCA01"
    }
  ]
}

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "ref": "SEL-001-PB20",
        "candidates": [
          {
            "productId": "PRD-0004812",
            "business": "MKP",
            "owner": {
              "type": "SELLER",
              "id": "SELLER-0004"
            },
            "status": "APROBADO",
            "sku": "1000004812",
            "lifecycle": "ACTIVO",
            "matchedOn": [
              "EAN",
              "MARCA"
            ]
          }
        ]
      },
      {
        "ref": "SEL-001-PB10",
        "candidates": []
      }
    ]
  }
}

Errores

HTTPCódigoCuándo
403AUTHORIZATION_ERRORQuien llama no tiene el permiso o no es el módulo autorizado
422VALIDATION_ERRORFalta un dato o viene con un formato inválido; el detalle dice qué campo
409IDEMPOTENCY_MISMATCHSe repite la llave de idempotencia con otro cuerpo

Las que usa y construye otra épica (9)

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-06-006POST /api/v2/scoresCalificar en lote los productos creadosFT-RAC-02 · Score de calidad del producto
API-06-004GET /api/v2/evaluations/{evaluationId}Ver qué le falta a un producto para subir su calificaciónFT-FLU-03 · Decisión por negocio ante coincidencia
API-01-016GET /api/v2/rules?type=Leer la lista negra vigenteFT-PLT-07 · Reglas de atributos
API-01-028GET /api/v2/taxonomies/PRODUCT/nodes/{id}/effectiveLeer los niveles de cada atributo para la calificaciónFT-PLT-06 · Configuración de atributos por plantilla y por negocio…
API-02-046POST /api/v2/product-importsSubir y revisar el archivo sin escribirFT-FLU-04 · Carga masiva de productos por archivo
API-02-047POST /api/v2/product-imports/{id}/applyConfirmar la carga y crear los renglones que siguenFT-FLU-04 · Carga masiva de productos por archivo
API-02-205GET /api/v2/product-imports/{id}/reportMostrar el reporte por renglónFT-FLU-04 · Carga masiva de productos por archivo
API-02-054GET /internal/product/products/{id}/publication-snapshot?version=Leer cada producto creado para calificarloFT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio
API-02-404GET /api/v2/offer-targets/{sku}Llevar al seller a ofertar sobre el SKU de un renglón que ya existeFT-INT-05 · Multioferta y stock out

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.validation.result/EVALUATION_DONETermina un bloque de renglones o un lote de calificacionesFT-FLU-02, FT-FLU-03, FT-FLU-04, FT-FLU-06, FT-PRD-10, FT-RAC-06, FT-REF-03
catalog.product.changed/PRODUCT_CREATEDMS-02 crea las propuestas de los renglones que siguenFT-ARQ-01

Consume

EventoPara quéQuién lo publica
catalog.validation.result/EVALUATION_DONEMS-02 lee la acción de cada renglón para el reporte, o guarda las calificaciones de los productos creadosesta misma épica

7. Datos

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

ColecciónDueñoQué guardaEsta épica
validation_resultsMS-06El resultado de cada evaluación: lista negra, coincidencias con su confianza y score.escribe
governance_rulesMS-01Reglas de captura y clasificación: marcas por plantilla, grupo de artículo a plantilla, alcance del proveedor y lista negra de Marketplace.lee
validation_thresholdsMS-06Los umbrales de coincidencia y de calificación por negocio.lee
identifier_registryMS-02Unicidad de SKU y de EAN por negocio.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-FLU-05·H1 · Mismas reglas en ambos canalesP1pasos 3, 4, 5, 6, 9, 10; flujo «Renglones que ya existen o están vetados»; API-06-002, API-06-003
FT-FLU-05·H2 · Acción por renglón cuando el producto existeP1flujo «Renglones que ya existen o están vetados»; API-06-003, API-02-404
FT-FLU-05·H3 · Cuatro reglas, sin IAP1pasos 3, 5, 6; API-06-002
FT-FLU-05·H4 · Score después de la cargaP2flujo «Calificación después de la carga»; API-06-006, API-06-004
FT-FLU-05·H5 · Reglas de datos para MercaderíasP3flujo «Proveedor de Mercaderías: EAN duplicado»

9. Decisiones de esta épica

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

  • D-FLU-05-1. Cada renglón pasa por la misma evaluación que el alta individual, en bloques de hasta 500 identificados por rowRef y con respuesta asíncrona (API-06-002 y EVALUATION_DONE): con los mismos datos, la misma decisión. Por qué: Si la masiva tuviera reglas propias, el seller recibiría respuestas distintas para el mismo producto. Se apoya en RN-MAS-03, DEC-56, RF-MAT-20.
  • D-FLU-05-2. Cuatro reglas y en este orden: datos (formato, obligatorios y EAN, que revisa MS-02 en el archivo), lista negra, coincidencia por EAN con la marca como peso, y categoría por el mapeo de la plantilla (FT-CAT-03). Sin imagen, URL ni IA para crear; la IA llega después del SKU (FT-IA-05). Por qué: Enriquecer 450 renglones con IA antes de crearlos tardaría días y costaría de más; el orden es el del alta individual: lista negra antes que coincidencia. Se apoya en RN-MAS-05, DEC-61, DEC-57, RN-MAT-05.
  • D-FLU-05-3. La evaluación de un renglón vale 24 horas y guarda con qué versión de reglas se hizo; si el seller confirma después o la lista negra cambió, MS-02 vuelve a evaluar sólo esos renglones antes de crearlos. Por qué: Entre revisar y confirmar puede pasar tiempo; no se puede crear con una lista negra vieja. Se apoya en RN-MAT-05, RF-MAS-07.
  • D-FLU-05-4. Los renglones con coincidencia o vetados no se crean: su acción va al reporte con el texto de la tabla de decisión («crear multioferta porque existe en Marketplace», «… porque está en Liverpool», «no se puede catalogar», «EAN duplicado») y la multioferta se hace con FT-INT-05. Por qué: Con coincidencia no se crea SKU ni se enriquece; el reporte reemplaza al mensaje en pantalla. Se apoya en RF-MAS-07, DEC-39, RN-MAS-04.
  • D-FLU-05-5. En la carga masiva la calificación se calcula después de crear las propuestas, en lotes de 100 (API-06-006), y no detiene la creación; cuenta para la publicación por rangos (FT-RAC-03) y el seller la ve con sugerencias para mejorarla. Por qué: Dos carreteras: el SKU no espera al contenido; la calidad decide la publicación, no la creación. Se apoya en PD-24, RN-CAL-08, RF-MAS-12.
  • D-FLU-05-6. Mercaderías y Suburbia usan la misma carga y la misma evaluación, sin lista negra: sólo reglas de datos y coincidencia por EAN en su negocio, donde un EAN ya usado sale como «EAN duplicado», como hoy. Por qué: La lista negra protege el surtido de Liverpool de los sellers; aplicada a sus propios proveedores lo bloquearía. Se apoya en DUD-32, RF-MAT-01.

Qué falta decidir

IDQué falta
PD-24Confirmar que en la masiva la calificación no condiciona el SKU (aquí no lo condiciona).

También siguen abiertos: PEN-19, La regla de Suburbia para los renglones que coinciden sólo con Suburbia (aquí arranca en «no se puede»); PEN-22, Ratificar las bandas de confianza de la coincidencia por EAN y marca; PEN-47, Quién valida lo que la IA agrega después del SKU en productos de carga masiva.

Fuentes

  1. [D] trazabilidad/features/FT-FLU-05-reglas-por-renglon-carga-masiva.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.