
CASE N1 :: 8 个线程并发创建同一 (user, event_key) 的通知
  ok   只有一个调用报告 created=true (expected=1, actual=1)
  ok   8 个调用返回同一个 notification id
  ok   notification 行数 (expected=1, actual=1)
  ok   user-0042 的两个启用渠道各一条任务 (expected=2, actual=2)
  ok   user-0043 关闭了 sms，只生成 push 任务 (expected=1, actual=1)

CASE N2 :: 正常路径：两个渠道各投递一次
  ok   三条任务都到 SENT (expected=3, actual=3)
  ok   push 替身外发 1 次 (expected=1, actual=1)
  ok   sms 替身外发 1 次 (expected=1, actual=1)
  ok   sms 任务的投递记录 (expected=[ACCEPTED], actual=[ACCEPTED])

CASE C1 :: FOR UPDATE SKIP LOCKED：并发领取不重复
  ok   1 条任务被 8 个线程同时领取，成功领取数 (expected=1, actual=1)
  note 4 个工作线程各自执行的尝试数: 6 4 5 5
  ok   4 个线程合计执行尝试数 (expected=20, actual=20)
  ok   替身新增外发数 (expected=20, actual=20)
  ok   投递记录行数 (expected=20, actual=20)
  ok   attempt_count 不等于 1 的任务数 (expected=0, actual=0)

CASE NC1 :: 负向对照：普通 SELECT 后 UPDATE 领取（无行锁、无状态条件）
  note 两个线程的 UPDATE 影响行数合计 2
  ok   negative control exposes: 同一任务被两个线程领取并外发，替身外发数=2

CASE T1 :: 支持幂等键的渠道：接受后响应超时，重试复用同一幂等键
  ok   投递记录 (expected=[TIMEOUT, ACCEPTED_REPLAY], actual=[TIMEOUT, ACCEPTED_REPLAY])
  ok   任务状态 (expected=SENT, actual=SENT)
  ok   替身收到的 /send 请求数 (expected=2, actual=2)
  ok   替身记录的外发次数 (expected=1, actual=1)

CASE T2 :: 不支持幂等键的渠道：超时后先查询，查到即收敛为 SENT
  ok   投递记录 (expected=[TIMEOUT, QUERY_FOUND], actual=[TIMEOUT, QUERY_FOUND])
  ok   任务状态 (expected=SENT, actual=SENT)
  ok   查询结果写回 provider_msg_id
  ok   替身记录的外发次数 (expected=1, actual=1)

CASE NC2 :: 负向对照：不支持幂等键的渠道超时后直接重发
  ok   投递记录 (expected=[TIMEOUT, ACCEPTED], actual=[TIMEOUT, ACCEPTED])
  ok   逻辑通知仍只有 1 条 (expected=1, actual=1)
  ok   任务状态 (expected=SENT, actual=SENT)
  ok   negative control exposes: 逻辑去重成立但替身外发次数=2

CASE T3 :: 结果未知且查询不可用：预算用尽后停在 UNKNOWN，等待人工处理
  ok   投递记录 (expected=[TIMEOUT, QUERY_FAILED, QUERY_FAILED], actual=[TIMEOUT, QUERY_FAILED, QUERY_FAILED])
  ok   任务状态 (expected=UNKNOWN, actual=UNKNOWN)
  ok   needs_review (expected=t, actual=t)
  ok   不再自动调度 (expected=0, actual=0)
  ok   工作进程不再领取该任务 (expected=NOTHING, actual=NOTHING)
  ok   替身外发次数（没有盲目重发） (expected=1, actual=1)
  ok   人工核对后标记 SENT (expected=1, actual=1)
  ok   重复人工处理被拒绝 (expected=0, actual=0)
  ok   投递记录 (expected=[TIMEOUT, QUERY_FAILED, QUERY_FAILED, MANUAL_SENT], actual=[TIMEOUT, QUERY_FAILED, QUERY_FAILED, MANUAL_SENT])

CASE F1 :: 接受前的 503 重试；400 终止为 FAILED
  ok   push 投递记录 (expected=[HTTP_5XX, ACCEPTED], actual=[HTTP_5XX, ACCEPTED])
  ok   push 状态 (expected=SENT, actual=SENT)
  ok   push 外发次数 (expected=1, actual=1)
  ok   sms 投递记录 (expected=[REJECTED], actual=[REJECTED])
  ok   sms 状态 (expected=FAILED, actual=FAILED)
  ok   sms 外发次数 (expected=0, actual=0)

CASE B1 :: 发送前关闭偏好 -> SUPPRESSED；超过 TTL -> FAILED，均不发请求
  ok   偏好关闭后的任务状态 (expected=SUPPRESSED, actual=SUPPRESSED)
  ok   user-0053 投递记录 (expected=[PREF_DISABLED], actual=[PREF_DISABLED])
  ok   过期通知的任务状态 (expected=FAILED, actual=FAILED)
  ok   user-0054 投递记录 (expected=[TTL_EXPIRED], actual=[TTL_EXPIRED])
  ok   替身收到的请求数 (expected=0, actual=0)

CASE B2 :: 结果未知之后 TTL 到期：不写成 FAILED，停在 UNKNOWN 交人工核对
  ok   投递记录 (expected=[TIMEOUT, TTL_EXPIRED_UNCERTAIN], actual=[TIMEOUT, TTL_EXPIRED_UNCERTAIN])
  ok   任务状态 (expected=UNKNOWN, actual=UNKNOWN)
  ok   needs_review (expected=t, actual=t)
  ok   过期后不再查询或发送 (expected=0, actual=0)
  ok   替身外发次数（第 1 次尝试已被接受） (expected=1, actual=1)
  ok   人工核对后标记 SENT (expected=1, actual=1)

CASE B3 :: 结果未知之后的 503：拒绝只说明这一次未被接受，预算用尽时停在 UNKNOWN，不写成 FAILED
  ok   投递记录 (expected=[TIMEOUT, HTTP_5XX], actual=[TIMEOUT, HTTP_5XX])
  FAIL 任务状态（第 1 次可能已被接受） (expected=UNKNOWN, actual=FAILED)
  FAIL needs_review (expected=t, actual=f)
  ok   替身外发次数（第 1 次尝试已被接受） (expected=1, actual=1)

CASE P1 :: 多进程：工作进程在调用渠道时被 kill -9，租约过期后被重新领取
  ok   w-p1-a 领取任务
  proc W w-p1-a CLAIMED task=36 attempt=1 action=SEND
  ok   kill 之前替身已接受外发 (expected=1, actual=1)
  ok   w-p1-a 以非零码退出（SIGKILL）
  ok   kill 后任务停在 SENDING (expected=SENDING, actual=SENDING)
  ok   租约未过期时探测领取得到空结果
  proc W w-p1-b CLAIMED task=36 attempt=2 action=SEND
  proc W w-p1-b CALLED outcome=ACCEPTED_REPLAY msg=push-msg-0026
  proc W w-p1-b RESULT SENT
  ok   w-p1-b 完成一次尝试
  ok   w-p1-b 用同一幂等键重发，渠道返回原消息号
  ok   任务状态 (expected=SENT, actual=SENT)
  ok   投递记录 (expected=[LEASE_EXPIRED, ACCEPTED_REPLAY], actual=[LEASE_EXPIRED, ACCEPTED_REPLAY])
  ok   第 1 次尝试的执行者 (expected=w-p1-a, actual=w-p1-a)
  ok   替身外发次数 (expected=1, actual=1)

CASE P2 :: 多进程：SIGSTOP 暂停持有者，新持有者完成后旧持有者的迟到结果被令牌拒绝
  proc W w-p2-a CLAIMED task=37 attempt=1 action=SEND
  ok   w-p2-a 领取任务
  ok   w-p2-b 在租约过期后领取并完成 (expected=SENT, actual=SENT)
  ok   任务当前令牌已更换
  proc W w-p2-a CALLED outcome=TIMEOUT msg=null
  proc W w-p2-a RESULT STALE
  ok   w-p2-a 的收尾被拒绝 (expected=W w-p2-a RESULT STALE, actual=W w-p2-a RESULT STALE)
  note w-p2-a 迟到观察 late_outcome=TIMEOUT
  ok   任务状态未被迟到结果改写 (expected=SENT, actual=SENT)
  ok   投递记录 (expected=[LEASE_EXPIRED, ACCEPTED_REPLAY], actual=[LEASE_EXPIRED, ACCEPTED_REPLAY])
  ok   替身外发次数 (expected=1, actual=1)

CASE NC3 :: 负向对照：只按任务 id 收尾（不检查令牌与状态），套用同一迟到观察
  note 按 id 收尾影响行数 1，写入状态 UNKNOWN
  ok   negative control exposes: 已 SENT 的任务被迟到的超时观察改回 UNKNOWN

SUMMARY passed=74 failed=2
  failed: B3: 任务状态（第 1 次可能已被接受） (expected=UNKNOWN, actual=FAILED)
  failed: B3: needs_review (expected=t, actual=f)
