本版规则验收矩阵 v0.8.1#
2026-09-13 · 对应规则1.5。本版替代旧D/L/P编号矩阵;删除对战验收,不再声称覆盖旧87项。下列 70项产品/协议场景尚未运行,用于实现后的端到端测试。现有Python检查参考DDL与Redis原语,不代表地图、同步算法、HTTP/WSS或真人体验已验证。
所有预期是发布判定:重复入账、错账号归属、未验证入榜、跨日补榜、越权看今天答案、个人录像出现在云请求中均阻断发布。性能、时间参数与玩家提示需根据实测调整,不能用测试环境小样本宣称反作弊绝对有效。
1. 成长与同步(X01–X10)#
| ID | 输入/故障 | 预期 |
|---|---|---|
| X01 | 云1000,A离线新局+50、B离线新局+200,各顺序同步 | 最终1250,两条独立奖励,不合并两份总额 |
| X02 | 云1500,A+50、B+200 | 最终1750,第3档;当前局不加血,下局2格 |
| X03 | 同op重传;换op但同run同终局 | 原回执/业务重复,无额外经验 |
| X04 | A/B同run复制续局得到不同终局 | 首个已提交合法终局结算一次,冲突保留两份本地存档 |
| X05 | 同日同档两设备均首通 | 一份首通权益,不双倍 |
| X06 | 每日已领失败6,再首通144,再重试失败/首通 | 仅补138,之后0 |
| X07 | push成功响应丢失,再pull新summary,再重发 | 不在新summary上重复加delta;本地预测按已覆盖run移除 |
| X08 | 同步中账号切换、会话到期、队列积压 | 队列绑定原档案,离线可玩,不上传到新账号 |
| X09 | 旧两份聚合XP含重叠每日奖励,无完整来源 | 按预览保守max/日权益去重,不重复叠加已覆盖事件 |
| X10 | bootstrap过期/日志清理/备份恢复 | 轮换epoch重新基线,保留outbox,取业务回执再重算预测 |
2. 服务器每日(D01–D10)#
| ID | 输入/故障 | 预期 |
|---|---|---|
| D01 | 多设备相同UTC日期/档次申请 | 同puzzle/map/rules,客户端不重新出题 |
| D02 | 生成图雷数错/数字错/开口不符/无猜校验不通过 | 不发布,重试预算耗尽则不可用,不静默降标准 |
| D03 | 8/18/28日与其他日期,各三档 | 初级始终无猜,中高级按日期策略验图 |
| D04 | 把本机日期改为未来/过去 | 服务器UTC日期不变,未来题无法下载/领奖 |
| D05 | 获取catalog、快照、失败状态、导出、日志 | 不泄露今天私有seed/完整雷阵 |
| D06 | 服务器离线、题未生成、网断后离线点击 | 今天每日不可本地替代;普通单人继续;离线点击不补入正式局 |
| D07 | 历史题下载后离线首次完成/重复完成 | 私人补差领奖,永不上历史榜 |
| D08 | 有2/3生命,踩雷后通关 | 进度/解锁有效;该次无伤资格永远失效 |
| D09 | 直接请求中/高档;伪造本地通关资格 | 服务端验证前置,不能靠客户端状态跳过 |
| D10 | 两设备正式开局/旧epoch继续输入/接管 | 同账号一个正式占用;显式接管不重置时间,旧输入拒绝 |
3. 成绩预选与压缩录像(U01–U12)#
| ID | 输入/故障 | 预期 |
|---|---|---|
| U01 | 综合三段不齐、单项缺对应段、有伤/日期或owner不匹配 | 不授予上传,不拿缺段0秒比较 |
| U02 | 完整成绩排第11,或合法完整成绩且榜未满10 | 前者不上传,后者发候选授权,均不直接入榜 |
| U03 | 客户端伪造total=0、复用别人更快attempt | 从本人服务器终局重算/拒绝,不操纵阈值 |
| U04 | 大量候选不上传 | 不占Top10,一个账号同日期每榜仅一个pending组合,别人可继续提交 |
| U05 | 无授权/跨账号/不在组合的attempt上传 | 拒绝,私人blobs不能代替授权 |
| U06 | 压缩1MiB/展开8MiB边界及超1字节、20,000事件及超1条、伪造长度、拼接gzip、慢连接、CPU耗尽 | 合法边界继续验证,超限流式中止且无部分录像入Redis/DB;429/413/422区分,不撤已确认经验 |
| U07 | 文件hash正确但动作被改、少事件、改时间/地图版本 | 重演或服务器chain/root不匹配,拒绝入榜 |
| U08 | 只改善一档,另两档已有合法官方段 | 复用两段,只上传缺失段,最终三段完全对应新总分 |
| U09 | 双hash、换设备/id重试、同段并发、同原文不同gzip、伪造hash、元数据在而正文丢失 | 首次服务端重算;有效文件上传前复用,进行中复用原任务并拒并发正文;清单冲突409、实际hash不符422;缺文件仅授权日内补传,不跨账号去重或续TTL |
| U10 | 预选第10,上传时别人更快 | 发布再比较;可能outpaced,不能承诺名额 |
| U11 | 本地草稿满盘/录制断裂/接管缺前缀 | 成长保留,明确无法提交完整回放,不伪造缺段 |
| U12 | 进程在验证后/发榜事务中崩溃 | DB只见旧完整或新完整generation;Redis成功而DB未提交的对象按TTL回收,DB提交后正文故障按R07处理 |
4. 截止与观看(W01–W12)#
| ID | 输入/故障 | 预期 |
|---|---|---|
| W01 | 所有步骤在截止前完成 | 可以发布,按完整排序键比较 |
| W02 | 截止瞬间完成;截止前报分但之后才传完/验完 | 全部不补榜;前者旧局只能普通结算 |
| W03 | freeze定时器延迟、服务重启、旧验证任务恢复 | 时间护栏生效;旧日期立即只读,不等待worker才关入口 |
| W04 | 日切后请求刷新best/改分/递补/重开榜 | 拒绝;同一最后generation永久保存排序 |
| W05 | 历史作弊复核、撤公开、删账号 | 注记/匿名化/撤播放,原名次占位,不升第11名 |
| W06 | 未完成今天三档请求今天公榜录像 | 只给元信息,不泄露棋盘/坐标/封面 |
| W07 | 未玩过历史题的游客观看历史Top10 | 保留期内允许,无通关检查,不锁今天 |
| W08 | 用历史路由/改date/旧watch读取今天或未来 | 由资源实际日期/映射判断,越权拒绝 |
| W09 | 仅列表/prepare取消/未释放内容就加载失败 | 不锁当日榜,不产生已观看事实 |
| W10 | release后正常ACK;release后崩溃/不ACK | 前者锁原日期,后者uncertain阻止新名次,不靠超时洗锁 |
| W11 | 跨日时保留昨日观看会话/屏障 | 切历史权限,不把昨日锁套在今天 |
| W12 | 到期/被移除/跨用户盗watch/退出账号 | 停发内容并正确显示原因,不给完整文件永久直链 |
5. 本期移除范围#
直播大厅、占位、开播、连续场次、实时旁观和相关超时均移出本版,不继续执行旧L01–L10验收。A03同时检查直播与PVP没有公开入口/handler/专用表;公榜录像观看验收继续保留。
6. 范围、隐私与防作弊(A01–A06)#
| ID | 输入/故障 | 预期 |
|---|---|---|
| A01 | 私人snapshot/import/export藏replays/replayDraft/录制历史 | 白名单过滤/拒绝,个人录像正文和元数据不落云 |
| A02 | 清本机录像/换设备登录/游客云合并 | 不下载不存在的云录像;明确仅本机,不暗中上传 |
| A03 | 请求直播入口/实时旁观/场次,以及PVP房间/邀请/治疗/战绩/消息类型 | 本版无入口、无handler、无专用表;延期不算验收遗漏 |
| A04 | 伪造新离线run、极快合法输入、同IP/无障碍玩家 | 自报成长不宣称可信;风险信号供复核,不凭单一信号封号 |
| A05 | 改客户端总XP/时间/服务器已锚定的录像内容 | 无直接XP接口;正式计时与hash重演检查不受客户端字段支配 |
| A06 | 删除账号后恢复旧备份 | 外部删除清单重放,身份/录像不复活,历史榜不递补 |
7. 四榜扩展(B01–B10)#
| ID | 输入/故障 | 预期 |
|---|---|---|
| B01 | 只有初级有效无伤段,中高未打 | 初级可入榜,综合incomplete;未解锁中级/高级仍不能跳关 |
| B02 | 三档都不在各自Top10,但总用时足够快 | 综合独立预选,三段证据齐后可入榜,不被单项名次过滤 |
| B03 | 同一账号满足四榜 | 每榜最多一行,可同时四榜;同rank跨榜不冲突,同榜不可重复 |
| B04 | 只改善中级且核验通过 | 中级/综合各自重算,初级/高级数值不变,四榜同generation原子可见 |
| B05 | 中级单项证据齐,综合缺初级文件 | 单项先发布,综合等待,不把等待候选当名次 |
| B06 | 初级段同时被单项/综合引用,掉出初级榜 | 正文只存一份;固定public_until不变,即使之后无榜引用也由原TTL回收 |
| B07 | 各设备分别完成三档,部分已登记/已上传,部分未上线 | 已验证段复用;登记清单可跨设备引用,缺清单返回SOURCE_MANIFEST_REQUIRED,缺正文等待原设备,截止未齐不补榜 |
| B08 | 四榜发布中事务失败/前端读到不同generation | 原子回滚保留旧四榜;前端固定代次刷新,不展示新单项与旧综合混合 |
| B09 | 日切四榜冻结后复核同一作弊段 | 所有受影响榜加注记、撤该段播放;不递补,不能通过另一榜绕过撤回 |
| B10 | 单项入榜后请求当天其他难度录像、反复刷新四榜、容量核算 | 入榜不代替三档观看资格,四榜仍共用日期锁/账号配额;经验不重复,公开最多40席/60段但总磁盘另计 |
8. Redis存储与故障(R01–R10)#
| ID | 输入/故障 | 预期 |
|---|---|---|
| R01 | DB发榜已提交,缓存写入失败、miss或Redis不可达 | 榜单按DB固定generation回源;不回滚名次、不重复奖励 |
| R02 | 旧代回填与新代发布竞争,历史缓存过期 | 只写各自代次key,同一响应四榜不混代;历史回填不重新排名 |
| R03 | 上传gzip/播放块,或将录像base64藏入JSON、导入包、日志 | 三张录像表只落key/hash/尺寸/期限等元数据;所有绕道正文拒绝,不进入SQLite |
| R04 | 首次写正文时断连、同内容重试、不同内容复用key | SET与绝对TTL原子生效;同内容幂等不滑动到期,不同内容拒绝;不出现无TTL正文 |
| R05 | 暂存授权到期、未公开候补日切、关闭过期通知 | 自动不可读并由Redis回收;不运行录像清理job,不要求DB同步改expired |
| R06 | 候选首次公开、跨榜复用、反复提升或日切后验证完成 | 首次提升到原题日固定public_until;复用不续命,跨日不得补榜 |
| R07 | Redis已写或提升但DB回滚;DB提交后Redis故障/正文丢失 | 前者孤儿到原TTL回收;后者保留名次并显示暂不可用/缺失,不声称跨库原子、不自动递补 |
| R08 | 逻辑过期、Redis失联、健康实例缺正文、只有播放块miss | 分别返回410过期、503不可用、410缺失;仅body仍在才重建播放块,块不超原正文截止 |
| R09 | noeviction内存满、AOF确认超时、响应丢失后重试 | 新上传/发布不给成功;既有录像不因容量淘汰;确认超时按结果不确定幂等处理,榜单仍可回源 |
| R10 | 一天反复刷榜、跨榜共用、撤公开/删账号后恢复备份 | 按曾提升TTL的全部不同正文核算容量;共用不复制/续期;DB撤权即时生效,已知key业务删除,恢复不复活权限 |
9. 现有检查记录#
2026-09-13:SQLite 3.40.1,python3 docs/account-system/verify_schema.py 50项SQLite约束检查通过,使用临时库;截止SQL测试使用确定性测试时钟。覆盖奖励唯一、上传归属、不可变终局/四榜、日切护栏、跨设备引用、移除直播/PVP,以及三张录像表无正文BLOB且Redis元数据有效。Redis 8.0.3,python3 docs/account-system/verify_redis.py 8项Redis原语检查通过;使用独立临时实例,覆盖二进制、原子TTL、幂等、固定公开截止、缺失/过期拒绝、WAITAOF本地确认与noeviction配置,结束后关闭并清理。
这些检查不是上面70项端到端测试的通过声明。待实现后需实际运行并发时序、地图独立验证、gzip解析/重演、UI首帧、UTC真实日切/时钟漂移、跨库故障、AOF故障恢复、队列负载与删除恢复。观察和解释分开记,所有失败必须对应具体字段、规则或提示修改。
10. 版本记录#
| 版本 | 日期 | 变化 |
|---|---|---|
| 0.8.1 | 2026-09-13 | 收紧录像大小/事件上限;双hash上传前去重;补流式拒收、配额、慢连接及验证资源保护 |
| 0.8.0 | 2026-09-13 | Redis限每日榜单缓存与官方录像TTL存储;录像正文移出SQLite,不设录像到期清理job;补跨库故障与持久化边界 |
| 0.7.0 | 2026-09-13 | 移除直播入口/协议/三张专用表;观看仅限每日公榜录像,保留四榜与私人同步;整理审阅范围 |
| 0.6.0 | 2026-09-13 | 初中高与综合四榜独立;单项1段/综合3段,录像共享、统一冻结、跨端分段提交;48项DDL检查通过 |
| 0.5.0 | 2026-09-13 | 重建60项现行验收:多端成长、服务器每日、条件证据、冻结/历史观看、直播与范围;移除PVP验收 |
| 0.4.0 | 2026-09-13 | 旧多人规则1.1的87项映射及5项个人录像边界,已被本版替代 |