lili 00ebeedc50 fix(ad): M4 回调验签 fail-closed 封铸币面 + M4广告SDK预接线设计回炉(R3 双评审 BLOCKER/MAJOR)
代码加固(仅 game-module-ad):
- AdProviderFactory 增 getStrict(未注册返 null、绝不降级 mock),回调路径改用之;get() 展示计费降级保持不变
- MockAdProvider 覆写 verifyRewardCallback 返 false(mock 不接联盟回调,纵深防御第一层)
- reportRewardCallback fail-closed:provider 未就绪抛 PROVIDER_NOT_READY(新增 1-111-002-005)
- ad.force-mock 熔断:只拒真实联盟位回调、不碰 calcRevenue、不影响 mock/callback 桩
- 回调铸币面全组合矩阵单测 8 格(provider×force-mock);ad 模块 33 单测全绿(Callback 7/AdSlot 6/AdRevenue 20)

设计档回炉(逐条吃双评审):
- B1 三层开关安全语义拆分(算钱降级宽松 vs 验签 fail-closed)+ runbook 切前 fail-closed 闸
- B2 冲正定死:不估算入账,以联盟 T+1 账单实际金额为唯一 trade 入账源(消除冲正,uk_source 幂等/账户恒等式成立)
- M1 热刷新 @RefreshScope 方案入档(本机验不了标 follow-up,runbook 滚动重启兜底 + 资损敞口)
- M2 契约断言改真话(callback 枚举 R4 bc0f486b 已补齐;AdSlotSaveReqVO 无 enum 强校验如实、R3 不补理由)
- 防重放窗口配置项预置(owner/默认300/上限900/timestamp fail-safe)+ ACK/来源IP进待核清单 + runbook 放量停止阈值

红线守住:不动 trade(冲正只设计)/不动 contracts(R4 已收口)/不写真实 provider 类。docs-gate 七检全绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:41:08 -07:00
..