Files
gplan-2/design/gdd/a1-board-generation.md
T
2026-09-14 18:18:49 +08:00

447 lines
42 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.
# A1 扫雷棋盘生成(Board Generation)
> **状态**:In Revision · 待 delta 复核放行 · **版本**:v2 · 2026-09-14
> **一句话**:从 (level_index, node_depth) 出发确定性生成完整扫雷棋盘,并在生成时刻承诺可推理率门槛。
> **推演件**:`design/gdd/analysis/a1-board-generation.md`(本文件只收结论,理由在那里)
## 设计目的
扫雷图的唯一生产者:五阶段确定性生成管线,为 A2/B1 提供自洽棋盘与生成期指标,为 P1"每一步都算数"提供生成端保障。缺位则游戏没有难度轴、A4 变异无布置载体、C3 曲线无落点。
1. 每张图在生成时刻承诺:从初始安全区出发、不靠赌能挖开的格子占比不低于该行及格线——玩家输给自选的赌(雾区/终局盲猜),不输给不可解的局。
2. 落点安全:出生 3×3 与其生成期可达域恒无雷、恒无变异。
3. 难度物质随 (level_index, node_depth) 上行——雷密、尺寸、雾占比由参数行直接雕刻。
4. 同种子同参数必产同图——回放、测试、复盘精确复现。
5. 参数组合退化时玩家永不卡死——降级出图并告警暴露,而非死锁。
## 系统范围
负责:
- 五阶段生成算法与生成-验证验收算子
- BoardGenTable schema 与数值回填(首个进度键表)
- 可推理率度量口径(F1)与双判据达标判定(F5)
- 雾参数域/可行性/成本谓词(F2/F2b/F2c)与加载期校验
- 清图预算增量构成(F3)与批量统计断言口径(F4)
- A4 变异约束的生成期强制执行(A4×15 清单唯一执行落点)
- 八项生成期指标集的产出
不负责:
- 挖掘执行(A2)
- 换图编排与 attempt 边界的编排侧断言(B1——A1 仅被调用)
- 难度曲线数值与调参(C3——仅类型依赖 schema,禁反向调用生成)
- 变异约束声明与候选池谓词出具(A4——A1 只消费 variant_pool_gate 并执行)
- dig_ap_cost 价目(A3——只读引用)
- "够不够"的判:清图总预算可用量与全量校验判据(A1/A3 契约与 C3);挖掘风险不等式与弃图支配性的闭合对账(B1 单一 owner——A1 只供给 actuals 分布锚值,非 target 参数)
- 推理器/布置算法实现选型(实现期 ADR——本 GDD 只冻结行为契约)
- 战斗侧/奖励定价/biome 词表(B1/B2/B3/B4/C1/D1——board_biome 仅为非空 StringSet 数据字段)
- 呈现(D1/A2/B5)
## 核心循环
```
generate(level_index, node_depth, rng) -> Board + 生成期指标集
│ ① 参数解析 ── BoardGenTable 行(D2 R1 floor 解析;域/跨字段谓词加载期已校验)
▼
② 布雷 ──────── N = round(mine_density × (W×H − 9)) (先定数,9 = 出生 3×3 恒排除)
│ 在"全格 − 出生 3×3"域经 board_gen 流均匀布雷
│ → 计算 0 格 flood 闭包及外扩 1 环 → 落在环内的雷移除
│ 【先布后删:只减不增、不重投、无迭代、确定性终止】
│ 实际雷数 |M| ≤ N;初始 3×3 及可达域内恒无雷;N ≥ 1 由加载期谓词保证
▼
③ 变异布置 ──── 先布雷后布雾(雾的 cell_constraint = safe_nonzero 要求雷先就位)
│ 候选池门控 → cell_constraint 生成期强制 → 出生区及可达域排除
│ → 雾形硬边界(厚度≤2【任意 3×3 窗口非全雾】 / f≤8×mine_density)
│ → 区域参数读行参数(region_count / target_ratio)
▼
④ 生成-验证循环 ─ 布雾完成后测可推理率(F1)
│ 实测 < target → 图内重试(同图种子实例内继续取数,不重开 scope)
│ 上限 max_gen_attempts 次 → 三分支出口(见出口分发表)
▼
⑤ 产出与上报 ── 棋盘 + 八项生成期指标集
```
| 出口 | 触发 | 行为 | 埋点 |
|---|---|---|---|
| 达标即出 | 存在合法尝试满足两项判据(inferability ≥ target ∧ inferability_core ≥ target) | 出最早达标尝试 k*(非全局 argmax) | attempts_used 记录 |
| 接受最优 | attempts 用尽、无达标但有合法尝试 | 出合法集内 inferability 最高者(tie 取最早、零额外取数)+ 降级标记 | 强告警埋点——运行期不死锁、开发期暴露参数问题 |
| 接受最不坏 | attempts 用尽且零合法尝试 | 确定性劣度字典序(不可达安全格数, min_safe 缺口, 序号)最小者出图 + 非法产物标记 | 最高级告警——玩家永不卡死,红线由 F4 断言 A′ 批量守 |
## 生成管线与随机流纪律
规则:
1. 生成器在每次被调用时按固定五步跑完——读参数、布雷、布雾布变异、自检重试、交货;顺序冻结,不调换、不跳步。
2. 布雷时先按密度定死雷数 N = round(mine_density × (W×H−9)),再在"全格 − 出生 3×3"域均匀落位;0 格 flood 闭包外扩 1 环内的雷落完后移除——只减不增、不重投、无迭代;实际雷数 |M| ≤ N,漂移量入指标集观测;加载期拒绝 N < 1 的零雷板。
3. 生成一张图期间的每一次随机取数——布雷、雾形、选变异、重试——都从同一条 board_gen 流按顺序取;一张图只 open_stream 一次、用到底;流之外零随机,randomize() 禁用(静态扫描 AC-18);不重开 scope,attempt 边界 = 生成函数完整返回。
4. 行参数在生成开始时单次读取快照,生成期内不重读;生成期间表热重载不影响进行中的生成(EC7)。
5. 推理器/生成器内部异常(crash/不变式违例)一律 fatal 中止 + 告警——实现缺陷 fail-fast,不降级(EC10,与参数性降级区分)。
6. 同帧两次生成请求顺序串行、各自 open_stream 取号,不引入锁(EC14)。
五阶段失败语义:
| 阶段 | 失败条件 | 语义 |
|---|---|---|
| 参数解析 | 行缺失 / 参数域违例 | 加载期校验已拦(D2);运行期不失败 |
| 布雷 | N = 0 | 运行期不失败(域内 N ≥ 1 恒可布,零雷板加载期已拒) |
| 变异布置 | cell_constraint 无解 | 静默降级:跳过变异、产物合法、shortfall 上报 |
| 验证循环 | 三分支(F5) | 达标即出 / 接受最优 + 强告警 / 接受最不坏 + 最高级告警 + 非法产物标记 |
| 产出 | —— | 棋盘 + 八项指标集 |
不变式:管线无状态、五阶段顺序冻结、生成期表值单次读取、attempt 边界 = scope 事件边界(重试不产生新取号);B1 编排不得把 attempt 边界当 scope 事件。
设计意图:无状态函数 + 单流取号是"同种子同参数必产同图"的根基。
## 出生区与可达域
规则:
1. 开局站立的 3×3 出生区保证无雷;从出生区顺 0 格连锁能走到的地方再外扩一圈,构成生成期"可达域"(R₀ = 出生 3×3 ∪ 0 格 flood 闭包,外扩 1 环为保守上界),由生成器按固定定义确定性算出,不依赖挖掘系统运行时行为。
2. 可达域内永远不放变异;外扩环内可有雷、只禁变异(验收口径 AC-6(a));雾区邻接出生 3×3 合法——约束谓词只管出生 3×3 格集及可达域内无变异格,邻接不构成违反(EC3)。
3. 挖掘系统实际能展开的范围只会比可达域小、不会比它大——双包含回验登记 A2 GDD:① A2 实际展开域 ⊆ A1 排除域;② A1 求解器初始态 ⊆ A2 实际初始展开域(F1 注记④度量保真对偶;若 A2 定稿展开更小,A1 回退口径 = 出生 3×3 最小态)。
设计意图:可达域是"落点安全"与"变异不堵路"的保守几何保证,A4 Rule 7 的执行落点。
## 变异布置与雾形边界
规则:
1. 生成器按固定顺序布置变异:先查候选池门控(消费 A4 variant_pool_gate),再把雾格放到允许的位置,最后守雾形硬边界。
2. 候选池为空(雾未解锁或 biome_tag 全不匹配)时,这张图静默布置为无变异图——空池合法非错误(EC1)。
3. 雾格只落在"8 邻含雷的非 0 安全格"(cell_constraint = safe_nonzero);出生区与可达域排除在外。
4. 雾形硬边界:任何 3×3 窗口不许全雾(雾皮厚度 ≤2);雾总量 ≤ 雷数 × 8(f ≤ 8×mine_density);摆几个雾区、每区目标多大读行参数(region_count / target_ratio)。
5. 布置无解(cell_constraint 连通分量不足)时静默降级:跳过变异、产物为合法无变异图;要求 N 区而实际达成 k<N 时尽力布置,实际达成数按 shortfall 分级上报;禁放宽约束硬塞——A4 Rule 3 不为布置成功率让步(EC2)。
6. 雾占比达 8d 上界但连通性不足时,参数域谓词 F2 仍放行(必要非充分),由 EC2 生成期降级路径兜底——两闸层次不同(EC12)。
7. 两个雾区相邻也各是独立布置实例,布置身份与 board_gen 取号互不牵连;呈现合并归 D1 渲染域(EC6);多变异选取消费 board_gen 流。
8. 每张图带 biome 标签集合:难度参数行携带非空 board_biome,同关卡同深度的所有图主题静态恒定——不存在逐图重掷主题的接口;标签集合为空属加载期致命校验错误;词表 owner 未定稿前只校验非空、不校验值域(EC13,词表定稿后补域校验,OQ4)。
设计意图:布置失败静默降级保产物合法,防钓鱼的主题恒定是结构保证而非文案。
## 可推理率度量与验收算子
规则:
1. 生成器给每张图算可推理率:评分模拟从开局展开后玩家能看见的盘面出发,与玩家信息严格同步——没开的格看不见、雷位不许偷看;确定性推理能挖开的安全格数 ÷ 总安全格数 = inferability;分子分母都剔除雾格得 inferability_core。
2. 每张图须同时过两条及格线:inferability ≥ target 且 inferability_core ≥ target——防"雾区无雷"常识单独把分数撑上去;两值随图输出。
3. 实测不达标时在同一张图的随机数配额内重试——不开新图、不重新取号;上限 max_gen_attempts(行读值);到顶仍不达标按出口分发表降级出图并告警——玩家永不卡死。
4. 合法性闸前置:legality = clearable ∧ \|S\| ≥ min_safe_count ∧ 结构不变式全过(雾 cell_constraint / 出生区及可达域排除 / 厚度≤2 / f≤8d / 数字计数恒真 / 初始展开不触雾)——不可清图产物不进"接受最优"候选,违规尝试判废重试。
5. 推理规则域 solver_rules MVP 冻结 single_subset(单点规则 + 子集消减);合法信息源穷尽枚举 = 数字约束(a)+ 雾元知识(b);新增信息源或改规则域 = 改可推理率定义 = GDD 修订,非调参。
术语表:
| 术语 | 含义 |
|---|---|
| inferability | 免赌确定揭示格数 ÷ 总安全格数——初始展开 ∪ 连锁揭示 ∪ 推导开据三通道全部计入分子,初始展开格同时计入分母 |
| inferability_core | 同上,分子分母都剔除雾格——两项判据第二腿 |
| inferability_target | 及格线,行读值,取值域 [0.85, 1];域下限 0.85 = "纯猜局红线"绝对锚 |
| clearable(B) | ∀c ∈ S:c 与出生 3×3 在"安全格 8 邻接图"上连通——清图可达性合法性谓词,与质量度量分两闸 |
### F1 可推理率度量(inferability_measure)
```
inferability(B) = |R∞(B)| ÷ |S(B)|
inferability_core(B) = |R∞(B) ∖ F(B)| ÷ max(1, |S(B) ∖ F(B)|)
R₀ = 出生 3×3 ∪(出生 3×3 经 0 格的 flood 闭包)
R∞ = R₀ 在两条闭包算子下的最小不动点:
① 连锁:x ∈ R 且 x 为 0 格 ⇒ x 的 8 邻安全格全部入 R(雾格可被链开但不传播)
② 推导开据:c ∈ S∖R 且 c 与 R 8 邻接,且求解器在可见信息态上
能以合法信息源唯一判定 c 非雷 ⇒ c 入 R
合法信息源(穷尽枚举):
(a)数字约束——可见数字格上以冻结规则域 solver_rules(single_subset)推理
(b)雾元知识——c 属于可见雾区 ⇒ c 非雷(建模知情玩家,非作弊读取雷位)
clearable(B) :⇔ ∀c ∈ S:c 与出生 3×3 在"安全格 8 邻接图"上连通
```
口径钉死(六条):
| # | 口径 |
|---|---|
| ① | "确定性推导格数" = 免赌确定揭示格数(字面窄读仅数字推导会使好图远低于门槛,非立法本意) |
| ② | 初始展开格计入分子与分母(R₀ ⊆ R∞) |
| ③ | 雾格入分子两通道:链可达雾格经算子①;与 R∞ 邻接的链不可达雾格经信息源(b);恒无 R 邻格的雾格计入终局残余;雾格 AP 代价不在此度量、由 F3 承载(两轴分离) |
| ④ | 求解器初始可见态取 0 格 flood 闭包内芯而非保守可达域全体(外扩 1 环非自动展开的必然产物) |
| ⑤ | 次序无关性(度量不变式):两算子对 R 单调 ⇒ 最小不动点唯一、与开据次序无关 |
| ⑥ | 每图指标输出携带 metric_version(当前 1)——防推理器实现漂移静默改定义(联动 F4 基线);改 R∞/信息源域则 version=2 + 向量重制 |
变量表:
| 变量 | 类型 | 范围 | 说明 |
|---|---|---|---|
| B | 棋盘实例 | —— | 一次尝试的产物(含雷布、雾布、出生区) |
| S(B) | 格集 | ⊆ 全格 | 安全格全集(分母;含雾格、含初始格、含不可达格) |
| F(B) | 格集 | ⊆ S | 雾格集(雾区无雷,由布置约束保证) |
| R₀ / R∞ | 格集 | R₀ ⊆ R∞ ⊆ S | 求解器初始可见态 / 免赌揭示闭包 |
| solver_rules | enum | {single_subset} 冻结 | 推理规则域(定义域非调参) |
值域与边界:
| 项 | 内容 |
|---|---|
| 值域 | inferability、inferability_core 均 ∈ [0,1](无雾板恒等);合法产物下下界 ≥ 9/\|S\| |
| target = 1 | 合法但结构性难达——由 F4 红线暴露,不加载期拒绝 |
| target < 0.85 | 加载期拒绝 |
| 不可达安全格 | 先触发 clearable 违例(合法性闸),不会以"拉低质量分"静默出图 |
| 验算例 | 12×12/mine_density=0.15 板 R∞=121、S=124、雾 9 格 → inferability ≈ 0.976、core ≈ 0.974,两项达标(完整例见推演件) |
### F5 生成-验证验收算子(attempt_acceptance)
```
合法尝试集 Lm = { B_k : legality(B_k), 1 ≤ k ≤ max_gen_attempts }
legality(B) :⇔ clearable(B) ∧ ( |S(B)| ≥ min_safe_count ) ∧ 结构不变式全过
B_out = B_{k*},k* = min{ k : B_k ∈ Lm ∧ inferability(B_k) ≥ target ∧ inferability_core(B_k) ≥ target }
(达标即出、非全局 argmax)
若 k* 不存在且 Lm ≠ ∅:B_out = B_{k**},k** = min{ k : inferability(B_k) = max_{j∈Lm} inferability(B_j) }
+ 强告警埋点 + 降级标记(tie 取最早,零额外取数)
若 Lm = ∅:接受最不坏尝试出图——确定性劣度字典序
k*** = min{ k : (不可达安全格数, max(0, min_safe_count − |S(B_k)|), k) 字典序最小 }
+ 最高级告警 + 非法产物标记(玩家永不卡死;批量红线由 F4 断言 A′ 守)
```
注记:
| # | 注记 |
|---|---|
| ① | 全部尝试共用同一 board_gen 流实例,k*/k**/k*** 与 B_out 同为流取数的确定函数——回放语义闭合;scope 事件边界 = 生成函数完整返回,D3 快照切点天然落在边界外 |
| ② | 合法性闸在质量评分之前——质量分不得掩盖功能残废 |
| ③ | "接受最不坏"的确定性劣度字典序零额外取数、可重放 |
| ④ | B1 编排不得把 attempt 边界当 scope 事件(登记 B1 接线注记) |
EC4/EC5 降级出口:
| 条件 | 行为 |
|---|---|
| EC4 重试耗尽仍无达标尝试(Lm ≠ ∅) | 接受 Lm 内 inferability 最高者出图(tie 取最早)+ 强告警埋点 + 降级标记——红线由 F4 断言 A 调参期守 |
| EC5 attempts 耗尽且零合法尝试(Lm = ∅) | 接受最不坏尝试出图 + 最高级告警 + 非法产物标记(遥测域、玩家不可见);零合法板玩家侧表现为"看似可玩"的功能残废——体验债如实登记,玩家侧诚实呈现(提示/补偿/回退)为 B1/D1 域承接项;运行期熔断候选(同 (L,D) 连续降级/非法 ≥ 阈值 → 确定性回退已知好种子重生成)方案裁决归实现期 ADR(OQ2 关联) |
| EC8 断言 B′ 失败(无雾行批量出现雾格) | 门控/布置泄漏 = 实现缺陷,转 bug 流程——非调参问题(与 EC9 区分) |
| EC9 某行 target = 1.0 | 合法参数——F4 断言 A 大概率开火 = 预期信号,触发参数修正会话而非 bug 修复 |
设计意图:质量度量与清图可达性分两闸,降级链保"玩家永不卡死"同时让参数问题必然现形。
## 清图预算增量(F3)
规则:
1. 生成器数出链不可达雾格(进这些雾只能花行动力一格一格硬挖),格数乘每格挖价(dig_ap_cost 为 A3 牌价、此处只读)得出雾致清图预算增量 Δbudget_fog,连同占比 fog_burden_ratio 随图输出——结算侧对账用这两个数。
2. 本条只在生成时算账、调参期批量核对;运行时不强制——账对不上改的是难度参数行;A1 只拥有量的计算与输出,不拥有"够不够"的判。
```
U(B) = F(B) ∖ Chain₀(B) Chain₀(B) = R₀ 经算子①(0 格级联)单独闭包的可达集
Δbudget_fog(B) = |U(B)| × dig_ap_cost (量纲闭合:格 × AP/格)
fog_burden_ratio(B) = |U(B)| ÷ max(1, |S(B) ∖ Chain₀(B)|)
```
| # | 口径 |
|---|---|
| ① | B1 条款 5 对账精确口径 = fog_burden_ratio(付费格分母);雾内部分母版本 \|U\|/\|F\| 不单列输出——可由指标集按需还原,不作对账输入 |
| ② | 分母 = \|S ∖ Chain₀\| = 最小清图付费挖掘格数(初始展开与连锁免费、其余每格 dig_ap_cost),分母下限 1 防全连锁退化板除零 |
| ③ | 链可达性取决于未开 0 格隐藏拓扑,玩家决策时点不可求值——本式是生成期事后度量 |
| ④ | 聚合义务:逐板计算入指标集;调参期按行批量聚合出核算报告供 C3 修正行参数;无运行期强制 |
| 变量 | 类型 | 范围 | 说明 |
|---|---|---|---|
| U(B) | 格集 | ⊆ F | 链不可达雾格集(全价段) |
| Chain₀(B) | 格集 | R₀ ⊆ Chain₀ ⊆ S | 纯 0 级联可达集(免费段,含初始展开) |
| dig_ap_cost | int [1,8] | 当前 1 | A3 价目,只读引用(knob 归 A3) |
值域与边界:Δbudget_fog ∈ [0, \|F\|×dig_ap_cost]、fog_burden_ratio ∈ [0,1];fog_region_count=0 → 两值恒 0;U=F 时雾板退化为纯 AP 税;U=∅ 时雾零成本——两极端形态均为观测对象。验算例:F1 例板 U=4、dig_ap_cost=1 → Δbudget_fog=4 AP、fog_burden_ratio ≈ 0.061。
设计意图:雾的成本在生成时入账,使"雾里面有价值"成为可对账的量而非感觉。
## 参数表、加载期校验与批量断言
### BoardGenTable schema(D2 承载,本 GDD 回填 owner——首个进度键表)
键结构 (level_index, node_depth),每关 depth-0 锚行前置(D2 R1);全项目第一张按进度键回填的配置表;A1 代码零硬编码,一切读取经 ConfigDB;数字计数恒真(每个非雷格数字 ≡ 8 邻雷数)、清图判定把雾格照常计入——交出的图不需要任何系统写特判。
| 字段 | 类型/范围 | knob | 说明 |
|---|---|---|---|
| board_width / board_height | int [8, 64] | ✓ | 图尺寸(MVP 量级护栏,非推导界) |
| mine_density | float (0, 0.5] | ✓ | 雷密度(尺寸解耦;f≤8d 分母对齐;上界为 MVP 护栏) |
| inferability_target | float [0.85, 1] | ✓ | P1 门槛——可推理率下限(承重 knob;域下限 = "纯猜局红线"绝对锚) |
| solver_rules | enum {single, single_subset} | ✗ 冻结 | 推理规则域(MVP 恒 single_subset——定义域非调参) |
| min_safe_count | int [1, 999] | ✓ | 最小安全格数下限(A3 EC5 对冲) |
| max_gen_attempts | int [1, 32] | ✓ | 生成-验证循环重试上限 |
| fog_region_count | int [0, 32] | ✓ | 雾区域数参数(0 = 本行无雾) |
| fog_target_ratio | float [0, 1) | ✓ | 雾面积占比参数(跨字段校验见下) |
| board_biome | StringSet 非空 | ✓ | 图类型标签(域校验致命) |
第三轴落点约定(冻结键 (level_index, node_depth) 对精英/Boss 修饰的约定):
| # | 约定 |
|---|---|
| ① | Boss 图 = 各 level 最大深度(Dmax)行:关底 Boss 恒为该关最后节点,Dmax 行即 Boss 行 |
| ② | schema 预留 elite_ / boss_ 前缀字段命名空间(与 D2 DifficultyTable Rule 4 对称;本 GDD 不定义任何修饰数值、不预写修饰枚举) |
| ③ | C1/C3 定稿强制重审(OQ6):若节点形态使精英性无法由 (level_index, node_depth) 唯一确定,走 D2 Rule 4 改键通道(接口漂移迁移)——迁移退路已登记 |
### 加载期校验(违规均加载期致命,D2 Rule 6 通道)
| 校验 | 判定式/内容 | 出处 |
|---|---|---|
| R1 键结构 | (level_index, node_depth) + depth-0 锚行 | D2 既有 |
| 字段域校验 | 九字段类型域全谱;inferability_target ∈ [0.85,1] | 本表 |
| 跨字段雾参数谓词 | `(fog_region_count = 0 ⇒ fog_target_ratio = 0)` ∧ `fog_region_count ≥ 1 ⇒ (0 < fog_target_ratio ≤ 8 × mine_density ∧ fog_target_ratio < 1 ∧ fog_target_ratio ≤ 0.25)`——F2 规范合取形;0.25 = 雾占比绝对上限 | F2 |
| 布雷数下限 | `round(mine_density × (W×H − 9)) ≥ 1`(零雷板拒绝) | F2 |
| min_safe 可行性谓词 | `W×H − round(mine_density × (W×H − 9)) ≥ min_safe_count`(计数可行 ≠ 连通可行——clearable 生成期闸不可互替) | F2b |
| 成本可行性谓词 | `max_gen_attempts × W × H ≤ 16384`(provisional 量级护栏,正式值归 OQ2 ADR;运行期禁墙钟时间逃生——耗时依赖输出即破同种子同图) | F2c |
| monotone_in_depth 字段标记(可选,非 knob) | 难度方向声明(size/density/target 类标记;fog_region_count 允许教学性非单调、不标)——F4 断言 E 载体,只校验方向不校验数值,数值所有权仍归 C3 | F4 断言 E |
规则:小图×高密×高 min_safe 的联合无解组合在加载期被 F2b 拦截判死、进不了游戏(EC11),对冲"图上没几格安全、随便挖挖就清图领奖励"的刷奖励漏洞(A3 EC5);生成完成后产物断言 \|S\| ≥ min_safe_count。
联合可行域裁决:不加 inferability_target 与雾/密度参数的第三条静态联合校验——无可判定静态界;暴露机制 = 运行期接受最优不死锁 + 强告警 + F4 批量断言;补偿保证与回写义务见推演件。
### F4 批量统计断言(调参期离线)
```
批量域 = BoardGenTable 全部行键 (L, D)(R1 floor 解析保证任意请求点归行)
批(L,D) = { generate(L, D, derive_at("board_gen", σ(L,D) + i)) : i ∈ [0, N) }
(derive_at 纯函数、不推运行期计数器;σ 基址清单入版本库,批量跨迭代可复现)
MVP 默认:N = 256/行;σ(L,D) = 10^9 + 2^20·L + 2^12·D(位打包使行区间两两不交)
```
| 断言 | 内容 |
|---|---|
| A(可推理率红线) | ∀行:低于 target 的板数 = 0——严格零(inferability 与 inferability_core 两项判据批量对照) |
| A″(target 绝对下限) | ∀行:target行 ≥ 0.85(provisional 锚——加载期域之外的调参期兜底) |
| A′(非法产物零容忍) | ∀行:带非法产物标记的板数 = 0(F5 配套) |
| B(雾出现下限 + 降级率上限,仅 count ≥ 1 行) | 实际达成区数 = fog_region_count 的板占比 ≥ 0.95(承载 A4⑭ 两件套) |
| B′(反向断言,仅 count = 0 行) | 含雾板数 = 0(门控泄漏 = bug 信号,转 bug 流程非调参) |
| E(难度方向 advisory) | monotone_in_depth 标记字段同 level 沿 depth 弱递增——违例 warning 级开火,调参期人工复核 |
| 报告 C | 按行 p10/p50/p90(实际 inferability)、p50/p90(Δbudget_fog 与 fog_burden_ratio)——p10 供 B1 条款 3 对账(消费 actuals 分布而非 target 参数) |
| 诊断 D(非断言) | 重试率(attempts_used ≥ 2 占比)、attempts_used 均值、EC2 shortfall 分级分布 |
严格零阈值与 0.85 / 0.25 / 16384 同属结构冻结——调整走 GDD 修订非调参。
设计意图:运行期"接受最优/最不坏"是安全网,批量红线是调参期纪律,两层不许互相折算。
## 依赖与输出
产物:棋盘(格状态 + 变异标记 + 出生区)+ 八项生成期指标集。措辞登记(防口径漂移):inferability 是盘面级免赌占比(生成侧);P(安全) 是单格认知概率(决策侧、经济口径)——免赌集内 P(安全) 恒 = 1(含雾格),风险讨论收缩到残余集(其安全格占比 ≤ 1 − inferability);inferability 是 P(安全) 的生成端结构性上界代理之占比形式,不是 P(安全) 本身。
| 方向 | 系统 | 性质 | 接口要点 |
|---|---|---|---|
| 上游 | A4 | hard | 变异约束声明方与 A4×15 验收清单出具方;A1 消费 VariationTable / variant_pool_gate 谓词 |
| 上游 | D2 | hard | BoardGenTable schema 承载 + 数值回填(A1 为回填 owner)+ R1 行解析 + board_gen 流(换图时 open_stream 一次) |
| 上游 | A3 | 间接只读 | dig_ap_cost 入 F3 预算构成(knob 归 A3) |
| 下游 | A2 | hard | 棋盘产物;初始展开执行归 A2(免费/计入清图/无奖励——A3 定);挖开上报携带变体标记;双包含回验两臂登记 A2 GDD(缺项即 blocking) |
| 下游 | B1 | 间接(hard 接线) | 换图编排 = 生成调用方;attempt 边界非 scope 事件;指标集 = 条款 3/5 对账输入,消费 actuals 分布(p10)而非 target(F4 报告 C) |
| 下游 | C3 | 类型依赖 | BoardGenTable schema 消费方(禁反向调用生成);曲线导出工具(C3 期交付物)+ A1 定稿前的临时抽查载体 |
| 下游 | B4 | 间接 | board_biome = 图类型上下文(差异化插槽输入;行参数静态恒定——防钓鱼结构保证) |
| 下游 | D1/B5 | 无直接 | 棋盘呈现归 D1/A2;biome 色板变体的数据源 |
A4×15 验收清单落位表(本 GDD 门禁评审逐项核对,缺项即 blocking):
| # | 义务 | A1 承载位置 |
|---|---|---|
| ① | 候选池门控(F1) | 变异布置规则 1(消费 variant_pool_gate 谓词) |
| ② | cell_constraint 生成期强制 | 变异布置规则 3 + F5 legality |
| ③ | 出生区及生成期可达域永不含雾(可达域 A1 确定性计算) | 出生区与可达域规则 2 |
| ④ | 可推理率按雾边双向净效应建模(禁单向补偿) | 生成管线(布雾后测量)+ F1 信息源(b) |
| ⑤ | 清图预算增量构成核算 + 链不可达占比生成期计算输出 | 清图预算增量节 + F3(fog_burden_ratio 为 B1 对账精确口径) |
| ⑥ | 空池静默 | EC1 |
| ⑦ | 降级静默 + 产物合法 | EC2 + F5(合法性闸前置) |
| ⑧ | 多变异选取消费 board_gen 流 | 变异布置规则 7 / 随机流规则 3 |
| ⑨ | EC3 邻接出生区合法 | 出生区与可达域规则 2(EC3) |
| ⑩ | EC10 雾占比参数域(可判定谓词) | Schema 校验 + F2 |
| ⑪ | EC11 双雾区实例独立(取号独立) | 变异布置规则 7 + EC6 |
| ⑫ | 厚度≤2【3×3 窗口谓词】/ f≤8d 硬边界 | 变异布置规则 4 + F2 + F5 legality |
| ⑬ | EC2 判据含连通分量尺寸 | EC2 |
| ⑭ | 降级率 (level,depth) 埋点 + 最低雾出现率义务【批量断言】+ 禁放宽 Rule 3 | F4 断言 B + EC2 上报 |
| ⑮ | board_biome 非空域校验(fail-fast) | 变异布置规则 8 + Schema 校验 + EC13 |
跨系统对账登记(活契约):
| 编号 | 内容 | 对侧 | 状态 |
|---|---|---|---|
| B1-CP | A1 侧生产者义务:actuals inferability 分布(p10)+ fog_burden_ratio + Δbudget_fog(条款 3/5 对账,B1 闭合) | B1 强制检查点 | 已登记 |
双向一致性核对:A1 ← A4, D2 · A2 ← A1, A3, A4 · C3 ← D2, B2 + A1 类型依赖——无单向遗漏。
呈现与 UI 契约(A1 无自有渲染面与 UI,呈现归 D1/A2/B5;无音频需求):
| # | 数据面义务 | 归属 |
|---|---|---|
| 1 | biome/tag = 换皮数据锚:board_biome 与产物标签是新 biome 色板变体的唯一数据源——新 biome 不新增资产只换色板 | D1/art-bible |
| 2 | 变异格标记保真:产物雾格标记是 D1"边界可见"呈现与"已开雾格 = 地板无字"的数据前提——标记错误即呈现欺骗 | D1 |
| 3 | 雾区连通域信息:双雾区呈现合并归 D1 渲染域,A1 只保证实例身份与取号独立(AC-14),不保证视觉分离 | D1 |
| 4 | 数字 = 8 邻雷数恒真(AC-6(g) 断言)——数字可信是"数字可读性"样张测试的逻辑前提 | D1 |
| 5 | 无 HUD 常显字段、无结算面;生成期指标不面向玩家(遥测/审计域) | A2/D1 |
## P0 最小闭环
1. B1 换图编排以 (level_index, node_depth) 调用 generate,A1 开一次 board_gen 流。
2. 读取 BoardGenTable 行并快照(加载期校验已通过)。
3. 按 N = round(mine_density × (W×H−9)) 先定数布雷,先布后删。
4. 候选池门控 → 雾/变异布置,无解静默降级。
5. 布雾后测可推理率两项判据,不达标图内重试至 max_gen_attempts。
6. 按 F5 三分支出 B_out,附降级/告警语义。
7. 交出棋盘 + 八项指标集:A2 消费棋盘,B1 消费指标对账——循环闭合于下一换图请求。
## P1 / P2 后置
| 优先级 | 内容 | 后置原因 |
|---|---|---|
| P1 | F4 全量批量工具交付(N=256/行 × 全行;断言 A/A″/A′/B/B′/E + 报告 C + 诊断 D) | 调参期离线工具域;与 D2 OQ5 曲线导出工具同批登记排期(OQ1);冒烟仅载缩样(AC-6/10) |
| P1 | B1 接线断言(attempt 边界非 scope 事件的编排侧断言、指标对账消费 actuals p10) | 对侧登记为生效条件——归 B1 GDD AC(O1) |
| P1 | A2 集成双包含回验 | 登记 A2 GDD 为生效条件(O3);A1 半边由 AC-6(a) BFS 对照承载 |
| P2 | 推理域扩展(solver_rules 启用 single 以外值 / 新增信息源) | 改可推理率定义 = GDD 修订,MVP 冻结 single_subset |
| P2 | 生成异步化与性能预算定稿(F2c 正式 C 值、四种实现姿态裁决) | 实现期 ADR / perf-profile 期(OQ2/O5) |
| P2 | C3 全行审计(曲线导出工具全行矩阵 diff) | C3 期交付物(O7) |
## 调参表
| 字段 | 域 | 默认 | owner | 说明 |
|---|---|---|---|---|
| board_width / board_height | int [8,64] | 10×10 / 12×12(L1/L2 参考行,provisional) | C3 调参 | 图尺寸 |
| mine_density | float (0,0.5] | 0.10 / 0.12(provisional) | C3 调参 | 雷密度,尺寸解耦 |
| inferability_target | float [0.85,1] | 0.95 / 0.92(provisional) | C3 调参 | 承重 knob;域下限 0.85 为绝对锚、结构冻结 |
| solver_rules | {single, single_subset} | single_subset(冻结) | 非 knob | 定义域非调参 |
| min_safe_count | int [1,999] | 50 / 60(provisional) | C3 调参 | 退化板对冲 |
| max_gen_attempts | int [1,32] | 16(provisional) | C3 调参 | 重试上限 |
| fog_region_count | int [0,32] | 0 / 1(provisional) | C3 调参 | 0 = 本行无雾 |
| fog_target_ratio | float [0,1) | 0 / 0.10(provisional) | C3 调参 | ≤ min(8d, 0.25) 加载期谓词 |
| board_biome | StringSet 非空 | {"dungeon"}(占位,provisional——词表 owner 未定稿) | B4/C1 域定稿后 | 只校验非空 |
| N(批量样本量) | int | 256/行 | A1 工具参数 | 登记默认非玩法 knob |
| σ(L,D)(批量种子基址) | int ≥ 0 | 10^9 + 2^20·L + 2^12·D | A1 工具参数 | 版本库清单 |
- MVP 参考行仅 schema 自洽性证明(F2/F2b/F2c 全过:10×10×16=1600、12×12×16=2304 ≤ 16384),非平衡事实、非回填默认值——曲线数值归 C3 调参所有权。
- 非 knob(结构冻结):solver_rules、键结构与 depth-0 锚、五阶段顺序、合法信息源穷举枚举、F4 断言 A/A′ 严格零阈值、先布雷后布雾顺序、attempt 边界 = scope 事件边界、target 域下限 0.85 / 雾占比上限 0.25 / F2c 常数 16384(provisional 量级护栏——调整走 GDD 修订)。
- Knob 交互:density × fog_target_ratio 同向调高 → 降级率结构性上行(F2 advisory);target × density 联合可行域无静态闸(F4 兜底);尺寸 × min_safe 联合(F2b)。跨 GDD 引用禁复制参数:ap_per_round / dig_ap_cost 归 A3,unlock_level / cell_constraint 归 A4。
## 验收标准
冒烟载体 = `godot --headless --script`(承 D2 冒烟框架);被测函数面 = `generate(level_index, node_depth, rng) -> Board`(+ 指标集);测试种子经 `derive_at("board_gen", σ)` 纯函数取号;夹具规格、黄金图回归向量协议、out-of-scope deferral 明细见推演件附录(本表沿用原 AC 编号,逐条完整判定口径同原文)。
| AC | Given | When | Then |
|---|---|---|---|
| AC-1 | 干净检出(默认根 = MVP 参考行) | 冒烟加载 Core Rules-3 表清单 | ConfigDB Ready:BoardGenTable 含 (1,0)/(2,0) 锚行(不断言行总数);九字段类型域断言;solver_rules = single_subset 唯一值断言;其余八 knob 字段仅域断言(期望由表读值推导);诊断收集器零 error 零 warning |
| AC-2 | BoardGenTable schema class_name 直引程序构造行实例(每腿先 reset_diagnostics()) | validate() 作用于违例集(f>8d · count≥1∧f=0 · f≥1 · count=0∧f=正值 · f=0.30∧d=0.15 超 0.25 上限 · round 后布雷数=0 · attempts×W×H>16384 · F2b 违例 10×10/d=0.10/min_safe=92 · board_biome=∅)与合法集(count=0∧f=0 · f=8×d 恰界 · min_safe 恰界 · biome 占位词非空) | 违例集各含对应致命类别;合法集零诊断 |
| AC-3 | 夹具根 a1_fog_domain / a1_min_safe / a1_biome_empty | 各以独立 headless 进程跑游戏通道 load_tables(root, collect_only=false) | 三进程均非 0 退出且错误清单完整;runner manifest 登记三项 →≠0 |
| AC-4 | 默认根 L2 行与登记种子 σ₀ | generate(2, 0, rng) 以 derive_at("board_gen", σ₀) 播种流执行两遍;再以 σ₁≠σ₀ 同行生成 | 两遍产物格状态逐格相同 + 八项指标集全等(含 attempts_used);σ₁ 产物与 σ₀ 不全同 |
| AC-5 | set_master_seed(42) 后 RngService 全真路径;夹具根 a1_high_target@2 | 以第 1、2 次 open_stream("board_gen") 实例分别驱动 generate;前后读只读计数器;同帧连续两次 generate(EC14) | 产物与 derive_at("board_gen", 0/1) 播种产物逐格相同;计数器差恰 1(重试不重开取号);同帧计数器差 2、各产物与各自 σ 播种一致(串行无锁) |
| AC-6 | 缩样产物集(默认根 L1·D0/L2·D0 各 N=8;σᵢ = F4 公式缩样版 i∈[0,8)) | 对每板断言 | 全板全腿通过:(a) 出生 3×3 与 R₀ 芯(0 格 flood 闭包,测试侧朴素 BFS 重算)内零雷零变异;外扩 1 环内零变异、环内可有雷(禁断言环内零雷)(b) R₀ 芯内零变异(初始展开不触雾)(c) 雾格 ⊆ cell_constraint 合法集——非雷、非 0、8 邻含雷 (d) 任意 3×3 窗口非全雾 (e) 雾格数 ≤ 8×雷数 (f) \|S\| ≥ min_safe_count 表读值 (g) 非雷格数字 ≡ 8 邻雷数 (h) 全板零非法产物标记 |
| AC-7 | Board class_name 直引程序构造板 | 合法性谓词作用于:雷墙包围孤立安全格板;\|S\|<min_safe 板;含 3×3 全雾窗板;再作用于黄金五板(含板ⅲ 雾区邻接出生 3×3) | 三病态板均 false(违例类别分别 = 不可达安全格 / min_safe / 结构违例);黄金五板全部 true(EC3——邻接不构成违例) |
| AC-8 | 测试口径协议定义的五类板集(规格+常数+手工推导记录) | 度量独立入口与合法性谓词作用于各板 | 输出与登记常数逐位相等(整数对比对);板ⅴ 另证两闸分立(clearable=false 而非仅拉低分数);板ⅲ 证明信息源(b)计入分子与寂静减项真实扣减(A4④ 双向净效应证据);失效处置协议见推演件附录 |
| AC-9 | 黄金板集 | 每板以 ≥2 种格存储序置换表示并各调度量独立入口一次、同板重复调用一次 | 全部输出逐位相同(输入表示序不变量);同输入恒同输出的确定性子集随之断言 |
| AC-10 | AC-6 同批缩样产物与各板行读值 | F4 缩样断言 | (a) 每板 inferability ≥ target 且 inferability_core ≥ target(表读值)(b) 全板零非法产物标记 (c) L1(count=0)含雾板数 = 0(断言 B′——泄漏一例即 bug)(d) L2(count≥1)存在 ≥1 含雾板 (e) 每板 attempts_used ∈ [1, max_gen_attempts 表读值] |
| AC-11 | 夹具根 a1_high_target@2 + 登记 σ(target=1.0 域内合法);同 σ 跑 a1_high_target@1,且登记验证确认该 σ 下 B₁ ∈ Lm(前提缺失时断言不适用,σ 失效即重搜并登记) | generate(@2 与 @1 各一) | @2:attempts_used=2、B_out 合法性谓词 true、降级标记=接受最优、强告警埋点存在(warning 级);inferability(B_out@2) ≥ inferability(B_out@1);tie-取最早腿 out-of-scope(O4) |
| AC-12 | 三腿——(a) 构造性腿 = AC-7(clearable 违例已证可判定);(b) a1_ec5@1 + 登记零合法种子 σ*(attempts=1 使 Lm=∅);(c) a1_ec5@k 族 k∈{1,2,8,16} 同 σ* | (b) generate;(c) 各 generate 并从产物重算劣度 (不可达安全格数, max(0, min_safe−\|S\|)) | (b) 产物带非法产物标记、attempts_used=1、最高级告警存在、B_out 仍完整返回(玩家永不卡死);(c) 劣度序列关于 k 单调不增(F5 k*** 选择语义行为级证据) |
| AC-13 | 默认根 L1 行与 VariationTable fog 行 unlock_level 表读值 u;夹具根 a1_pool_empty | 仅当 1 < u 时 generate(1,0,σ);a1_pool_empty 下 generate(1,0,σ);generate(1,1,σ)(biome={dungeon,ice} 行) | 前两腿产物零雾零变异、诊断收集器零新增(空池静默);第三腿产物可含雾(交集非空入池) |
| AC-14 | 夹具根 a1_two_regions 与登记 σ | generate 两遍;单遍产物检查 | 两遍逐格相同(多变异选取取数在流内);单遍产物雾格非空、雾格连通域数 ∈ [1,2](独立实例可相邻——呈现合并归 D1,O6);AC-6 套件全腿对该板通过 |
| AC-15 | (a) 任意冒烟产物;(b) 夹具根 a1_ec2_press(f=8×d 恰界——F2 必过必要非充分)+ 登记 σ*′(shortfall>0 搜索种子,协议同 AC-12) | (a) 检查指标集;(b) generate | (a) 指标集含实际达成区数(shortfall)字段且 ≤ fog_region_count 表读值;(b) 降级标记=雾布置降级、shortfall < count 表读值、产物仍过 AC-6 全腿、error 级诊断零新增(静默降级——warning/埋点级不算违静默) |
| AC-16 | 任意冒烟产物(AC-6/10/14/15 批次复用) | 指标完备性检查 + F1/F3 重算 | 八项指标字段完备(实际 inferability 含 metric_version=1 / inferability_core / 实际雾占比 = \|F\|÷(W×H) / 实际雷数与实际 \|S\| 并断言 \|M\| ≤ round(d×(W×H−9)) 表读值 / fog_burden_ratio / Δbudget_fog / attempts_used / 降级标记含非法产物标记+shortfall);inferability_core = \|R∞∖F\|÷max(1, \|S∖F\|) 重算一致;从产物重算 Chain₀/U → Δbudget_fog = \|U\|×dig_ap_cost(A3 表读值)、fog_burden_ratio 以整数对 (\|U\|, max(1, \|S∖Chain₀\|)) 比对;fog_region_count=0 行雾相关四值恒 0 且 core = inferability |
| AC-17 | ConfigDB 加载完成(registry board_gen_table 条目与本 AC 同批回填——条目缺位即失败,非条件豁免) | 脚本解析 design/registry/entities.yaml 的 board_gen_table 条目 | 与 BoardGenTable 九字段定义(字段名/类型/域/knob 标记)逐一相等;值对账仅限非 knob 字段(solver_rules=single_subset);八 knob 字段值不对账(C3 调参豁免) |
| AC-18 | A1 文件集(生成器/度量入口/谓词/schema/冒烟脚本) | 按 D2 AC-9 模式静态扫描 | 玩法代码文件集零 randomize()、零自建 RandomNumberGenerator 构造(tests/ 路径豁免,玩法文件集不豁免);零 ConfigDB 外 data 表加载(schema class_name 直引豁免);零 Control/场景类 import;AC-1 headless 实跑通过合成判定 |
| AC-19 | A1 文件集 | 纳入 D2 AC-14 项目级人工三要素字面量扫描 | 人工三要素口径——无未登记字面量 |
## 版本历史
| 版本 | 日期 | 改动 |
|---|---|---|
| v2 | 2026-09-14 | 两件套迁移:按模板 v2 重排为 design(只收结论)+ analysis(`design/gdd/analysis/a1-board-generation.md`,收全部推演)——规则/枚举/公式结论/AC/EC/依赖/义务台账全部保留原编号与原值;推导论证、候选取舍、体验锚点论证、测试口径详表与覆盖矩阵移入 analysis;零规则变更、零数值变更 |
| v1.1-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/边界情况/义务台账/覆盖矩阵/AC 转表格;生成管线转字符画 + 出口分发表;F1–F5 公式本体、Variables 与验算数据全保留;语义与 2026-09-09 修订批对齐,零规则变更 |
| 2026-09-09 修订批 | 2026-09-09 | full /design-review 判 MAJOR REVISION NEEDED,8 条 blocking 同日修订:两项达标判据 + inferability_target 收窄 [0.85,1] 绝对锚;AC-6(a) 改写(环内可有雷);雷数取整钉死 + 布雷语义(先布后删)+ N≥1 零雷护栏;F2 ≡ Schema 跨字段校验合流(count=0 ⇒ f=0 腿);AC-11 前提腿(Lm(1)≠∅);断言 B 收紧为达成区占比;第三轴登记约定 + elite_/boss_ 后门;F2c 成本闸 16384 + 禁墙钟。cheap-now 包:σ 打包修复(10^9 + 2^20·L + 2^12·D)、F1 注记③改口(雾格入分子两通道)、\|U\|÷\|F\| 删承诺、monotone_in_depth + 断言 E、EC5 玩家侧语义登记。覆盖矩阵"无洞"自称修正为 5 处标注问题(已修 4 处,差分两项登记待核销)。日志:design/gdd/reviews/a1-board-generation-review-log.md |
| v1 定稿 | 2026-09-08/09 | 一次会话定稿:五阶段管线 + F1–F5 + 三轴分离口径 + 19 条 AC + A4×15 逐项映射;四结构决策(生成-验证循环 / 接受最优 + 零合法接受最不坏 / 推理域 single_subset 冻结 / 密度浮点)与 F4 严格零红线为用户拍板;lean 门禁 CD-GDD-ALIGN 跳过,生产前人工复核体验锚点情绪定位 |