
CASE L1 :: 正常路径：发放 1000，扣减 300，分录平衡
  ok   扣减结果 (expected=OK, actual=OK)
  ok   余额 (expected=700, actual=700)
  ok   该笔交易分录和 (expected=0, actual=0)
  ok   该笔交易分录条数 (expected=2, actual=2)

CASE L2 :: 边界：恰好扣到 0、再扣 1 被拒、拒绝结果可重放、非法输入
  ok   扣减等于余额 (expected=OK, actual=OK)
  ok   余额为 0 (expected=0, actual=0)
  ok   余额 0 时扣 1 (expected=INSUFFICIENT, actual=INSUFFICIENT)
  ok   补足余额后用同键重试，返回已登记的 INSUFFICIENT（replay=true）
  ok   换新键后扣 1 成功 (expected=OK, actual=OK)
  ok   余额 (expected=9, actual=9)
  ok   amount=0 返回 400 (expected=400, actual=400)
  ok   缺 Idempotency-Key 返回 400 (expected=400, actual=400)
  ok   未知账户返回 404 (expected=404, actual=404)
  ok   余额 9 扣 10 返回 409 (expected=409, actual=409)

CASE L3 :: 真实并发：32 线程各扣 7，初始余额 100，条件更新
  note ok=14 insufficient=18 balance=2
  ok   成功次数 = floor(100/7) (expected=14, actual=14)
  ok   余额不足次数 (expected=18, actual=18)
  ok   最终余额 (expected=2, actual=2)
  ok   扣减分录条数 (expected=14, actual=14)

CASE L4 :: 负向对照：先读后写（绝对值写回），32 线程在读后汇合
  note naive ok=32 stored balance=93 debited by entries=224
  ok   negative control exposes: 成功次数 32 超过余额允许的 14 次
  ok   negative control exposes: 丢失更新：余额 93 ≠ 100 - 分录扣减 224

CASE L5 :: 负向对照：无 CHECK 表上先读判断、再相对扣减
  note naive balance=-124
  ok   negative control exposes: 余额被扣成负数 -124

CASE L6 :: CHECK 只防透支：先读判断+相对扣减被 23514 拦下；换键重发两次照样扣两次
  note ok=14 check_violation(23514)=18 balance=2
  ok   CHECK 保住余额非负
  ok   被 CHECK 拒绝的扣减数 (expected=18, actual=18)
  ok   negative control exposes: 同一业务请求换键重发被扣两次，余额 40，CHECK 未触发

CASE L7 :: 提交后响应丢失：客户端超时，用同一个键重试，只扣一次
  ok   第一次请求在客户端超时（400ms）
  ok   超时时服务端已提交，余额已是 70 (expected=70, actual=70)
  note retry status=201 replayed=true body=outcome=OK txn=24 balance_after=70 replay=true
  ok   重试返回原状态码 (expected=201, actual=201)
  ok   重试带 Idempotent-Replayed (expected=true, actual=true)
  ok   重试后余额仍为 70 (expected=70, actual=70)
  ok   该键只有一笔交易 (expected=1, actual=1)
  ok   negative control exposes: 超时后换新键重发，余额 40（扣了两次）
  ok   这种重复扣款在账本内部仍然平衡，对账查不出 (expected=0, actual=0)
  ok   服务端丢弃响应次数 (expected=2, actual=2)

CASE L8 :: 同键 16 个请求同时到达，结果一致；同键不同金额返回 422
  note distinct responses=[201 outcome=OK txn=28 balance_after=75] fresh=1 replayed=15
  ok   16 个响应的状态码、txn、余额完全相同 (expected=1, actual=1)
  ok   只有一个请求真正执行 (expected=1, actual=1)
  ok   只扣一次 (expected=75, actual=75)
  ok   同键不同载荷返回 422（outcome=KEY_REUSED txn=0 balance_after=0 replay=true） (expected=422, actual=422)
  ok   另一客户端使用相同键字符串，作为独立请求执行 (expected=201, actual=201)

CASE L9 :: 子 JVM 在事务中途被 kill -9：回滚；等待中的同键请求随后执行
  ok   子进程停在提交前：PAUSED_IN_TX pid=2340033
  ok   数据库看到子进程会话处于事务中 (expected=idle in transaction, actual=idle in transaction)
  ok   其他会话读不到未提交扣减 (expected=100, actual=100)
  ok   同键请求在唯一索引上等待子进程事务结束
  note child exit=137
  ok   子进程回滚后，等待者作为首个请求执行（outcome=OK txn=32 balance_after=60 replay=false）
  ok   最终只扣一次 40 (expected=60, actual=60)
  ok   该键一笔交易 (expected=1, actual=1)
  ok   子进程会话已被服务端清理 (expected=0, actual=0)

CASE L10 :: 已提交扣减在 pg.sh restart-immediate 后仍在；未提交的消失
  ok   提交扣减 10 (expected=OK, actual=OK)
  ok   restart-immediate 退出码（pg b3-27 restarted after immediate stop） (expected=0, actual=0)
  ok   停机前打开的事务连接已失效
  note after restart: fsync=on synchronous_commit=on
  ok   已提交的 10 仍在，未提交的 20 不在 (expected=90, actual=90)
  ok   幂等记录仍在 (expected=OK, actual=OK)
  ok   重启后同键重试返回原结果（outcome=OK txn=34 balance_after=90 replay=true）

CASE L11 :: 对账：从分录重算余额，每笔交易和为 0，请求与交易一一对应
  note accounts=10 txns=33 entries=66 requests=54
  ok   主库对账无差异 (expected=[], actual=[])
  note tampered: [balance acct-0001 stored=705 recomputed=700, global balance sum=5]
  ok   negative control exposes: 绕过账本改余额被重算发现
  ok   改回后对账恢复无差异 (expected=[], actual=[])
  note negative db: [balance acct-0004 stored=93 recomputed=-124, balance acct-0006 stored=2 recomputed=100, global balance sum=119] + 32 笔交易没有对应的幂等登记（naive 路径不登记）
  ok   negative control exposes: L4 的丢失更新被对账发现

SUMMARY passed=56 failed=0
