Files
gplan-2/design/gdd/a2-minesweeper-rules.md
T
2026-09-14 18:18:49 +08:00

505 lines
68 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# A2 排雷玩法规则(Minesweeper Rules)
> **状态**:Approved · **版本**:v2.0 · 2026-09-14
> **一句话**:持有 A1 棋盘、执行全部棋盘面规则,把事实以恰好三种事件外发——全项目事件源头。
> **推演件**:`design/gdd/analysis/a2-minesweeper-rules.md`(本文件只收结论,理由在那里)
> **承载支柱**:P1 主 · P4 · P3 · P2(机制承诺论证见推演件)
> **层级**:Layer 2 Core · Milestone MVP · 设计顺序第 6 位(上游 A1/A3/A4/D2 均 Approved)
## 设计目的
A2 是扫雷层的玩法规则引擎与全项目事件源头:接收玩家动作意图(挖/插旗/拔旗/移动/停手),执行全部棋盘面规则,把发生的事实以恰好三种事件外发;没有 A2,A1 的板、A3 的预算、B1 的结算都失去发生地。
1. P1"我算对了":数字恒真透传(雾格只是不显示,数据层永不说谎)、连锁传播与生成端度量同构、每个拒绝携带可辨原因——系统回应的每一格都与玩家推演一致。
2. P4"走过的伤疤":小人从出生安全区向雷图边缘探索,点击已探明区瞬移穿行、在未开边界挖掘,已引爆雷格可通行——雷不是探索终点,是走过的伤疤。
3. P3"赌与算都可见":挖开雷格是事实上报而非死亡,旗是零信息收益的纯粹承诺(雾内旗恒不中也被诚实判定)——A2 不裁决得失,只保证事实流真实。
4. P2"结算可归因":结算明细每行归因(安全格增益/标中旗削弱/雷→伏击/清图奖励)都溯源到 A2 事件流——reward_eligible / channel / hit 是归因的字段落点。
反向护栏:任何"规则层说谎"形态——数字失真、连锁静默变异分支、拒绝原因含混——默认砍掉;呈现层的隐藏(雾格无字)必须以数据层恒真为前提。
## 系统范围
负责:
- 全部棋盘面规则:小人控制 · 8 向相邻判定 · 连锁展开 flood fill · 数字提示 · 旗子棋盘状态 · 清图判定
- 三事件发射面(cell_revealed / flag_judged / round_end 棋盘路径)与"先旗后结束"事件序契约
- 批次结算入口 settle_batch 与语义序仲裁;install 四条结构不变式校验与初始展开执行
- F1–F4 四条行为契约(清图谓词 / 连锁闭包 / 初始展开域 / 批次仲裁)
不负责:
- 资源账本(A3——判棋盘面后调 try_spend,禁自行扣减)· 轮次编排(B1——轮次节拍权威在 A3/B1,A2 以 A3 相位观测量为闸、不自持轮次状态)
- 奖励内容(B4)· 棋盘生成(A1)· 变异规则(A4——只透传生成期快照标记)· 呈现(D1)
- 数值字面量 / 表读取 / RNG / UI 与输入设备依赖(规则 1 四零禁令)
## 核心循环
装板与挖掘期事件发射主链:
```
install_board(board) 受理域 = Idle/Waiting + Active·仅弃图刷新路径
│ ① 持有产物快照(生成期变异快照,非活引用——抗表重载)
│ ② 校验结构不变式 ①–④ ── 违例 → 拒绝 + board_invalid + error 诊断(fail-fast)
│ ③ 初始展开 O₀ = R₀ → cell_revealed ×|R₀|,channel=initial,规范序
│ ④ 小人落位 B3 中心格
▼
Installed·Active ── 挖掘期:玩家意图经 D1 → settle_batch(intents)(A2 唯一结算入口)
│ dig 棋盘面判定 → A3 try_spend → 开格 + 连锁 → cell_revealed ×(1+chain_size)
│ flag try_spend → 棋盘旗标记(插/拔零事件外发,反馈经调用返回值命令式驱动)
│ move 免费瞬移(不经账本,零事件;compute_move_path 供 D1 路径预览)
│ stop 先发 flag_judged ×N → 委托 A3.request_stop()
▼
轮次结束事务(A3 仲裁:cleared > stopped > ap_exhausted——首次为真处定胜者,余意图 voided)
│ flag_judged ×N(判定基线 = 事务开始旗位,行主序;先于 round_end——事件序契约)
│ 棋盘路径:A2 读 last_round_end 恰一次 → round_end{ap_exhausted/cleared} 外发
│ stopped 路径:A3 直发 round_end{stopped}(双发射源——A2 禁双发)
▼
Installed·Frozen ── Waiting:全态冻结;编排边界受理 install_board(换新图)/ retire_board
```
| 出口 | 触发 | 动作 | RAP |
|---|---|---|---|
| cleared | dig 胜 ∧ 结算时点 clears_map=true | A2 外发 `(cleared, new_board)` 恰一条(棋盘路径) | +0(剩余 AP 清零不入 RAP——A3 Rule 5) |
| stopped | C_stop 胜 | 先发 flag_judged ×N → 委托 A3.request_stop() → round_end`(stopped, same_board)` 由 A3 直发 | += remaining_ap(1:1) |
| ap_exhausted | 耗尽 AP 的 C_other | A2 外发 `(ap_exhausted, same_board)` 恰一条 | +0(不变式 remaining=0) |
| 继续 | 不结束轮次 | 无 round_end,继续下一意图 | — |
## 事件面与枚举
### 术语表(白话首定义集中于此;已登记 registry 术语条目)
| 术语 | 白话定义 |
|---|---|
| 双包含回验 | A1 与 A2 互检两条包含关系——臂① A2 实际初始展开域 ⊆ A1 生成期排除域(开局不触雷不触变异);臂② A1 求解器初始可见态 ⊆ A2 实际初始展开域(A1 度量不吃亏)。恰等 = 两集合逐格相等 |
| 零特判 | A2 代码不为变异写任何 if 分支——变异只是随格携带的只读标记透传,行为差异全部由生成端约束保证 |
| 规范序 | 事件发射的固定顺序(触发格 BFS、8 邻行主序)——同输入必得同顺序,禁实现自选遍历序 |
| 语义序仲裁 | 批次内不按玩家提交顺序、而按"清图挖 > 停手 > 其余"的固定类别顺序结算 |
| 双发射源 | round_end 有两个合法发射者——棋盘路径(ap_exhausted/cleared)由 A2 发、停手路径(stopped)由 A3 直发,payload 同构 |
| 三源拒绝 | 拒绝原因来自三个互异来源——棋盘面(board_face)/ 资源面(resource_face,AP 不足)/ 相位(phase,非 Active) |
| 单意图批 / 便捷形 | settle_batch 只装一个意图时 ≡ 直接调 try_dig 等便捷 API,行为逐项相同 |
| voided | 轮次结束后未获执行的批次意图——零棋盘效果、零扣费、零事件,区别于非法拒绝 |
### 发言面规则
规则:
1. (规则 1)A2 引擎吃两样输入——A1 产出的棋盘、玩家提交的意图序列,吐一样输出——三种事件组成的事实流;同棋盘同意图序列必得逐位相同的事件流,为此守四零禁令:零随机(不掷骰子、不自建随机源)、零数值字面量(价格读账本、板面读生成产物、变异随格快照携带)、零表读取(参数全经上游)、零界面与输入设备依赖(唯一通道是意图对象,`--headless --script` 完整可驱动)。
2. (规则 2)A2 对外只报三种事实——每挖开一格报一次 cell_revealed,轮次结束事务开始时对每面在场旗报一条 flag_judged(判中/判空),轮次结束报一次 round_end(停手路径由 A3 直发,A2 禁双发);多一个事件、少一个事件都是接口漂移;同一次收轮先把旗判定全部报完再报轮次结束,所有收轮路径统一(停手路径一样:先报旗判定、再委托收轮,停手不改旗位)。
举证:确定性、零字面量与 headless 可驱动依据 D2 Rule 5/1/7;静态扫描 AC-22、回放断言 AC-19/AC-20;payload 验收 AC-4/6/7/8/9,事件序契约 AC-9/AC-10;下游结算触发不依赖事件到达序(B1 强制项①)。
### 三事件回边(发射面封闭——增删事件 = 接口漂移修订)
| 事件 | 字段 | 发射点 | 语义要点 |
|---|---|---|---|
| cell_revealed | cell · kind ∈ {safe, mine} · digit · variant_ids · channel ∈ {initial, chain, dig} · reward_eligible | 开格事实 | digit 恒真透传(仅 kind=safe 携带;雾格携带真实数字、呈现隐藏归 D1、判定数据源 = variant_ids);reward_eligible:initial 恒 false / chain·dig ∧ safe 恒 true(含链开雾格)/ kind=mine 恒 false;发射序 = 规范序(初始/连锁 = 触发格 BFS、8 邻行主序固定序) |
| flag_judged | cell · hit | 轮末统一判定批 | 每轮次结束事务开始时对判定基线旗位逐旗一条(基线 = 轮次结束事务开始时的旗位;枚举序 = 行主序扫描,确定性) |
| round_end | path_tag ∈ {ap_exhausted, cleared, stopped} · continuation_hint ∈ {same_board, new_board} | 棋盘路径由 A2 外发 | 核心字段逐字段取自 A3 `last_round_end`(读取权为接口契约),与 A3 stopped 路径 payload 同构;stopped 路径由 A3 直发、A2 禁双发 |
### 字段值封闭枚举
| 字段 | 值域 | 语义 |
|---|---|---|
| kind | safe · mine | 开格种类;kind=mine 事件无 digit 字段 |
| channel | initial · chain · dig | initial=初始展开(恒无奖励)· chain=连锁 · dig=单格 |
| reward_eligible | bool | initial 恒 false;chain/dig ∧ kind=safe 恒 true(含链开雾格);kind=mine 恒 false |
| path_tag | ap_exhausted · cleared · stopped | 棋盘路径仅前两者由 A2 外发;stopped 由 A3 直发(双发射源) |
| continuation_hint | same_board · new_board | cleared → new_board;其余 same_board |
| hit | bool | [cell ∈ M];被拔的旗不判;雾内旗恒 false(零特判) |
| intent | dig · flag_place · flag_pull · move · stop | stop 执行 = 批事务内委托 A3.request_stop |
| reject_reason | board_face · resource_face · phase · board_invalid | 三源拒绝 + 装板违例 |
### 三源拒绝与 board_face 拒绝目录
| 源 | 判定 | 承载 |
|---|---|---|
| board_face | 挖:目标非 8 向相邻 / 目标已开 / 目标有旗(须先拔旗)· 插旗:非相邻 / 已开 / 已有旗 · 拔旗:非相邻 / 无旗 · 移动:目标未开 / 无 BFS 路径;目录外输入(越界坐标等)= out_of_catalog | sub_reason 封闭枚举(见下表) |
| resource_face | A3 try_spend 返回 false(AP 不足) | reject_reason=resource_face |
| phase | A3 非 Active 或无板态 | reject_reason=phase |
### sub_reason(仅 board_face 携带,封闭枚举——"须先拔旗"与"非相邻"玩家语义截然不同,必须数据可分;批后修改 = 接口漂移)
| 值 | 语义 | 适用动作 |
|---|---|---|
| not_adjacent | 目标非 8 向相邻 | 挖 / 插旗 / 拔旗 |
| target_revealed | 目标已开 | 挖 / 插旗 |
| target_concealed | 目标未开 | 移动 |
| flag_present | 目标已有旗(挖 = 须先拔旗;插 = 已有旗) | 挖 / 插旗 |
| flag_absent | 目标无旗 | 拔旗 |
| no_path | 经已开区无 BFS 路径 | 移动 |
| out_of_catalog | 目录外输入(越界坐标等)——debug 级诊断,不与玩家语义混桶、禁静默吞 | 全部 |
### 装板违例诊断类别(board_invalid 携带,封闭枚举)
| 值 | 对应不变式 |
|---|---|
| inv1_mine_in_spawn | ① B3 内无雷 |
| inv2a_variant_in_spawn | ② B3 内无变异格 |
| inv2b_variant_in_r0 | ② R₀ 内无变异格("R₀ 触雾"归此——②的 R₀ 子情形) |
| inv3_digit_invariant | ③ 数字恒真 |
| inv4_r0_equals_s | ④ R₀ ≠ S |
### 对外 API 面(provisional,封闭枚举——新增入口 = 接口漂移)
| API | 签名 | 语义 |
|---|---|---|
| install_board | `install_board(board)` | 装板 + 校验四不变式 + 初始展开 |
| settle_batch | `settle_batch(intents)` | A2 唯一结算入口(D1 唯一提交入口;单意图批 = 平凡形) |
| try_dig / try_flag_place / try_flag_pull / try_move | `try_*(cell)` | 便捷形 ≡ 对应单意图批,行为逐项相同 |
| compute_move_path | `compute_move_path(cell)` | 只读——BFS 路径(8 邻行主序);不可达格返回空 |
| retire_board | `retire_board()` | 板实例与变异快照消亡(NoBoard 下幂等受理) |
| ActionOutcome | `{accepted, outcome, reject_reason, sub_reason}` | outcome ∈ {executed, voided, rejected};sub_reason 仅 board_face 携带 |
## 棋盘状态·装板与初始展开
### 板态
| 板态 | 进入条件 | 行为/出口 |
|---|---|---|
| NoBoard | 冷启动 / `retire_board()` 后 | 全部动作 API 拒绝(phase 源);`install_board` 受理(Idle/Waiting);retire_board 幂等受理 |
| Installed·Active | 装板完成 ∧ A3 phase=Active | 接受全部动作意图;dig/旗经 `try_spend`,移动免费直达;弃图刷新 = retire + install(B1 `refresh_board` 编排,装板后回本板态);轮次结束事务 → Installed·Frozen |
| Installed·Frozen | A3 phase=Waiting(三路径任一收轮) | 全部动作意图拒绝(phase 源);棋盘/旗/小人全态冻结;`install_board`(换新图)/`retire_board` 受理(编排边界) |
| Retired | `retire_board()` 或战斗终结后编排调用 | 旗/小人/事件分段终结(事件捕获以 install 为段界)——板实例与变异快照一同消亡 |
### 输入 × 相位 × 板态矩阵(动作意图 ∈ {dig, flag_place, flag_pull, move, stop};编排调用 ∈ {install_board, retire_board})
| 输入 | NoBoard | Installed·Active | Installed·Frozen |
|---|---|---|---|
| 动作意图(含 stop) | 拒绝(phase) | 受理(经批次结算器) | 拒绝(phase;A3 侧按同一致相位矩阵同判——两侧判定一致) |
| install_board | 受理(Idle/Waiting) | 受理(仅弃图刷新路径——B1 `refresh_board` 编排;非刷新路径仍拒绝——防轮内换板) | 受理(换新图 = 全态重置 + 初始展开重放) |
| retire_board | 幂等受理 | 拒绝(板态) | 受理 |
### 装板与初始展开规则
规则:
1. (规则 3)install_board 在 Idle/Waiting 相位受理,挖掘进行中只有"弃图刷新"这一条编排路径例外(以账本扣费成功为前提),其余在局内装板一律拒绝;受理后 A2 持有生成期变异快照(非数据表活引用,热重载改表不影响行为),当场验四条结构不变式,任一不过即拒绝装板并给出 board_invalid 错误级诊断,绝不带病运行;验过才执行初始展开、把小人放到出生 3×3 中心格。
2. (规则 4)装板成功的那一次事务里,A2 免费翻开出生 3×3 加上与之连通的空地闭包(每次装板执行一次、跨轮不重放);这片初始展开域与 A1 生成器求解时的初始视野逐格相等——不多开不少开、不外扩一圈"安全边距";翻开守四条铁律:免费(不扣行动点、账本零写入)、计入清图进度(剩余安全格从这片开完后起算)、无奖励(这些格不发奖励、下游不得入库)、永不触雷触雾(出生区无雷 + 闭包只走安全格,在板上即可独立证明)。
举证:四条不变式与诊断类别见下表,受理域见上矩阵;"无奖励格不得入库"下游义务见 B1 强制项②;初始展开定义落点承接 A3 EC5 委派;恰等与双包含证明见 F3 与推演件;验收 AC-1/AC-1b/AC-2/AC-3/AC-16/AC-17。
### install 四不变式(violation = 拒绝 + `board_invalid` + error 级诊断,fail-fast 不静默;AC-1b/AC-2 按枚举名断言)
| # | 不变式 | 违例诊断(封闭枚举) |
|---|---|---|
| ① | B3 内无雷 | inv1_mine_in_spawn |
| ② | B3 ∪ R₀ 内无变异格(A4 Rule 7 消费侧兜底;"R₀ 触雾"归 R₀ 子情形) | inv2a_variant_in_spawn / inv2b_variant_in_r0 |
| ③ | 数字恒真——num(x) ≡ 8 邻雷数(A2 全部规则的地基) | inv3_digit_invariant |
| ④ | R₀ ≠ S——清图退化板拒绝(防"初始展开即整图"使轮次棋盘路径出口结构性不可达;生产面由 A1 legality 闸保证,本条为纵深防御、非 A1 clearable 闸复验——不可达安全格板 A2 照常运行) | inv4_r0_equals_s |
补充不变式:板态仅上述四态;变体属性是格级只读快照(无独立运行期状态机分支于变异/雾——零特判);产物只能经程序构造或 A1 产生,运行期不存在该输入源;A2 以 A3 相位观测量为闸、不自持轮次状态。
## 动作规则
符号约定:U / M / S = 全格集 / 雷集 M ⊆ U / 安全格全集 S = U ∖ M;F / G / O = 雾格集 F ⊆ S / 旗集 G / 已开集 O ⊆ U;B3 = 出生 3×3;num(x) = x 的真实数字(8 邻雷数,数字恒真)∈ {0..8};N₈(x) = x 的 8 邻。
规则:
1. (规则 5)挖/插旗/拔旗三个付费动作,A2 先查棋盘面(目标相不相邻、开没开过、旗位对不对),查过再请资源账本扣行动点;任一边说不行,整个动作被拒绝——棋盘不变、不扣费、不发事件;每次拒绝携带三源之一的可辨原因码(棋盘面/资源面/相位,玩家面文案归呈现层);A2 自己绝不直接扣资源;挖成之后连锁规模与清图事实(chain_size, clears_map)由 A2 上报账本。
2. (规则 6)挖开数字为 0 的格时,它周围 8 向相邻的未插旗安全格免费连锁全开,一路递推到没有新的 0 格为止;连锁格只花首格挖掘价、照常计入清图进度、奖励资格照常;旗格不入链也不当传播源——旗是玩家可用的"链阻断器"(花 1 AP 插旗保护一格不被误链);雾格可被链开但永不传播(生成端保证雾格数字恒非 0),代码里没有为变异写的分支。
3. (规则 7)点击任何已开格,小人经已开区一次瞬移到位——逐格走的动画是呈现层的事,规则层一次事务完成落位;合法条件两条:目标格已开、且能只经过已开格 8 向连通走过去("已探明区"含已引爆雷格——走过的雷可以穿行站立);移动免费、不经账本、不发事件;只读查询 compute_move_path 返回同一条寻路路径(固定 8 邻行主序,确定性),既是合法性判定载体、也是呈现层路径预览的数据源。
4. (规则 8)旗是棋盘状态的一部分:插上的旗跨轮保留、随图存续,换图/刷新/战斗结束随之消失;没有"口袋旗"库存、数量无上限、只能插在未开格上;轮次结束时 A2 对当时在场的每面旗报一条判定——旗下是雷判中、不是雷判空,雾里的旗恒判空(雾区无雷,判定零特判);旗留在雷上就每轮诚实重复报判中,去重是结算侧的事,A2 只报事实;插拔旗本身不发事件,界面反馈走调用返回值。
5. (规则 11)挖开雷格报一条 kind=mine 开格事件,轮次不结束、格子算已开——从此可以通行:小人能站上去、能穿过它继续挖;雷格不计清图进度、不能再挖、不能再插旗;同一轮可连续挖开多颗雷,每颗都是独立事实;雷格通行是有价捷径:挖已知雷 = 花 1 AP + 给敌方送优势,是玩家主动抄近路的权衡与降级板上的兜底通路,不是免费通道。
6. (规则 12)本作没有双击快开/数字和弦:点击已开数字格的唯一含义就是移动小人;对外接口是封闭枚举、里面没有快开入口,将来谁想加就是接口漂移修订。
举证:
- 规则 5 依据 A3 Rule 9(禁自行扣减),验收 AC-4/AC-11/AC-21;规则 6 算子见 F2,遇旗逐格行为见 EC17,验收 AC-5/AC-6;规则 7 边界见 EC14,呈现归属归 D1,验收 AC-14。
- 规则 8 价目见下表,判定字段见三事件回边,兑付去重归 A3 Rule 8/OQ5,挪旗价目见 A3 EC3/EC7,验收 AC-11/12/13;规则 11 验收 AC-15、边界 EC10;规则 12 负空间验收 = API 封闭枚举"无对应入口",chord 首遇提示归 D1 强制项③,行为验收 AC-4。
| 旗动作 | 花费 | 发生什么 |
|---|---|---|
| 插旗 | 1 AP | 未开格上立一面旗 |
| 拔旗 | 1 AP | 旗从棋盘移除 |
| 挪旗 | 2 AP(拔 + 插) | 旗换个位置 |
| 挖有旗的格 | 拒绝 | 须先拔旗(1 AP)再挖 |
## 批次结算与收轮
```
settle_batch(intents) ── 单一结算事务(到达序 ⟨I₁,…,Iₙ⟩,n ≥ 1)
│ ① 分类 class(I)(批次初态求值):C_dig(执行后 clears_map=true 的 dig)
│ · C_stop(stop)· C_other(非清 dig / flag×2 / move)——真模拟 F2,禁计数器捷径
│ ② 语义序 ≺:C_dig ≺ C_stop ≺ C_other;同类内按到达序(稳定序)
│ ③ 逐意图执行;轮次结束首次为真处定胜者 ω
│ 其后意图全部 voided——零棋盘效果 · 零 AP 扣减 · 零事件(区别于非法拒绝)
▼
胜者 ω → 出口分发(见核心循环节出口分发表)
```
| 类别 | 成员 | 结算次序 |
|---|---|---|
| C_dig | dig 且执行后 clears_map = true(真模拟 F2——禁"rem=1 则任意 dig 必清"计数器捷径,反例 = 挖雷不入 S) | 最先 |
| C_stop | stop | 次之 |
| C_other | 非清 dig / flag ×2 / move | 其余(同类内按到达序——稳定序,多 cleared-dig 时最先者执行胜出) |
四组合真值表(≡ A3 Rule 3 优先级 cleared > stopped > ap_exhausted):
| # | 批次(到达序) | 结果 | RAP |
|---|---|---|---|
| 1 | [dig清, stop] | (cleared, new_board),stop voided | +0(voided) |
| 2 | [stop, dig清] | 语义序重排 → 同 #1 | +0 |
| 3 | [stop, dig耗] | (stopped, same_board),dig voided | += remaining |
| 4 | [dig耗, stop] | 语义序重排 → 同 #3 | += remaining |
规则:
1. (规则 9)一帧多个指令全部经批次入口 settle_batch 提交——A2 唯一结算入口,单意图批等价于逐个调便捷接口;批次是整体事务:先按固定类别顺序重排(能清图的挖最优先、停手次之、其余殿后,同类内按提交顺序),再逐个执行,轮次结束条件第一次成立处定出胜者,其后意图全部 voided——零棋盘效果、零扣费、零事件;voided 不等于被拒绝——拒绝是"本来就不合法",voided 是"来不及了";停手指令经批次入口转交资源系统,停手轮的结束事件仍由资源系统直发。
2. (规则 10)一次挖掘结算让资源系统仲裁出轮次结束(行动点耗尽或清图胜出)时,A2 读取资源系统的轮次结束记录、组装恰一条轮次结束事件外发,外发之前先把本轮旗判定全部报完;行动点归零的瞬间轮次即结束——不存在"0 行动点还能操作"的窗口。
举证:
- 规则 9:优先级口径与 A3 Rule 3 逐项一致,承接 A3 EC4 deferral;RAP 记账随胜者(键 = 胜者意图类型 × 结算时点 clears_map 真值);stop 经 settle_batch 提交、不直调 A3 的接线义务见 D1 强制项①;验收 AC-9/AC-10,边界 EC6/EC13/EC15。
- 规则 10:组包即字段转抄——核心字段逐字段取自 A3 `last_round_end`;验收 AC-7/AC-8;清图轮剩余 AP 清零不入 RAP 见 A3 Rule 5。
## 行为契约(F1–F4 数值结论)
口径总纲:F1 定终局判定谓词(状态轴)、F2 定连锁展开算子(执行轴)、F3 定初始展开域(对偶轴——A1 度量与 A2 行为的接缝)、F4 定批次仲裁(事务轴)——四条均为行为契约,禁互相折算;本节零平衡公式、零随机、零字面量、零 UI 依赖。变量域、验算数据与全部推导论证见推演件「数值锚定与验算记录」及各问题节。
### F1 清图判定谓词(clear_predicate)
**结论**:cleared ⇔ 已开集覆盖全部安全格(等价形:剩余安全格计数 rem = 0 ⟺ cleared);求值点穷举两处——install 初始展开事务尾(不变式④保证恒 false)与每次 dig 执行完成点;插旗/拔旗/移动不改已开集 → 结构上不可能触发 cleared;A3 `clears_map` ≡ 本谓词在该动作事务尾求值——单一谓词两个名字,禁第二套实现。
```
cleared(σ) :⇔ O(σ) ∩ S(B) = S(B) 等价形:|S(B) ∖ O(σ)| = 0
rem(σ) = |S(B) ∖ O(σ)| ——剩余安全格计数;rem = 0 ⟺ cleared
```
| 项 | 判定处理 |
|---|---|
| 雷格 | 恒 ∉ S(已引爆雷格入 O 作 BFS 通道但不入判定) |
| 旗 | 不入 O 不入 S(带旗未开格照常计入 rem——"全图标旗不挖"永不 cleared) |
| 雾格 | 照常计入(A4 Rule 4) |
| 求值点 1 | install 初始展开事务尾——不变式④保证此处恒 false |
| 求值点 2 | 每次 dig 执行完成点(连锁完成后)——批次内逐 dig 求值,与 A3 `request_dig` 按次上报契约一致 |
### F2 连锁展开闭包(chain_closure)+ chain_size / clears_map 上报参数
**结论**:连锁闭包 = 单调最小不动点,与 A1 F1 算子①在 G=∅ 域逐字同构;chain_size = 附加格数(不含首格);clears_map ≡ F1 本事务尾求值(禁第二套实现);连锁不越旗(旗格不入链、不作传播源——集合减法非分支);含链开雾格、雾格永不传播(零特判定理非分支);Cl 单调幂等 ⇒ 逐动作增量求值 ≡ 一次全量闭包。
```
Chain(O, c) = μX.[ O ∪ {c} ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ∖ G ⊆ X ) ]
dig(c) 的棋盘效果:O′ = Chain(O, c);事件:cell_revealed × |O′ ∖ O|(BFS 规范序)
chain_size(dig(c)) = |O′ ∖ (O ∪ {c})| ——附加格数,不含首格(A3 AC-2/AC-6b 期望依赖)
clears_map(dig(c)) = [ S ⊆ O′ ] ——≡ F1 本事务尾求值
```
### F3 初始展开域(initial_expansion_domain)+双包含回验
**结论**:O₀ = R₀ = B3 ∪ flood 闭包,与 A1 F1 求解器初始态恰等(同算子同板 ⇒ 同值),显式不含外扩 1 环;恒不开雷 R₀ ∩ M = ∅ 为 A2 侧独立可证定理;双包含两臂构造性成立 ⇒ A1 回退口径(出生 3×3 最小态)不触发、度量保真零降级;退化守卫 R₀ ≠ S——install 拒绝清图退化板(不变式④纵深防御,非 A1 clearable 闸复验)。|R₀| ∈ [9, |S|−1],域非空前提 |S| ≥ 10。
```
O₀ = R₀(B) = μX.[ B3 ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ⊆ X ) ]
≡ A1 F1 "出生 3×3 ∪ flood 闭包" 逐字(同算子同板 ⇒ 同值);显式不含外扩 1 环。
性质 1(恒不开雷,定理):R₀ ∩ M = ∅(B3 无雷 + 闭包只收安全格)。
双包含回验:臂① R₀ ⊆ 排除域(以最终产物板计:出生 3×3 ∪ 闭包 ∪ 外扩 1 环)——构造性成立;
臂② A1 求解器初始态 = R₀ ⊆ O₀ = R₀ ——恰等。
退化守卫(不变式④):R₀ ≠ S——install 拒绝清图退化板(EC1;非 A1 clearable 闸复验)。
```
### F4 批次仲裁(settle_batch)
**结论**:语义序 C_dig ≺ C_stop ≺ C_other(同类内按到达序稳定);轮次结束首次为真处定胜者、其后意图全部 voided;(path_tag, continuation_hint, AP/RAP 终值) 对任意到达序不变(全批域)——执行/voided 划分的无关性仅对异类竞争成立;同类多成员批内划分由类内稳定序决定(不同到达序 = 不同输入,均为合法确定行为);RAP 记账随胜者。
```
类别函数(排序用,批次初始态求值):
class(I) = C_dig 若 I = dig(c) 且执行后 clears_map = true(真模拟 F2——禁计数器捷径:
"rem=1 则任意 dig 必清"为假,反例 = 挖雷不入 S)
= C_stop 若 I = stop
= C_other 其余(非清 dig / flag ×2 / move)
语义序 ≺:C_dig ≺ C_stop ≺ C_other;同类内按到达序(稳定序——多 cleared-dig 时最先者执行胜出,
其余 voided;未钉死类内序会使事件流与奖励格归属漂移——规范性义务)。
结算循环:按 ≺ 逐意图执行;轮次结束首次为真处定胜者 ω,其后意图全部 voided
(false + voided:零棋盘效果、零 AP 扣减、零事件——区别于非法拒绝)。
胜者 → 出口映射见核心循环节出口分发表;棋盘路径 round_end 由 A2 恰一次外发;
stopped 由 A3 直发(双发射源纪律,A2 禁双发)。
```
### 显式排除声明(归属表)
| 对象 | 归属 |
|---|---|
| 平衡公式 | 本 GDD 无——全部数值归位如下 |
| 价目、ap_per_round、RAP 规则 | A3(F4 只消费 try_spend/request_stop/last_round_end 行为契约,零数值所有权) |
| 雷布/尺寸/密度/可推理率/R₀ 与排除域定义版权 | A1(F3 是其运行期镜像;A1 侧定义修订 = 接口漂移 + metric_version 联动,A2 禁独立改动) |
| 变异约束 | A4(F2 只消费"雾格恒非 0"生成保证) |
| 奖励档位/标中旗判定/结算编排 | B 系(A2 只输出事件流) |
| 曲线 | C3 |
| A2 拥有 | 四条行为契约(F1–F4) |
| 概率/期望公式 | 零(零随机——确定性由 AC-19 行为断言承载:同板同意图序列 ⇒ 事件流逐位相同) |
### 实现期红线(与 A1 度量的漂移风险清单)
| # | 红线 |
|---|---|
| 1 | 0 格判定必须读真实数字 num(x),禁读显示值 |
| 2 | 初始展开禁加外扩环(破臂①)、禁只开 3×3(破臂②) |
| 3 | clears_map 与 cleared 同一实现 |
| 4 | chain_size 不含首格、链不开雷、含链开雾格 |
| 5 | A1 R₀/算子修订 = metric_version 跳变 + 本 GDD 同步修订 |
| 6 | 双包含臂①排除域以最终产物板计(先布后删无迭代,placed 基准可小于最终 R₀——A1 Rule 4 措辞修订义务,EC1) |
## 边界情况
| 条件 | 行为 | 依据 |
|---|---|---|
| EC1 初始展开即整图(R₀ = S,清图退化板) | install 拒绝——不变式④ fail-fast(`board_invalid` + error 诊断),非合同内行为;生产面由 A1 legality 闸拦截;A2 侧不变式④为纵深防御,双包含两臂不受影响(跨 GDD 阻断缺口反例 B 与 A1 修订义务见依赖节登记义务表与推演件) | 不变式④ / systems-index 门禁块 / AC-1b |
| EC2 install 产物违例(B3 内雷 / B3∪R₀ 内变异 / 数字不恒真 / R₀=S) | 拒绝 + 状态不变 + error 恰一类别(不变式①–④)——信任边界 fail-fast;违例板只能由程序构造错误产生(A1 产物经生成期合法性闸),运行期不存在该输入源 | 规则 3 / AC-2 |
| EC3 挖已插旗格 | 拒绝(board_face,sub_reason=flag_present)——须先拔旗(1 AP)再挖;旗是"别挖这里"的承诺标记 | A3 EC11 棋盘面判定落点 / AC-11 |
| EC4 连锁传播开到雾格 | 雾格被免费开出(channel=chain)、digit 恒真透传 + variant_ids 非空(呈现隐藏归 D1)、级联自然停止(雾格非 0 不传播)、计入清图、reward_eligible=true 奖励照常入库——零特判的自然结果,代码零变异分支 | A2×4① / A4 EC4 / AC-6 |
| EC5 玩家在雾格插旗 | 合法、耗 1 AP、旗立在未开雾格上;轮末判定恒 hit=false(雾区无雷——判定逻辑零特判自然覆盖);标错惩罚上线后的一致性推论:雾内旗按"非雷格上的旗"恒受罚——无 A4/A2 特判;D5 教学须警示"雾内插旗纯损" | A2×4② / OQ1 前瞻登记 / AC-12 |
| EC6 同批次多结束路径竞争 | F4 语义序仲裁,四组合与 A3 Rule 3 逐项一致(真值表)、RAP 记账随胜者、voided 意图零副作用(零棋盘写/零扣减/零事件——被 voided 的旗动作不进轮末判定,无幽灵旗);胜出后余意图 voided,棋盘只读查询逐格不变。联合清图让位条款:批内个体非清的 dig 联合可清图时,stop 仍先执行并胜出(C_stop ≺ C_other)——联合清图高光被停手让位,为语义序的显式设计后果(单意图帧提交下生产面不可构造——D1 强制项⑥;F4 语义保留为防御性兜底,AC-10 义务不豁免) | F4 / AC-10 |
| EC7 最后 1 AP 挖开最后安全格 | cleared 与 ap_exhausted 同时成立 → A3 事务内 cleared 胜出 → A2 外发 (cleared, new_board) 恰一条、剩余 AP 清零不入 RAP——防"耗尽优先"实现把清图高光结算为最差结局 | A3 EC10 / AC-7 用例 1 |
| EC8 战斗中热重载修改 VariationTable | 板持生成期变异快照(非活引用)——行为零变化;A2 零表读取使抗重载为构造性;行为级代理 = 换根重放事件流逐位相同 | A2×4④ / A4 EC8 / AC-18 |
| EC9 拒绝目录外溢 | 目录外输入(越界坐标等)按 board_face 拒绝 + `sub_reason=out_of_catalog`(debug 级诊断,不与玩家语义混桶)+ debug 诊断禁静默吞;三源(board_face/resource_face/phase)互异可判定——玩家面文案归 D1(映射源 = sub_reason 枚举) | 规则 5 / AC-21 目录外用例 |
| EC10 挖开雷格 | `kind=mine` 事件(无 digit)、轮次不结束、reward_eligible=false、格子可通行(工程债)可经其 BFS 续挖;同轮连续挖多雷 = 每雷独立事实事件;rem 不变(雷 ∉ S) | 工程债(systems-index 门禁修正记录)/ AC-15 |
| EC11 换图/刷新/战斗结束 | `install_board`(新板)= 旗/小人/已开集全量重置 + 初始展开重放;`retire_board` = 板实例与变异快照消亡——旗随图存续语义(A3 Rule 8)的 A2 侧终点 | A3 Rule 8 / AC-13/17 |
| EC12 非 Active 相位动作请求 | 拒绝(phase 源)、零事件、全态不变——A2 与 A3 两侧按同一相位矩阵各自判定、结论一致;不存在 0-AP 窗口(A3 Rule 3 的对侧消费) | 状态矩阵 / AC-16 |
| EC13 批次内旗动作与终局意图竞争 | 旗动作 ∈ C_other → 被 cleared-dig/stop 压成 voided;判定基线 = 轮次结束事务开始时旗位(voided 旗动作不留痕)——语义序使基线与到达序无关 | F4 / AC-10c/d |
| EC14 移动边界 | 目标未开 / 无 BFS 路径 → board_face 拒绝;目标即当前格定义为零移动,幂等受理;`compute_move_path` 对不可达格返回空——预览与执行同源 | 规则 7 / AC-14 |
| EC15 同批次多个 cleared-dig | 类内稳定序——到达序最先者执行并胜出,其余 voided;(path_tag, RAP) 天然唯一,稳定序规范的是事件流与奖励格归属 | F4 / AC-10e |
| EC16 install 与 A3 相位组合非法(如非刷新路径的 Active 装板〔刷新路径已受理〕/ NoBoard 动作) | 编排面拒绝(板态/相位源)——B1 编排错误 fail-fast 暴露,禁静默(A3"拒绝 + debug 诊断"口径同族,进程致命保留给数据通道) | 状态矩阵 / AC-16 |
| EC17 连锁前沿遇旗(连锁不越旗) | 旗格不入链、不作传播源——被旗挡的格保持未开 + 带旗,仅经该格可达的后续格本轮不被链开(经其他路径可达者照常开出);chain_size 只计实开格;旗格轮末判定照常(hit 按其是否为雷——误标安全格留待玩家自拔,自己的承诺自己付 1 AP 撤回,与 OQ1 惩罚逻辑自洽);零特判合规:传播集 `∖ G` 是集合减法非分支(F2 注) | 规则 6 / F2 注 / AC-5 分支 2 |
## 依赖与输出
A2 不依赖任何下游——systems-index TD-SYSTEM-BOUNDARY 唯一回边:A2 只外发事件,B4/B1 订阅后回调;A2 为瓶颈系统(B4/D1/D5 挂其事件),规则一次定稳。
| 方向 | 系统 | 性质 | 接口要点 |
|---|---|---|---|
| 上游 | A1 | hard(产物消费) | 棋盘产物 = 格状态 + 变异标记 + 出生区(Board class_name 数据契约);双包含回验两臂落点在 F3(臂① 展开域 ⊆ 排除域、臂② 求解器初始态 ⊆ 展开域,恰等——A1 回退口径不触发,门禁缺项即 blocking);install 不变式①–④为消费侧信任边界(fail-fast);A1 修订义务 ×2 见跨 GDD 登记义务表 |
| 上游 | A3 | hard(账本) | `try_spend(action_kind)` 唯一扣减入口(A2 禁自行扣减);`request_dig(chain_size, clears_map)` 参数上报(A2 计算);stop 意图委托 `request_stop()`(A3 直发 stopped round_end);轮末读 `last_round_end` 组包棋盘路径 round_end(读取权 = 接口契约);相位观测量(Idle/Active/Waiting)= A2 动作闸的对侧来源;A3 API 面零改动(settle_batch 是 A2 侧入口) |
| 上游 | A4 | soft(快照透传) | 变异属性经 A1 产物快照只读携带、随 `cell_revealed.variant_ids` 透传——A2 执行逻辑零变异分支(零特判原则,义务是"不加分支");A2×4 清单缺项即 blocking |
| 上游 | D2 | 无直接依赖(登记事实) | A2 零表读取、零 ConfigDB 引用——参数经 A3 账本、板面经 A1 产物;D2 Interactions 表"A2 无直接依赖"由本 GDD 证实 |
| 下游 | B1 | hard(编排,未设计——provisional 登记) | 消费 round_end(棋盘路径)与全事件流结算;换图编排 = `install_board`/`retire_board` 的调用方(接线归 B1 GDD);B1 强制项 ×3 见下表(缺项即 blocking) |
| 下游 | B4 | soft(订阅,未设计) | 清图奖励触发(cleared 路径)与安全格奖励内容归 B4——A2 只上报棋盘面资格事实(`reward_eligible`/`channel`),内容与折算不经 A2;连锁批量授予的溢出吸收设计待 B1/B4 条目化(13 格链 × B3 max_stack=2 ⇒ 大量"溢出未生效"行进结算明细,P2 画面反向伤害连锁幻想——溢出转一次性资源/治疗或显式接受,裁决归 B1/B4) |
| 下游 | D1 | hard(呈现,未设计) | 棋盘/小人/旗/数字渲染;数字显示判定消费 `variant_ids`(雾格无字——digit 恒真透传是前提);三源拒绝呈现(映射源 = reject_reason + sub_reason);D1 强制项 ×6 见下表(缺项即 blocking),数据面义务见呈现与数据供给契约表 |
| 下游 | D5 | soft(Alpha) | 教学口径来源:小人三动作 + 连锁/旗/收轮以本 GDD 规则为准;教学条目:雾内旗纯损、雷格可通行、旗挡链(连锁止于旗属正常)、挖到雷 = 敌方优势而非死亡(经典扫雷玩家最大预期违背)、已开雾格无字属正常——挂 OQ1/EC5/EC17 |
| 下游 | D4 | soft(Alpha) | 挖掘/连锁/雷格/收轮音效挂三事件流;旗/移动反馈经调用返回值命令式驱动(两动作零事件外发——发射面封闭的已声明代价;systems-index 依赖分层 D4 ← A2,B1) |
| 下游 | A5 | soft(垂直切片预留) | 探测类道具的显影面可能挂 A2 查询接口(未开格数字显影)——接口归 A5 GDD 定稿,本 GDD 不预写(OQ4) |
### B1 强制项(缺项即 blocking,systems-index 门禁块登记)
| # | 义务 |
|---|---|
| 1 | 结算触发 = Waiting 相位编排点、不依赖事件到达序(stopped 轮 A3 直发 round_end 与 A2 旗判定批的到达序不承载语义) |
| 2 | `reward_eligible=false`(initial 通道)的格不得进入奖励入库(A3 EC5 委派闭环) |
| 3 | 诚实重复上报的去重义务(资格以雷格实例为键) |
### D1 强制项(缺项即 blocking,systems-index 门禁块登记)
| # | 义务 |
|---|---|
| 1 | stop 意图经 `settle_batch` 提交、不直调 A3(单一结算序保证) |
| 2 | 四种格态一眼可辨(已开 0 格地板 / 已开雾格无字 / 未开格 / 未开雾格——左键"已开=移动/未开=挖"消歧的感知前提;后果不对称:误挖 = 1 AP + 可能触雷且不可逆) |
| 3 | 悬停预承诺(光标区分移动/挖/旗目标语义)+ 可挖域(8 向相邻)常驻指示 + 怀旧扫雷玩家 chord 肌肉记忆首遇提示("点击数字格 = 移动小人"——非模态、每 run 一次,A4 先例) |
| 4 | 已引爆雷格"可通行可读"呈现 |
| 5 | `compute_move_path` 呈现语义定稿(合法性指示 vs 穿行动画轨道——P4 氛围载体;BFS 行主序路径可能视觉绕路,形态归 D1 裁决) |
| 6 | 单意图帧输入收集(stop 点击终结当帧收集;F4 语义序退为防御性兜底)+ 批次 voided 呈现义务(至少 stop 被 voided 须可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP)+ 每次拒绝玩家可感知(文案归 D1,映射源 = reject_reason + sub_reason) |
### 呈现与数据供给契约(A2 无自有渲染面与 UI——数据供给规格 + D1 呈现义务登记)
| # | 数据面义务 | 归属 |
|---|---|---|
| 1 | 数字可读性的数据前提:digit 恒真透传(含雾格)是"数字是主角"(视觉锚 1)的逻辑地基——呈现层任何隐藏/遮罩都不改数据层真值;已开雾格 = 地板无字(负空间,防误读为 bug) | D1 |
| 2 | 绘制优先级固定(视觉锚 3):数字 > 小人 > 旗 > 变异纹理 > 底色——小人所在格用边框高亮而非覆盖文本;A2 的事件流是 D1 分层绘制的输入 | D1 |
| 3 | 三 channel 驱动动效语义(D1/B5 消费):initial(开局整片亮起——"地牢初醒")· chain(连锁撕开——P1 高光时刻的动效载体;连锁止于旗的呈现已登记 D1/教学)· dig(单格回应) | D1/B5 |
| 4 | kind=mine 事件 = 已引爆雷格视觉态:已开底 + 雷图标 + 可通行可读——玩家必须看得出"这是走过的雷、能走"(D1 强制项④) | D1 |
| 5 | 变异标记保真:variant_ids 透传错误即呈现欺骗(雾格显影/隐藏全链路的数据源) | D1 |
| 6 | 无 MVP 音频:挖掘/连锁/旗/雷格/收轮音效挂 D4(Alpha,依赖分层 D4 ← A2,B1);事件流已含全部触发点 | D4 |
| 7 | 输入模型:鼠标驱动(PC 主输入)——左键已开格 = 移动 / 未开相邻格 = 挖、右键 = 插/拔旗、停手按钮 = `settle_batch([stop])`;全部意图经 `settle_batch` 提交(D1 强制项①)——单帧多意图时 A2 语义序仲裁兜底(F4);触屏/Gamepad 非 MVP 门禁(意图对象架构使后续接入零数据层障碍) | D1 |
| 8 | 单意图帧输入收集(D1 强制项⑥):stop 点击终结当帧收集——F4 语义序退为防御性兜底 | D1 |
| 9 | 输入消歧感知前提(D1 强制项②③):四种格态(已开 0 格地板/已开雾格无字/未开格/未开雾格)一眼可辨、悬停光标区分移动/挖/旗目标语义、可挖域(8 向相邻)常驻指示——硬前提(后果不对称:误挖 = 1 AP + 可能触雷且不可逆) | D1 |
| 10 | 三源拒绝呈现:board_face(sub_reason 封闭枚举)/ resource_face(AP 不足)/ phase(收轮中)——每次拒绝玩家可感知(AC-21 为数据源验收) | D1 |
| 11 | voided 呈现义务(D1 强制项⑥):被 voided 的意图(至少 stop)须玩家可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP 的读感欺骗 | D1 |
| 12 | 移动路径预览:`compute_move_path` 返回 BFS 路径,呈现语义(合法性指示 vs 穿行动画轨道)归 D1 GDD 裁决定稿(D1 强制项⑤——systems-index 门禁登记项,悬案的数据面已备) | D1 |
| 13 | 输入摩擦护栏观测:每轮原始输入动作数(含被拒/voided)∶ 当轮 AP 消耗 ≤ 2(A3 P4 载体;"点击"以设备中立"输入动作数"计)——归 D1 遥测(A2 只收意图对象、不收原始输入),≤2 为 playtest 待验证假设(挂 A3 OQ3);远距目标两击摩擦的复合意图(点击远格 = 自动 move+dig)登记为 D1 评估项(MVP 可裁决不做、留痕) | D1 遥测 |
| 14 | 结算明细无 A2 附加项:效果归因全部经事件流字段由 B1 呈现(P2) | B1 |
### 跨 GDD 新登记义务汇总(本 GDD 出具,随 systems-index 门禁块登记)
| 编号 | 内容 | 对侧 | 状态 |
|---|---|---|---|
| A1-1 | F5 legality 增 R₀ ≠ S(违例 = 该次尝试废弃重试,clearable 同款)——"初始展开即 cleared"反例 B 与 N=1 行整行退化阻断缺口 | A1 | 待回写 |
| A1-2 | F4 批量断言严格零 + Rule 4 排除域基准措辞(最终产物板计) | A1 | 待回写 |
| B1×3 | 结算触发相位编排点 · initial 格不入奖励库 · 兑付去重(明细见 B1 强制项表) | B1 | 已登记(缺项即 blocking) |
| D1×6 | stop 经 settle_batch · 格态可辨 · 悬停预承诺+可挖域+chord 首遇提示 · 雷格可通行可读 · 路径呈现语义定稿 · 单意图帧收集+voided 呈现+拒绝可感知(明细见 D1 强制项表) | D1 | 已登记(缺项即 blocking) |
| B1/B4-1 | 高光兑现节点条目化(含 chord 缺席的标中旗即时兑现补偿候选——清单外散文登记会丢失,B3 先例) | B1/B4 | 待条目化 |
| B1/B4-2 | 连锁批量授予溢出吸收设计(见依赖 B4 行) | B1/B4 | 待条目化 |
## P0 最小闭环
1. A1 产板 → `install_board` 受理:持有生成期快照 + 校验四不变式(违例 fail-fast)。
2. 初始展开 R₀ 免费翻开(cell_revealed ×\|R₀\|,channel=initial,规范序),小人落位 B3 中心格。
3. 玩家意图经 D1 → `settle_batch`(A2 唯一结算入口)。
4. dig:棋盘面判定 → A3 `try_spend` → 开格 + 连锁(cell_revealed ×(1+chain_size)),A2 上报 `request_dig(chain_size, clears_map)`。
5. flag/move:旗入棋盘(1 AP)/ 免费瞬移——零事件,反馈经调用返回值命令式驱动。
6. 批次内轮次结束首次成立 → 定胜者,其后意图 voided(零效果、零扣费、零事件)。
7. 收轮:`flag_judged ×N` 先于 `round_end`——棋盘路径 A2 读 `last_round_end` 组包外发,stopped 路径 A3 直发。
8. 三事件流被 B4/B1/D1/D4/D5 消费(结算归因、呈现、音效)→ Waiting 相位编排受理 `install_board` 换新图,回到步骤 1。
## P1 / P2 后置
后置以对侧登记为生效条件;复活任何一行 = 修订本 GDD,不许静默加回。
| 优先级 | 内容 | 后置原因 |
|---|---|---|
| P1 | B1 轮次编排接线(Waiting 出口/next_round_mode/request_refresh 代理)· 结算兑付与 P2 来源标注 · 兑付去重(诚实重复上报的对侧,A3 Rule 8/OQ5)· EC8 末轮判定次序 · 双发射源消费序 | B1 未设计——systems-index B1×8 义务清单 + 本 GDD B1×3,生效条件成立 |
| P1 | B4 奖励内容与差异化插槽 · debuff 档位 | B4 未设计——A4 三条定价硬约束 |
| P1 | D1 数字显示消费 variant_ids · 三源呈现 · 路径预览表现 · 点击摩擦观测 | D1 未设计——A4 D1×2 + 本 GDD D1 强制项 ×6 |
| P2 | A5 显影接口 | 接口归 A5 GDD 定稿(OQ4) |
| P1 | A1×A2 双包含端到端集成用例——"A1 真生成器产物 → A2 install"全链路回验 | 两系统实现后集成冒烟承载(本 GDD 冒烟用程序构造板) |
| P1 | 标错惩罚落地 | OQ1 登记——实测义务保留,不阻塞设计;惩罚前 AC-12 只断言 hit=false |
## 调参表
A2 零专属 knob——结构冻结项修订走本 GDD 修订流程非调参;禁止在 A2 侧复制任何参数(D2 Rule 1 单一事实源)。已锁数值以 design/registry 为准,本表只登记字段与归属,不复述锁值。
| 字段 | 域 | 默认 | owner | 说明 |
|---|---|---|---|---|
| ap_per_round · dig_ap_cost · flag_place_ap_cost · flag_pull_ap_cost · rap_refresh_cost | 见 registry action_economy | 以 registry 为准 | A3 | 节奏与价目——A2 只消费 try_spend 行为契约 |
| BoardGenTable 九字段 | 见 registry board_gen_table | 以 registry 为准 | A1 | 板面与推理保障 |
| unlock_level | 见 registry | 以 registry 为准 | A4 | 变异资格 |
| flag_pull_ap_cost 联动观测(引用不拥有) | — | — | A3 | 挪旗成本与 OQ1 标错惩罚的双重定价位(A3 OQ2 复核落点——若实测推翻拔旗 1 AP,A2 行为零改动、仅价目表值变化) |
| ap_per_round 联动观测(引用不拥有) | — | — | A3 | 决定每轮可兑现的确定动作供给(A3 OQ3 供给指标) |
| A2 侧可观测指标(非 knob,遥测域) | — | — | A2 | 每消耗 1 AP 输入动作数(≤ 2 护栏,P4 点击摩擦——D1 观测,provisional 待 playtest 验证)· 连锁规模分布 · 批次数/轮 |
结构冻结清单(非 knob):三事件面封闭 · 初始展开 = R₀ 恰等 · 连锁免费 · 移动/初始展开不经账本 · 无 chord · 批次语义序 · 四条 install 不变式 · 瞬移移动语义。
## 验收标准
### 测试口径
| 口径 | 要点 |
|---|---|
| 测试载体 | `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化);A2 冒烟 = Core-Core 集成:被测面 = A2 规则引擎 + 真 A3 实例(资源全经真账本 `try_spend` 驱动——A2 不可自行扣减);冒烟另以 B1 编排角色最小形驱动 `notify_round_start()`/`notify_settlement_done()`(仅开轮/收轮;B1 就绪后改走真实调用方,断言口径不变) |
| 棋盘输入 | Board class_name 直引程序构造(不经生成器、不经 load()/preload()——A4 AC-5/A1 夹具先例;板规格即 A1 产物 schema 的坐标级实例化,A1 未实现不阻塞本冒烟) |
| API 面 | provisional 封闭枚举,见枚举节(install_board · settle_batch——D1 唯一提交入口,单意图批 = 平凡形 · try_* 便捷形 · compute_move_path 只读 · retire_board);无 chord 负空间:封闭枚举即"无对应 API"的验收形态,新增快开入口 = 接口漂移 |
| 事件捕获断言面 | B1/D1 未设计 → 以事件捕获列表断言,分订两发射面:A2 面(cell_revealed / round_end 棋盘路径 / flag_judged)+ A3 直发面(stopped round_end);payload 口径钉死:① digit 恒真透传(仅 kind=safe 携带;雾格携带真值——呈现隐藏归 D1,判定源 = variant_ids);② reward_eligible:initial 恒 false、chain/dig ∧ safe 恒 true(含链开雾格)、kind=mine 恒 false;③ round_end 核心字段 ≡ A3.last_round_end 逐字段(同构) |
| 只读观测量 | A2 侧 = 已开集/旗集/小人位/事件捕获;A3 侧 = ap/rap/phase/last_round_end;多步 GIVEN 均给出构造序列 |
| 夹具策略 | 程序构造小板、每用例先 `reset_diagnostics()`;行为夹具根 = 零(A2 无数据表、无加载期校验类别——`--data-root` 通道在本域无消费者;资源面非默认价目分支经 D2 R3 debug override 构造,A3 AC-7 同款);登记常数协议(A1 黄金向量同源):每板登记 (R₀ 成员集, \|R₀\|, \|S\|, 关键格 digit, 级联集) + 逐格手工推导记录入版本库;失效处置 = 先复核推导、推导无误即实现缺陷 |
| 期望值推导纪律 | 行为类 THEN 数值 = ConfigDB A3 表读值推导(ap_per_round/各价目经测试通道读取)⊕ 板登记常数;不写死玩法数值,唯一例外 = 登记常数;默认价目全 1 AP 下"AP 不足"分支不可构造(A3 EC2 同款)——资源面分支显式承载于 debug override 非默认表值(AC-21) |
| 致命类协议 | 零行 manifest(显式声明)——D2 AC-2b 协议适用前提 = 加载期数据通道致命;A2 无加载期校验,install 违例 = `board_invalid` 拒绝 + error 诊断(进程致命保留给数据通道;实现期 ADR 若裁决升格,回本节补 manifest 行) |
| out-of-scope | deferral 以对侧登记为生效条件——见 P1 / P2 后置表 |
### 夹具板清单(程序构造小板)
spawn = 出生 3×3 中心格坐标,逐板显式登记:b_spawn / b_flag / b_batch / b_mine_walk / b_degenerate = (3,3),b_chain / b_fog = (3,2)——按默认"板中心"读法该两板 B3 = {2..4}² 会含 y=4 雷墙雷、违反不变式①、板不可安装(已修正并纳入 OQ3 复核范围)。
| 板 | 规格(坐标级要点) | 服务 |
|---|---|---|
| `b_spawn` | M = {(1,y): y∈[0,6]∖{3}} 竖墙 6 雷留缺口;R₀=35、\|S\|=43、未开 8 格;(1,3) digit=2 | 安装五属性/双包含/挖掘/移动/相位 |
| `b_chain` | spawn=(3,2);M = y=4 横墙 6 雷留 (3,4) 缺口;R₀=28(y∈[0,3] 全安全格);墙下封闭区 14 格;(3,6) 为 0 格、级联集 \|C\|=13 | 连锁/双包含/链不越旗 |
| `b_fog` | spawn=(3,2);b_chain 几何 + M += {(5,0),(6,1)};雾 F = {(0,5),(1,5)}(链可达)∪ {(6,0)}(链不可达);雾格 digit 2/3/2、厚度≤2 ✓;R₀ 常数随 M 变化按板重算((6,2)/(6,3) 退出 R₀) | 雾链两态/雾旗/快照/零特判/回放 |
| `b_fog_bare` | b_fog 同 M 同几何、variant 标记剥离 | AC-20 同构对板 |
| `b_flag` | b_spawn 同几何复用;(1,2)/(1,4) 雷 = hit 旗靶、(0,3) 安全 = miss 旗靶 | 旗生命周期/轮末判定/三源拒绝 |
| `b_batch` | b_spawn 同几何复用(未开恰 8 格支持构造) | 批次四组合/两收轮路径 |
| `b_mine_walk` | M = {(3,5)} 单雷;(3,4) digit=1 ∈ R₀ | 雷格挖开/已引爆可通行 |
| `b_degenerate` | 8×8、M = {(7,7)} 单雷角——R₀ = S(全 0 格连通,构造性退化) | 不变式④ install 拒绝 |
| `b_invalid_*` | ① mine_spawn:b_spawn+M+=(3,3) ② fog_spawn:b_fog+F+=(3,2) ③ fog_flood:b_fog+F+=(5,1)(R₀ 成员)④ digit:b_spawn+数字篡改 | 不变式①②③④ 各一(AC-2) |
### AC 清单(Given-When-Then,编号不变,23 条)
| AC | Given | When | Then | 覆盖 |
|---|---|---|---|---|
| AC-1 | 真 A3 实例(phase=Idle)与 `b_spawn` | `install_board(b_spawn)`,随后 `notify_round_start()` → Active | accepted=true 且事件捕获**仅**含 cell_revealed 批,逐事件断言:① 免费——A3 ap 仍=表读值(零 try_spend)且诊断零新增;② 计入清图——构造序列挖尽未开 8 格(登记常数)时恰在第 8 次触发 `round_end{cleared, new_board}`(无超前/滞后);③ 无奖励——全部 reward_eligible=false(channel=initial);④ 永不触雷触雾——全部 kind=safe;⑤ 恰等 R₀(有序断言)——事件**有序列表** ≡ 测试侧朴素 BFS 重算 R₀ 的行主序枚举,逐格逐序相等(规范序钉死——DFS/列主序等"错误但确定"的实现不可通过;登记常数 \|R₀\|=35 为独立锚) | 规则 4 / A3 EC5 委派 |
| AC-1b | `b_degenerate`(R₀=S 构造板) | `install_board`;随后 `install_board(b_spawn)` | accepted=false、reject_reason=board_invalid、error 诊断恰一条类别=**inv4_r0_equals_s**(枚举见状态节);随后重装 accepted=true(拒绝原子性) | EC1 / 不变式④ |
| AC-2 | `b_invalid_mine_spawn` / `b_invalid_fog_spawn` / `b_invalid_fog_flood` / `b_invalid_digit` 各板(每用例先 reset_diagnostics) | 各 `install_board` | 均 accepted=false、board_invalid、error 恰一对应类别(**inv1_mine_in_spawn / inv2a_variant_in_spawn / inv2b_variant_in_r0**〔"R₀ 触雾"归此——②的 R₀ 子情形〕**/ inv3_digit_invariant**,封闭枚举见状态节) | 规则 3 / EC2 |
| AC-3 | `b_chain` 与 `b_fog` 各 install 后捕获的初始域格集 E(B);测试侧按 A1 F1/Rule 4 公开定义朴素重算 R₀(B) 与排除域 X(B)=R₀∪外扩 1 环(X(B) 以最终产物板计——先布后删后基准,A1 Rule 4 措辞修订义务 EC1) | 逐板比对 | **臂①** E(B) ⊆ X(B);**臂②** E(B) ≡ R₀(B) **逐格恰等**(不欠展开也不过度展开——A1 回退口径不触发的行为面);两板全用例通过 | 规则 4 / F3 / registry a2_dual_containment(门禁缺项即 blocking) |
| AC-4 | `b_spawn` Active、小人于 R₀ 内 | `try_dig(c)`(相邻未开)→ `try_dig`(非相邻 / 已开格 / 有旗格)→ 等价护栏:同构造态分别驱动 `try_dig(c)` 与 `settle_batch([dig c])`(各新轮) | 第一次 executed、A3 ap −dig_ap_cost(表读值,真 try_spend)、事件恰一条 `{cell=c, kind=safe, channel=dig, reward_eligible=true, digit ≡ 测试侧重算 8 邻雷数}`;拒绝分支 rejected+board_face(sub_reason 分别 = not_adjacent / target_revealed / flag_present)、零事件、ap 不变;等价护栏:事件流/ap/棋盘只读观测量/诊断逐项相同(单意图批 ≡ 便捷形) | 规则 5 / 规则 9 / A3 Rule 2 |
| AC-5 | `b_chain`;构造序列挖 (3,4)→移→挖 (3,5)→移→`try_dig((3,6))`(0 格);分支 2:构造至小人立于 (3,5) 后 `try_flag_place((2,5))`(未开相邻,1 AP)→ 再 `try_dig((3,6))` | 第三次挖掘(分支 1);插旗后再挖(分支 2) | 分支 1:executed 且 ap 总耗 = 3×dig_ap_cost(级联免费——非 3+13 格);事件 channel=chain 批恰 \|C\|=13 条(登记常数)且序 ≡ 测试侧 BFS 行主序枚举、全 reward_eligible=true、digit 恒真透传、事件数 = chain_size + 1(一致性恒等式);级联止于非 0 格(链只经 0 格扩);链格计入清图(挖尽封闭区后余格清图即 cleared)。分支 2:(2,5) 保持未开+带旗(零 cell_revealed)、chain_size=12(级联集减 1——(1,5)/(1,6) 经 (2,6) 照常开出,仅旗格本身被挡)、旗格轮末判定照常 | 规则 6 / F2 / EC17 |
| AC-6 | `b_fog`;同 AC-5 构造至 (3,6) 级联;另一用例:小人移至 (5,1) 后 `try_dig((6,0))` | 级联(链可达雾);全价挖链不可达雾 | 四项逐验:① 链可达雾 (0,5),(1,5) 免费开出(channel=chain、ap 无雾附加扣减);② variant_ids 含 "fog" 且 digit=2/3 恒真透传(呈现判定数据源——A2×4③ 同板证);③ 级联停止(级联集与 b_chain 同构板逐格同形——雾格只作叶);④ reward_eligible=true 且计入 cleared 判定。另一用例(链不可达全价):executed、channel=dig、耗 1 AP 全价、variant_ids 非空、digit=2 透传 | A2×4①③ / A4 EC4 / fog_ap_note 两态执行侧 |
| AC-7 | 用例 1(同帧竞争):`b_batch` 构造至"未开恰 1、ap=1"(cleared 与 ap_exhausted 同事务成立——"耗尽优先"缺陷仅在此构造可检出);用例 2:同构造 ap=k≥2 | `try_dig(末格)` | 用例 1:executed、A2 面 `round_end{cleared, new_board}` 恰一条(ap_exhausted 不触发)、其字段 ≡ A3 `last_round_end` 同帧读值(组包数据源行为面)、与 stopped 路径 payload 同构(字段集/类型一致)、rap 不变(剩余 AP 清零);用例 2(剩余清零非平凡分支):cleared 恰一条、rap 不变(k−1 > 0 清零非平凡) | 规则 10 / EC7 / A3 Rule 5/6/9/EC10 |
| AC-8 | `b_batch` 未开 ≥2、ap=1 | `try_dig(非末格)`;紧接任意 `try_*` | executed、`round_end{ap_exhausted, same_board}` 恰一条、A3 remaining_ap=0 不变式;紧接动作全部 rejected+phase、零事件 | 规则 10 / A3 Rule 3/EC1/EC14 |
| AC-9 | `b_batch` Active 未开完、ap=k≥1 | `settle_batch([stop])` | **A3 直发面**捕获 `round_end{stopped, same_board}` 恰一条(A2 面零 round_end——双发射源行为面)、rap = 前值 + k(1:1,表读值推导)、事件序 = flag_judged ×N 先于 round_end(事件序契约) | 规则 9 / A3 Rule 4/9 |
| AC-10 | `b_batch`(每用例新轮新构造)六场景:a〔dig清→stop〕· b〔stop→dig清〕· c〔dig→stop,ap=1 耗尽型构造:新轮 7 次非清挖〕· d〔stop→dig,同 ap=1 构造〕· e〔dig清₁→dig清₂ 同批〕· f〔非清 dig₁→非清 dig₂ 联合清图;多步 GIVEN:前轮挖雷 (1,2) 开道(雷格可通行的构造性利用)→ 挖尽 x=0 列余格 → 停手收轮;新轮未开恰 {(0,3),(1,3)}、ap=8〕 | 提交各批次 | a:cleared 胜出、rap 不变(stop 清零不入 RAP);b:与 a 同结果(同 path_tag/同 rap 终态/同事件数——异类序无关性);c:**语义序救援用例**——stopped 胜出(朴素到达序将产出 (ap_exhausted, RAP+0)——语义序校正为 (stopped, RAP+1))、rap += 1(表读值推导)、被弃 dig 格仍未开(续轮同图可证);d:与 c 同结果;e:类内稳定序——到达序最先者执行胜出、恰一条 cleared、第二 dig voided 零副作用;f:dig₁ 执行不清图(rem 2→1)、dig₂ 结算时点 clears_map=true 胜出 → cleared、两意图均执行、rap 不变(出口映射按结算时点真值键控——F4)。全用例断言:voided 意图零棋盘写/零扣减/零事件(棋盘只读查询逐格不变)、round_end 恰一条;c/d 断言 `flag_judged ×N` 先于 `round_end`(事件序契约) | 规则 9 / F4 / EC6/EC13/EC15 / A3 EC4 deferral 兑现(A3 冒烟不可构造用例在本节兑现,deferral 生效) |
| AC-11 | `b_flag`、小人于 (2,3) | 依次插 (1,4)、插 (1,2) 后拔 (1,2)(挪旗)→ `try_dig((1,4))`(有旗)→ 插非相邻/插已开/插已有旗/拔无旗/拔非相邻 | 全 executed、ap 合计 −(place+pull)×2(表读值)、旗集随动、零事件外发;挖旗格 rejected+board_face(EC11 落点);各拒绝分支 rejected+board_face | 规则 5/8 / A3 EC3/EC7/EC11 |
| AC-12 | 分支 1:`b_flag` 插 (1,4)(雷)与 (0,3)(安全,经挖 (1,3) 后站立可达),前置断言验"被拔的不判"(插 (1,2) 后拔,轮末无该条目);分支 2(雾旗):`b_fog` 小人相邻未开雾格插旗;分支 3(重复上报):分支 1 收轮后 `notify_settlement_done(same_board)`+`notify_round_start` 续轮旗仍在 | `settle_batch([stop])`(分支 1/3);轮末(分支 2);再停手(分支 3) | 分支 1:flag_judged 恰 2 条**集合断言**:{(1,4),true}、{(0,3),false}(行主序枚举);分支 2:`{cell,hit=false}` 恒(雾区无雷零特判;标错惩罚上线后"恒受罚"推论 = OQ1,惩罚前不可判定);分支 3:再次 {(1,4),true}——A2 逐轮诚实重复上报,**去重归 B1/B4(out-of-scope)** | A2×4② / A4 EC5 / A3 Rule 8/OQ5 上报半 |
| AC-13 | `b_flag` 已插 2 旗 stopped 收轮 | 续轮(same_board);随后 `retire_board()` + `install_board(b_fog)` | 旗集不变且**事件捕获零新增 cell_revealed**(初始展开板级一次、跨轮不重放——每轮重放的违例实现在此用例现形);重装后旗集 = 空、初始展开照常(按新板) | 规则 8 / EC11 / A3 Rule 8/EC9 |
| AC-14 | `b_spawn` 小人于 (3,3) | `compute_move_path((2,3))` 两次 → `try_move((2,3))` → 拒绝/幂等四对:① move 未开格 ② move 已开但 BFS 不可达格 ③ move 目标 = 当前格 ④ 正常移动分支 | 路径两次逐格相同(确定性)且全格 ∈ 已开集、相邻步 8 向合法;try_move executed、位置更新、**ap 不变**(不经账本)、零事件;① rejected+board_face(sub_reason=target_concealed);② rejected+board_face(sub_reason=no_path)**且** `compute_move_path` 对同格返回空(预览与执行同源,一用例双断言);③ executed 幂等(零移动:位置不变、零事件、ap 不变——EC14);④ 保持 | 规则 7 / EC14 / A3 Rule 2 移动行/P4 |
| AC-15 | `b_mine_walk`、小人于 (3,4) | `try_dig((3,5))` → `try_move((3,5))` → 经雷格续挖 (3,6) | executed、ap −1、事件恰一条 `{kind=mine, channel=dig, 无 digit 字段, reward_eligible=false}`、**轮次不结束**(两面零 round_end);try_move executed(**可通行**——工程债验收落点)、位置=(3,5);续挖正常受理 | 规则 11 / EC10 / 工程债登记 |
| AC-16 | NoBoard 或 Installed·Frozen(Idle/Waiting 两分支);另 GIVEN Active | 依次 dig/flag×2/move/`settle_batch([stop])`;Active 下 `install_board`/`retire_board` | 全部 rejected+phase、棋盘只读查询与事件面逐字不变;Active 下装板/退板拒绝(板态——EC16) | 状态矩阵 / EC12/EC16 / A3 输入×相位矩阵对侧 |
| AC-17 | `b_spawn` 已装且部分挖掘 | `retire_board()`;随后 `install_board(b_flag)` | 全动作拒绝(phase;无板态)、事件分段边界确立(跨段断言禁止——防前图泄漏);重装后初始展开按新板重算、无前板残留(旗/小人位/已开集) | 规则 3 / EC11 |
| AC-18 | `b_fog` 基线事件流 E₀ 已捕获 | 测试通道换根加载变异表(B3 AC-15 换根模式)后重放同一意图序列(新 A3 实例+新 install) | 事件流与 E₀ **逐位相同**(含 variant_ids)——生成期快照非活引用;A2 零表读取(AC-22③)使抗重载为构造性,本用例为行为级代理 | A2×4④ / A4 EC8 |
| AC-19 | 同坐标规格独立构造的 `b_fog` ×2(各配全新 A3 实例) | 同一定长意图序列驱动两遍(含挖/链/雾链/插拔旗/移动/多意图批/停手收轮——覆盖三 channel、flag_judged 与批次仲裁) | 两遍事件捕获列表**逐位相同**(数、序、全字段) | 规则 1 / D2 Rule 5 的 A2 层 |
| AC-20 | (`b_fog`, `b_fog_bare`) 同构对(同雷布同 digit、仅 variant 标记差异) | 同一意图序列各驱动一遍 | 两事件流**除 variant_ids 外逐位相同**(差分容许域 = 该字段且仅该字段)——连锁/清图/旗判定/价目/收轮全不感知变异 | A4 Rule 4 零特判 / 规则 1 / A2×4③ 反向证成 |
| AC-21 | `b_flag` + debug override `action_economy.flag_place_ap_cost=2`(D2 R3 域内值;承载声明:默认价目下资源面分支不可构造,同 A3 AC-7)构造 ap=1 | `try_flag_place`(棋盘面合法)→ `try_dig`(非相邻)→ `try_dig((1,4))`(有旗格)→ Waiting 相位任意动作 → `try_dig((-1,-1))`(越界,目录外用例) | rejected+**resource_face**、全态不变;**board_face + sub_reason=not_adjacent**;**board_face + sub_reason=flag_present**("须先拔旗"与"非相邻"数据可分);**phase**——三源互异可判定;目录外:rejected+board_face + **sub_reason=out_of_catalog** + 诊断收集器恰一条 debug(非静默吞) | 规则 5 / EC9 / A3 EC2 对侧 |
| AC-22 | A2 文件集(规则引擎/事件载荷/冒烟脚本/夹具规格) | 静态扫描 | ① 零 `randomize()`、零自建 RNG 构造(**tests/ 豁免不启用**——A2 确定性回放不需种子,严于 A1 先例);② 零 ConfigDB 外 data 表加载(Board class_name 直引豁免);③ **零 `ConfigDB.*` 属性读取**(A2 全部输入经 A3 账本与 A1 产物——设计决策;实现期 ADR 若裁决需读表,走接口漂移修订本条);④ 零 `extends Control/Node2D`、零 `.tscn` preload;⑤ AC-1 在 `godot --headless --script` 实跑通过(退出码 0 + 断言收集器零失败)作为本项判定(Rule 7);⑥ 纳入 D2 AC-14 项目级人工三要素字面量扫描(warning 级 + 人工复核,成员清单随实现建立并入——B3 AC-19 同款) | 规则 1 / D2 Rule 1/2/5/7 |
### 覆盖矩阵(验收评审用)
| 类别 | 映射 |
|---|---|
| 规则 | 1→AC-19/20/22 · 2→AC-4/6/7/8/9(payload 前言钉死)· 3→AC-1b/2/17/18 · 4→AC-1/3(A3 EC5 委派 + 双包含)· 5→AC-4/11/21 · 6→AC-5/AC-6 · 7→AC-14 · 8→AC-11/12/13 · 9→AC-4 等价护栏/AC-9/10 · 10→AC-7/8 · 11→AC-15 · 12(无 chord 负空间)→API 封闭枚举 |
| Formulas | F1→AC-1②/5/7 · F2→AC-5/AC-6 · F3→AC-1⑤/3 · F4→AC-10 |
| EC | EC1→AC-1b · EC2→AC-2 · EC3→AC-11 · EC4→AC-6 · EC5→AC-12 · EC6→AC-10 · EC7→AC-7 用例 1 · EC8→AC-18 · EC9→AC-21 目录外用例 · EC10→AC-15 · EC11→AC-13/17 · EC12→AC-16 · EC13→AC-10c/d · EC14→AC-14 四对 · EC15→AC-10e · EC16→AC-16 · EC17→AC-5 分支 2 |
| 义务 | A2×4①→AC-6 · ②→AC-12 · ③→AC-6/AC-18/AC-20 · ④→AC-18 · 双包含①→AC-3 · ②→AC-3 · A3 EC4 deferral→AC-10 · 工程债→AC-15 · OQ1 在位→推演件开放问题区 |
| 规模 | 23 条 = AC-1…AC-22 + AC-1b(原"EC4 腿"编号为 AC-6,EC17 由 AC-5 分支 2 承载) |
## 版本历史
| 版本 | 日期 | 改动 |
|---|---|---|
| v2.0 | 2026-09-14 | 两件套迁移:按模板 v2 重排为 design 结论件(设计目的/系统范围/核心循环/领域章节×6/依赖与输出/P0 闭环/P1·P2 后置/调参表/验收标准),公式推导论证、候选取舍、体验锚点论证、已裁决争议、义务审计台账与全部 OQ 移至推演件 `design/gdd/analysis/a2-minesweeper-rules.md`;规则、数值、AC/EC/F/OQ 编号与内容零变更 |
| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/边界情况/AC/义务台账/覆盖矩阵/开放悬案转表格,流程转字符画;F1–F4 公式本体、Variables 与验算数据全保留;术语统一以 voided 行文;语义与 2026-09-09 定稿及 2026-09-12 D4 修订对齐,零规则变更 |
| D4 修订 | 2026-09-12 | install_board 受理域扩 Active·仅弃图刷新路径:B1 `refresh_board` 编排内、A3 扣费成功为前提;其余 Active 装板仍拒绝(防轮内换板原则对非刷新路径不变),EC16 随之收窄 |
| v1 | 2026-09-09 | full /design-review 定稿 Approved:game-designer/systems-designer/qa-lead/ux-designer 四专员 + CD 终审六 blocking 同日修订核销、用户拍板放行(A3/A4/A1/B3 先例);systems-designer 起草 F1–F4 + 反例 B 阻断缺口(登记 A1 修订义务)、qa-lead 起草 23 条 AC(AC-1…22 + AC-1b + 覆盖矩阵 + 夹具坐标规格);本次定稿含:初始展开 R₀ 恰等 / 批次语义序仲裁 / 移动瞬移语义 / install 四不变式 / sub_reason 封闭枚举(UX-1)/ 连锁不越旗(GD-1)/ 雷格通行有价捷径(GD-2)/ 到达序无关性收窄 / 联合清图让位条款 / D1 强制项 ×1→×6 / B1 强制项 ×3 / spawn 坐标修正(b_chain、b_fog=(3,2))/ 已引爆雷格可通行(工程债);评审日志 design/gdd/reviews/a2-minesweeper-rules-review-log.md |