ai-image-quota-cas
[靶子] clone=h8 port=20098 container=wt_h8_tp8 base=http://localhost:20098
[A] 登录 + 快照额度
✓ 登录成功(loginpost 返 info=1)
✓ 解析出 e2e_bot 的 uid(实得 990863)
✓ 读到出图额度快照 remaining=0 used=0 left=503
✓ 日计数键形态正确(实得 ac1_usecnt_20260916_1_990863)
[B] 缓存分支(remaining=0 → cacheCorp 日计数)
✓ 已把 remaining 压到 0 —— 本段验的确实是 cacheCorp 那条分支
✓ 把 left 投毒成 1(只改 cache 日计数)
✓ 并发见证:4 发里有 4 发同时越过了锁外预检(≥2 即构成抢跑)
✓ 没有意外响应(无)
✓ 恰好 1 发拿到签名(实得 1)
✓ 其余 3 发拿到「已用完」文案(实得 3)
✓ 守恒:remaining 减少 0 + 日计数增加 1 = 1 == 成功放行 1 次
✓ aiuse 只多了 1 行(实得 1)= 被拒的那几发拒在 corpInsert 之前
✓ 扣完 left 归 0(实得 0)
[C] 守卫:不是一刀切拒死
✓ 把 left 投毒成 5
✓ 单发成功并拿到 64 位签名(实得 "f0a3679c4153a4c20f89405ed93a10fdb704393ff7af1abeb6f982588958f5ec")
✓ 日计数 +1、aiuse +1(实得 +1 / +1)
[D] DB 分支(remaining>0 → user_ac1_remaining)
✓ 已把 remaining 临时置 1(实得 1)
✓ 把 left 投毒成 1(此时 left 的唯一来源就是那 1 点 remaining)
✓ 并发见证:4 发里有 4 发同时越过了锁外预检(≥2 即构成抢跑)
✓ 没有意外响应(无)
✓ 恰好 1 发拿到签名(实得 1)
✓ 其余 3 发拿到「已用完」文案(实得 3)
✓ 守恒:remaining 减少 1 + 日计数增加 0 = 1 == 成功放行 1 次
✓ remaining 扣到 0(实得 0)
✓ aiuse 只多了 1 行
[F] 锁是真的(外部持锁 → 请求 fail-closed)
✓ 扣减锁名形态正确(实得 ai_img_quota_1_990863)
✓ 开跑前这把锁没人持着
✓ 把 left 投毒成 5(额度充足 —— 被拒只可能是因为锁)
✓ 外部会话已按住这把锁(IS_USED_LOCK = 2294)
✓ 拿不到锁时 fail-closed 拒绝(实得 "系统繁忙,请稍后重试")
✓ 确实等满了 corpGetLock 的 2 秒(实测 2047ms)
✓ 被拒时一分额度都没扣、也没写 aiuse(used 498→498,aiuse 393)
✓ 外部持锁会话已结束、锁已释放
[E] 守卫:两轮抢锁之后仍拿得到锁
✓ 把 left 投毒成 3
✓ 单发仍然成功(实得 "6be96491704f0fe05230c76392cac3c145c6fb1dd95e9008ce21ed01a0a)
✓ 没有撞到 2 秒取锁超时(实测 43ms)
✓ 日计数 +1
✓ 已还原 user_ac1_remaining=0(实得 0)
✓ 已冲掉投毒的日计数(实得 0)
✓ 已清空突刺计数器
(本次 jnc_aiuse 新增的计量行按 e2e-integrity § 7.1 的 ○ 档保留,不清)
===== PASS=40 FAIL=0 =====