const MODULE = 'phase3-order-splitting' const SCENARIO = 'parent-child-multi-container-consolidation' export async function run(context) { const fixture = context.createdResources?.phase3Loading || context.createdResources?.phase3ContainerLoading const metadata = { fixture: { available: Boolean(fixture?.inboundId && fixture?.containerBookingId), marker: fixture?.marker || null, inboundId: fixture?.inboundId || null, containerBookingId: fixture?.containerBookingId || null, }, activation: { state: 'pending-public-contract', assertions: [ '父单与自动剩余子单关系可由 HTTP 查询', '一单多柜关系由 container aggregate 返回', '一柜多单关系由 container aggregate 返回', '已装数量 + 自动子单剩余数量 = 拆分前数量', '同一 Idempotency-Key 与相同参数重放返回同一拆分结果', '同一 Idempotency-Key 与不同参数被冲突拒绝且无部分写入', '旧 expectedVersion 被冲突拒绝且父子订单数量不变', '平台与客户 fulfillment-tree 均隔离其他客户数据', '子订单继续拆分被拒绝,不产生嵌套层级', '已消费 REMAINDER 再次消费被拒绝且数量不变', ], }, } context.addCoverageGap(MODULE, SCENARIO, '父/子订单拆分、装载数量守恒与剩余自动子订单', 'PDA partial/skip 内部结算已实现,但公开 InboundOrderSummary/Detail 未返回 inboundRole、parentInboundId、rootInboundId、splitStatus 或拆分批次,HTTP 总控无法证明父子关系和守恒,不能用同 orderId 的记录数量伪造成功', 'contract-gap', metadata) context.addCoverageGap(MODULE, SCENARIO, '一单多柜与多单拼柜', 'SmartLoadingController 支持按明细分配,但当前公开契约没有订单-多柜/柜次-多订单关系聚合,也没有本轮安全 fixture 一次生成两个可装柜入库单;待真实查询 DTO 与专用 fixture 接口公开后转为断言', 'contract-gap', metadata) }