二七王:不可查牌模式屏蔽出牌历史(design §9 消歧义 + 代码门控)

design §9 原文把可查牌模式的四项功能列成无序列表,不可查牌只写
「不提供以上任何查看 / 明牌功能」,随后展开的例子却只提了主牌数量、
对子结构、明牌按钮、亮牌统计,没提第一条「已经打出的牌可以查看」,
导致"以上"的范围有歧义。代码据此照发出牌历史,前一轮核对把它记为
待确认项(01 表 D6)。

规则设计者已确认:**不可查牌模式必须屏蔽出牌历史,只有可查牌模式
才能查看**。据此:

- design §9 改写为无歧义表述:先给出「查牌 = 回看不该随时可见的信
  息」的定义,把可查牌的四项功能编号列出(① 出牌历史 ② 报无主后的
  他家主牌数/对子数 ③ 明牌 ④ 庄家亮牌),不可查牌逐条对应说明一项
  都不提供;并补一段边界说明——**当前这一轮桌面上的牌两种模式下都
  必须可见**,否则后出的人无从跟牌、无从判断本轮谁最大,断线重连同
  理(当前轮照常恢复,往轮历史按模式开关给不给)。
- class.export.js:get_deskinfo 的 PushCards.pushlist 构建与排序整
  体移入 `if (!cfg.nocheck)`,不查牌时不带该属性;当前轮桌面牌由
  PushCards.playproc.cards 恢复,两种模式都有。
- 协议文档:pushlist 补「仅可查牌模式下有此属性」,playproc 补「两
  种模式恒有」及其原因。
- 合规文档:01 表 D6 由「待确认/未修」改为已确认并修复,从「尚未处
  置」移出;02 测试计划断言总数 357→361 并新增该维度覆盖行。

test_rpc 新增 4 项:不查牌房无 pushlist、可查牌房有 pushlist,且两
种模式下当前轮桌面牌 playproc.cards 都能恢复。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-16 18:55:33 +08:00
co-authored by Claude Opus 5
parent 26a52e1a11
commit 35affa7c20
6 changed files with 68 additions and 41 deletions
@@ -82,13 +82,14 @@
| D3 | 🟧 中等 | `class.desk.js` | 下发了 `countdown`,但服务端**无任何定时器**做超时兜底/托管,玩家掉线不操作则牌局永久卡死(server dev-guide「服务端自动操作复用真人链路」) | **未修**,见下方「待办」 |
| D4 | 🟨 轻微 | `paiju.do_playcard` | 报无主后只更新出牌者自己那一格,B/C 要等各自轮到出牌才补上,界面最多滞后两次出牌(design §9 要求「为全体三人显示另外两家」) | 改为一旦 `have_baofu()` 成立即按实际手牌刷新三个座位 |
| D5 | 🟨 轻微 | `can_playcard` / `chupai1` | `cardtype` 只能表达单一牌型,甩牌被压平成 1xx/2xx(「主K对+主5」→103),客户端连"这是一次甩牌"都看不出来 | `chupai1` 增发 `shuai` 分量构成(与 `shuai_demand` 同源) |
| D6 | 🟨 待确认 | `export.get_deskinfo` | 不查牌模式下 `pushlist`(已打出牌历史)仍照发。design §9「不可查牌模式:不提供以上任何查看功能」的"以上"是否含第一条(查看已打出的牌),**规则本身有歧义** | **未修**,需规则设计者确认 |
| D6 | 🟧 中等 | `export.get_deskinfo` | 不查牌模式下 `pushlist`(已打出牌历史)仍照发。规则设计者已确认:**不可查牌模式必须屏蔽出牌历史,只有可查牌模式才能查看** | 已按确认修复:`pushlist` 按 `cfg.nocheck` 门控;design §9 同步改写为无歧义表述(四项功能整体开关 + 「当前轮桌面牌不属于查牌、两种模式都可见」的边界) |
| D7 | 🟨 轻微 | `check_cards_inhand` | 牌已出/已埋时 `return;`(undefined)而非 `false` | 已改为 `return false` |
### 尚未处置(需外部输入)
- **D3 超时托管**:服务端对四个阶段只下发 `countdown` 数值,没有对应的定时器与超时后的默认动作(自动叫分/选主/埋牌/出牌)。design.md 未规定托管行为,且默认动作与前端表现强相关,需与前端和规则设计者一起定义后再实现。当前状态下**任一玩家掉线不操作,该局会永久停住**。
- **D6 不查牌模式的范围**:见上表,等规则设计者确认后再决定是否屏蔽 `pushlist`。
> D6 原为「规则歧义、待确认」,现已由规则设计者拍板(不可查牌屏蔽出牌历史),已改 design §9 + 代码 + 单测,不再是待办。
---
@@ -147,7 +147,7 @@
## 5. 当前状态小结 —— ✅ DoD 达成,P0/P1/P2 全部完成
**共 357 项断言全绿**(`test_arith` 106 / `test_callgrade` 6 / `test_config` 19 / `test_deal` 12 / `test_desk` 6 / `test_follow` 50 / `test_input` 34 / `test_paiju` 31 / `test_rpc` 64 / `test_success` 29)。
**共 361 项断言全绿**(`test_arith` 106 / `test_callgrade` 6 / `test_config` 19 / `test_deal` 12 / `test_desk` 6 / `test_follow` 50 / `test_input` 34 / `test_paiju` 31 / `test_rpc` 68 / `test_success` 29)。
design 全部服务端可验证章节均有正/反/边界单测:
- **§2 构成**:`test_deal` 92张/去3-4/三家28+底8/分值。
@@ -179,9 +179,11 @@ design 全部服务端可验证章节均有正/反/边界单测:
| §7.3 下发面 multiple 与结算同源 | `mod.jiaofen` / `get_deskinfo` / `get_paiju_account` | 正:叫 45 分在常规房/爬坡房分别得 6/7;正:上庄包与重连 ChooseMain 一致;边界:与结算包 `aset.multiple` 逐一对齐 | `test_rpc` | ✅ 7 |
| §5.4 甩牌下发面 | `chupai1` | 正:合法甩牌带 `shuai` 分量;反:非甩牌不带;反:甩错只打最小一张且不带 `shuai` | `test_rpc` | ✅ 8 |
| 重连 pushlist 结构 | `get_deskinfo` | 正:轮数正确、内层恒 3 个座位、无 undefined;正:按本局主牌花色排序(主5 排在副A 前) | `test_rpc` | ✅ 4 |
| §9 出牌历史按查牌模式门控 | `get_deskinfo` | 反:不查牌房无 `pushlist`;正:可查牌房有 `pushlist`;边界:两种模式下当前轮桌面牌 `playproc.cards` 都必须恢复 | `test_rpc` | ✅ 4 |
| §3 相邻链花色 | `is_continuous` | 正:同花色 8-6 连;反:三组跨花色 8-6 不连;反:差 2 但非 8/6 不连 | `test_arith` | ✅ 5 |
**仍无自动化覆盖(需外部输入后才能定义期望)**:
- **超时托管**(`01` 表 D3):服务端只下发 `countdown`、无定时器与默认动作,玩家不操作则牌局永久停住。默认动作需与前端/规则设计者共同定义,定义前无法写期望。
- **不查牌模式是否屏蔽出牌历史**(`01` 表 D6):design §9 表述有歧义,待规则设计者确认。
> 原列在此处的「不查牌模式是否屏蔽出牌历史」已由规则设计者确认(屏蔽),design §9 改写为无歧义表述,代码与用例均已落地,见上表「§9 出牌历史按查牌模式门控」。