# 功能验收

每次交付写清已测试、未测试、不适用；没有真实设备或供应商时保留未验证项，不能把本地 mock 当成线上成功。

## 环境区分

| 环境 | 可证明 | 不能证明 |
|---|---|---|
| 编辑器/本地普通 HTTP | GDScript 可解析、游戏入口/资源运行、无平台时明确失败 | 真实平台身份、扣款和广告 |
| 隔离夹具 | 失败分支、重试去重、字段处理、事件顺序 | 线上配置和供应商填充 |
| 平台预览 | 平台界面、模拟商品及登录返回 | 真钱交易、正式持久库存；模拟权益可能刷新重置 |
| 经授权的正式测试 | 实际交易/消费/广告及账号恢复 | 未测试设备或任意攻击场景全部安全 |

## 登录与账号

游客进入；点购买触发登录；取消不购买；成功继续原购买；登录返回正确作品；A 切 B 时不显示 A 的库存和档案；账号资料空值及中文正常。桌面浏览器、手机浏览器、微信、QQ 分别记录。

## 商品与权益

| 场景 | 期望 |
|---|---|
| 只购买消耗品，未使用就刷新 | 正式库存保留，不自动消费、不要求重复购买 |
| 只消耗已有库存 | 成功扣一次，返回 consumptionId；不创建购买 |
| 购买并使用且已有库存 | 直接消费，无新订单 |
| 购买并使用且无库存 | 登录/确认购买 → 入库 → 消费；两步成功才允许付费动作 |
| 登录取消、购买取消或余额不足 | 不发新权益、不执行付费动作 |
| 购买成功但消费失败 | 明确已购买/使用未完成，保留库存或核实未知结果 |
| 消费已成功但响应丢失，再刷新重试 | 原 requestId 恢复同一回执；不重买、不再扣一次 |
| 相同 requestId 换商品/数量 | 服务端拒绝，不按新参数执行 |
| 多次点击、并发或切账号 | 无串号、无负库存；游戏成功效果不重复应用 |
| 永久权益已拥有 | 从服务端恢复，不依赖本地布尔值 |

仅有消费账本成功还不足以证明游戏恢复完整：模拟消费后、玩法启动前关闭页面，确认能恢复同一动作；否则报告该缺口。

## 广告、排行榜和存档

广告：未开通、无填充、取消、失败均不发奖；真实完成返回有效凭据；重复回调/领取不多奖；账号切换/刷新/存档冲突不串奖。

排行榜：只绑定真实结算；同一冻结 run 重试不重复；非法数据失败；世界/省/市、空榜、分页、中文昵称；自绘和平台 UI 对应同一个 boardKey。

存档：空档、旧档、新档、两个标签冲突、超限、断网；游客/预览/账号分开；账号切换先 load；旧版本未知 schema 不覆盖。

## 界面与资源

模态框 pause/resume 恢复原暂停和音量；按钮 loading 不跳布局、失败可恢复；窄屏不溢出；长商品名/昵称有换行和字体。冷启动、热启动与刷新分别记录资源字节、次数、耗时，不重复下载已缓存的大文件；见[运行验收与资源访问](../packaging/validation.md)。

## 更新和兼容性

保留同一游戏 ZIP 哈希，验证平台运行时升级/回滚后原能力仍能使用；旧插件+新平台通过原协议；新插件面对未公布能力明确失败。SDK 新增包装器不删除旧 request 或改变字段。记录版本、证据和限制；无法证明兼容时暂停受影响发布，交负责开发者判断。

## 交付证据

给出每项操作的准确入口、环境/版本、输入、预期、实际、时间和业务编号；截图脱敏。附上[配置交接单](../../skills/platform-handoff/SKILL.md)，把平台待配置、游戏待修改和创作者待回答分开，不能只写“全部接好了”。
