ai-text-quota

20260916-201504 轮 · 看它的历史
[靶子] clone=h8 port=20098 container=wt_h8_tp8 base=http://localhost:20098

[A] 登录 + 读今日用量
  ✓ 登录成功(loginpost 返 info=1)
  ✓ 解析出 e2e_bot 的 uid(实得 990863)
  ✓ aiTextDailyUsed 读到今日用量 U=2
  ✓ 清空突刺计数器

[B] 上限 = 已用+1 → 调用必须成功
  ✓ 投毒 ai_text_daily_limit=3 生效
  ✓ 返 info='1'(实得 "1")
  ✓ 拿到 64 位 hex 签名(实得 "a0e409af55eb9bfa7523dbe204184549e234731d1172a93ebbed560742fad0e6")
  ✓ aiuse 恰好 +1(395→396)= 成功路径确实跑完了
  ✓ 今日用量 2→3

[I] 日界(dbDayStart)
  ✓ 时钟不变量:应用连接的 DB NOW()=2026-09-16 20:20:50 与 PHP date()=2026-09-16 20:20:50 相差 0s(< 120)
  ✓ 应用连接的 session time_zone=Asia/Kuala_Lumpur 严格等于 APP_TIMEZONE=Asia/Kuala_Lumpur
  ✓ dbDayStart()=2026-09-16 00:00:00 严格等于 DB 算的今天零点 2026-09-16 00:00:00(本站偏移 +08:00)
  ✓ 今日计数非零(实得 3)—— 0 会让下一条退化成恒真
  ✓ aiTextDailyUsed=3 严格等于 DB 独立计数 3
  ✓ dbDayStart()=2026-09-16 00:00:00 与 date('Y-m-d')零点 2026-09-16 00:00:00 严格相等(本站偏移 +08:00)
  ✓ 三个日限函数都走 dbDayStart 且无 date('Y-m-d') 残留(实得 {"realnameDailyUsed":"H-","realnameDailyFailed":"H-","aiTextDailyUsed":"H-"})

[C] 上限用尽 → generateTextByPic 必须被拒且零副作用
  ✓ 今日用量 ≥1 才能当正上限用(实得 3)
  ✓ 投毒 ai_text_daily_limit=3(= 已用尽)生效
  ✓ 返 info='0'(实得 "0")
  ✓ data 严格等于拒绝文案(实得 "今日 AI 使用次数已达上限,请联系管理员或明天再试")
  ✓ aiuse 行数不变 396→396 = 拒在 corpInsert 之前,没花钱

[D] getAlbumAction / relayoutElement 同样被拒
  ✓ 重新把上限压到 3(已用尽)
  ✓ getAlbumAction 被拒且文案一致(实得 "今日 AI 使用次数已达上限,请联系管理员或明天再试")
  ✓ relayoutElement 被拒且文案一致(实得 "今日 AI 使用次数已达上限,请联系管理员或明天再试")
  ✓ 两次被拒都没有新增 aiuse(行数 396→396,今日仍 3)
  ✓ getJncBackground 未被本闸误伤(实得 "参数错误")

[E] 挂载图与顺序不变量
  ✓ 全部 8 个 public 方法都已分类(未分类:[])
  ✓ 声明过的方法都还在(消失的:[])
  ✓ 文字桶 3 个:每人每日闸 ×1 + 共用闸 ×1(实得 [{"text":1,"image":0,"shared":1},{"text":1,"image":0,"shared":1},{"text":1,"image":0,"shared":1}])
  ✓ 出图桶 2 个:出图额度 ×1 + 共用闸 ×1 + 每人每日闸 ×0(实得 [{"text":0,"image":1,"shared":1},{"text":0,"image":1,"shared":1}])
  ✓ 豁免桶 3 个:三道闸全 0(实得 [{"text":0,"image":0,"shared":0},{"text":0,"image":0,"shared":0},{"text":0,"image":0,"shared":0}])
  ✓ relayoutElement:每人每日闸(31)在 embedText(41)之前
  ✓ relayoutElement:共用闸(32)也在 embedText(41)之前 —— 那是本类唯一一处 step1 自出站
  ✓ getAlbumAction:闸(23)在 corpInsert(39)之前

[F] 回落值与非法配置
  ✓ 上限配 "" → 回落放行(实得 '')
  ✓ 上限配 "0" → 回落放行(实得 '')
  ✓ 上限配 "abc" → 回落放行(实得 '')
  ✓ 上限配 "-1" → 回落放行(实得 '')
  ✓ 上限=已用量 3 → 返拒绝文案(实得 "今日 AI 使用次数已达上限,请联系管理员或明天再试")
  ✓ 源码里的回落值严格等于 500(实得 500)

[G] 突刺闸:第 20 次仍放行,第 21 次被拒
  ✓ 把每人每日上限抬到 103,给突刺闸让路
  ✓ 投毒突刺计数 = 19
  ✓ 第 20 次仍放行(实得 info="1")
  ✓ 计数器 19→20 = 闸确实执行了(实得 20)
  ✓ 放行路径写了 1 行 aiuse(396→397)
  ✓ 第 21 次返 info='0'(实得 "0")
  ✓ data 严格等于突刺文案(实得 "操作过于频繁,请稍后再试")
  ✓ 被拒时 aiuse 行数不变(397)= 拒在 corpInsert 之前,没花钱
  ✓ 被拒不再累加(仍 20)= rateLimitHit「一档不过就整组不记数」

[H] 企业每日总量(按库聚合)
  ✓ 清掉突刺计数,给企业闸让路
  ✓ 今日全站已用 = 8(> 0 —— 否则下面「上限=已用」会退化成 0>=0 的恒真)
  ✓ 把 ai_corp_daily_limit 投成空值 → 走回落 2000
  ✓ 已用 8 < 回落上限 2000,所以这一发应当放行
  ✓ 未达上限时放行(实得 info="1")
  ✓ 全站已用 8→9 = 闸读的就是刚写进库的那一行(实得 9)
  ✓ 放行路径写了 1 行 aiuse(397→398)
  ✓ 投毒 ai_corp_daily_limit=9(= 已用尽)
  ✓ 返 info='0'(实得 "0")
  ✓ data 严格等于企业闸文案(实得 "本站今日 AI 使用量已达上限,请明天再试")
  ✓ 被拒时全站已用与 aiuse 行数都不变(9 / 398)= 拒在 corpInsert 之前
  ✓ getJncBackground 同样被企业闸拒(实得 "本站今日 AI 使用量已达上限,请明天再试")
  ✓ 出图端点被拒也没写 aiuse / 没扣出图额度(398)
  ✓ idx_corp_time 存在且列序正确(实得 "aiuse_corpid,create_time")
  ✓ 闸那条 where 能用上 idx_corp_time(possible_keys=idx_corp_user_time_risk,idx_corp_time,本次实选 key=idx_corp_time type=range)
  ✓ 源码常量 = 企业回落 2000 / 突刺 20 每 60 秒(实得 2000|20|60)
  ✓ 后台读(R)写(W)两条接线都在(实得 "RW")

[J] 重启不变量
  ✓ 重启前:写一个探针缓存键 = 12345
  ✓ 重启前:闸读到的今日已用 = 9
  ✓ 重启后 HTTP 恢复应答(轮询到 200,不靠 sleep 猜)
  ✓ 重启后:探针缓存键没了(实得 0)—— 证明缓存确实被清空
  ✓ 重启后:今日已用仍是 9(实得 9)
  ✓ 重启后重新投毒 ai_corp_daily_limit=9(= 已用尽)
  ✓ 重启后【端点仍然被拒】(实得 "本站今日 AI 使用量已达上限,请明天再试")—— 这是按库聚合的全部意义
  ✓ 已还原 ai_text_daily_limit 配置读数 '500'(实得 '500')
  ✓ 已还原 ai_corp_daily_limit 配置读数 '2000'
  ✓ 已清空突刺计数器
  ✓ 已清掉本次投毒触发的告警工单(1 张)

===== PASS=77 FAIL=0 =====