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

42 KiB
Raw Blame History

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 跳过,生产前人工复核体验锚点情绪定位