42 KiB
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 曲线无落点。
- 每张图在生成时刻承诺:从初始安全区出发、不靠赌能挖开的格子占比不低于该行及格线——玩家输给自选的赌(雾区/终局盲猜),不输给不可解的局。
- 落点安全:出生 3×3 与其生成期可达域恒无雷、恒无变异。
- 难度物质随 (level_index, node_depth) 上行——雷密、尺寸、雾占比由参数行直接雕刻。
- 同种子同参数必产同图——回放、测试、复盘精确复现。
- 参数组合退化时玩家永不卡死——降级出图并告警暴露,而非死锁。
系统范围
负责:
- 五阶段生成算法与生成-验证验收算子
- 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′ 批量守 |
生成管线与随机流纪律
规则:
- 生成器在每次被调用时按固定五步跑完——读参数、布雷、布雾布变异、自检重试、交货;顺序冻结,不调换、不跳步。
- 布雷时先按密度定死雷数 N = round(mine_density × (W×H−9)),再在"全格 − 出生 3×3"域均匀落位;0 格 flood 闭包外扩 1 环内的雷落完后移除——只减不增、不重投、无迭代;实际雷数 |M| ≤ N,漂移量入指标集观测;加载期拒绝 N < 1 的零雷板。
- 生成一张图期间的每一次随机取数——布雷、雾形、选变异、重试——都从同一条 board_gen 流按顺序取;一张图只 open_stream 一次、用到底;流之外零随机,randomize() 禁用(静态扫描 AC-18);不重开 scope,attempt 边界 = 生成函数完整返回。
- 行参数在生成开始时单次读取快照,生成期内不重读;生成期间表热重载不影响进行中的生成(EC7)。
- 推理器/生成器内部异常(crash/不变式违例)一律 fatal 中止 + 告警——实现缺陷 fail-fast,不降级(EC10,与参数性降级区分)。
- 同帧两次生成请求顺序串行、各自 open_stream 取号,不引入锁(EC14)。
五阶段失败语义:
| 阶段 | 失败条件 | 语义 |
|---|---|---|
| 参数解析 | 行缺失 / 参数域违例 | 加载期校验已拦(D2);运行期不失败 |
| 布雷 | N = 0 | 运行期不失败(域内 N ≥ 1 恒可布,零雷板加载期已拒) |
| 变异布置 | cell_constraint 无解 | 静默降级:跳过变异、产物合法、shortfall 上报 |
| 验证循环 | 三分支(F5) | 达标即出 / 接受最优 + 强告警 / 接受最不坏 + 最高级告警 + 非法产物标记 |
| 产出 | —— | 棋盘 + 八项指标集 |
不变式:管线无状态、五阶段顺序冻结、生成期表值单次读取、attempt 边界 = scope 事件边界(重试不产生新取号);B1 编排不得把 attempt 边界当 scope 事件。
设计意图:无状态函数 + 单流取号是"同种子同参数必产同图"的根基。
出生区与可达域
规则:
- 开局站立的 3×3 出生区保证无雷;从出生区顺 0 格连锁能走到的地方再外扩一圈,构成生成期"可达域"(R₀ = 出生 3×3 ∪ 0 格 flood 闭包,外扩 1 环为保守上界),由生成器按固定定义确定性算出,不依赖挖掘系统运行时行为。
- 可达域内永远不放变异;外扩环内可有雷、只禁变异(验收口径 AC-6(a));雾区邻接出生 3×3 合法——约束谓词只管出生 3×3 格集及可达域内无变异格,邻接不构成违反(EC3)。
- 挖掘系统实际能展开的范围只会比可达域小、不会比它大——双包含回验登记 A2 GDD:① A2 实际展开域 ⊆ A1 排除域;② A1 求解器初始态 ⊆ A2 实际初始展开域(F1 注记④度量保真对偶;若 A2 定稿展开更小,A1 回退口径 = 出生 3×3 最小态)。
设计意图:可达域是"落点安全"与"变异不堵路"的保守几何保证,A4 Rule 7 的执行落点。
变异布置与雾形边界
规则:
- 生成器按固定顺序布置变异:先查候选池门控(消费 A4 variant_pool_gate),再把雾格放到允许的位置,最后守雾形硬边界。
- 候选池为空(雾未解锁或 biome_tag 全不匹配)时,这张图静默布置为无变异图——空池合法非错误(EC1)。
- 雾格只落在"8 邻含雷的非 0 安全格"(cell_constraint = safe_nonzero);出生区与可达域排除在外。
- 雾形硬边界:任何 3×3 窗口不许全雾(雾皮厚度 ≤2);雾总量 ≤ 雷数 × 8(f ≤ 8×mine_density);摆几个雾区、每区目标多大读行参数(region_count / target_ratio)。
- 布置无解(cell_constraint 连通分量不足)时静默降级:跳过变异、产物为合法无变异图;要求 N 区而实际达成 k<N 时尽力布置,实际达成数按 shortfall 分级上报;禁放宽约束硬塞——A4 Rule 3 不为布置成功率让步(EC2)。
- 雾占比达 8d 上界但连通性不足时,参数域谓词 F2 仍放行(必要非充分),由 EC2 生成期降级路径兜底——两闸层次不同(EC12)。
- 两个雾区相邻也各是独立布置实例,布置身份与 board_gen 取号互不牵连;呈现合并归 D1 渲染域(EC6);多变异选取消费 board_gen 流。
- 每张图带 biome 标签集合:难度参数行携带非空 board_biome,同关卡同深度的所有图主题静态恒定——不存在逐图重掷主题的接口;标签集合为空属加载期致命校验错误;词表 owner 未定稿前只校验非空、不校验值域(EC13,词表定稿后补域校验,OQ4)。
设计意图:布置失败静默降级保产物合法,防钓鱼的主题恒定是结构保证而非文案。
可推理率度量与验收算子
规则:
- 生成器给每张图算可推理率:评分模拟从开局展开后玩家能看见的盘面出发,与玩家信息严格同步——没开的格看不见、雷位不许偷看;确定性推理能挖开的安全格数 ÷ 总安全格数 = inferability;分子分母都剔除雾格得 inferability_core。
- 每张图须同时过两条及格线:inferability ≥ target 且 inferability_core ≥ target——防"雾区无雷"常识单独把分数撑上去;两值随图输出。
- 实测不达标时在同一张图的随机数配额内重试——不开新图、不重新取号;上限 max_gen_attempts(行读值);到顶仍不达标按出口分发表降级出图并告警——玩家永不卡死。
- 合法性闸前置:legality = clearable ∧ |S| ≥ min_safe_count ∧ 结构不变式全过(雾 cell_constraint / 出生区及可达域排除 / 厚度≤2 / f≤8d / 数字计数恒真 / 初始展开不触雾)——不可清图产物不进"接受最优"候选,违规尝试判废重试。
- 推理规则域 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)
规则:
- 生成器数出链不可达雾格(进这些雾只能花行动力一格一格硬挖),格数乘每格挖价(dig_ap_cost 为 A3 牌价、此处只读)得出雾致清图预算增量 Δbudget_fog,连同占比 fog_burden_ratio 随图输出——结算侧对账用这两个数。
- 本条只在生成时算账、调参期批量核对;运行时不强制——账对不上改的是难度参数行;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 最小闭环
- B1 换图编排以 (level_index, node_depth) 调用 generate,A1 开一次 board_gen 流。
- 读取 BoardGenTable 行并快照(加载期校验已通过)。
- 按 N = round(mine_density × (W×H−9)) 先定数布雷,先布后删。
- 候选池门控 → 雾/变异布置,无解静默降级。
- 布雾后测可推理率两项判据,不达标图内重试至 max_gen_attempts。
- 按 F5 三分支出 B_out,附降级/告警语义。
- 交出棋盘 + 八项指标集: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 跳过,生产前人工复核体验锚点情绪定位 |