
CASE C29-01 :: 正常路径：HTTP 下单、重放、支付成功、重复回调、拒付归还库存、outbox 投递、对账
  note POST /orders -> 201 outcome=CREATED order_id=ord-0001 status=CREATED ; replay -> 200 outcome=REPLAY order_id=ord-0001 status=CREATED
  ok   首次下单 201 (expected=201, actual=201)
  ok   同 request_key 重放 (expected=REPLAY, actual=REPLAY)
  ok   重放返回同一订单 (expected=ord-0001, actual=ord-0001)
  note POST /orders/ord-0001/pay -> 200 status=PAID
  ok   同步应答 CHARGED 后订单 PAID (expected=PAID, actual=PAID)
  note callbacks [CHARGED:DUPLICATE PAID, CHARGED:DUPLICATE PAID]
  ok   两份回调都判定为重复 (expected=[CHARGED:DUPLICATE PAID, CHARGED:DUPLICATE PAID], actual=[CHARGED:DUPLICATE PAID, CHARGED:DUPLICATE PAID])
  ok   预留已确认 (expected=CONFIRMED, actual=CONFIRMED)
  ok   渠道拒付 → FAILED (expected=FAILED, actual=FAILED)
  ok   拒付后预留归还 (expected=RELEASED, actual=RELEASED)
  ok   库存 5 - 已确认 1 = 4 (expected=4, actual=4)
  ok   outbox 两条终态事件投递 (expected=2, actual=2)
  ok   消费者收到 PAID (expected=ORDER_PAID, actual=ORDER_PAID)
  ok   发货一次 (expected=1, actual=1)
  note timeline ord-0001: [-->CREATED v1 create] [CREATED->PAYING v2 pay] [PAYING->PAID v3 charge reply]
  note reconcile classes={FAILED=1, PAID=1} mismatches=0 pending=0 channel_net=1990 paid_sum=1990 confirmed=1 paid=1 drift=0
  ok   对账无差异
  ok   渠道净额 = PAID 金额 (expected=1990, actual=1990)

CASE C29-02 :: 状态机拒绝路径：重复支付、非法取消、键复用、限购、金额不符、未知订单、售罄不落库
  ok   同键不同用户 → KEY_REUSED (expected=KEY_REUSED, actual=KEY_REUSED)
  ok   同用户第二单 → USER_LIMIT (expected=USER_LIMIT, actual=USER_LIMIT)
  note 8 concurrent pay -> {PAID=1, REJECTED PAYING=7}
  ok   并发支付只有一个进入渠道并成功 (expected=1, actual=1)
  ok   渠道只收到一次扣款请求 (expected=1, actual=1)
  ok   PAID 再支付被拒绝
  ok   PAID 不能取消 (expected=REJECTED PAID, actual=REJECTED PAID)
  ok   CREATED 可取消 (expected=CANCELLED, actual=CANCELLED)
  ok   取消归还预留 (expected=RELEASED, actual=RELEASED)
  ok   CANCELLED 不能支付 (expected=REJECTED CANCELLED, actual=REJECTED CANCELLED)
  ok   重复取消被拒绝 (expected=REJECTED CANCELLED, actual=REJECTED CANCELLED)
  ok   回调已应答 (expected=200, actual=200)
  ok   金额不符的成功通知不改变状态 (expected=[CHARGED:AMOUNT_MISMATCH], actual=[CHARGED:AMOUNT_MISMATCH])
  ok   订单仍为 CREATED (expected=CREATED, actual=CREATED)
  ok   未知订单的通知只记录 (expected=[CHARGED:UNKNOWN_ORDER], actual=[CHARGED:UNKNOWN_ORDER])
  ok   库存 3 已被 o1 确认、o3/o4 占用 (expected=0, actual=0)
  ok   售罄 (expected=SOLD_OUT, actual=SOLD_OUT)
  ok   售罄不留订单行 (expected=0, actual=0)
  note orders {CANCELLED=1, CREATED=2, PAID=1} o4=ord-0006
  ok   守恒 (expected=0, actual=0)

CASE C29-03 :: 边界：同一订单上支付与取消并发（10 单，各一对线程）
  note final {CANCELLED=3, PAID=7} charge_requests=7
  ok   每单要么 PAID 且渠道已扣款，要么 CANCELLED 且渠道无记录
  ok   扣款请求数 = PAID 数 (expected=7, actual=7)
  note reconcile classes={CANCELLED=3, PAID=7} mismatches=0 pending=0 channel_net=13930 paid_sum=13930 confirmed=7 paid=7 drift=0
  ok   对账无差异

CASE C29-04 :: 超时：渠道已扣款但应答丢失 → UNKNOWN，保留预留，查询后收敛为 PAID
  ok   客户端 300ms 超时 → UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  ok   渠道侧已经扣款 (expected=CHARGED, actual=CHARGED)
  ok   UNKNOWN 不归还库存 (expected=HELD, actual=HELD)
  note reconcile classes={UNKNOWN=1} mismatches=0 pending=1 channel_net=1990 paid_sum=0 confirmed=0 paid=0 drift=0
  ok   收敛前：无差异、1 单待收敛
  note resolve -> {query:CHARGED->PAID=1}
  ok   查询 CHARGED → PAID (expected=PAID, actual=PAID)
  ok   预留确认 (expected=CONFIRMED, actual=CONFIRMED)
  ok   迟到的回调判定为重复 (expected=[CHARGED:DUPLICATE PAID], actual=[CHARGED:DUPLICATE PAID])
  note timeline ord-0001: [-->CREATED v1 create] [CREATED->PAYING v2 pay] [PAYING->UNKNOWN v3 charge timeout] [UNKNOWN->PAID v4 query]
  note reconcile classes={PAID=1} mismatches=0 pending=0 channel_net=1990 paid_sum=1990 confirmed=1 paid=1 drift=0
  ok   对账无差异

CASE C29-05 :: 超时：请求滞留未到渠道 → 查询 NOT_FOUND → 关单 → FAILED；迟到的扣款被渠道拒绝
  ok   超时 → UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  ok   此刻渠道没有记录 (expected=NOT_FOUND, actual=NOT_FOUND)
  note resolve -> {close:CLOSED->FAILED=1}
  ok   关单结果 CLOSED → FAILED (expected=FAILED, actual=FAILED)
  ok   库存归还 (expected=2, actual=2)
  ok   迟到的扣款请求遇到 CLOSED，未扣款 (expected=CLOSED, actual=CLOSED)
  ok   关单后同号再扣款，渠道应答 result=CLOSED (expected=CLOSED, actual=CLOSED)
  ok   渠道账本无扣款行 (expected=0, actual=0)
  note timeline ord-0001: [-->CREATED v1 create] [CREATED->PAYING v2 pay] [PAYING->UNKNOWN v3 charge timeout] [UNKNOWN->FAILED v4 close CLOSED]
  note reconcile classes={FAILED=1} mismatches=0 pending=0 channel_net=0 paid_sum=0 confirmed=0 paid=0 drift=0
  ok   对账无差异

CASE C29-06 :: 回调：16 份重复并发到达；退款通知先于扣款通知到达（乱序）
  ok   UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  note 16 duplicate callbacks -> http {200=16} effects {DUPLICATE PAID=15, PAID=1}
  ok   只有一份造成迁移 (expected=1, actual=1)
  ok   其余 15 份为重复 (expected=15, actual=15)
  ok   outbox 只有一条 ORDER_PAID (expected=1, actual=1)
  ok   只迁移一次 (expected=1, actual=1)
  ok   第二单 UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  ok   第二单预留到期被释放 (expected=1, actual=1)
  note resolve -> {query:CHARGED->REFUNDED=1}
  ok   钱到了但名额没了 → 退款 → REFUNDED (expected=REFUNDED, actual=REFUNDED)
  note held notices [CHARGED, REFUNDED]，倒序发送
  ok   乱序回调不改变终态 (expected=[REFUNDED:IGNORED REFUNDED, CHARGED:DUPLICATE REFUNDED], actual=[REFUNDED:IGNORED REFUNDED, CHARGED:DUPLICATE REFUNDED])
  ok   仍为 REFUNDED (expected=REFUNDED, actual=REFUNDED)
  note timeline ord-0002: [-->CREATED v1 create] [CREATED->PAYING v2 pay] [PAYING->UNKNOWN v3 charge timeout] [UNKNOWN->REFUNDING v4 query stock lost (SOLD_OUT)] [REFUNDING->REFUNDED v5 refund reply]
  note reconcile classes={CREATED=1, PAID=1, REFUNDED=1} mismatches=0 pending=0 channel_net=1990 paid_sum=1990 confirmed=1 paid=1 drift=0
  ok   对账无差异

CASE C29-07 :: 预留到期后才得知支付成功：A 重新占用成功；B 占不到 → 退款，首次退款应答超时后同键重试
  ok   A UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  ok   B UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  ok   两条预留到期释放 (expected=2, actual=2)
  ok   C 占走 1 件，剩 1 件 (expected=1, actual=1)
  ok   A：重新占用并确认 (expected=[CHARGED:PAID_REHELD], actual=[CHARGED:PAID_REHELD])
  ok   A 的当前预留换成 /r2 (expected=ord-0001/r2, actual=ord-0001/r2)
  ok   B：占不到，进入 REFUNDING (expected=[CHARGED:REFUNDING], actual=[CHARGED:REFUNDING])
  ok   退款应答超时，B 停在 REFUNDING (expected=REFUNDING, actual=REFUNDING)
  ok   渠道侧其实已退款 (expected=REFUNDED, actual=REFUNDED)
  note resolve -> {refund-retry:REFUNDED=1}
  ok   同键重试 → REFUNDED (expected=REFUNDED, actual=REFUNDED)
  ok   渠道账本只有一笔退款 (expected=1, actual=1)
  note B effects [CHARGED:REFUNDING, REFUNDED:IGNORED REFUNDED, CHARGED:DUPLICATE REFUNDED]
  ok   迟到的成功通知不让 B 复活 (expected=REFUNDED, actual=REFUNDED)
  ok   C 未受影响 (expected=CREATED, actual=CREATED)
  note timeline ord-0001: [-->CREATED v1 create] [CREATED->PAYING v2 pay] [PAYING->UNKNOWN v3 charge timeout] [UNKNOWN->PAID v4 callback ntf-0001 re-reserved ord-0001/r2]
  note timeline ord-0002: [-->CREATED v1 create] [CREATED->PAYING v2 pay] [PAYING->UNKNOWN v3 charge timeout] [UNKNOWN->REFUNDING v4 callback ntf-0002 stock lost (SOLD_OUT)] [REFUNDING->REFUNDED v5 refund reply]
  note reconcile classes={CREATED=1, PAID=1, REFUNDED=1} mismatches=0 pending=0 channel_net=1990 paid_sum=1990 confirmed=1 paid=1 drift=0
  ok   对账无差异
  ok   库存守恒 (expected=0, actual=0)

CASE C29-08 :: 并发：20 个成功回调、2 个到期释放任务、10 个新用户抢购同时进行
  ok   20 单 UNKNOWN (expected=20, actual=20)
  note original 20 callback effects {PAID_REHELD=13, REFUNDING=7} ; newcomers {PAID=7, SOLD_OUT=3}
  note orders {PAID=20, REFUNDED=7}
  ok   PAID 数 20 不超过库存 20
  ok   无待收敛订单 (expected=0, actual=0)
  note reconcile classes={PAID=20, REFUNDED=7} mismatches=0 pending=0 channel_net=39800 paid_sum=39800 confirmed=20 paid=20 drift=0
  ok   对账无差异
  ok   渠道净额 = PAID 金额之和 (expected=39800, actual=39800)

CASE C29-09 :: Outbox：两个中继并发（SKIP LOCKED）投递 40 条；重复与旧版本直接投给消费者
  ok   40 条未发布事件 (expected=40, actual=40)
  note per relay sent {0=20, 1=20}
  ok   两个中继合计发送 40 条 (expected=40, actual=40)
  ok   消费者收到 40 次 (expected=40, actual=40)
  ok   发货 40 次 (expected=40, actual=40)
  ok   全部已发布 (expected=0, actual=0)
  note redeliver -> effect=DUPLICATE ; older version -> effect=STALE
  ok   同一 event_id 再到达：DUPLICATE (expected=DUPLICATE, actual=DUPLICATE)
  ok   更旧版本的事件：STALE (expected=STALE, actual=STALE)
  ok   状态未被旧事件覆盖 (expected=ORDER_PAID, actual=ORDER_PAID)
  ok   发货次数不变 (expected=1, actual=1)

CASE C29-10 :: 多进程：支付进程在渠道扣款成功、本地记账之前被 kill -9
  note worker pid=2342169 says: channel replied result=CHARGED txn=txn-0001
  note worker pid=2342169 says: STAGE pay-stall reached
  ok   子进程停在扣款之后
  ok   子进程被 SIGKILL 终止 (expected=137, actual=137)
  ok   订单停在 PAYING (expected=PAYING, actual=PAYING)
  ok   渠道已扣款 (expected=CHARGED, actual=CHARGED)
  ok   未超过陈旧阈值的 PAYING 不处理（可能仍在进行） (expected={}, actual={})
  note resolve(stale=0) -> {query:CHARGED->PAID=1}
  ok   查询收敛为 PAID (expected=PAID, actual=PAID)
  ok   进程崩溃前发出的回调后到，判定为重复 (expected=[CHARGED:DUPLICATE PAID], actual=[CHARGED:DUPLICATE PAID])
  note timeline ord-0001: [-->CREATED v1 create] [CREATED->PAYING v2 pay] [PAYING->PAID v3 query]
  note reconcile classes={PAID=1} mismatches=0 pending=0 channel_net=1990 paid_sum=1990 confirmed=1 paid=1 drift=0
  ok   对账无差异

CASE C29-11 :: 多进程：成功通知的事务（确认预留 + PAID + outbox）提交前被 kill -9
  ok   UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  note worker pid=2342203 says: STAGE apply-stall reached
  ok   未提交：其他会话看到的仍是 UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  ok   子进程被 SIGKILL 终止 (expected=137, actual=137)
  ok   回滚后仍是 UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  ok   预留仍是 HELD (expected=HELD, actual=HELD)
  ok   没有孤立的 outbox 事件 (expected=0, actual=0)
  note resolve -> {query:CHARGED->PAID=1}
  ok   恢复任务重做 → PAID (expected=PAID, actual=PAID)
  ok   outbox 恰好一条 (expected=1, actual=1)
  note reconcile classes={PAID=1} mismatches=0 pending=0 channel_net=1990 paid_sum=1990 confirmed=1 paid=1 drift=0
  ok   对账无差异

CASE C29-12 :: 多进程：中继投递完成、标记提交之前被 kill -9，重启后重投，消费者去重
  note worker pid=2342233 says: STAGE relay-stall reached
  ok   消费者已收到 3 条 (expected=3, actual=3)
  ok   子进程被 SIGKILL 终止 (expected=137, actual=137)
  ok   标记随事务回滚，3 条仍未发布 (expected=3, actual=3)
  ok   重启后重投 3 条 (expected=3, actual=3)
  note consumer effects {APPLIED=3, DUPLICATE=3}
  ok   重投的 3 条被判定为重复 (expected=3, actual=3)
  ok   每单只发货一次 (expected=3, actual=3)

CASE C29-13 :: 混合场景（种子 29，36 个用户争 24 件）：拒付、应答丢失、请求滞留、不付款、到期竞争、重复与迟到回调、补抢，恢复后对账
  note created=24 plan {decline=ord-0022,ord-0009,ord-0001, expiry-race=ord-0003,ord-0006,ord-0018,ord-0013, expiry-race+refund-timeout=ord-0008,ord-0019, never-pay=ord-0004,ord-0011,ord-0012, normal=ord-0010,ord-0007,ord-0024,ord-0016,ord-0020, request-delayed=ord-0015,ord-0005,ord-0023, response-lost=ord-0017,ord-0021,ord-0002,ord-0014}
  note after pay: {CANCELLED=3, FAILED=3, PAID=9, UNKNOWN=9} expired=9 cancelled=3
  note late buyers 11 ; final {CANCELLED=3, FAILED=5, PAID=24, REFUNDED=3}
  note notification effects {DUPLICATE=29, IGNORED=9, PAID=5}
  note consumer effects {APPLIED=35}
  ok   无待收敛订单 (expected=0, actual=0)
  note reconcile classes={CANCELLED=3, FAILED=5, PAID=24, REFUNDED=3} mismatches=0 pending=0 channel_net=47760 paid_sum=47760 confirmed=24 paid=24 drift=0
  ok   三方对账无差异
  ok   渠道净额 = PAID 金额之和 (expected=47760, actual=47760)
  ok   发货次数 = PAID 订单数 (expected=24, actual=24)
  ok   没有订单发货两次 (expected=0, actual=0)
  ok   outbox 已全部发布 (expected=0, actual=0)

CASE C29-14 :: 负向对照：扣款超时当作失败，立即归还库存
  note naive pay -> FAILED
  note 另一用户买走归还的名额 -> PAID
  note reconcile classes={FAILED=1, PAID=1} mismatches=2 pending=0 channel_net=3980 paid_sum=1990 confirmed=1 paid=1 drift=0
  note   mismatch ord-0001 FAILED CHARGED_BUT_FAILED charged=1990 refunded=0 reservation=RELEASED
  note   mismatch GLOBAL channel_net=3980 != paid_sum=1990
  ok   negative control exposes: 用户已被扣款但订单 FAILED，名额已卖给别人

CASE C29-15 :: 负向对照：查询 NOT_FOUND 即判定失败，不关单
  ok   UNKNOWN (expected=UNKNOWN, actual=UNKNOWN)
  note naive resolve -> FAILED
  note channel status after late request: CHARGED
  note reconcile classes={FAILED=1} mismatches=2 pending=0 channel_net=1990 paid_sum=0 confirmed=0 paid=0 drift=0
  note   mismatch ord-0001 FAILED CHARGED_BUT_FAILED charged=1990 refunded=0 reservation=RELEASED
  note   mismatch GLOBAL channel_net=1990 != paid_sum=0
  ok   negative control exposes: 迟到的扣款在 FAILED 之后成功

CASE C29-16 :: 负向对照：成功回调不检查当前状态（REFUNDED 之后迟到的 CHARGED）
  ok   按正确流程已 REFUNDED (expected=REFUNDED, actual=REFUNDED)
  note after blind callback status=PAID
  note reconcile classes={CREATED=1, PAID=1} mismatches=3 pending=0 channel_net=0 paid_sum=1990 confirmed=0 paid=1 drift=0
  note   mismatch ord-0001 PAID PAID_BUT_REFUNDED charged=1990 refunded=1990 reservation=EXPIRED
  note   mismatch GLOBAL confirmed=0 != paid=1
  note   mismatch GLOBAL channel_net=0 != paid_sum=1990
  ok   negative control exposes: 已退款的订单被迟到回调改回 PAID

CASE C29-17 :: 负向对照：成功回调不看预留确认结果（预留已到期并被别人买走）
  ok   10 条预留到期释放 (expected=10, actual=10)
  note PAID orders=20 total stock=10 confirmed=10
  note reconcile classes={PAID=20} mismatches=11 pending=0 channel_net=39800 paid_sum=39800 confirmed=10 paid=20 drift=0
  note   mismatch ord-0001 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0002 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0003 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0004 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0005 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0006 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0007 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0008 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0009 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch ord-0010 PAID PAID_WITHOUT_CONFIRMED_RESERVATION(EXPIRED) charged=1990 refunded=0 reservation=EXPIRED
  note   mismatch GLOBAL confirmed=10 != paid=20
  ok   negative control exposes: PAID 订单 20 超过库存 10（超卖）

CASE C29-18 :: 负向对照（多进程）：消费者不去重，中继崩溃重投后重复发货
  note worker pid=2342495 says: STAGE relay-stall reached
  ok   子进程被 SIGKILL 终止 (expected=137, actual=137)
  note 3 PAID orders, shipments=6
  ok   negative control exposes: 3 单发货 6 次

CASE C29-19 :: 负向对照（多进程）：先提交 PAID 再直接通知消费者（无 outbox），两步之间 kill -9
  ok   UNKNOWN（渠道已扣款） (expected=UNKNOWN, actual=UNKNOWN)
  note worker pid=2342531 says: STAGE dualwrite-stall reached
  ok   子进程被 SIGKILL 终止 (expected=137, actual=137)
  ok   订单已 PAID (expected=PAID, actual=PAID)
  note reconcile classes={PAID=1} mismatches=0 pending=0 channel_net=1990 paid_sum=1990 confirmed=1 paid=1 drift=0
  ok   三方对账（渠道/订单/预留）看不出问题
  note relay resent=0 fulfillment rows=0
  note PAID orders without ORDER_PAID outbox event: 1
  ok   negative control exposes: 已支付订单永远不会发货，也没有可重试的记录

SUMMARY passed=134 failed=0
