{
  "criteria": [
    {
      "id": "reuse",
      "name": "复用程度",
      "weight": 20,
      "help": "多个页面是否使用同一套机制"
    },
    {
      "id": "state",
      "name": "状态保护",
      "weight": 25,
      "help": "旧请求、切账号、连续操作是否有保护"
    },
    {
      "id": "cleanup",
      "name": "退出清理",
      "weight": 20,
      "help": "关闭或离开后是否清理监听、计时器与任务"
    },
    {
      "id": "recovery",
      "name": "失败恢复",
      "weight": 20,
      "help": "失败后是否能提示、回填、重试或回滚"
    },
    {
      "id": "loading",
      "name": "加载安排",
      "weight": 15,
      "help": "是否按需要下载、分批显示或缓存资源"
    }
  ],
  "topics": [
    {
      "id": "dialogs",
      "name": "弹窗怎么打开",
      "tag": "交互",
      "pwa": [
        "重弹窗打开时才下载，下载过的内容会复用。",
        "自动奖励弹窗按队列依次显示。"
      ],
      "stake": [
        "网址决定当前打开哪个弹窗。",
        "内容按需加载，关闭和权限检查集中处理。"
      ],
      "decision": "两边都已具备统一弹窗机制。PwaSlotCash 可补“刷新或返回时恢复入口”，继续使用现有懒加载工厂。",
      "p": [
        4,
        4,
        4,
        4,
        4
      ],
      "s": [
        4,
        3,
        4,
        3,
        4
      ],
      "why": [
        "Pwa：已有懒加载缓存、稳定弹窗身份和关闭结果机制。",
        "Stake：打开状态清楚；异步弹窗载入后的过期保护未确认，按已见机制评3分。"
      ],
      "mods": [
        "CMP-I02",
        "CMP-I03",
        "CMP-I04",
        "CMP-I05"
      ],
      "refs": [
        "L14",
        "L15",
        "SUP33"
      ]
    },
    {
      "id": "latest",
      "name": "旧请求会不会覆盖新页面",
      "tag": "正确性",
      "pwa": [
        "KYC 已检查响应是否属于当前账号。",
        "首页切账号后的回写还需要补同类检查。"
      ],
      "stake": [
        "检查游戏信息时，每次请求都会带一个编号。",
        "只接收最新编号的结果，晚到的旧结果不更新页面。"
      ],
      "decision": "优先核验 PwaSlotCash 首页。可把已有 KYC 的保护思路复用过来，防止旧账号数据晚到后覆盖新账号。",
      "p": [
        3,
        3,
        null,
        3,
        null
      ],
      "s": [
        3,
        4,
        null,
        3,
        null
      ],
      "why": [
        "Pwa：已有保护范例，但首页这条调用链尚未统一。",
        "Stake：这里评价的是已确认的游戏信息检查，不代表全站异步任务都受保护。"
      ],
      "mods": [
        "CMP-I08",
        "PD03"
      ],
      "refs": [
        "L03",
        "UI14"
      ]
    },
    {
      "id": "forms",
      "name": "表单怎么显示错误",
      "tag": "交互",
      "pwa": [
        "已校验手机、邮箱、密码和验证码。",
        "失焦与提交会分别维护错误信息。"
      ],
      "stake": [
        "输入、失焦、错误和提交都有统一字段状态。",
        "提交先检查所有字段，再决定是否执行。"
      ],
      "decision": "PwaSlotCash 的业务规则可以保留。把“何时校验、如何清错、如何定位首个错误”提为共同机制。",
      "p": [
        3,
        3,
        null,
        3,
        null
      ],
      "s": [
        4,
        3,
        null,
        4,
        null
      ],
      "why": [
        "Pwa：现有规则能用，字段生命周期还有重复管理。",
        "Stake：共享字段和整表提交机制完整可见；未评价真实填表体验。"
      ],
      "mods": [
        "CMP-I06"
      ],
      "refs": [
        "UI10",
        "UI11",
        "UI12",
        "UI13"
      ]
    },
    {
      "id": "catalog",
      "name": "游戏列表怎么加载",
      "tag": "加载",
      "pwa": [
        "分区接近屏幕时才挂载。",
        "游戏很多时只渲染可见行，已有图片占位。"
      ],
      "stake": [
        "最近玩过、热门、推荐和原创游戏按组组织。",
        "推荐保留版本与展示批次，便于跟踪。"
      ],
      "decision": "PwaSlotCash 的列表加载已有优势。可以补统一的“加载中／为空／失败”显示；是否加推荐批次取决于业务。",
      "p": [
        4,
        4,
        3,
        3,
        4
      ],
      "s": [
        4,
        null,
        null,
        3,
        null
      ],
      "why": [
        "Pwa：虚拟列表、分区懒挂载与图片优先级有源码依据。",
        "Stake：未确认目录是否采用虚拟列表，相关项留未知；分数覆盖不对等，不排名。"
      ],
      "mods": [
        "GUI01",
        "GUI03",
        "PD08"
      ],
      "refs": [
        "L09",
        "L10",
        "L11",
        "SUP32"
      ]
    },
    {
      "id": "game",
      "name": "进入和离开游戏",
      "tag": "游戏",
      "pwa": [
        "主要负责 iframe／Unity 的下载、连接和退出。",
        "已有超时、迟到游戏编号检查和资源销毁。"
      ],
      "stake": [
        "游戏壳负责游戏信息、布局和可用状态。",
        "内建 Dice 自己控制请求、结果展示和自动模式。"
      ],
      "decision": "比较加载与退出流程最有价值。PwaSlotCash 可统一阶段状态；Dice 的下注状态机不能直接套在供应商容器上。",
      "p": [
        4,
        4,
        3,
        4,
        4
      ],
      "s": [
        4,
        4,
        3,
        3,
        4
      ],
      "why": [
        "Pwa：承载层保护已存在；退出清理有需核验的具体函数边界。",
        "Stake：共享壳与内建游戏生命周期可见，第三方游戏实现不完整。"
      ],
      "mods": [
        "GUI04",
        "GUI05",
        "GUI06",
        "CMP-I10"
      ],
      "refs": [
        "L03",
        "L05",
        "SUP24",
        "D09",
        "D10"
      ]
    },
    {
      "id": "balance",
      "name": "余额怎么更新",
      "tag": "状态",
      "pwa": [
        "使用服务端返回的 GC／SC 余额快照。",
        "从游戏回大厅时触发刷新。"
      ],
      "stake": [
        "用本局编号记录响应、余额推送和游戏结束。",
        "失败时回滚该局记录，再与真实余额对齐。"
      ],
      "decision": "这是两种业务方案。先完善 PwaSlotCash 的刷新状态和账号保护；需要本地下注交互时，再考虑事件账本。",
      "p": [
        4,
        3,
        null,
        3,
        null
      ],
      "s": [
        4,
        4,
        4,
        4,
        null
      ],
      "why": [
        "Pwa：快照与回流刷新清楚；版本号是否应单调比较，接口合同尚未确认。",
        "Stake：这里评价本局事件协调机制，不意味着 GC／SC 业务应该照搬它。"
      ],
      "mods": [
        "PD04",
        "PD05",
        "PD06"
      ],
      "refs": [
        "D18",
        "D19",
        "D22",
        "D23"
      ]
    },
    {
      "id": "style",
      "name": "界面样式怎么统一",
      "tag": "适配",
      "pwa": [
        "有 GC／SC 主题、移动布局和比例缩放。",
        "组件样式主要通过 CSS Modules 管理。"
      ],
      "stake": [
        "颜色、间距和圆角使用统一的语义名称。",
        "侧栏和移动底栏按屏幕条件切换。"
      ],
      "decision": "保留 PwaSlotCash 的移动适配。新增组件可逐步使用“背景／文字／边框／警告”等统一变量。",
      "p": [
        3,
        3,
        null,
        null,
        null
      ],
      "s": [
        4,
        4,
        null,
        null,
        null
      ],
      "why": [
        "Pwa：已有主题与适配，语义变量覆盖仍可渐进整理。",
        "Stake：集中tokens和布局条件清楚；不是审美或性能评分。"
      ],
      "mods": [
        "GUI07",
        "GUI08"
      ],
      "refs": [
        "SUP11",
        "SUP13",
        "SUP14",
        "SUP15"
      ]
    },
    {
      "id": "preferences",
      "name": "刷新后记住界面习惯",
      "tag": "状态",
      "pwa": [
        "已保存搜索历史、最近游戏和收藏相关状态。",
        "选择保存哪些字段，由各 store 决定。"
      ],
      "stake": [
        "会记住侧栏开关和显示币种。",
        "手机上打开一侧时，会收起另一侧，避免挤屏。"
      ],
      "decision": "两边都已有保存偏好的能力。重点检查哪些数据能跨账号保留，哪些在刷新时应回到默认值。",
      "p": [
        4,
        3,
        null,
        3,
        null
      ],
      "s": [
        4,
        3,
        null,
        3,
        null
      ],
      "why": [
        "两边都采用共享状态与选择性保存。",
        "没有逐一运行跨账号与存储失败场景，因此不打验证级高分。"
      ],
      "mods": [
        "CMP-I01"
      ],
      "refs": [
        "UI01",
        "UI02",
        "UI03",
        "UI07",
        "UI08"
      ]
    }
  ],
  "rubric": {
    "1": "零散处理，只有基础流程",
    "2": "有集中处理，但关键流程较分散",
    "3": "共享机制可见，仍有明确边界待补",
    "4": "相关保护、恢复或生命周期较完整",
    "5": "在4分基础上，有针对性运行验证"
  },
  "limits": "主观代码评审分；本轮未运行验证，不给5分；未知项不计入分母；不同覆盖不做总体排名"
}