Known limitations
Hallazgos reales, confirmados en el código (o confirmados en vivo) — varios de los cuales ninguna
prueba unitaria aislada había detectado antes de que existiera este Business Case. La versión
técnica completa, con citas de archivo:línea, vive en examples/marketplace-mercatto/GAPS.md;
esta página es el índice legible para humanos, en el orden en que los capítulos las referencian.
F.1 — El Settlement no depende del estado del Workflow
executeSettlement() puede llamarse con o sin que se haya ingerido nunca un evento de entrega —
Ishtaran valida invariantes financieros, nunca hechos del mundo físico. Este es un diseño
deliberado, no un bug: confirmar la entrega antes del settlement es trabajo del integrador. Ver
Confirming delivery.
F.2 — No hay clawback después de un Settlement completo
Una vez que un Settlement distribuyó por completo el Distributable Amount, no existe ningún mecanismo de la plataforma para revertir lo que ya se acreditó. Cualquier corrección después de ese punto es un movimiento nuevo y separado — nunca una edición al Settlement histórico.
F.3 — No hay ruta pública para leer la Pricing Policy por adelantado
Un integrador solo conoce el porcentaje de Fee real a partir del resultado de un Settlement en sí — nunca antes de llamarlo. Ver Settlement and Split.
F.4 — No hay mecanismo oficial de Sandbox para saltar los cooldowns de Withdrawal
Ni el cooldown de activación de destino de 24h ni el cooldown de cambio de destino de 168h pueden adelantarse. Este Business Case nunca los salta — ver Withdrawal.
F.9 — Algunas llamadas necesitan una sesión de Member, no una API Key
accounts.authorizeApplication, cada mutación de workflows.*, y events.ingest rechazan hoy
una Application API Key. Ver Architecture.
F.10 — No hay API financiera self-service para AccountHolders
El propio login de un vendedor solo puede gestionar su propia identidad — no revisar su balance ni solicitar un retiro. Cada llamada financiera en su nombre usa las credenciales propias del marketplace. Ver Seller balance.
F.15 — Los Settlements parciales rápidos pueden producir un conflicto de concurrencia transitorio
Comportamiento estándar y esperado de concurrencia optimista (409 CONCURRENT_MODIFICATION)
cuando llamadas de Settlement caen muy cerca una de otra sobre el mismo pedido — la respuesta
correcta es un reintento acotado, igual que en cualquier API de concurrencia optimista. Ver
Partial Settlement.
F.16 — El camino de ejecución real del Settlement es SelfCustody, no "calcula el Fee y registra el Ledger"
Versiones anteriores de este tutorial (y de su propio diagrama de arquitectura) describían
executeSettlement como si registrara Ledger Entries directamente. Eso era correcto para el
modelo ManagedCustody de la plataforma, pero SelfCustody — el único modo que este Sandbox
realmente corre hoy (DEC-037, docs/architecture/CUSTODY-EXECUTION-MODES.md) — es distinto:
executeSettlement construye un SigningRequest real y retorna con el Settlement en Executing;
nada es final, y no existe ninguna Ledger Entry todavía, hasta que cada execution leg se firma,
se transmite, y se confirma. Ver Settlement and Split para la mecánica
completa, y self-custody-settlement.ts para el código de firmar/confirmar/esperar que reutiliza
cada capítulo desde ahí en adelante.
F.17 — El Settlement ahora requiere un NetworkCostPayerAccount registrado
Transmitir las execution legs de un Settlement cuesta recursos de red reales, cobrados por
separado del Platform Fee — Mercatto tiene que decirle a Ishtaran, una vez por AssetNetwork, cuál
de sus propias Accounts paga eso. Sin esto, executeSettlement falla antes incluso de construir
ningún SigningRequest. Ver Settlement and Split y
register-network-cost-payer-account.ts.
F.18 — Pregunta de producto abierta: ¿cómo recibe su primer saldo un NetworkCostPayerAccount nuevo?
Registrar un NetworkCostPayerAccount (F.17) no basta por sí solo — la plataforma también
verifica el saldo Available real de esa Account antes de dejarla pagar nada, y hoy no existe
ninguna ruta para financiar una Account de forma independiente de una Transaction. Para el primer
Settlement real de un marketplace nuevo, esto es un problema real de huevo-y-gallina que la
plataforma todavía no resuelve: nada se ha liquidado todavía para financiar la cuenta, pero
financiarla requiere una liquidación. La verificación local de este tutorial sorteó esto con una
herramienta solo de desarrollo, nunca algo utilizable en Sandbox o Production — esto queda
registrado como una decisión abierta para el dueño de la plataforma, no resuelta aquí. Ver
GAPS.md §F.18 para el detalle completo.
Lo demás
GAPS.md también documenta hallazgos de ejecución de la plataforma fuera del alcance propio de
este tutorial, del mismo pase de auditoría:
- Todavía nada conecta la aprobación de
Settlement/Withdrawalsdirectamente con la creación automática de unSigningRequest— el propio código de este tutorial (release-order.ts,withdraw.ts) es quien cumple ese rol hoy, llamando aexecuteSettlement/requesty luego manejando el protocolo de firma explícitamente. Es trabajo real de cualquier forma, tanto en Sandbox como en Production — no es un gap exclusivo de Production. - La ejecución blockchain real — una transacción firmada realmente llegando a una red real — es exclusiva de Production y todavía no está disponible; el broadcast/confirmación de Sandbox es simulado de principio a fin, deliberadamente, no un atajo que este tutorial esconda.
Dos hallazgos anteriores de esta lista — el modelo de Network Fee sin distinguir el activo
transferido del recurso que paga la ejecución en red, y la falta de una verificación previa al
broadcast — se resolvieron con el Network Execution Engine de la plataforma (ver
Settlement and Split y Withdrawal); GAPS.md §F.13/F.14
mantiene los hallazgos originales registrados junto con lo que realmente cambió.
Ninguno de estos se corrige inventando una solución alternativa: cada uno o bien se corrigió de raíz (ver el propio rastro de auditoría de Ledger/Settlement de la plataforma) o está documentado con la precisión suficiente para que una sesión futura retome exactamente donde esta lo dejó.