摘要
竞技场开局要“选秀”:系统给出若干候选英雄、技能、宝物、兵种,玩家逐个挑选。某些种子下,Simulator 会在某一阶段凑不出完整的候选集合(问题编号 B01),抛出“候选生成错误”。以前这个异常没有统一处理。
本实验只做应用层的错误处理,不是修复 B01:候选权重、共享阶级、随机数、规则版本和 AI 选择都不变。目标是失败时绝不发布半个会话或半次选择,也不把私有信息漏给玩家。
约定
- Simulator 对外导出已有的候选生成错误类型;Arena 只在“创建会话”和“写盘前的单次候选操作”周围转换它。
- 返回 HTTP 409,代码
draft_offer_unavailable,retryable: false、request_committed: false。中文提示说明需要修复 Simulator、本次请求没有提交;不建议换种子或重抽,不替换阶级,不返回不完整的候选。 - 返回内容是固定文本:提供方诊断里可能出现对手阵营、未来阶级、候选 ID 或种子,这些只留在本地异常链中。
- 无关异常保持原分类。特别是写盘之后的快照失败不经过这个包装,不会错误地声称“未提交”;之后用 GET 恢复即可拿到持久状态。
结果
- 新增 5 项测试:创建失败与恢复、选择失败、重抽失败、精确恢复持久前缀、令牌与事件保留、私有信息边界、无关错误和“提交后失败”的反例。故障注入只测试错误约定,不代表真实候选池的行为。聚焦套件加公共接口边界共 32 项通过。
- 在独立的本地服务上,用种子 61 / quick 的真实候选池失败复现(没有注入规则、没有改 AI):返回 409,没有登记会话,也没有写出半个存档。
- 全量 Simulator + Arena + 集成:10,348 通过 / 38 失败 / 3 错误 / 2 跳过 / 28 预期失败,用时 295.49 秒。与此前检查点的失败集合比较,没有出现新的失败身份;整个发布门槛仍是红的。
局限
- 这只是 HTTP / 接口层面的检查,没有做渲染后的浏览器验收。
- 种子 61 那局仍然无法完成;B01 保持打开,此前失败的完整对局测试保留。
- 用户的服务、存档和商业游戏都没有操作。
Comments