  [PASS] 真中转起来了

═══ 场景 1：DEVICE_TTL 清理 + allow_new=False 的死亡组合 ═══
  [PASS] 设备首次注册成功
  [PASS] 关掉「允许新设备接入」成功
  [PASS] 【对照】设备还在 devices 里时，老设备能通过开关
    等 5 秒让设备超时…
  [PASS] 【前提】超时设备已被 snapshot 清出 devices
  [PASS] 【前提】该设备的码绑定也已被清（codes 成对清理）
  [PASS] 超时清理后老设备仍能重新上线
  [PASS] 【归因】打开开关后同一 deviceId 立刻能注册（证明是被开关挡的）

═══ 场景 2：改码 A->B->C 后 codes 里有没有留孤儿 ═══
  [PASS] 设备注册（码 A）
  [PASS] 改码 A->B 成功
  [PASS] 改码 B->C 成功
  [PASS] 一台设备只占一个码（codeCount 与设备数一致）
  [PASS] 设备当前码是 C
  [PASS] 旧码 A 已被释放（另一台设备能占用）

═══ 场景 3：改码之后重启，codes 是否还原成自洽状态 ═══
  [PASS] 再改成 B
  [PASS] state.json 里该设备只有一条码绑定

═══ 场景 4：deviceId 塞奇怪字符 ═══
  [PASS] 非法 deviceId（超长 200 字符）被拒绝而不是崩溃
  [PASS] 非法 deviceId（控制字符）被拒绝而不是崩溃
  [PASS] 非法 deviceId（路径分隔符）被拒绝而不是崩溃
  [PASS] 非法 deviceId（Unicode）被拒绝而不是崩溃
  [PASS] 非法 deviceId（只有空格）被拒绝而不是崩溃

═══ 场景 5：并发改码（两个线程同时改同一台设备）═══
  [PASS] 并发改码没抛异常
  [PASS] 并发后设备还在
  [PASS] 并发后设备当前码是 X 或 Y 之一
  [PASS] 并发改码后输掉的那个码没有变成孤儿（别的设备能占）

═══ 场景 6：管理接口未鉴权访问 ═══
  [PASS] 未鉴权 POST /v1/admin/allow_new 被拒（401/403）
  [PASS] 未鉴权 POST /v1/admin/set_code 被拒（401/403）
  [PASS] 未鉴权 POST /v1/admin/delete 被拒（401/403）
  [PASS] 未鉴权 POST /v1/admin/delete_all 被拒（401/403）

═══ 场景 7：设备列表为空时管理页是否 500 ═══
  [PASS] 设备列表为空时管理页仍正常渲染
  [PASS] 空列表页面没有 traceback

═══ 场景 8：关掉开关后重启中转，开关状态是否还在 ═══
  [PASS] 关掉开关
  [PASS] 重启后中转起来了
  [PASS] 重启后 allowNew 仍为 False（持久化生效）

==============================================================
  通过 34 项，失败 0 项
==============================================================
