docs(写卡v1.1): 迭代35两卡按停机呈报阻断清单修订重锚——卡①:§3行号重锚(level_runner enc组装:467→:513等、level_table校验体现态、difficulty_table validate锚)+§6断言面smoke_all→tests三宿主+T1/T2/T3补run_all manifest登记步(阻断④闭合)。卡②:S1–S8全量宿主重锚至批B 16宿主(S1→integration/node_map_templates_test:32-104、S2三副本→level_shop_economy:970/adventure_feats:812/round_flow:357、S3/S4→level_shop_economy:679-715/:102/:257/:714、S5→:211-274/adventure_feats:118-130、S8 extra键样例→meta_progression_forge:316/:323、S7→sim/level_autoplay与probe新路径);T2跨表校验④删除范围重划(阻断③闭合——④整段:54-106随静态节点数据消亡退役,迭代34多终点Boss带互异检查:103-106语义由S5/V11运行时断言承接、入旧断言预声明④,config_db_cross_validator_test的_test_level_node_band_rules段同步退役);T1补manifest登记步(阻断④闭合);F1–F10全量行号重锚;§0硬交付序列补2026-10-24数据实况与Boss带键可互异条款。待办清单06条目:补覆盖批缺口登记(立卡要件=敌侧每(关,row_kind)顶带键≥该关最大生成深度+Boss带键可互异+板侧board_gen键域覆盖全域,数值provisional;覆盖批落地前卡②禁切源合入)。pipeline_gate 36行5链全绿;文档域闸--docs全绿(回执commit=30197255)
This commit is contained in:
1 parent
3019725536
commit
1147c260a1
3 files changed
+69
-55
No files matched your search
@@ -1,8 +1,8 @@
|
|||||||
# 需求卡片:节点图消费侧换代批(模板池消费 → 生成图消费)· 关卡节点图重构卡②
|
# 需求卡片:节点图消费侧换代批(模板池消费 → 生成图消费)· 关卡节点图重构卡②
|
||||||
|
|
||||||
- 版本:**v1.0**(2026-10-21 成文;自审五查+grilling 复核结论见文末)
|
- 版本:**v1.1**(2026-10-24 修订重锚——断言宿主随 game/smoke/ 退役〔16c6f136〕迁批 B 16 宿主、跨表校验④删除范围重划(迭代 34 检查语义承接进 S5)、run_all manifest 登记步补齐、§3 行号重锚;v1.0 2026-10-21 成文,自审五查+grilling 复核结论见文末)
|
||||||
- 来源:[待办清单](../待办清单.md)「关卡节点图重构——可选节点太少」(2026-10-13 登记,来源=playnote,设计面=文档轨,状态=文档设计已闭合)(唯一事实源:[关卡节点地图](../design/gdd/systems/冒险循环/关卡节点地图.md) v2.1+[关卡节点图生成](../design/gdd/systems/冒险循环/关卡节点图生成.md) v1.1+[冒险结构](../design/gdd/systems/冒险循环/冒险结构.md) 关卡行集与结构冻结行,2026-10-21 双定稿闭合凭据)
|
- 来源:[待办清单](../待办清单.md)「关卡节点图重构——可选节点太少」(2026-10-13 登记,来源=playnote,设计面=文档轨,状态=文档设计已闭合)(唯一事实源:[关卡节点地图](../design/gdd/systems/冒险循环/关卡节点地图.md) v2.1+[关卡节点图生成](../design/gdd/systems/冒险循环/关卡节点图生成.md) v1.1+[冒险结构](../design/gdd/systems/冒险循环/冒险结构.md) 关卡行集与结构冻结行,2026-10-21 双定稿闭合凭据)
|
||||||
- 归属:关卡节点地图消费侧(加载校验/行进语义/商店编排冒烟/定位信息/确定性承载/旧模板清理);关卡节点图重构批卡②(卡①生成器/卡③敌人表深度带〔已写卡〕/卡④迷雾同批)
|
- 归属:关卡节点地图消费侧(加载校验/行进语义/商店编排冒烟/定位信息/确定性承载/旧模板清理);关卡节点图重构批卡②(卡①生成器/卡③敌人表深度带〔已落地·迭代 34〕/卡④迷雾可见性〔已落地·迭代 34〕同批)
|
||||||
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
|
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
|
||||||
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(零待裁点,见 §11)
|
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(零待裁点,见 §11)
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
- **设计闭合(第〇步)**:06 条目「关卡节点图重构——可选节点太少」状态=文档设计已闭合,凭据=关卡节点图生成.md v1.1+关卡节点地图.md v2.1(各带路径+版本号)→ 放行写卡。
|
- **设计闭合(第〇步)**:06 条目「关卡节点图重构——可选节点太少」状态=文档设计已闭合,凭据=关卡节点图生成.md v1.1+关卡节点地图.md v2.1(各带路径+版本号)→ 放行写卡。
|
||||||
- **硬依赖卡①(生成器)**:运行时图来源换成生成器产图(§7 取用块),卡①接口定稿+实现落地后本卡才可合入运行时切源;T0 与卡①接口对齐(签名/图数据形状/参数档 schema/复现语义四件)。
|
- **硬依赖卡①(生成器)**:运行时图来源换成生成器产图(§7 取用块),卡①接口定稿+实现落地后本卡才可合入运行时切源;T0 与卡①接口对齐(签名/图数据形状/参数档 schema/复现语义四件)。
|
||||||
- **硬交付序列(跨卡数据覆盖)**:敌人深度带数据对生成图深度域的覆盖(每 (关卡序号, row_kind) 顶带键 ≥ 该关生成图最大节点深度)须先落或与本卡同批落——归口=卡③ §5 已登记的「生成图深度扩面覆盖问题(卡①/后续表批)」。未覆盖时覆盖断言(§8 V5/S5)红、遭遇解析顶 clamp 消解,本卡不得单独合入(依据:冒险结构.md:293 覆盖义务+卡③契约 7 顶 clamp 禁消解+闸全绿要求)。
|
- **硬交付序列(跨卡数据覆盖)**:敌人深度带数据对生成图深度域的覆盖(每 (关卡序号, row_kind) 顶带键 ≥ 该关生成图最大节点深度;且多终点 Boss 各终点深度的解析带键可互异——卡③ 契约 5「同关多 Boss 行集带键互异」的图侧投影)须先落或与本卡同批落——归口=卡③ §5 已登记的「生成图深度扩面覆盖问题(卡①/后续表批)」,**尚未立卡(2026-10-24 实况登记,见待办清单 06 条目缺口)**。数据实况(迭代 34 落地后实查):敌侧战斗带顶 L1=3/L2=L3=7(L1 深度 4-5、L2 深度 8、L3 深度 8/10-12 越顶)、Boss 各关单带 4/9/9(L1 终点深度 6 越顶、L2 双终点深 8/9 共带、L3 终点深至 13 越顶);板侧 board_gen `node_depth` 精确行同域缺口——切源即 `EnemyTable.band_of`(`enemy_table.gd:157`)越顶返 -1 加载致命。未覆盖时覆盖断言(§8.1 S5)红、遭遇解析顶 clamp 消解,本卡不得单独合入(依据:冒险结构.md:293 覆盖义务+卡③契约 7 顶 clamp 禁消解+闸全绿要求)。
|
||||||
- 与卡③接口零改动:定位信息契约=(关卡序号 + 节点深度) 两样(关卡节点地图.md:119;卡③ §0 同口径),本卡换传递侧值语义、不动消费侧寻址。
|
- 与卡③接口零改动:定位信息契约=(关卡序号 + 节点深度) 两样(关卡节点地图.md:119;卡③ §0 同口径),本卡换传递侧值语义、不动消费侧寻址。
|
||||||
- 与卡④(迷雾可见性)并行无依赖;迷雾呈现面(近处见类型/远处起雾)归卡④,本卡只保证图结构只读读面在位。
|
- 与卡④(迷雾可见性)并行无依赖;迷雾呈现面(近处见类型/远处起雾)归卡④,本卡只保证图结构只读读面在位。
|
||||||
|
|
||||||
@@ -46,20 +46,20 @@
|
|||||||
|
|
||||||
闭合凭据一致性:D1/D2 与 06 条目状态内列的两份定稿逐字一致;D3 关卡行集行与结构冻结行同向,且明文把「旧模板池清理」预写为实现批义务。
|
闭合凭据一致性:D1/D2 与 06 条目状态内列的两份定稿逐字一致;D3 关卡行集行与结构冻结行同向,且明文把「旧模板池清理」预写为实现批义务。
|
||||||
|
|
||||||
## 3. 现状事实(2026-10-21 worktree 实查;开工日 T0 复核行号)
|
## 3. 现状事实(2026-10-21 成文实查;行号与断言宿主 2026-10-24 v1.1 重锚——对齐 game/smoke/ 退役〔16c6f136,1065 条断言经批 B 迁入 16 宿主〕与迭代 34 落地后 master 现态;开工日 T0 复核行号)
|
||||||
|
|
||||||
| # | 事实 | 出处 |
|
| # | 事实 | 出处 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| F1 | 图合法性校验唯一落点=`LevelTable.validate()`(表加载期、ConfigDB 收敛 fail-fast):单链校验体 `_validate_level_nodes`(Boss 计数恰一 :80-81、战斗 ≥2 :82-83、单链末 Boss :84-87、单链前三纯战斗 U2 规则 :91-95);图合法性核心 `_validate_graph`(悬空出边+前进方向「目标编号严格递增 ⇒ 无环」:123-129、**出度上限 2** :130-135、**入口唯一〔无入边恰一〕** :136-146、**Boss 唯一终点+无出边+编号最大** :147-154、双向可达〔无孤儿+全员达 Boss〕:155-179、BFS 层宽 ≤5 U2 规则 :180-197);id 解析双编号空间(图=node_depth/单链=数组下标):106-122 | `game/data/schemas/level_table.gd:20-54`/:58-96/:101-198 |
|
| F1 | 图合法性校验唯一落点=`LevelTable.validate()`(表加载期、ConfigDB 收敛 fail-fast):单链校验体 `_validate_level_nodes`(Boss 计数恰一 :83-84、战斗 ≥2 :85-86、单链末 Boss :87-90、单链前三纯战斗 U2 规则 :94-98);图合法性核心 `_validate_graph`(悬空出边+前进方向「目标编号严格递增 ⇒ 无环」:126-132、**出度上限 2** :133-138、**入口唯一〔无入边恰一〕** :139-149、**Boss 唯一终点+无出边+编号最大** :150-157、双向可达〔无孤儿+全员达 Boss〕:159-182、BFS 层宽 ≤5 U2 规则 :183-201);id 解析双编号空间(图=node_depth/单链=数组下标):104-125 | `game/data/schemas/level_table.gd:21-58`/:61-99/:104-201 |
|
||||||
| F2 | 模板池加载路径:`level.tres` 三关各 5 张模板(15 张;L1 五张=单链排列变体、L2/L3 网状 10 节点);`LevelTable.validate` 池分支(池内全模板加载期校验);`LevelRunner._resolve_template_row`(template_pick ≥0 强制取模板/−1 经 `rng.open_stream("node_map")` 抽签;`active_template_name` 供 MC 分层出数、`active_template_index` 供断点备案);`start_level`/`start_level_external` 各带 `template_pick` 尾参;池解析在播种后(EC7) | 模板数据 `game/data/tables/level.tres:8-10`+表尾注释(t5/U2 生成史);校验分支 `level_table.gd:38-53`;解析 `game/core/level_runner.gd:299-324`(:304-305/:307/:317-318);尾参 :130/:186;播种序 :162 |
|
| F2 | 模板池加载路径:`level.tres` 三关各 5 张模板(15 张;L1 五张=单链排列变体、L2/L3 网状 10 节点);`LevelTable.validate` 池分支(池内全模板加载期校验);`LevelRunner._resolve_template_row`(template_pick ≥0 强制取模板/−1 经 `rng.open_stream("node_map")` 抽签;`active_template_name` 供 MC 分层出数、`active_template_index` 供断点备案);`start_level`/`start_level_external` 各带 `template_pick` 尾参;池解析在播种后(EC7) | 模板数据 `game/data/tables/level.tres:8-10`+表尾注释(t5/U2 生成史);校验分支 `level_table.gd:40-57`;解析 `game/core/level_runner.gd:300-324`(:304-305/:307/:317-318);尾参 :130/:186;播种序 :162 |
|
||||||
| F3 | 首局/回滚档(模板 0)读取处:`main.gd` `first_script = not save_manager.is_first_adventure_done()` 传入冒险参数面;种子三分判定(①显式合法整数②**首局固定 42**〔教学重放模板 0 即在此种子下标定〕③非首局 randi());`AdventureRunner._first_script`(true=全关零抽签取池内模板 0)→ `template_pick = 0 if _first_script else -1`;`SaveManager.is_first_adventure_done/mark_first_adventure_done`(存档布尔位,置位只在冒险收束挂点);冒烟「模板 0 = 现行固定图(回滚档成员)」断言段(池=5/强制 0 逐位相等/N=1 回滚档形态/first_script 分支/收束置位) | `game/presentation/main.gd:591-595`/:1427-1439;`game/core/adventure_runner.gd:45`/:102/:194/:850;`game/core/save_manager.gd:136-144`/:181-182;`game/smoke/smoke_all.gd:705-773`(:716-718/:719-732/:744-748/:749-763/:764-773) |
|
| F3 | 首局/回滚档(模板 0)读取处:`main.gd` `first_script = not save_manager.is_first_adventure_done()` 传入冒险参数面;种子三分判定(①显式合法整数②**首局固定 42**〔教学重放模板 0 即在此种子下标定〕③非首局 randi())单点=`_seed_value()`;`AdventureRunner._first_script`(true=全关零抽签取池内模板 0)→ `template_pick = 0 if _first_script else -1`;`SaveManager.is_first_adventure_done/mark_first_adventure_done`(存档布尔位,置位只在冒险收束挂点);断言段「模板 0 = 现行固定图(回滚档成员)」(池=5/强制 0 逐位相等/N=1 回滚档形态/first_script 分支/收束置位)——**宿主=批 B 裁决六整套迁集成** | `game/presentation/main.gd:594-596`/:1476-1490(_seed_value 三分判定);`game/core/adventure_runner.gd:45`/:102/:194/:850;`game/core/save_manager.gd:301-311`;`game/tests/integration/node_map_templates_test.gd:32-104`(:44 池=5/:45 模板 0 现行/:52-59 强制零抽签逐位相等/:76 N=1/:82 首次脚本/:96-101 布尔位与收束置位;manifest 已在册) |
|
||||||
| F4 | 商店「Boss 前一位必经」冒烟断言:`_smoke_shop_graph` 硬编码旧模板形状(L2/L3 商店房恰 1 且 node_depth=8〔next=[9]〕:5133、Boss=9=全图最大编号 :5134、DFS 枚举全路径穿商店房 8 :5135-5140、跨表 (·,9)/(·,8) 行覆盖 :5141-5152);路径枚举 `_all_entry_boss_paths`(DFS 迭代栈);行进断言「L2 行进到商店房(节点 8,next=[9]——Boss 前必经位)」;模板感知取节点表 `_level_active_nodes`(恒取模板 0) | `game/smoke/smoke_all.gd:5114-5152`/:5313-5339/:5034/:3438-3445 |
|
| F4 | 商店「Boss 前一位必经」断言:`_smoke_shop_graph` 硬编码旧模板形状(商店房恰 1 且 node_depth=8〔next=[9]〕、Boss=9=全图最大编号、DFS 枚举全路径穿商店房 8、跨表 (·,9)/(·,8) 行覆盖+「L1 行集零改动(单链 Boss (1,4))」);路径枚举 `_all_entry_boss_paths`(DFS 迭代栈);行进断言「L2 行进到商店房(节点 8,next=[9]——Boss 前必经位)」;模板感知取节点表 `_level_active_nodes`(恒取模板 0)——**宿主=批 B 迁 G8 单元宿主** | `game/tests/unit/core/level_shop_economy_test.gd:679-715`(_smoke_shop_graph::696 商店恰 1 depth=8/:697 Boss=9 最大编号/:698-703 DFS 穿店/:704-714 跨表行覆盖与 L1 行集零改动)/:936(_all_entry_boss_paths)/:601(行进到商店房)/:970(_level_active_nodes) |
|
||||||
| F5 | Boss 编号最大语义:`_validate_graph` ⑤「Boss 恒唯一终点:无出边 + 编号最大」——`ids[i] != ids.max()` 报「终点编号最大」;连带 :80-81 Boss 计数恰一 | `game/data/schemas/level_table.gd:147-154`/:80-81 |
|
| F5 | Boss 编号最大语义:`_validate_graph` ⑤「Boss 恒唯一终点:无出边 + 编号最大」——`ids[i] != ids.max()` 报「终点编号最大」;连带 :83-84 Boss 计数恰一 | `game/data/schemas/level_table.gd:150-157`/:83-84 |
|
||||||
| F6 | 定位信息与寻址现状:`begin_battle` 组装 enc=`level_index` + `node_depth`(**值实为节点编号**)+ `node_type`;`_node_id` 双编号空间(图形态=node_depth 当节点身份/单链=数组下标,混用注记在案);`_entry_node` 取无入边**唯一**节点;`pick_next_node(node_id)` 按编号选路;断点 `node_id`/`visited_ids` 同编号空间;战斗侧按 (level_index, node_depth) 解析敌/板行集 | 组装 `game/core/level_runner.gd:467-482`(:467/:479);`_node_id` :338-344;`_entry_node` :348-356;`pick_next_node` :573-581;断点 `game/core/adventure_runner.gd:1000`/:1017;消费 `game/core/battle_orchestrator.gd:327`/:355/:445/:1051-1052;跨表覆盖校验 `game/core/config_db_cross_validator.gd:54-85`(模板池感知分支 :68-75) |
|
| F6 | 定位信息与寻址现状:`begin_battle` 组装 enc=`level_index` + `node_depth`(**值实为节点编号**)+ `node_type`;`_node_id` 双编号空间(图形态=node_depth 当节点身份/单链=数组下标,混用注记在案);`_entry_node` 取无入边**唯一**节点;`pick_next_node(node_id)` 按编号选路;断点 `node_id`/`visited_ids` 同编号空间;战斗侧按 (level_index, node_depth, row_kind) 三参解析敌行集(`resolve_enemy_rowset`——迭代 34 卡③ 落地形态) | 组装 `game/core/level_runner.gd:513-525`(:514/:524);`_node_id` :341-347;`_entry_node` :348-358;`pick_next_node` :619 起;断点 `game/core/adventure_runner.gd:1000`/:1017;消费 `game/core/battle_orchestrator.gd:329`(resolve_enemy_rowset 三参)/:357/:447/:1054;跨表覆盖校验 `game/core/config_db_cross_validator.gd:54-106`(模板池感知分支 :76-83;敌侧带寻址+顶 clamp 拦截 :90-102;**迭代 34 写入「同图多终点 Boss 解析带键互异」:103-106——T2 删除范围须按 v1.1 重划**) |
|
||||||
| F7 | 行进语义现状:defer_entry 入口停点(单候选=唯一入口)、`present_entry_choice`、兑付确认后 `_present_choices` 出边候选、零自动推进;`_on_battle_finished` 以「节点 type=="boss"」判关卡收束(Boss 胜=victory、任意败=defeat,多 Boss 场景本就泛化);单链隐式出边(无 next 键=数组序下一项)+`_graph_mode` 探测 | `level_runner.gd:184-233`(:219-223/:228-233)/:561-569/:510-535(:516)/:359-367/:156-159、:203-206 |
|
| F7 | 行进语义现状:defer_entry 入口停点(单候选=唯一入口)、`present_entry_choice`、兑付确认后 `_present_choices` 出边候选、零自动推进;`_on_battle_finished` 以「节点 type=="boss"」判关卡收束(Boss 胜=victory、任意败=defeat,多 Boss 场景本就泛化);单链隐式出边(无 next 键=数组序下一项)+`_graph_mode` 探测 | `level_runner.gd:184-233`(:219-223/:228-233)/:561-569/:556-562(:562 boss 判收束)/:360-385(单链隐式出边在 _out_ids/_out_nodes 体内)/:149-158、:202-205 |
|
||||||
| F8 | 断点与确定性承载现状:快照 28 键含 `template_pick`(=`active_template_index`)、`master_seed`、`rng_counter`、`node_id`、`visited_ids`;续玩 `resume_adventure` 回填 `rng.restore_adventure(master_seed, rng_counter)`+强制 `template_pick`(已抽模板续玩零重抽零 RNG 消耗);rng 快照契约=主种子+计数器 | `game/core/adventure_runner.gd:998-1031`(:1000/:1013/:1014/:1015/:1017)/:140-148/:851-854;`game/core/rng_service.gd:4`/:73-80 |
|
| F8 | 断点与确定性承载现状:快照 28 键含 `template_pick`(=`active_template_index`)、`master_seed`、`rng_counter`、`node_id`、`visited_ids`;续玩 `resume_adventure` 回填 `rng.restore_adventure(master_seed, rng_counter)`+强制 `template_pick`(已抽模板续玩零重抽零 RNG 消耗);rng 快照契约=主种子+计数器 | `game/core/adventure_runner.gd:998-1023`(:1000/:1013/:1014/:1015/:1017)/:140-148/:852-854;`game/core/rng_service.gd:4`/:77-83(restore_adventure) |
|
||||||
| F9 | 模板/first_script 依赖面共 7 文件:`adventure_runner.gd` 7 处、`level_runner.gd` 17 处、`main.gd` 2 处、`level_autoplay.gd` 4 处(run_level 尾参 template_pick :37/:63、MC 分层出数字段 `level_templates` :141/:202、route 轴注释「候选节点编号最小/最大」:12/:377)、`smoke_all.gd` 28 处、`feat_vouchers_test.gd` 1 处、`pool_case_d_test.gd` 5 处(均传 `{"first_script": true}`) | 各文件如列;`game/tests/unit/core/feat_vouchers_test.gd:25`/`pool_case_d_test.gd:37/:68/:113/:142/:160` |
|
| F9 | 模板/first_script 依赖面(game/smoke/ 退役后现役清单,2026-10-24 实查,共 12 文件):产品面 4 件——`adventure_runner.gd` 7 处(:45/:102/:194/:850/:852-854/:863/:1013)、`level_runner.gd` 17 处(尾参 :130/:186、解析体 :300-321、active_template_* :304-305)、`main.gd` 2 处(:594-596)、`game/sim/level_autoplay.gd` 7 处(尾参 :37/:63、`level_templates` :141/:200-202、route 轴注释「候选节点编号最小/最大」:12/:377-379);测量面 1 件——`game/sim/adventure_monte_carlo.gd`(`level_templates` 出数面 :139);测试面 7 件——`game/tests/integration/node_map_templates_test.gd`(S1 全段 :32-104)、`game/tests/integration/cross_system_flow_test.gd:79`(`{"first_script": true}` 驱动)、`game/tests/unit/core/meta_progression_forge_test.gd:316/:323-324`(参数面 extra 键样例)、`feat_vouchers_test.gd:25`、`pool_case_d_test.gd:37/:68/:113/:142/:160`(均传 `{"first_script": true}`)、`adventure_feats_test.gd`(模板感知取节点表 :812-816+en_keys 覆盖断言 :112-130)、`level_shop_economy_test.gd`(`_level_active_nodes` :970 及消费 3 处) | 各文件如列 |
|
||||||
| F10 | 形状写死的冒烟断言面(模板时代遗留):L2/L3「节点数 = 10」:4564/:4726、「L1 行集零改动(单链 Boss (1,4))」:5151-5152、逐节点扫描断言 :4567-4759、参数面断言「入口特有键(first_script/shop_mode)随 extra 原样并入」:5944-5952;历史生成工具 `tools/t5_build_templates.py`/`t17_fanout2_rebuild.py`(一次性内容批工具留档) | `game/smoke/smoke_all.gd` 如列;`tools/t5_build_templates.py:8` 等 |
|
| F10 | 形状写死的断言面(模板时代遗留,**宿主=批 B 迁入**):「L2/L3 节点数 = 10」`level_shop_economy_test.gd:102/:257`、「L1 行集零改动(单链 Boss (1,4))」:714、逐节点扫描断言 :105-110/:211-219/:260-274、参数面断言「入口特有键(first_script/shop_mode)随 extra 原样并入」`meta_progression_forge_test.gd:316/:323-324`;历史生成工具 `tools/t5_build_templates.py`/`t17_fanout2_rebuild.py`(一次性内容批工具留档,在盘) | `game/tests/unit/core/level_shop_economy_test.gd` 与 `meta_progression_forge_test.gd` 如列;`tools/t5_build_templates.py:8` 等 |
|
||||||
|
|
||||||
## 4. 设计契约(红线,违反 = L3 停机呈报)
|
## 4. 设计契约(红线,违反 = L3 停机呈报)
|
||||||
|
|
||||||
@@ -105,7 +105,8 @@
|
|||||||
| `待办清单.md`(06 登记处) | 本卡登记条状态推进「已写卡(`reports/需求卡片-节点图消费侧换代批-2026-10-21.md`)」(req-card 06 状态回写义务);实现批完成后按退役规则处理 | 反哺点 · 列清单(⑤状态回写与条目退役记载——本会话文件面限于本卡一个文件,回写由批次收口/用户发令执行,防四卡并行互踩) |
|
| `待办清单.md`(06 登记处) | 本卡登记条状态推进「已写卡(`reports/需求卡片-节点图消费侧换代批-2026-10-21.md`)」(req-card 06 状态回写义务);实现批完成后按退役规则处理 | 反哺点 · 列清单(⑤状态回写与条目退役记载——本会话文件面限于本卡一个文件,回写由批次收口/用户发令执行,防四卡并行互踩) |
|
||||||
| `roadmap.md` | 迭代行编入笔与批内状态刷新 | 反哺点 · 列清单(⑥) |
|
| `roadmap.md` | 迭代行编入笔与批内状态刷新 | 反哺点 · 列清单(⑥) |
|
||||||
| `game/data/schemas/level_table.gd`、`game/data/tables/level.tres`、`game/core/level_runner.gd`、`game/core/adventure_runner.gd`、`game/core/config_db_cross_validator.gd`、`game/presentation/main.gd`、`game/core/save_manager.gd` | 消费侧换代与模板清理本体 | 实施本体(可写) |
|
| `game/data/schemas/level_table.gd`、`game/data/tables/level.tres`、`game/core/level_runner.gd`、`game/core/adventure_runner.gd`、`game/core/config_db_cross_validator.gd`、`game/presentation/main.gd`、`game/core/save_manager.gd` | 消费侧换代与模板清理本体 | 实施本体(可写) |
|
||||||
| `game/smoke/*`、`game/tests/*` | 断言面换代(§8 S 清单) | 实施本体(可写) |
|
| `game/tests/integration/node_map_templates_test.gd`、`game/tests/unit/core/level_shop_economy_test.gd`、`game/tests/unit/core/meta_progression_forge_test.gd`、`game/tests/unit/core/adventure_feats_test.gd`、`game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd`、`game/tests/unit/core/config_db_cross_validator_test.gd`、`game/tests/unit/core/breakpoint_resume_test.gd`、`game/tests/unit/core/pool_case_d_test.gd`、`game/tests/unit/core/feat_vouchers_test.gd`、`game/tests/run_all.gd` | 断言面换代与 manifest 登记(§8 S 清单——game/smoke/ 已退役,批 B 后断言面全落 16 宿主) | 实施本体(可写) |
|
||||||
|
| `game/sim/level_autoplay.gd`、`game/sim/adventure_monte_carlo.gd`、`game/probe/shot_probe.gd`、`game/probe/ui_click_probe.gd` | 驱动/测量/探针面换代(S7) | 实施本体(可写) |
|
||||||
|
|
||||||
## 7. 任务卡
|
## 7. 任务卡
|
||||||
|
|
||||||
@@ -119,10 +120,10 @@
|
|||||||
| `game/data/tables/level.tres` | 15 张模板数据清理(三行 `templates` 键删除;行级字段保留;参数档字段随卡① schema 不归本卡) |
|
| `game/data/tables/level.tres` | 15 张模板数据清理(三行 `templates` 键删除;行级字段保留;参数档字段随卡① schema 不归本卡) |
|
||||||
| `game/core/level_runner.gd` | 图来源换代(卡①产图替代 `_resolve_template_row`)+起关校验调用+多入口首跳+句柄寻址(`_node_id` 双空间退役)+enc `node_depth` 值语义换代 |
|
| `game/core/level_runner.gd` | 图来源换代(卡①产图替代 `_resolve_template_row`)+起关校验调用+多入口首跳+句柄寻址(`_node_id` 双空间退役)+enc `node_depth` 值语义换代 |
|
||||||
| `game/core/adventure_runner.gd` | `first_script`/`template_pick` 链路退役;断点键换代(`template_pick` 退役、`node_id`/`visited_ids` 句柄化) |
|
| `game/core/adventure_runner.gd` | `first_script`/`template_pick` 链路退役;断点键换代(`template_pick` 退役、`node_id`/`visited_ids` 句柄化) |
|
||||||
| `game/core/config_db_cross_validator.gd` | ④ 关卡节点半边退役(模板池感知分支删除;敌侧带校验归卡③,本卡只删死分支) |
|
| `game/core/config_db_cross_validator.gd` | ④ 关卡节点半边整体退役(:54-106,随静态节点数据消亡——含迭代 34 多终点 Boss 带互异检查的静态形态,语义由 S5/V11 运行时断言承接;跨表校验单测 `_test_level_node_band_rules` 段同步退役) |
|
||||||
| `game/presentation/main.gd` | `first_script` 参数构造退役(种子三分判定保持不动) |
|
| `game/presentation/main.gd` | `first_script` 参数构造退役(种子三分判定保持不动) |
|
||||||
| `game/core/save_manager.gd` | `is_first_adventure_done` 注释语义换代(模板 0 教学重放 → 首局固定种子;键与行为不变) |
|
| `game/core/save_manager.gd` | `is_first_adventure_done` 注释语义换代(模板 0 教学重放 → 首局固定种子;键与行为不变) |
|
||||||
| `game/smoke/smoke_all.gd`、`game/smoke/level_autoplay.gd`、`game/smoke/shot_probe.gd`、`game/smoke/ui_click_probe.gd` | 模板冒烟段退役+商店冒烟换代+形状断言性质化+生成图取数面(§8 S 清单) |
|
| `game/tests/integration/node_map_templates_test.gd`(改)、`game/tests/unit/core/level_shop_economy_test.gd`(改)、`game/tests/unit/core/meta_progression_forge_test.gd`(改)、`game/tests/unit/core/adventure_feats_test.gd`(改)、`game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd`(改)、`game/tests/unit/core/config_db_cross_validator_test.gd`(改)、`game/tests/run_all.gd`(改) | 断言面换代(S1–S8):模板段退役+商店断言换代+形状断言性质化+生成图取数面+④ 静态检查退役随动+新套件 manifest 登记 |
|
||||||
| `game/tests/unit/core/level_table_validate_test.gd`(新建) | 四检+良构单测(正向/负向夹具图) |
|
| `game/tests/unit/core/level_table_validate_test.gd`(新建) | 四检+良构单测(正向/负向夹具图) |
|
||||||
| `game/tests/unit/core/breakpoint_resume_test.gd`、`game/tests/unit/core/pool_case_d_test.gd`、`game/tests/unit/core/feat_vouchers_test.gd` | 断点键换代随动、`first_script` 键清退 |
|
| `game/tests/unit/core/breakpoint_resume_test.gd`、`game/tests/unit/core/pool_case_d_test.gd`、`game/tests/unit/core/feat_vouchers_test.gd` | 断点键换代随动、`first_script` 键清退 |
|
||||||
|
|
||||||
@@ -145,37 +146,38 @@
|
|||||||
### T1 加载校验换代(≈1.5–2d)
|
### T1 加载校验换代(≈1.5–2d)
|
||||||
|
|
||||||
- [ ] 实装 `LevelTable.validate_graph(nodes: Array) -> Array`(签名与判据=契约 1 四检+良构基底;落点 `level_table.gd`)。可核查结果:正向夹具图(多入口多终点/含岔口/单链)零错误;负向夹具图(非 Boss 终点/带出边的 Boss/环/孤儿节点/断头节点/悬空出边/句柄重复/缺 depth 的战斗节点)各报对应错误类别(沿 `structural`/`dangling_next`/`dup_key`/`enum`/`domain` 词表)。
|
- [ ] 实装 `LevelTable.validate_graph(nodes: Array) -> Array`(签名与判据=契约 1 四检+良构基底;落点 `level_table.gd`)。可核查结果:正向夹具图(多入口多终点/含岔口/单链)零错误;负向夹具图(非 Boss 终点/带出边的 Boss/环/孤儿节点/断头节点/悬空出边/句柄重复/缺 depth 的战斗节点)各报对应错误类别(沿 `structural`/`dangling_next`/`dup_key`/`enum`/`domain` 词表)。
|
||||||
- [ ] 退役旧判据六项(`level_table.gd:80-81` Boss 恰一、:82-83 战斗 ≥2、:84-87 单链末 Boss、:91-95 前三纯战斗、:130-135 出度 ≤2、:153-154 编号最大)与模板池校验分支(:38-53),行级校验(level_index 唯一/display_name/rest_heal_pct 域)保留。可核查结果:`validate()` 对生产表行级零错误;全仓检索六判据消息文本零残留。
|
- [ ] 退役旧判据六项(`level_table.gd:83-84` Boss 恰一、:85-86 战斗 ≥2、:87-90 单链末 Boss、:94-98 前三纯战斗、:133-138 出度 ≤2、:155-157 编号最大)与模板池校验分支(:40-57),行级校验(level_index 唯一/display_name/rest_heal_pct 域)保留。可核查结果:`validate()` 对生产表行级零错误;全仓检索六判据消息文本零残留。
|
||||||
- [ ] 实装无环判据=出边目标节点深度严格大于源(取代「目标编号严格递增」,:123-129 换代)。可核查结果:回边夹具(目标深度 ≤ 源)报「违反前进方向」错误。
|
- [ ] 实装无环判据=出边目标节点深度严格大于源(取代「目标编号严格递增」,:126-132 换代)。可核查结果:回边夹具(目标深度 ≤ 源)报「违反前进方向」错误。
|
||||||
|
- [ ] manifest 登记:`game/tests/run_all.gd` `_suites()` 追加 `{"path": "res://tests/unit/core/level_table_validate_test.gd", "expect": 0}`(对齐既有行体例;批 B 协议——禁「文件在 manifest 不在」空窗)。可核查结果:run_all 实跑套件数 +1 且新套件 PASS。
|
||||||
- [ ] 验收步骤:跑 `godot --headless --path game --script res://tests/unit/core/level_table_validate_test.gd`,期望四检正负向断言全绿。
|
- [ ] 验收步骤:跑 `godot --headless --path game --script res://tests/unit/core/level_table_validate_test.gd`,期望四检正负向断言全绿。
|
||||||
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 还原→记录):注释掉「终点恒为 Boss」判据 → 期望非 Boss 终点负向用例红;把无环判据改成恒真 → 期望回边负向用例红。记录表进实现报告。
|
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 还原→记录):注释掉「终点恒为 Boss」判据 → 期望非 Boss 终点负向用例红;把无环判据改成恒真 → 期望回边负向用例红。记录表进实现报告。
|
||||||
|
|
||||||
### T2 消费侧切源与行进/定位/确定性换代(≈2–2.5d)
|
### T2 消费侧切源与行进/定位/确定性换代(≈2–2.5d)
|
||||||
|
|
||||||
- [ ] 实装图来源换代:`level_runner.gd` `_resolve_template_row`(:299-324)删除,起关路径改调卡① `generate(level_index, params, seed)`(params 读关卡行参数档、seed 取本局种子口径——单关自播种/冒险主种子派生,以卡①定稿为准)。可核查结果:起关拿到生成图(夹具参数产图可走通进节点)。
|
- [ ] 实装图来源换代:`level_runner.gd` `_resolve_template_row`(:300-324,含 :300-305 解析注释与 `active_template_name`/`active_template_index` 声明)删除,起关路径改调卡① `generate(level_index, params, seed)`(params 读关卡行参数档、seed 取本局种子口径——单关自播种/冒险主种子派生,以卡①定稿为准)。可核查结果:起关拿到生成图(夹具参数产图可走通进节点)。
|
||||||
- [ ] 实装起关校验接线:生成图到手、进节点前调用 `LevelTable.validate_graph`,违规 push_error+返回 false(起关拒绝,冒险启动失败走既有 fatal 路径——`main.gd:596` `_fatal_screen`)。可核查结果:违规夹具图起关被拒(返回 false)。
|
- [ ] 实装起关校验接线:生成图到手、进节点前调用 `LevelTable.validate_graph`,违规 push_error+返回 false(起关拒绝,冒险启动失败走既有 fatal 路径——`main.gd:396` `_fatal_screen`,启动失败挂点 :597)。可核查结果:违规夹具图起关被拒(返回 false)。
|
||||||
- [ ] 实装多入口首跳:`_entry_node`(:348-356)换 `_entry_nodes` 返回全部无入边节点;`defer_entry`/`present_entry_choice` 入口停点候选=全部入口(单入口行为逐位不变)。可核查结果:双入口夹具图首跳候选数=2,pick 任一入口正确进入。
|
- [ ] 实装多入口首跳:`_entry_node`(:348-358)换 `_entry_nodes` 返回全部无入边节点;`defer_entry`/`present_entry_choice` 入口停点候选=全部入口(单入口行为逐位不变)。可核查结果:双入口夹具图首跳候选数=2,pick 任一入口正确进入。
|
||||||
- [ ] 实装句柄寻址:`_node_id`(:338-344)改返回节点句柄(卡① id 字段);`_out_ids`/`_out_nodes`/`visited_ids`/`pick_next_node`/`_restore_to_stop` 同空间随动;单链隐式出边(:359-367 数组序)退役(生成图恒带显式出边,单链=出度 ≤1 的图)。可核查结果:单链夹具图(显式出边)行进走通;`pick_next_node` 候选外句柄拒绝。
|
- [ ] 实装句柄寻址:`_node_id`(:341-347)改返回节点句柄(卡① id 字段);`_out_ids`/`_out_nodes`/`visited_ids`/`pick_next_node`/`_restore_to_stop` 同空间随动;单链隐式出边(:360-385 数组序,_out_ids/_out_nodes 体内)退役(生成图恒带显式出边,单链=出度 ≤1 的图)。可核查结果:单链夹具图(显式出边)行进走通;`pick_next_node` 候选外句柄拒绝。
|
||||||
- [ ] 实装定位信息值语义换代:`begin_battle` enc(:467)`node_depth` 取节点 `depth` 值(自入口步数);`level_finished` 载荷位置字段句柄化;enc 键名不变。可核查结果:载荷断言(level_index/depth 与图上节点一致)绿。
|
- [ ] 实装定位信息值语义换代:`begin_battle` enc(:513-525)`node_depth` 取节点 `depth` 值(自入口步数);`level_finished` 载荷位置字段句柄化;enc 键名不变。可核查结果:载荷断言(level_index/depth 与图上节点一致)绿。
|
||||||
- [ ] 实装 `adventure_runner.gd` 模板链路删除:`_first_script` 字段与参数读入(:45/:102/:194)、`template_pick` 计算与传递(:850/:851-854/:863)整体删除。可核查结果:全仓检索 `_first_script`/`template_pick` 零引用(`level_autoplay`/单测面随动见 T3)。
|
- [ ] 实装 `adventure_runner.gd` 模板链路删除:`_first_script` 字段与参数读入(:45/:102/:194)、`template_pick` 计算与传递(:850/:852-854/:863)整体删除。可核查结果:全仓检索 `_first_script`/`template_pick` 零引用(`level_autoplay`/单测面随动见 T3)。
|
||||||
- [ ] 实装断点键换代:`_snapshot_breakpoint` 的 `template_pick` 键(:1013)删除、扩列代差标记键(契约 3);`node_id`/`visited_ids`(:1000/:1017)句柄化落档与 `_restore_to_stop` 回读同空间;`resume_adventure` 遇缺标记键旧断点显式拒绝(返回 false+push_error)。可核查结果:断点写读往返无 `template_pick` 键、句柄往返一致;旧形态夹具断点被拒(`breakpoint_resume_test` 面)。
|
- [ ] 实装断点键换代:`_snapshot_breakpoint` 的 `template_pick` 键(:1013)删除、扩列代差标记键(契约 3);`node_id`/`visited_ids`(:1000/:1017)句柄化落档与 `_restore_to_stop` 回读同空间;`resume_adventure` 遇缺标记键旧断点显式拒绝(返回 false+push_error)。可核查结果:断点写读往返无 `template_pick` 键、句柄往返一致;旧形态夹具断点被拒(`breakpoint_resume_test` 面)。
|
||||||
- [ ] 实装 `main.gd` `first_script` 参数构造删除(:593-595);种子三分判定(:1427-1439)零改动。可核查结果:首局(`is_first_adventure_done==false`)种子=42、非首局随机两态行为不变。
|
- [ ] 实装 `main.gd` `first_script` 参数构造删除(:594-596);种子三分判定(:1476-1490,`_seed_value` 单点)零改动。可核查结果:首局(`is_first_adventure_done==false`)种子=42、非首局随机两态行为不变。
|
||||||
- [ ] 实装 `save_manager.gd:136` 注释语义换代(「模板 0 教学重放」→「首局固定种子」;键与行为零改动)。可核查结果:注释与契约 3 同口径。
|
- [ ] 实装 `save_manager.gd:301-305` 注释语义换代(「模板 0 教学重放」→「首局固定种子」;键与行为零改动)。可核查结果:注释与契约 3 同口径。
|
||||||
- [ ] 实装跨表校验死分支清理:`config_db_cross_validator.gd:54-85` ④ 关卡节点半边(模板池感知 :68-75 及其 node_lists 循环)删除(敌侧带校验归卡③、板侧覆盖随数据批,本卡只删静态节点校验死分支)。可核查结果:全仓检索 `node_lists`/「模板池感知」零残留。
|
- [ ] 实装跨表校验 ④ 关卡节点半边退役+迭代 34 检查语义承接:`config_db_cross_validator.gd:54-106` ④ 整段(模板池感知 :76-83、node_lists 循环、敌侧带寻址/顶 clamp 拦截 :90-102、**迭代 34 写入的「同图多终点 Boss 解析带键互异」:103-106**)随静态节点数据消亡整体删除——该检查的对象=表内静态节点,切源后 `level.tres` 行不再携带节点数据,留置即死代码(契约 6 禁留);其两条拦截语义由 S5 运行时断言承接(顶 clamp 禁消解=`band_of` 非 -1;多终点 Boss 带键互异——对真实生成图逐终点解析比对,拦截面从静态代理升级到消费图本体);`config_db_cross_validator_test.gd` 的 `_test_level_node_band_rules` 段(:19 调用行)同步退役。可核查结果:全仓检索 `node_lists`/「模板池感知」/`level_node_dangling` 零残留;S5 承接断言在位(T3)。
|
||||||
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档),期望除 §8 S 清单未换代条目外零红(S 清单随 T3 收口)。
|
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档),期望除 §8 S 清单未换代条目外零红(S 清单随 T3 收口)。
|
||||||
- [ ] 变异验证:把多入口候选写死单入口 → 期望多入口首跳断言红;把 enc `node_depth` 值取句柄 → 期望定位信息载荷断言红;把断点 `template_pick` 键偷偷写回 → 期望断点键退役断言红。记录表进实现报告。
|
- [ ] 变异验证:把多入口候选写死单入口 → 期望多入口首跳断言红;把 enc `node_depth` 值取句柄 → 期望定位信息载荷断言红;把断点 `template_pick` 键偷偷写回 → 期望断点键退役断言红。记录表进实现报告。
|
||||||
|
|
||||||
### T3 模板清理与冒烟断言换代(≈2–2.5d)
|
### T3 模板清理与冒烟断言换代(≈2–2.5d)
|
||||||
|
|
||||||
- [ ] 实装 `level.tres` 三行 `templates` 键删除(15 张模板数据清出;`level_index`/`display_name`/`rest_heal_pct` 保留)。可核查结果:`git diff` 仅删模板数据段+表尾注释一段(15 张模板去向+参数档字段指引——沿 `level.tres` 既有表尾注释体例);冒烟表校验段行级零错误。
|
- [ ] 实装 `level.tres` 三行 `templates` 键删除(15 张模板数据清出;`level_index`/`display_name`/`rest_heal_pct` 保留)。可核查结果:`git diff` 仅删模板数据段+表尾注释一段(15 张模板去向+参数档字段指引——沿 `level.tres` 既有表尾注释体例);冒烟表校验段行级零错误。
|
||||||
- [ ] 换代模板冒烟段(S1):`_smoke_node_map_templates`(`smoke_all.gd:705-773`)①-⑥ 退役(node_map 标签/池=5/模板 0=现行/强制 0/N=1 回滚档/first_script 分支),⑦ 收束置位断言保留改写(语义换「首局种子 42」注释);替代断言=确定性三条(S6)。可核查结果:该段绿且消息文本无「模板 0/回滚档」字样。
|
- [ ] 换代模板断言段(S1):`_smoke_node_map_templates`(`game/tests/integration/node_map_templates_test.gd:32-104`)①-⑥ 退役(node_map 标签/池=5/模板 0=现行/强制 0/N=1 回滚档/first_script 分支),⑦ 收束置位断言保留改写(语义换「首局种子 42」注释);替代断言=确定性三条(S6,同宿主落位)。可核查结果:该宿主绿且消息文本无「模板 0/回滚档」字样。
|
||||||
- [ ] 换代生成图取数面(S2):`_level_active_nodes`(:3438-3445)改经卡①接口取生成图(固定种子+关卡行参数档);消费点(:977/:3452/:4564/:4567/:4682/:4726/:4729/:4738/:5126)随动。可核查结果:该段绿、取数面零模板引用。
|
- [ ] 换代生成图取数面(S2):`_level_active_nodes` 三宿主副本(`level_shop_economy_test.gd:970`、`adventure_feats_test.gd:812-816`、`round_flow_skill_pool_test.gd:357`)改经卡①接口取生成图(固定种子+关卡行参数档);消费点(level_shop :102/:105/:211-219/:260-274/:689/:698、adventure_feats :118-130、round_flow :319/:330)随动。可核查结果:三宿主绿、取数面零模板引用。
|
||||||
- [ ] 换代商店冒烟(S3,三条性质断言):① 每个终点的直接前驱恰为一家 shop 节点(终点入边恰一且 type=="shop");② 商店总数=终点数;③ 所有入口→终点路径穿过且恰穿过一家店(DFS 枚举换代 `_all_entry_boss_paths` 消费句柄/深度,判定=路径上 shop 计数恰 1);断言面=L1/L2/L3 参数档 × 种子扫描(42 与 range(42, 62) 全种子);硬编码「node_depth 8/9/穿节点 8」退役(:5133-5140);:5034 行进到商店房断言改性质(路径上恰一店)。可核查结果:三性质断言在扫描面全绿。
|
- [ ] 换代商店断言(S3,三条性质断言):① 每个终点的直接前驱恰为一家 shop 节点(终点入边恰一且 type=="shop");② 商店总数=终点数;③ 所有入口→终点路径穿过且恰穿过一家店(DFS 枚举换代 `_all_entry_boss_paths`(:936)消费句柄/深度,判定=路径上 shop 计数恰 1);断言面=L1/L2/L3 参数档 × 种子扫描(42 与 range(42, 62) 全种子);硬编码「node_depth 8/9/穿节点 8/L1 行集零改动」退役(:696/:697/:698-703/:714);:601 行进到商店房断言改性质(路径上恰一店)。可核查结果:三性质断言在扫描面全绿。
|
||||||
- [ ] 换代形状写死断言(S4)::4564/:4726「节点数 = 10」改生成图读数性质(节点数 ≥ 层高下限+随图);:5151-5152「L1 行集零改动(单链 Boss (1,4))」退役(单链模板消亡,单链合法性改由 V2 夹具承载);逐节点扫描断言(:4567-4759)敌侧键面随卡③ S 清单、本卡只换取数面。可核查结果:清单条目逐条勾销、冒烟全绿。
|
- [ ] 换代形状写死断言(S4)::102/:257「节点数 = 10」改生成图读数性质(节点数 ≥ 层高下限+随图);:714「L1 行集零改动(单链 Boss (1,4))」退役(单链模板消亡,单链合法性改由 V2 夹具承载);逐节点扫描断言(:105-110/:211-219/:260-274)敌侧键面随卡③ S 清单、本卡只换取数面。可核查结果:清单条目逐条勾销、断言面全绿。
|
||||||
- [ ] 换代覆盖义务断言(S5):节点源换生成图后,敌侧覆盖判据=`band_of` 非 -1(禁顶 clamp)、板侧=解析命中非空;以 §0 硬交付序列(敌侧带数据覆盖)为绿灯前提。可核查结果:覆盖断言绿(数据批先行后)。
|
- [ ] 换代覆盖义务断言(S5,承接跨表校验④退役后的两条语义):节点源换生成图后,敌侧覆盖判据=`EnemyTable.band_of`(`game/data/schemas/enemy_table.gd:157`)非 -1(禁顶 clamp——承 `config_db_cross_validator.gd:98-102` 静态拦截语义)+**多终点 Boss 解析带键互异**(承迭代 34 `:103-106` 检查语义——对生成图逐终点 depth→`band_of` 解析比对,共带即红);板侧=board_gen 解析命中非空;以 §0 硬交付序列(敌侧带数据覆盖+Boss 带键可互异)为绿灯前提。可核查结果:覆盖与带互异断言在扫描面全绿(数据批先行后)。
|
||||||
- [ ] 新增确定性冒烟(S6):① 同 (种子, 参数档) 两次 `generate` 逐位同图;② 首局种子 42 两次开局(`is_first_adventure_done==false`)生成图逐位同图;③ 断点写→`restore_adventure`→再产图同图;④ `level.tres` 无 `templates` 键。可核查结果:四断言绿。
|
- [ ] 新增确定性断言(S6,落点 `game/tests/integration/node_map_templates_test.gd`——S1 同宿主,模板段退役后该宿主承载生成图确定性断言;manifest 已在册零新增登记):① 同 (种子, 参数档) 两次 `generate` 逐位同图;② 首局种子 42 两次开局(`is_first_adventure_done==false`)生成图逐位同图;③ 断点写→`restore_adventure`→再产图同图;④ `level.tres` 无 `templates` 键。可核查结果:四断言绿。
|
||||||
- [ ] 换代驱动/工具面(S7):`level_autoplay.gd` `template_pick` 尾参退役(:37/:63)、MC 字段 `level_templates`(:141/:202)改生成图身份字段(`level_maps`,值=种子+参数档标识)、route min/max 轴(:12/:377)改句柄升/降序(确定性轴保持);探针注释与驱动假设(`shot_probe.gd:12-13`、`ui_click_probe.gd:281`「L2 商店节点 8」)性质化。可核查结果:autoplay/探针跑通、MC 出数字段名更新。
|
- [ ] 换代驱动/工具面(S7):`game/sim/level_autoplay.gd` `template_pick` 尾参退役(:37/:63)、MC 字段 `level_templates`(:141/:200-202)改生成图身份字段(`level_maps`,值=种子+参数档标识)、route min/max 轴(:12/:377-379)改句柄升/降序(确定性轴保持)、`game/sim/adventure_monte_carlo.gd:139` 出数面随动;探针注释与驱动假设(`game/probe/shot_probe.gd:12-13`、`game/probe/ui_click_probe.gd:373`「L2 商店为 Boss 前必经位」)性质化。可核查结果:autoplay/探针跑通、MC 出数字段名更新。
|
||||||
- [ ] 换代单测随动(S8):`breakpoint_resume_test.gd`(断点无 `template_pick` 键、`node_id`/`visited_ids` 句柄往返、复现同图);`pool_case_d_test.gd`/`feat_vouchers_test.gd` `first_script` 键清退(:37/:68/:113/:142/:160/:25);`main.gd` 参数面断言(`smoke_all.gd:5944-5952` first_script extra 键样例换非 first_script 键,「入口特有键随 extra 原样并入」语义保持)。可核查结果:单测面全绿、全仓 `first_script`/`template_pick`/`active_template` 零引用(件核)。
|
- [ ] 换代单测随动(S8):`breakpoint_resume_test.gd`(断点无 `template_pick` 键、`node_id`/`visited_ids` 句柄往返、复现同图);`pool_case_d_test.gd`/`feat_vouchers_test.gd` `first_script` 键清退(:37/:68/:113/:142/:160/:25)+`cross_system_flow_test.gd:79` 随动;`main.gd` 参数面断言(`meta_progression_forge_test.gd:316/:323-324` first_script extra 键样例换非 first_script 键,「入口特有键随 extra 原样并入」语义保持)。可核查结果:单测面全绿、全仓 `first_script`/`template_pick`/`active_template` 零引用(件核)。
|
||||||
- [ ] 验收步骤:T 段出口跑一次全套闸,期望冒烟+单测全绿、探针段无红。
|
- [ ] 验收步骤:T 段出口跑一次全套闸,期望冒烟+单测全绿、探针段无红。
|
||||||
- [ ] 变异验证:终点前驱改非店节点 → 期望商店断言①红;某路径加第二家店 → 期望③红;生成器夹具注一滴计数器依赖(同种子两次产图不同)→ 期望 S6① 红;`level.tres` 偷留一个 `templates` 键 → 期望 S6④ 红。记录表进实现报告。
|
- [ ] 变异验证:终点前驱改非店节点 → 期望商店断言①红;某路径加第二家店 → 期望③红;生成器夹具注一滴计数器依赖(同种子两次产图不同)→ 期望 S6① 红;`level.tres` 偷留一个 `templates` 键 → 期望 S6④ 红。记录表进实现报告。
|
||||||
|
|
||||||
@@ -199,21 +201,22 @@
|
|||||||
| V8 | 模板 0 语义废除+旧断点代差 | `level.tres` 无 `templates` 键;全仓零 `first_script`/`template_pick`/`active_template` 引用;`is_first_adventure_done` 种子选择两态行为不变(42/随机);缺代差标记键的旧断点被显式拒绝续玩(禁静默回放) | 冒烟(S6④+收束置位改写断言)+单测(旧断点拒绝——`breakpoint_resume_test`)+件核 |
|
| V8 | 模板 0 语义废除+旧断点代差 | `level.tres` 无 `templates` 键;全仓零 `first_script`/`template_pick`/`active_template` 引用;`is_first_adventure_done` 种子选择两态行为不变(42/随机);缺代差标记键的旧断点被显式拒绝续玩(禁静默回放) | 冒烟(S6④+收束置位改写断言)+单测(旧断点拒绝——`breakpoint_resume_test`)+件核 |
|
||||||
| V9 | 15 张模板清理 | 三行 `templates` 键不在;模板池代码路径(`_resolve_template_row`/模板池校验分支/`_level_active_nodes` 模板读取)零残留;表尾去向注释在位 | 冒烟表断言+件核(git diff 仅删模板段) |
|
| V9 | 15 张模板清理 | 三行 `templates` 键不在;模板池代码路径(`_resolve_template_row`/模板池校验分支/`_level_active_nodes` 模板读取)零残留;表尾去向注释在位 | 冒烟表断言+件核(git diff 仅删模板段) |
|
||||||
| V10 | 反哺点清单 | §6 六条每条有落点 | 件核对表(T4) |
|
| V10 | 反哺点清单 | §6 六条每条有落点 | 件核对表(T4) |
|
||||||
|
| V11 | 生成图覆盖+多终点 Boss 带互异(消费侧绿灯断言,S5 承接跨表校验④语义) | 生成图每个 battle/boss 节点深度 `band_of` 非 -1(禁顶 clamp);多终点各深度解析带键两两互异(共带即红);板侧解析命中非空——以 §0 硬交付序列为绿灯前提 | S5 断言(三关参数档×种子扫描,宿主 `level_shop_economy_test.gd` 换代段) |
|
||||||
|
|
||||||
### 8.1 冒烟/断言面随动清单(S 清单——模板时代遗留、须换代的断言/直呼面,2026-10-21 实查)
|
### 8.1 断言面随动清单(S 清单——模板时代遗留、须换代的断言/直呼面;宿主 2026-10-24 v1.1 重锚=批 B 迁入位)
|
||||||
|
|
||||||
| # | 断言/直呼面 | 位置 | 换代内容 |
|
| # | 断言/直呼面 | 位置 | 换代内容 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| S1 | 模板池冒烟段 `_smoke_node_map_templates` | `game/smoke/smoke_all.gd:705-773` | ①-⑥ 退役(node_map 标签/池=5/模板 0=现行/强制 0/N=1 回滚档/first_script 分支);⑦ 收束置位保留改写(语义换首局种子) |
|
| S1 | 模板池断言段 `_smoke_node_map_templates` | `game/tests/integration/node_map_templates_test.gd:32-104` | ①-⑥ 退役(node_map 标签/池=5/模板 0=现行/强制 0/N=1 回滚档/first_script 分支);⑦ 收束置位保留改写(语义换首局种子) |
|
||||||
| S2 | 模板感知取节点表 `_level_active_nodes` 及消费点 | `smoke_all.gd:3438-3445`;消费 :977/:3452/:4564/:4567/:4682/:4726/:4729/:4738/:5126 | 改经卡①接口取生成图(固定种子+参数档) |
|
| S2 | 模板感知取节点表 `_level_active_nodes` 三宿主副本及消费点 | `level_shop_economy_test.gd:970`(消费 :102/:105/:211-219/:260-274/:689/:698);`adventure_feats_test.gd:812-816`(消费 :118-130);`round_flow_skill_pool_test.gd:357`(消费 :319/:330) | 改经卡①接口取生成图(固定种子+参数档) |
|
||||||
| S3 | 商店图不变式 `_smoke_shop_graph`+行进到商店房断言 | `smoke_all.gd:5114-5152`/:5034 | 换三条性质断言(终点前恰一店/商店数=终点数/全路径恰穿一店);硬编码 8/9/穿节点 8 退役 |
|
| S3 | 商店图不变式 `_smoke_shop_graph`+行进到商店房断言 | `level_shop_economy_test.gd:679-715`/:601 | 换三条性质断言(终点前恰一店/商店数=终点数/全路径恰穿一店);硬编码 8/9/穿节点 8/L1 行集零改动退役 |
|
||||||
| S4 | 形状写死断言 | `smoke_all.gd:4564`/:4726(节点数=10)/:5151-5152(L1 行集零改动)/:4567-4759(逐节点扫描) | 节点数改生成图读数性质;L1 单链断言退役;扫描断言敌侧键面随卡③ S 清单、本卡换取数面 |
|
| S4 | 形状写死断言 | `level_shop_economy_test.gd:102`/:257(节点数=10)/:714(L1 行集零改动)/:105-110、:211-219、:260-274(逐节点扫描) | 节点数改生成图读数性质;L1 单链断言退役;扫描断言敌侧键面随卡③ S 清单、本卡换取数面 |
|
||||||
| S5 | 覆盖义务断言(en_keys 键聚合) | `smoke_all.gd:971-981`/:4677-4687/:5144-5147 | 节点源换生成图;敌侧判据=band_of 非 -1(禁顶 clamp)、板侧=解析命中非空;以 §0 数据覆盖为绿灯前提 |
|
| S5 | 覆盖义务断言(en_keys 键聚合→生成图覆盖) | `level_shop_economy_test.gd:211-219/:267-274`(跨表行完整)/:704-714(商店房跨表行集)/`adventure_feats_test.gd:118-130` | 节点源换生成图;敌侧判据=`band_of` 非 -1(禁顶 clamp)+多终点 Boss 解析带键互异(承跨表校验④/迭代 34 检查语义);板侧=解析命中非空;以 §0 数据覆盖为绿灯前提 |
|
||||||
| S6 | 确定性冒烟(新增) | `smoke_all.gd` 新段 | 同图三断言+`level.tres` 无 templates 键(V7/V8 承载) |
|
| S6 | 确定性断言(新增) | `integration/node_map_templates_test.gd` 换代段(S1 同宿主) | 同图三断言+`level.tres` 无 templates 键(V7/V8 承载) |
|
||||||
| S7 | 驱动/工具面 | `level_autoplay.gd:37/:63/:141/:202/:12/:377`;`shot_probe.gd:12-13`;`ui_click_probe.gd:281` | template_pick 尾参退役;MC 字段 `level_templates`→`level_maps`;route 轴句柄序;探针假设性质化 |
|
| S7 | 驱动/工具面 | `game/sim/level_autoplay.gd:37/:63/:141/:200-202/:12/:377-379`;`game/sim/adventure_monte_carlo.gd:139`;`game/probe/shot_probe.gd:12-13`;`game/probe/ui_click_probe.gd:373` | template_pick 尾参退役;MC 字段 `level_templates`→`level_maps`;route 轴句柄序;探针假设性质化 |
|
||||||
| S8 | 单测随动面 | `breakpoint_resume_test.gd`;`pool_case_d_test.gd:37/:68/:113/:142/:160`;`feat_vouchers_test.gd:25`;`smoke_all.gd:5944-5952`(参数面 extra 键样例) | 断点键换代断言;first_script 键清退;extra 键样例换非 first_script 键(断言语义保持) |
|
| S8 | 单测随动面 | `breakpoint_resume_test.gd`;`pool_case_d_test.gd:37/:68/:113/:142/:160`;`feat_vouchers_test.gd:25`;`cross_system_flow_test.gd:79`;`meta_progression_forge_test.gd:316/:323-324`(参数面 extra 键样例);`config_db_cross_validator_test.gd`(`_test_level_node_band_rules` 段,:19 调用行) | 断点键换代断言;first_script 键清退;extra 键样例换非 first_script 键(断言语义保持);④ 静态检查段随 T2 退役(语义由 S5 承接) |
|
||||||
|
|
||||||
清单口径:S1–S6 归 T3 冒烟面,S7 归 T3 驱动面,S8 归 T2/T3 单测面;`tools/` 下历史生成脚本不随动(§5 不做)。
|
清单口径:S1–S6 归 T3 断言面,S7 归 T3 驱动面,S8 归 T2/T3 单测面;「冒烟」措辞沿 v1.0 语义=断言面统称,批 B 后其载体已是 `game/tests/` 各宿主(非 `game/smoke/`——该目录已退役);`tools/` 下历史生成脚本不随动(§5 不做)。
|
||||||
|
|
||||||
### 8.2 改动—验收对照表
|
### 8.2 改动—验收对照表
|
||||||
|
|
||||||
@@ -224,12 +227,13 @@
|
|||||||
| 加载校验四检+良构 | `level_table.gd` 新增 `validate_graph`、旧六判据与模板池校验分支退役 | V1(`level_table_validate_test.gd` 正负向夹具+起关拒绝冒烟) | 接口+集成 | 起关真实入口 `LevelRunner.start_level_external`(违规图返回 false) | 变异:注释「终点恒为 Boss」判据→负向红;无环判据短路→回边红 |
|
| 加载校验四检+良构 | `level_table.gd` 新增 `validate_graph`、旧六判据与模板池校验分支退役 | V1(`level_table_validate_test.gd` 正负向夹具+起关拒绝冒烟) | 接口+集成 | 起关真实入口 `LevelRunner.start_level_external`(违规图返回 false) | 变异:注释「终点恒为 Boss」判据→负向红;无环判据短路→回边红 |
|
||||||
| 行进语义(大岔口/多 Boss/单链) | `level_runner.gd` 多入口首跳+句柄寻址+单链显式出边;收束泛化保持 | V2(双入口候选断言)/V3(多终点全程驱动)/V4(单链夹具+含岔口+L1 终点恰 1) | 单元+集成 | 冒烟生成图全程驱动(`level_autoplay.run_level` 真实入口)+runner 夹具单测 | 变异:候选写死单入口→V2 红 |
|
| 行进语义(大岔口/多 Boss/单链) | `level_runner.gd` 多入口首跳+句柄寻址+单链显式出边;收束泛化保持 | V2(双入口候选断言)/V3(多终点全程驱动)/V4(单链夹具+含岔口+L1 终点恰 1) | 单元+集成 | 冒烟生成图全程驱动(`level_autoplay.run_level` 真实入口)+runner 夹具单测 | 变异:候选写死单入口→V2 红 |
|
||||||
| 商店编排冒烟换代 | `smoke_all.gd` `_smoke_shop_graph` 三条性质断言换代 | V5(终点前恰一店/商店数=终点数/全路径恰穿一店,种子扫描) | 集成 | 冒烟商店段(`python tools/run_smoke.py`) | 变异:终点前驱改非店→①红;路径加第二店→③红 |
|
| 商店编排冒烟换代 | `smoke_all.gd` `_smoke_shop_graph` 三条性质断言换代 | V5(终点前恰一店/商店数=终点数/全路径恰穿一店,种子扫描) | 集成 | 冒烟商店段(`python tools/run_smoke.py`) | 变异:终点前驱改非店→①红;路径加第二店→③红 |
|
||||||
|
| 生成图覆盖+Boss 带互异(S5 新判据,承跨表校验④语义) | S5 换代断言:`band_of` 非 -1+多终点带键互异+板侧命中(落 `level_shop_economy_test.gd` 换代段) | V11(S5 覆盖与带互异断言,种子扫描) | 集成 | 生成图逐节点/逐终点解析驱动(`resolve_enemy_rowset`/`band_of` 真实消费链) | 变异:enemy.tres boss 带并成单带→带互异断言红;删某 (关,row_kind) 顶带→覆盖断言红 |
|
||||||
| 定位信息两样 | `begin_battle` enc 值语义换代(node_depth=深度)+句柄寻址 | V6(载荷断言+卡③解析衔接) | 接口 | 战斗真实入口 `begin_battle`(冒烟驱动开战) | 变异:enc node_depth 取句柄→V6 红 |
|
| 定位信息两样 | `begin_battle` enc 值语义换代(node_depth=深度)+句柄寻址 | V6(载荷断言+卡③解析衔接) | 接口 | 战斗真实入口 `begin_battle`(冒烟驱动开战) | 变异:enc node_depth 取句柄→V6 红 |
|
||||||
| 确定性承载+旧断点代差 | `adventure_runner.gd`/`main.gd`/`save_manager.gd` 模板链路退役+断点键换代+代差标记键 | V7(S6 同图三断言)/V8(模板键零引用+旧断点拒绝) | 接口+集成 | 冒烟 S6+`breakpoint_resume_test.gd`+续玩真实入口 `resume_adventure` | 变异:生成器注计数器依赖→V7 红;旧断点放行回放→V8 红 |
|
| 确定性承载+旧断点代差 | `adventure_runner.gd`/`main.gd`/`save_manager.gd` 模板链路退役+断点键换代+代差标记键 | V7(S6 同图三断言)/V8(模板键零引用+旧断点拒绝) | 接口+集成 | 冒烟 S6+`breakpoint_resume_test.gd`+续玩真实入口 `resume_adventure` | 变异:生成器注计数器依赖→V7 红;旧断点放行回放→V8 红 |
|
||||||
| 15 张模板清理 | `level.tres` 三行 `templates` 键删除+模板池代码路径清退 | V9(表断言+件核) | 接口 | 冒烟表校验段+`git diff` 件核(仅删模板段) | 变异:留一个 `templates` 键→V9 红 |
|
| 15 张模板清理 | `level.tres` 三行 `templates` 键删除+模板池代码路径清退 | V9(表断言+件核) | 接口 | 冒烟表校验段+`git diff` 件核(仅删模板段) | 变异:留一个 `templates` 键→V9 红 |
|
||||||
| 反哺点清单(**非行为改动**——纯文档产出物,无游戏行为,§9.1) | §6 六条落 `reports/iter<N>-反哺点-<完成日>.md` | V10(件核对表) | 非行为改动 | T4 产出物件核 | 撤销证明:缺任一落点→V10 件核红 |
|
| 反哺点清单(**非行为改动**——纯文档产出物,无游戏行为,§9.1) | §6 六条落 `reports/iter<N>-反哺点-<完成日>.md` | V10(件核对表) | 非行为改动 | T4 产出物件核 | 撤销证明:缺任一落点→V10 件核红 |
|
||||||
|
|
||||||
**旧断言预声明(test-conventions §9.5)**——允许改写的旧断言清单及理由:①§8.1 S1–S8 随动面全部条目(理由:图源换模板池→参数档生成、寻址换句柄与节点深度、断点键换代;其中标注「断言语义保持」者只换键样例/定位方式、判据不动);②V5 商店三条性质断言换代(理由:商店编排规则由「每关恰 1·Boss 前一位」换代为「每终点前一位恰一店」,旧断言判据对象已废);③V8 收束置位改写断言(理由:模板 0 回滚档语义废除,置位条件随种子承载换代)。除此之外的断言删除/放宽/换下层直调=未声明削弱,停卡呈报、独立审计判红。
|
**旧断言预声明(test-conventions §9.5)**——允许改写的旧断言清单及理由:①§8.1 S1–S8 随动面全部条目(理由:图源换模板池→参数档生成、寻址换句柄与节点深度、断点键换代;其中标注「断言语义保持」者只换键样例/定位方式、判据不动);②V5 商店三条性质断言换代(理由:商店编排规则由「每关恰 1·Boss 前一位」换代为「每终点前一位恰一店」,旧断言判据对象已废);③V8 收束置位改写断言(理由:模板 0 回滚档语义废除,置位条件随种子承载换代);④**跨表校验④静态检查退役**(`config_db_cross_validator.gd:54-106` 含迭代 34「同图多终点 Boss 解析带键互异」:103-106 与顶 clamp 拦截 :90-102,及 `config_db_cross_validator_test.gd` `_test_level_node_band_rules` 段——理由:检查对象=表内静态节点,切源后随模板数据消亡,留置即死代码;两条拦截语义由 S5/V11 运行时断言承接,拦截面从静态代理升级到真实生成图,无削弱)。除此之外的断言删除/放宽/换下层直调=未声明削弱,停卡呈报、独立审计判红。
|
||||||
|
|
||||||
**独立验收审计**(test-conventions §9.7):合并前由未参与实现的会话或子代理执行——审计入口=只读需求卡片+本对照表+diff+测试文件+实现报告,自跑最窄测试抽查(不采信「已全绿」自述);审计报告文件=`reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」,未通过不得合并。测试执行两入口铁规不变(审计在迭代 loop 内启动的子代理算 loop;另开会话须用户点名)。
|
**独立验收审计**(test-conventions §9.7):合并前由未参与实现的会话或子代理执行——审计入口=只读需求卡片+本对照表+diff+测试文件+实现报告,自跑最窄测试抽查(不采信「已全绿」自述);审计报告文件=`reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」,未通过不得合并。测试执行两入口铁规不变(审计在迭代 loop 内启动的子代理算 loop;另开会话须用户点名)。
|
||||||
|
|
||||||
@@ -269,4 +273,6 @@
|
|||||||
|
|
||||||
**自审五查记录(2026-10-21)**:①规格覆盖——§1 六件目标/八项完成定义逐条挂 T 卡(校验=T1、行进/定位/确定性=T2、商店冒烟/模板清理=T3、反哺点=T4;确定性横跨 T2 链路退役+T3 断言补齐),无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,实现体只给签名+判据名(`validate_graph` 判据清单、商店三性质断言、确定性三断言),无抄写体;③类型一致性——接口块签名与 T 卡引用逐字一致(`generate(level_index, params, seed)`/`validate_graph(nodes)`/enc 三键/runner 读面七个方法名);④审查焦点——补挂四类失败模式:违规图放行(V1 变异)、商店位漏店/双店(V5 变异)、复现漂移(V7 变异)、模板键残留(V9 变异);⑤篇幅比例——规格约 1 屏、任务卡步骤与实现面 1:1,函数体零展开。
|
**自审五查记录(2026-10-21)**:①规格覆盖——§1 六件目标/八项完成定义逐条挂 T 卡(校验=T1、行进/定位/确定性=T2、商店冒烟/模板清理=T3、反哺点=T4;确定性横跨 T2 链路退役+T3 断言补齐),无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,实现体只给签名+判据名(`validate_graph` 判据清单、商店三性质断言、确定性三断言),无抄写体;③类型一致性——接口块签名与 T 卡引用逐字一致(`generate(level_index, params, seed)`/`validate_graph(nodes)`/enc 三键/runner 读面七个方法名);④审查焦点——补挂四类失败模式:违规图放行(V1 变异)、商店位漏店/双店(V5 变异)、复现漂移(V7 变异)、模板键残留(V9 变异);⑤篇幅比例——规格约 1 屏、任务卡步骤与实现面 1:1,函数体零展开。
|
||||||
|
|
||||||
|
**v1.1 修订自审(2026-10-24,宿主重锚批——六查复核)**:动笔面=§3 F1–F10 宿主与行号重锚(smoke_all 五处指认全迁批 B 宿主:S1→integration/node_map_templates_test、S3/S4/S5 主体→unit/core/level_shop_economy_test、extra 键样例→meta_progression_forge_test、驱动面→sim/probe 新路径)+§0 硬交付序列补 2026-10-24 数据实况与 Boss 带互异条款+T1/T2/T3 行号订正+T1 补 manifest 登记步(阻断 4 闭合)+**T2 跨表校验删除范围重划**(阻断 3 闭合:④ 整段 :54-106 随静态节点数据消亡退役,迭代 34 检查〔:103-106〕的拦截语义由 S5/V11 运行时断言承接——原 v1.0 写「只删死分支」时迭代 34 尚未在该段落码,照旧执行会连带静默删掉已交付断言;拦截面从静态代理升级到真实生成图,无削弱,入旧断言预声明④)+§8.1 S 清单宿主换代+§8/8.2 补 V11 行与变异证明+归据句卡③④ 状态换代。六查:①规格覆盖——设计面零变动(§1/§2/§4 契约未触;§4 契约 8「本卡不新增校验」不受影响——S5 是断言不是加载校验),V11 为既有 §0 交付序列的验收落位(v1.0 缺行,本轮补齐使验收闭合);②步骤扫描——manifest 步与 S5 语义承接步均一步一动作+可核查结果;③类型一致性——签名零变动(卡① 接口块期望签名沿 v1.0 原文,T0 对齐步不变);④改动覆盖——V11 新行带撤销/变异证明(boss 带并单带→红;删顶带→红);⑤篇幅比例——零函数体;⑥落位复用——断言宿主全复用批 B 16 宿主与既有 manifest 行体例,S6 落 S1 同宿主零新增登记。重锚依据=`reports/批B-断言迁移账本-2026-10-22.md`+2026-10-24 master 实查(16c6f136/迭代 34 落地后现态)。
|
||||||
|
|
||||||
**grilling 复核记录(2026-10-21,设计树对抗复核,不采访用户——可推导定值写依据、真归用户列 §11)**:按设计树走查八支——①校验语义边界(四检 vs 产出规格五条:五条是卡①产出侧自证〔D2:117 产出合格判据〕、四检是消费侧加载拦截〔D1:51/:176 明列清单〕,「个数=参数档」括注归产出侧、本卡不核个数——边界写进契约 1①);②节点深度歧义(合流/多入口下 depth 赋值一致性归卡①产出规格,消费侧以「出边目标深度严格大于源」兜前进方向);③多入口路径语义(「每条路径恰好从一个入口出发」=每个节点在某条入口→终点路径上〔无孤儿无断头〕+入口为无入边节点——形式化写进契约 1②);④确定性复现(三案淘汰两案、定值纯函数复现,§11 留否决口;RNG 机制协调归卡①接口定稿、硬语义不浮动);⑤U2 规则去留(判据对象消亡+产出规格无据 → 退役定值,§11 留否决口);⑥商店「前一位」形式化(D1:63「前一位恰一家店」+D1:182「恰穿一家」+D2「商店数=出口数」三者合取 ⇒ 终点入边恰一且前驱是店——契约 4 表述核对);⑦**旧断点代差(本轮新查出的真缺口)**——旧断点 node_id 与新句柄空间可碰撞静默错位,定值代差标记键+显式拒绝(§11 留否决口);⑧跨卡序列(生成图深度域 vs 敌侧带覆盖=真实缺口,卡③ §5 已登记归口——本卡把交付序列写死为 §0 硬前置而非待裁)。code-conventions 对照:§2.2「跨层标识符语义单一且成文」恰为契约 2 的规范依据(node_depth 双语义是现役违规态)、S9 类型闸与既有 `validate()` 同形、§4.11 新单测不经 autoload 无冲突。AGENTS.md 硬红线逐条过:数值单点(本卡零数值、参数档只读)、RNG 单点(生成器取数归卡①、本卡不自建 RNG)、测试两入口(T 卡只写断言不跑测)、实现批禁写 design/(§6 义务全走反哺点、零旧口径义务措辞)、fail-fast(违规图致命无软回退+旧断点显式拒绝)。结论:零待裁点,四处灰色推导已定值并留 §11 供用户否决。
|
**grilling 复核记录(2026-10-21,设计树对抗复核,不采访用户——可推导定值写依据、真归用户列 §11)**:按设计树走查八支——①校验语义边界(四检 vs 产出规格五条:五条是卡①产出侧自证〔D2:117 产出合格判据〕、四检是消费侧加载拦截〔D1:51/:176 明列清单〕,「个数=参数档」括注归产出侧、本卡不核个数——边界写进契约 1①);②节点深度歧义(合流/多入口下 depth 赋值一致性归卡①产出规格,消费侧以「出边目标深度严格大于源」兜前进方向);③多入口路径语义(「每条路径恰好从一个入口出发」=每个节点在某条入口→终点路径上〔无孤儿无断头〕+入口为无入边节点——形式化写进契约 1②);④确定性复现(三案淘汰两案、定值纯函数复现,§11 留否决口;RNG 机制协调归卡①接口定稿、硬语义不浮动);⑤U2 规则去留(判据对象消亡+产出规格无据 → 退役定值,§11 留否决口);⑥商店「前一位」形式化(D1:63「前一位恰一家店」+D1:182「恰穿一家」+D2「商店数=出口数」三者合取 ⇒ 终点入边恰一且前驱是店——契约 4 表述核对);⑦**旧断点代差(本轮新查出的真缺口)**——旧断点 node_id 与新句柄空间可碰撞静默错位,定值代差标记键+显式拒绝(§11 留否决口);⑧跨卡序列(生成图深度域 vs 敌侧带覆盖=真实缺口,卡③ §5 已登记归口——本卡把交付序列写死为 §0 硬前置而非待裁)。code-conventions 对照:§2.2「跨层标识符语义单一且成文」恰为契约 2 的规范依据(node_depth 双语义是现役违规态)、S9 类型闸与既有 `validate()` 同形、§4.11 新单测不经 autoload 无冲突。AGENTS.md 硬红线逐条过:数值单点(本卡零数值、参数档只读)、RNG 单点(生成器取数归卡①、本卡不自建 RNG)、测试两入口(T 卡只写断言不跑测)、实现批禁写 design/(§6 义务全走反哺点、零旧口径义务措辞)、fail-fast(违规图致命无软回退+旧断点显式拒绝)。结论:零待裁点,四处灰色推导已定值并留 §11 供用户否决。
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# 需求卡片:节点图生成器核心批(参数化长图生成器)· 关卡节点图重构卡①
|
# 需求卡片:节点图生成器核心批(参数化长图生成器)· 关卡节点图重构卡①
|
||||||
|
|
||||||
- 版本:**v1.0**(2026-10-21 成文;自审五查+grilling 复核结论见文末 §11)
|
- 版本:**v1.1**(2026-10-24 修订重锚——§3 行号与断言宿主对齐 game/smoke/ 退役〔16c6f136〕后仓库现态+run_all manifest 登记步补齐;v1.0 2026-10-21 成文,自审五查+grilling 复核结论见文末 §11)
|
||||||
- 来源:[待办清单](../待办清单.md)「关卡节点图重构——可选节点太少」(2026-10-13 登记,来源=playnote,设计面=文档轨,状态=文档设计已闭合)(**唯一事实源**:[关卡节点图生成](../design/gdd/systems/冒险循环/关卡节点图生成.md) **v1.1**(2026-10-21 双定稿闭合凭据之一);协作凭据=[关卡节点地图](../design/gdd/systems/冒险循环/关卡节点地图.md) v2.1+[冒险结构](../design/gdd/systems/冒险循环/冒险结构.md) 关卡行集/结构冻结/覆盖义务行)
|
- 来源:[待办清单](../待办清单.md)「关卡节点图重构——可选节点太少」(2026-10-13 登记,来源=playnote,设计面=文档轨,状态=文档设计已闭合)(**唯一事实源**:[关卡节点图生成](../design/gdd/systems/冒险循环/关卡节点图生成.md) **v1.1**(2026-10-21 双定稿闭合凭据之一);协作凭据=[关卡节点地图](../design/gdd/systems/冒险循环/关卡节点地图.md) v2.1+[冒险结构](../design/gdd/systems/冒险循环/冒险结构.md) 关卡行集/结构冻结/覆盖义务行)
|
||||||
- 归属:关卡节点图**生成侧**(参数化长图生成器算法本体+五旋钮参数档数据表+产出约束自证+执行边界+确定性承载);关卡节点图重构批**卡①**(卡②消费侧换代/卡③敌人表深度带/卡④迷雾可见性同批,均已写卡)
|
- 归属:关卡节点图**生成侧**(参数化长图生成器算法本体+五旋钮参数档数据表+产出约束自证+执行边界+确定性承载);关卡节点图重构批**卡①**(卡②消费侧换代/卡③敌人表深度带〔已落地·迭代 34〕/卡④迷雾可见性〔已落地·迭代 34〕同批)
|
||||||
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
|
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
|
||||||
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(零待裁点,见 §11)
|
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(零待裁点,见 §11)
|
||||||
|
|
||||||
@@ -46,17 +46,17 @@
|
|||||||
|
|
||||||
闭合凭据一致性:D1 与 06 条目状态内列的设计定稿逐字一致(`关卡节点图生成.md` v1.1);D2/D3 为协作语义参照,与 D1 同向(确定性、结构铁律、覆盖义务)。
|
闭合凭据一致性:D1 与 06 条目状态内列的设计定稿逐字一致(`关卡节点图生成.md` v1.1);D2/D3 为协作语义参照,与 D1 同向(确定性、结构铁律、覆盖义务)。
|
||||||
|
|
||||||
## 3. 现状事实(2026-10-21 worktree 实查;开工日 T0 复核行号)
|
## 3. 现状事实(2026-10-21 成文实查;行号 2026-10-24 v1.1 重锚——对齐 game/smoke/ 退役〔16c6f136〕与迭代 34 落地后 master 现态;开工日 T0 复核行号)
|
||||||
|
|
||||||
| # | 事实 | 出处 |
|
| # | 事实 | 出处 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| F1 | **无运行时参数化生成器**;图来自固定模板池(15 张=3 关×5 张,L1 五张=单链排列变体 7 节点、L2/L3 网状 10 节点 node_depth 0–9);离线工具 `tools/t5_build_templates.py`/`t17_fanout2_rebuild.py` 一次性预生成入库(非运行时生成) | 模板数据 `game/data/tables/level.tres:8`(L1 五链)/:9(L2 五网)/:10(L3 五网);表尾生成史注释 `level.tres:13-19`(:19「生成器 = tools/t5_build_templates.py」);离线工具 `tools/t5_build_templates.py`/`tools/t17_fanout2_rebuild.py` 在盘 |
|
| F1 | **无运行时参数化生成器**;图来自固定模板池(15 张=3 关×5 张,L1 五张=单链排列变体 7 节点、L2/L3 网状 10 节点 node_depth 0–9);离线工具 `tools/t5_build_templates.py`/`t17_fanout2_rebuild.py` 一次性预生成入库(非运行时生成) | 模板数据 `game/data/tables/level.tres:8`(L1 五链)/:9(L2 五网)/:10(L3 五网);表尾生成史注释 `level.tres:13-19`(:19「生成器 = tools/t5_build_templates.py」);离线工具 `tools/t5_build_templates.py`/`tools/t17_fanout2_rebuild.py` 在盘 |
|
||||||
| F2 | 节点图数据结构=`level_row.nodes: Array[Dictionary]`,节点=`{node_depth, type, next?}`;图形态=任一节点带 `next`(`_graph_mode` 探测);节点 id 双编号空间(图=`node_depth` 当节点身份/单链=数组下标,注记「混用两空间会碰撞」);入口取「无入边**唯一**节点」 | 结构与探测 `game/core/level_runner.gd:67`/:156-159/:203-206;`_node_id` 双空间 `level_runner.gd:338-344`;`_entry_node` 唯一 `level_runner.gd:348-356`;出边 `_out_ids`/`_out_nodes` `level_runner.gd:360-379` |
|
| F2 | 节点图数据结构=`level_row.nodes: Array[Dictionary]`,节点=`{node_depth, type, next?}`;图形态=任一节点带 `next`(`_graph_mode` 探测);节点 id 双编号空间(图=`node_depth` 当节点身份/单链=数组下标,注记「混用两空间会碰撞」);入口取「无入边**唯一**节点」 | 结构与探测 `game/core/level_runner.gd:67`/:149-158/:202-205;`_node_id` 双空间 `level_runner.gd:341-347`;`_entry_node` 唯一 `level_runner.gd:348-358`;出边 `_out_ids`/`_out_nodes` `level_runner.gd:360-385` |
|
||||||
| F3 | 现行图合法性校验约束与 D1 v1.1 冲突(旧模板形状约束):出度 ≤2(:130-135)、入口唯一〔无入边恰一〕(:136-146)、Boss 唯一终点+无出边+编号最大(:147-154)、Boss 计数恰一(:80-81)、单链末 Boss(:84-87)、单链前三纯战斗 U2(:91-95)、BFS 层宽 ≤5 U2(:180-197)——D1 v1.1 多入口多终点/岔口去路 2–3/大岔口自 L2 起 与之冲突;换代归卡②(消费侧加载校验),本卡产出侧按 D1 v1.1 | 校验体 `game/data/schemas/level_table.gd:80-81`/:84-87/:91-95/:130-135/:136-146/:147-154/:180-197 |
|
| F3 | 现行图合法性校验约束与 D1 v1.1 冲突(旧模板形状约束):出度 ≤2(:133-138)、入口唯一〔无入边恰一〕(:139-149)、Boss 唯一终点+无出边+编号最大(:150-157)、Boss 计数恰一(:83-84)、单链末 Boss(:87-90)、单链前三纯战斗 U2(:94-98)、BFS 层宽 ≤5 U2(:183-201)——D1 v1.1 多入口多终点/岔口去路 2–3/大岔口自 L2 起 与之冲突;换代归卡②(消费侧加载校验),本卡产出侧按 D1 v1.1 | 校验体 `game/data/schemas/level_table.gd:83-84`/:87-90/:94-98/:133-138/:139-149/:150-157/:183-201 |
|
||||||
| F4 | 模板抽取经 `node_map` 流(`rng.open_stream("node_map")` 抽签)/`template_pick` 强制取模板;`begin_battle` 组装 enc=`level_index`+`node_depth`(值实为节点编号)+`node_type` | 抽取 `level_runner.gd:307-324`(:317-318 抽签、:314-315 强制);enc 组装 `level_runner.gd:467-482`(:467/:479) |
|
| F4 | 模板抽取经 `node_map` 流(`rng.open_stream("node_map")` 抽签)/`template_pick` 强制取模板;`begin_battle` 组装 enc=`level_index`+`node_depth`(值实为节点编号)+`node_type` | 抽取 `level_runner.gd:307-324`(:317-318 抽签、:314-315 强制);enc 组装 `level_runner.gd:513-525`(:514/:524) |
|
||||||
| F5 | RngService 统一随机流单点(禁 `randomize()`/自建 RNG):`open_stream(purpose)` 经全局计数器取号(计数器 +1)、`derive_at(scope)` 纯派生不推计数器、`PURPOSE_TAGS` 含 `node_map`;快照契约=主种子+计数器 | 类头纪律 `game/core/rng_service.gd:3`;`PURPOSE_TAGS` :9;`derive_at` :34-37;`set_master_seed` :52;`new_adventure` :67;`open_stream` :86-99;AGENTS.md:73「RNG 单点——禁 randomize()/自建 RandomNumberGenerator,随机只经 RngService 统一流」 |
|
| F5 | RngService 统一随机流单点(禁 `randomize()`/自建 RNG):`open_stream(purpose)` 经全局计数器取号(计数器 +1)、`derive_at(scope)` 纯派生不推计数器、`PURPOSE_TAGS` 含 `node_map`;快照契约=主种子+计数器 | 类头纪律 `game/core/rng_service.gd:3`;`PURPOSE_TAGS` :9;`derive_at` :34-37;`set_master_seed` :52;`new_adventure` :67;`open_stream` :86-99;AGENTS.md:73「RNG 单点——禁 randomize()/自建 RandomNumberGenerator,随机只经 RngService 统一流」 |
|
||||||
| F6 | ConfigDB 数据表注册模式:`_tables` 映射表名→.tres、`var level: LevelTable`、`load_tables` 装载、访问器单点读取(`level_row(level_index)`);数值单一事实源=`data/tables/*.tres` 经 ConfigDB 单点读 | 注册映射 `game/core/config_db.gd:20`;成员 `config_db.gd:40`;装载 `config_db.gd:142`;访问器 `config_db.gd:245-246`;AGENTS.md:72 数值单一事实源 |
|
| F6 | ConfigDB 数据表注册模式:`_tables` 映射表名→.tres、`var level: LevelTable`、`load_tables` 装载、访问器单点读取(`level_row(level_index)`);数值单一事实源=`data/tables/*.tres` 经 ConfigDB 单点读 | 注册映射 `game/core/config_db.gd:20`;成员 `config_db.gd:40`;装载 `config_db.gd:142`;访问器 `config_db.gd:245-246`;AGENTS.md:72 数值单一事实源 |
|
||||||
| F7 | 数据表 schema 范例(`rows: Array[Dictionary]`+`validate()` 域校验,空表=合法态):难度表 schema 同构可循 | `game/data/schemas/difficulty_table.gd:7`(rows)/:17-31(validate 域校验);同构参照 `game/data/schemas/level_table.gd:7/:20` |
|
| F7 | 数据表 schema 范例(`rows: Array[Dictionary]`+`validate()` 域校验,空表=合法态):难度表 schema 同构可循 | `game/data/schemas/difficulty_table.gd:7`(rows)/:13-27(validate 域校验);同构参照 `game/data/schemas/level_table.gd:7/:21` |
|
||||||
| F8 | Core 层纪律:完整玩法须可 `--headless --script` 跑通、零 UI 依赖;`--script` 模式禁裸 autoload 标识符(ConfigDB/RngService 经节点路径注入) | AGENTS.md:75;`code-conventions.md:71`(`--script` 禁裸 autoload,经 `get_node("/root/…")`);`level_runner.gd:2-3`(Core 零 UI、headless 可跑) |
|
| F8 | Core 层纪律:完整玩法须可 `--headless --script` 跑通、零 UI 依赖;`--script` 模式禁裸 autoload 标识符(ConfigDB/RngService 经节点路径注入) | AGENTS.md:75;`code-conventions.md:71`(`--script` 禁裸 autoload,经 `get_node("/root/…")`);`level_runner.gd:2-3`(Core 零 UI、headless 可跑) |
|
||||||
|
|
||||||
## 4. 设计契约(红线,违反 = L3 停机呈报)
|
## 4. 设计契约(红线,违反 = L3 停机呈报)
|
||||||
@@ -102,7 +102,8 @@
|
|||||||
| `待办清单.md`(06 登记处) | 本卡登记条状态推进「已写卡(`reports/需求卡片-节点图生成器核心批-2026-10-21.md`)」(req-card 06 状态回写义务) | 反哺点 · 列清单(⑤状态回写与条目退役记载——本会话文件面限于本卡一个文件,回写由批次收口/用户发令执行,防四卡并行互踩) |
|
| `待办清单.md`(06 登记处) | 本卡登记条状态推进「已写卡(`reports/需求卡片-节点图生成器核心批-2026-10-21.md`)」(req-card 06 状态回写义务) | 反哺点 · 列清单(⑤状态回写与条目退役记载——本会话文件面限于本卡一个文件,回写由批次收口/用户发令执行,防四卡并行互踩) |
|
||||||
| `roadmap.md` | 迭代行编入笔与批内状态刷新 | 反哺点 · 列清单(⑥) |
|
| `roadmap.md` | 迭代行编入笔与批内状态刷新 | 反哺点 · 列清单(⑥) |
|
||||||
| `game/core/node_map_generator.gd`、`game/data/schemas/level_gen_params.gd`、`game/data/tables/level_gen_params.tres`、`game/core/rng_service.gd`、`game/core/config_db.gd` | 生成器本体+参数档数据表+RNG 纯流面+ConfigDB 注册 | 实施本体(可写) |
|
| `game/core/node_map_generator.gd`、`game/data/schemas/level_gen_params.gd`、`game/data/tables/level_gen_params.tres`、`game/core/rng_service.gd`、`game/core/config_db.gd` | 生成器本体+参数档数据表+RNG 纯流面+ConfigDB 注册 | 实施本体(可写) |
|
||||||
| `game/tests/unit/core/node_map_generator_test.gd`、`game/tests/unit/data_config/level_gen_params_test.gd`、`game/smoke/smoke_all.gd` | 验收断言面(§8 V 清单) | 实施本体(可写) |
|
| `game/tests/unit/core/node_map_generator_test.gd`、`game/tests/unit/core/node_map_growth_test.gd`、`game/tests/unit/data_config/level_gen_params_test.gd` | 验收断言面(§8 V 清单;game/smoke/ 已退役〔16c6f136〕——批 B 后断言面全落 `game/tests/` 宿主) | 实施本体(可写) |
|
||||||
|
| `game/tests/run_all.gd` | 三套新测试套件 manifest 登记(`_suites()` 追加三行 `expect=0`——manifest 数即闸 02 计数口径,未登记=闸 02 不执行) | 实施本体(可写) |
|
||||||
|
|
||||||
## 7. 任务卡
|
## 7. 任务卡
|
||||||
|
|
||||||
@@ -143,6 +144,7 @@
|
|||||||
- [ ] 实装 `game/data/schemas/level_gen_params.gd`:类 `LevelGenParams`(extends Resource),`rows: Array[Dictionary]`(键=level_index),`validate() -> Array`(域校验:五旋钮在域、配比四类合计 1、出口 L1=1/L2L3∈[1,3]、层深 L1≥6、岔口去路数 2/3、战斗保底≥0),`row_by_level_index(level_index: int) -> Dictionary` 单点读。可核查结果:schema 编译通过、validate 对合法行零错误对越域行报错。
|
- [ ] 实装 `game/data/schemas/level_gen_params.gd`:类 `LevelGenParams`(extends Resource),`rows: Array[Dictionary]`(键=level_index),`validate() -> Array`(域校验:五旋钮在域、配比四类合计 1、出口 L1=1/L2L3∈[1,3]、层深 L1≥6、岔口去路数 2/3、战斗保底≥0),`row_by_level_index(level_index: int) -> Dictionary` 单点读。可核查结果:schema 编译通过、validate 对合法行零错误对越域行报错。
|
||||||
- [ ] 实装 `game/data/tables/level_gen_params.tres`:L1/L2/L3 三行五旋钮 provisional 值(取值照 §8.1 表逐行填)。可核查结果:表加载零诊断、三行值与 §8.1 provisional 表对上、validate 全绿。
|
- [ ] 实装 `game/data/tables/level_gen_params.tres`:L1/L2/L3 三行五旋钮 provisional 值(取值照 §8.1 表逐行填)。可核查结果:表加载零诊断、三行值与 §8.1 provisional 表对上、validate 全绿。
|
||||||
- [ ] 实装 `game/core/config_db.gd` 注册:`_tables` 映射加 `"level_gen_params": "level_gen_params.tres"`(对齐 :20 体例)、成员 `var level_gen_params`、装载(对齐 :142)、访问器 `level_gen_params_row(level_index: int) -> Dictionary`(对齐 :245 体例,缺行返回 `{}`)。可核查结果:ConfigDB 装载该表、访问器按 level_index 读回正确行、缺行返回空字典。
|
- [ ] 实装 `game/core/config_db.gd` 注册:`_tables` 映射加 `"level_gen_params": "level_gen_params.tres"`(对齐 :20 体例)、成员 `var level_gen_params`、装载(对齐 :142)、访问器 `level_gen_params_row(level_index: int) -> Dictionary`(对齐 :245 体例,缺行返回 `{}`)。可核查结果:ConfigDB 装载该表、访问器按 level_index 读回正确行、缺行返回空字典。
|
||||||
|
- [ ] manifest 登记:`game/tests/run_all.gd` `_suites()` 追加 `{"path": "res://tests/unit/data_config/level_gen_params_test.gd", "expect": 0}`(对齐既有行体例;批 B 协议——禁「文件在 manifest 不在」空窗)。可核查结果:run_all 实跑套件数 +1 且新套件 PASS。
|
||||||
- [ ] 验收步骤:跑 `godot --headless --path game --script res://tests/unit/data_config/level_gen_params_test.gd`,期望 schema validate+值域断言全绿。
|
- [ ] 验收步骤:跑 `godot --headless --path game --script res://tests/unit/data_config/level_gen_params_test.gd`,期望 schema validate+值域断言全绿。
|
||||||
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 还原→记录):把 L1 出口改 2(应=1)→ 期望值域断言红;把配比四类改合计 0.5 → 期望合计 1 断言红。记录表进实现报告。
|
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 还原→记录):把 L1 出口改 2(应=1)→ 期望值域断言红;把配比四类改合计 0.5 → 期望合计 1 断言红。记录表进实现报告。
|
||||||
|
|
||||||
@@ -152,6 +154,7 @@
|
|||||||
- [ ] 实装 `game/core/node_map_generator.gd`:类 `NodeMapGenerator`(extends RefCounted,Core 零 UI、RngService 经构造注入〔`--script` 禁裸 autoload,code-conventions:71〕);`generate(params: Dictionary, seed: int) -> Dictionary` 产出 `{nodes, entries, terminals}`(节点字段 id/type/depth/next)。**长图算法(HOW)归实现**(D1:28),只钉产出必须满足 §4 契约 3 全部产出约束+结构铁律+摆放约束三条+契约 2 深度赋值。取数只经 `pure_stream`(契约 1)。可核查结果:对 L1/L2/L3 参数档各以固定种子产图,图非空、字段齐备。
|
- [ ] 实装 `game/core/node_map_generator.gd`:类 `NodeMapGenerator`(extends RefCounted,Core 零 UI、RngService 经构造注入〔`--script` 禁裸 autoload,code-conventions:71〕);`generate(params: Dictionary, seed: int) -> Dictionary` 产出 `{nodes, entries, terminals}`(节点字段 id/type/depth/next)。**长图算法(HOW)归实现**(D1:28),只钉产出必须满足 §4 契约 3 全部产出约束+结构铁律+摆放约束三条+契约 2 深度赋值。取数只经 `pure_stream`(契约 1)。可核查结果:对 L1/L2/L3 参数档各以固定种子产图,图非空、字段齐备。
|
||||||
- [ ] 实装产出侧自证 `validate_output(graph: Dictionary) -> Array`(生成器内、产前强制):过产出约束五条+结构铁律+摆放约束三条(道路系统/宽度/层高/归属锁定/战斗保底/无环/多入口多终点/每路径恰一入一出/商店位/岔路取舍两条/多终点深度互异)。可核查结果:合法产出自证零错误;构造违规夹具图(环/断头/孤儿/双终点同深/缺店/岔口同类型下一跳)各报对应错误类别(沿 `structural`/`dangling_next`/`dup_key`/`enum`/`domain` 词表)。
|
- [ ] 实装产出侧自证 `validate_output(graph: Dictionary) -> Array`(生成器内、产前强制):过产出约束五条+结构铁律+摆放约束三条(道路系统/宽度/层高/归属锁定/战斗保底/无环/多入口多终点/每路径恰一入一出/商店位/岔路取舍两条/多终点深度互异)。可核查结果:合法产出自证零错误;构造违规夹具图(环/断头/孤儿/双终点同深/缺店/岔口同类型下一跳)各报对应错误类别(沿 `structural`/`dangling_next`/`dup_key`/`enum`/`domain` 词表)。
|
||||||
- [ ] 实装确定性:`generate` 同 (seed, params) 两次逐位同图(深比较 nodes/entries/terminals);counter 无关(不同 `_counter` 初值下同 (seed,params) 同图)。可核查结果:`node_map_generator_test` 可复现断言绿。
|
- [ ] 实装确定性:`generate` 同 (seed, params) 两次逐位同图(深比较 nodes/entries/terminals);counter 无关(不同 `_counter` 初值下同 (seed,params) 同图)。可核查结果:`node_map_generator_test` 可复现断言绿。
|
||||||
|
- [ ] manifest 登记:`game/tests/run_all.gd` `_suites()` 追加 `{"path": "res://tests/unit/core/node_map_generator_test.gd", "expect": 0}`(对齐既有行体例)。可核查结果:run_all 实跑套件数 +1 且新套件 PASS。
|
||||||
- [ ] 验收步骤:跑 `godot --headless --path game --script res://tests/unit/core/node_map_generator_test.gd`,期望产出合格+可复现断言全绿。
|
- [ ] 验收步骤:跑 `godot --headless --path game --script res://tests/unit/core/node_map_generator_test.gd`,期望产出合格+可复现断言全绿。
|
||||||
- [ ] 变异验证:生成器取数改 `open_stream`(推计数器)→ 期望 counter 无关断言红;把 depth 赋值改「最短路径」→ 期望「出边目标 depth>源」无环判据对某合流图误判/多终点深度互异断言红;产出自证注释「终点恒 Boss」判据 → 期望非 Boss 终点夹具红。记录表进实现报告。
|
- [ ] 变异验证:生成器取数改 `open_stream`(推计数器)→ 期望 counter 无关断言红;把 depth 赋值改「最短路径」→ 期望「出边目标 depth>源」无环判据对某合流图误判/多终点深度互异断言红;产出自证注释「终点恒 Boss」判据 → 期望非 Boss 终点夹具红。记录表进实现报告。
|
||||||
|
|
||||||
@@ -161,6 +164,7 @@
|
|||||||
- [ ] 实装 `game/tests/unit/core/node_map_growth_test.gd` 生长递增断言:同子下 L1/L2/L3 生成图的最长路径步数与节点总数均逐关递增,且节点总数增幅 Δ(L2→L3)>Δ(L1→L2)。可核查结果:三档读数表断言绿。
|
- [ ] 实装 `game/tests/unit/core/node_map_growth_test.gd` 生长递增断言:同子下 L1/L2/L3 生成图的最长路径步数与节点总数均逐关递增,且节点总数增幅 Δ(L2→L3)>Δ(L1→L2)。可核查结果:三档读数表断言绿。
|
||||||
- [ ] 实装参数无解 fail-fast 断言:构造无解参数档(如 layers=1 且 branch_density 强制零岔口而出口要求分区域、或必经店无法满足)→ 期望 `generate` 致命中止(push_error+assert/既有 fatal,返回前不产出残图),无兜底图回退。可核查结果:无解参数夹具触发致命、断言「无残图返回、无兜底图路径」。
|
- [ ] 实装参数无解 fail-fast 断言:构造无解参数档(如 layers=1 且 branch_density 强制零岔口而出口要求分区域、或必经店无法满足)→ 期望 `generate` 致命中止(push_error+assert/既有 fatal,返回前不产出残图),无兜底图回退。可核查结果:无解参数夹具触发致命、断言「无残图返回、无兜底图路径」。
|
||||||
- [ ] 变异验证(新增/改写断言逐条注入实验,记录表进实现报告):终点前驱改非店 → 期望「必经恰一店」红;把两终点设同 depth → 期望多终点深度互异红;把岔口两去路设同类型 → 期望岔路取舍·下一跳红;把战斗节点砍到低于 battle_floor → 期望战斗保底红;生长断言把 L2/L3 参数调成节点数增幅倒挂 → 期望生长递增红;把 `generate` 无解路径改「返回空图」→ 期望 fail-fast 断言红。逐条执行「注入→最窄闸见红→`git checkout` 精确还原→记录」。
|
- [ ] 变异验证(新增/改写断言逐条注入实验,记录表进实现报告):终点前驱改非店 → 期望「必经恰一店」红;把两终点设同 depth → 期望多终点深度互异红;把岔口两去路设同类型 → 期望岔路取舍·下一跳红;把战斗节点砍到低于 battle_floor → 期望战斗保底红;生长断言把 L2/L3 参数调成节点数增幅倒挂 → 期望生长递增红;把 `generate` 无解路径改「返回空图」→ 期望 fail-fast 断言红。逐条执行「注入→最窄闸见红→`git checkout` 精确还原→记录」。
|
||||||
|
- [ ] manifest 登记:`game/tests/run_all.gd` `_suites()` 追加 `{"path": "res://tests/unit/core/node_map_growth_test.gd", "expect": 0}`(对齐既有行体例)。可核查结果:run_all 实跑套件数 +1 且新套件 PASS。
|
||||||
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批碰 `game/` 代码与数据表+测试 → 代码域档),期望生成器/参数档断言全绿、探针段无红。
|
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批碰 `game/` 代码与数据表+测试 → 代码域档),期望生成器/参数档断言全绿、探针段无红。
|
||||||
- [ ] 件核:全仓 `generate` 调用点不传 level_index(契约 6);生成器内零 `randomize()`/零自建 RandomNumberGenerator/零 `open_stream`(契约 1,`pure_stream` 除外)。
|
- [ ] 件核:全仓 `generate` 调用点不传 level_index(契约 6);生成器内零 `randomize()`/零自建 RandomNumberGenerator/零 `open_stream`(契约 1,`pure_stream` 除外)。
|
||||||
|
|
||||||
@@ -259,4 +263,6 @@
|
|||||||
|
|
||||||
**自审五查记录(2026-10-21)**:① 规格覆盖——§1 四件本体/八项完成定义逐条挂 T 卡(参数档=T1、生成器产出合格+确定性=T2、专项+生长+fail-fast+变异=T3、反哺点=T4;确定性横跨 T2 纯流面+V3 断言),无漏项;② 步骤扫描——全部步骤一步一动作一可核查结果,实现体只给签名+判据名(`generate`/`pure_stream`/`validate_output` 签名、产出约束判据清单、七类专项断言名),长图算法(HOW)明写归实现(D1:28)不抄写、无占位符、无推诿措辞、无本批未定义的类型/函数名;③ 类型一致性——§7 接口块签名与 T 卡/邻卡引用逐字一致(`generate(params: Dictionary, seed: int) -> Dictionary`、返回 `{nodes,entries,terminals}`、节点 `{id,type,depth,next}`、`pure_stream(seed_val: int, scope: int) -> RandomNumberGenerator`、`level_gen_params_row(level_index: int) -> Dictionary`、字段名 layers/branch_density/battle_ratio/reward_ratio/rest_ratio/shop_ratio/entry_count/exit_count/battle_floor/fork_ways_min/fork_ways_max);④ 审查焦点——补挂失败模式:产图失败回退残图(V4 变异)、复现漂移(V3 变异)、多终点同深错兑付(V6 变异)、岔口同类型下一跳(V5 变异)、必经店漏店(V6 变异)、战斗被挤没(V7 变异)、生长倒挂(V8 变异)、取数推计数器(V3 counter 无关变异);⑤ 篇幅比例——规格约 2 屏、任务卡步骤与实现面 1:1,函数体零展开(长图算法不抄写),产出规格/执行边界照录 D1 不增删。
|
**自审五查记录(2026-10-21)**:① 规格覆盖——§1 四件本体/八项完成定义逐条挂 T 卡(参数档=T1、生成器产出合格+确定性=T2、专项+生长+fail-fast+变异=T3、反哺点=T4;确定性横跨 T2 纯流面+V3 断言),无漏项;② 步骤扫描——全部步骤一步一动作一可核查结果,实现体只给签名+判据名(`generate`/`pure_stream`/`validate_output` 签名、产出约束判据清单、七类专项断言名),长图算法(HOW)明写归实现(D1:28)不抄写、无占位符、无推诿措辞、无本批未定义的类型/函数名;③ 类型一致性——§7 接口块签名与 T 卡/邻卡引用逐字一致(`generate(params: Dictionary, seed: int) -> Dictionary`、返回 `{nodes,entries,terminals}`、节点 `{id,type,depth,next}`、`pure_stream(seed_val: int, scope: int) -> RandomNumberGenerator`、`level_gen_params_row(level_index: int) -> Dictionary`、字段名 layers/branch_density/battle_ratio/reward_ratio/rest_ratio/shop_ratio/entry_count/exit_count/battle_floor/fork_ways_min/fork_ways_max);④ 审查焦点——补挂失败模式:产图失败回退残图(V4 变异)、复现漂移(V3 变异)、多终点同深错兑付(V6 变异)、岔口同类型下一跳(V5 变异)、必经店漏店(V6 变异)、战斗被挤没(V7 变异)、生长倒挂(V8 变异)、取数推计数器(V3 counter 无关变异);⑤ 篇幅比例——规格约 2 屏、任务卡步骤与实现面 1:1,函数体零展开(长图算法不抄写),产出规格/执行边界照录 D1 不增删。
|
||||||
|
|
||||||
|
**v1.1 修订自审(2026-10-24,宿主重锚批——六查复核)**:动笔面=§3 行号重锚(F2 探测块 :156-159→:149-158 等、F3 校验体随 level_table.gd 现态、F4 enc 组装 :467-482→:513-525、F7 validate :17-31→:13-27)+§6 断言面行 smoke_all→tests 三宿主+run_all manifest 行+T1/T2/T3 各补 manifest 登记步(阻断 4 闭合)+归属句卡③④ 状态换代(已落地·迭代 34)。①规格覆盖——设计面零变动(§1/§2/§4/§8 未触),新增 manifest 步各挂 T1/T2/T3 与 fv2/fv1-fv3/fv4-fv8 宿主执行面;②步骤扫描——三步均一步一动作+可核查结果(实跑套件数 +1);③类型一致性——签名与邻卡引用零变动;④改动覆盖——本修订纯指认面订正+测试基建登记步,零游戏行为改动,无新增对照表行义务;⑤篇幅比例——零函数体;⑥落位复用——manifest 登记沿批 B 既有行体例(`{"path":…, "expect": 0}`)、断言宿主沿批 B 16 宿主体制,无新增件无重复落点。重锚依据=`reports/批B-断言迁移账本-2026-10-22.md`+2026-10-24 master 实查(16c6f136 后现态)。
|
||||||
|
|
||||||
**grilling 复核记录(2026-10-21,设计树对抗复核,不采访用户——可推导定值写依据、真归用户列 §11)**:按设计树走查八支——① RNG/复现(三案淘汰两案定纯流面,§11 留统一流口径否决口);② 深度赋值(最长路径 vs 最短路径,最短路径破无环判据→定最长路径);③ 多终点深度互异(卡③ 推论条款 A 派发→定互异 depth,深度带归卡③);④ generate 签名(D1:72「不认关卡号」→去 level_index,卡② 授权裁剪);⑤ 支路度量(互斥段口径保设计意图+可核查);⑥ 产出约束五条 vs 结构铁律 vs 摆放约束的分工(五条=合法图定义、铁律=无环/多入多出/每路径恰一入一出、摆放=商店位/岔路取舍——三者产出自证全兜,卡② 加载校验是独立防御不重叠);⑦ 大岔口自 L2 起(D1:70「大岔口自第二关起、第一关出口恒 1」→L1 出口恒 1、多终点归属锁定 L2+,与「第一关即含岔口〔普通选择岔口〕」不矛盾——普通岔口 L1 有、归属大岔口 L1 无);⑧ 覆盖依赖(生成深度域 vs 敌/板表覆盖=真实跨卡缺口,卡③ §5 已登记归口后续表批——本卡写死交付序列依赖 §0,不扩敌数值)。code-conventions 对照:§2.2「位置/句柄/键语义单一」= 契约 2(id/depth 拆分)的规范依据(node_depth 双语义是现役违规态);§71 `--script` 禁裸 autoload=生成器 RngService 注入依据;§4.11 新单测不经 autoload 无冲突。AGENTS.md 硬红线逐条过:数值单点(参数档 .tres 经 ConfigDB、生成器零数值字面量定值)、RNG 单点(纯流面出自 RngService、禁自建 RNG/randomize——「统一流」口径留 §11 否决口)、测试两入口(T 卡只写断言不跑测)、实现批禁写 design/(§6 义务全走反哺点、零旧口径的同步措辞)、fail-fast(参数无解致命无兜底图)、数值全 provisional(定值批落终值)。**本轮对抗复核实改两处**:① 入口/终点数=参数档(D1:51「个数=参数档」)此前无验收断言兜住(入口/出口两旋钮兑现缺口)→ 补进 V1 结构铁律;② 纯流面「统一流」口径加固(援引 RngService 已有纯派生面 `derive_at`〔rng_service.gd:34〕,纯流面=其流化非第二套流,「只经 RngService 统一流」成立)。结论:零待裁点,五处灰色推导已定值并留 §11 供用户否决。
|
**grilling 复核记录(2026-10-21,设计树对抗复核,不采访用户——可推导定值写依据、真归用户列 §11)**:按设计树走查八支——① RNG/复现(三案淘汰两案定纯流面,§11 留统一流口径否决口);② 深度赋值(最长路径 vs 最短路径,最短路径破无环判据→定最长路径);③ 多终点深度互异(卡③ 推论条款 A 派发→定互异 depth,深度带归卡③);④ generate 签名(D1:72「不认关卡号」→去 level_index,卡② 授权裁剪);⑤ 支路度量(互斥段口径保设计意图+可核查);⑥ 产出约束五条 vs 结构铁律 vs 摆放约束的分工(五条=合法图定义、铁律=无环/多入多出/每路径恰一入一出、摆放=商店位/岔路取舍——三者产出自证全兜,卡② 加载校验是独立防御不重叠);⑦ 大岔口自 L2 起(D1:70「大岔口自第二关起、第一关出口恒 1」→L1 出口恒 1、多终点归属锁定 L2+,与「第一关即含岔口〔普通选择岔口〕」不矛盾——普通岔口 L1 有、归属大岔口 L1 无);⑧ 覆盖依赖(生成深度域 vs 敌/板表覆盖=真实跨卡缺口,卡③ §5 已登记归口后续表批——本卡写死交付序列依赖 §0,不扩敌数值)。code-conventions 对照:§2.2「位置/句柄/键语义单一」= 契约 2(id/depth 拆分)的规范依据(node_depth 双语义是现役违规态);§71 `--script` 禁裸 autoload=生成器 RngService 注入依据;§4.11 新单测不经 autoload 无冲突。AGENTS.md 硬红线逐条过:数值单点(参数档 .tres 经 ConfigDB、生成器零数值字面量定值)、RNG 单点(纯流面出自 RngService、禁自建 RNG/randomize——「统一流」口径留 §11 否决口)、测试两入口(T 卡只写断言不跑测)、实现批禁写 design/(§6 义务全走反哺点、零旧口径的同步措辞)、fail-fast(参数无解致命无兜底图)、数值全 provisional(定值批落终值)。**本轮对抗复核实改两处**:① 入口/终点数=参数档(D1:51「个数=参数档」)此前无验收断言兜住(入口/出口两旋钮兑现缺口)→ 补进 V1 结构铁律;② 纯流面「统一流」口径加固(援引 RngService 已有纯派生面 `derive_at`〔rng_service.gd:34〕,纯流面=其流化非第二套流,「只经 RngService 统一流」成立)。结论:零待裁点,五处灰色推导已定值并留 §11 供用户否决。
|
||||||
@@ -140,6 +140,8 @@
|
|||||||
|
|
||||||
**前置(用户 2026-10-13 裁)**:**须先做文档设计讨论,不可直接开发**——参考调研+重构方案先行、过人闸后才可开卡。版本标准侧已登记为 Alpha 待做项,见 [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「一 · 系统 · 冒险循环」。
|
**前置(用户 2026-10-13 裁)**:**须先做文档设计讨论,不可直接开发**——参考调研+重构方案先行、过人闸后才可开卡。版本标准侧已登记为 Alpha 待做项,见 [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「一 · 系统 · 冒险循环」。
|
||||||
|
|
||||||
|
**缺口(2026-10-24 迭代 35 开工检查登记)**:迭代 35 停机退回——卡①② 已于同日 v1.1 修订重锚断言宿主(game/smoke/ 退役后现态,卡① 可独立成批开工);卡② 阻塞于「生成图深度扩面覆盖批」未立卡——生成图深度域(L1 0–6/L2 0–9/L3 0–13,卡① §8.1 provisional)未被敌带与板键覆盖(敌侧战斗带顶 L1=3/L2=L3=7、Boss 各关单带 4/9/9;板侧 board_gen `node_depth` 精确行同域缺口),且 L2/L3 多终点 Boss 各终点深度需解析带键可互异;切源即 `band_of` 越顶 -1 加载致命。立卡要件(归口=卡③ §5):敌侧每 (关, row_kind) 顶带键 ≥ 该关最大生成深度+Boss 带键可互异;板侧 board_gen 键域覆盖生成深度全域;数值 provisional。覆盖批落地前卡② 不得切源合入(卡② §0 硬交付序列),落地后重编迭代交付卡①②。
|
||||||
|
|
||||||
**归属**:[关卡节点地图](design/gdd/systems/冒险循环/关卡节点地图.md)(图结构与节点语义,主责)+ [关卡节点图生成](design/gdd/systems/冒险循环/关卡节点图生成.md)(产出规格与生成参数)+ [level-map](design/gdd/ux/level-map.md)(选路呈现)+ [敌人系统](design/gdd/systems/战斗循环/敌人系统.md)(遭遇行集坐标连带);版本标准侧已登记为 Alpha 待做项,见 [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「一 · 系统 · 冒险循环」
|
**归属**:[关卡节点地图](design/gdd/systems/冒险循环/关卡节点地图.md)(图结构与节点语义,主责)+ [关卡节点图生成](design/gdd/systems/冒险循环/关卡节点图生成.md)(产出规格与生成参数)+ [level-map](design/gdd/ux/level-map.md)(选路呈现)+ [敌人系统](design/gdd/systems/战斗循环/敌人系统.md)(遭遇行集坐标连带);版本标准侧已登记为 Alpha 待做项,见 [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「一 · 系统 · 冒险循环」
|
||||||
|
|
||||||
**状态**:文档设计已闭合+已写卡+已编迭代 34+已编迭代 35
|
**状态**:文档设计已闭合+已写卡+已编迭代 34+已编迭代 35
|
||||||
|
|||||||
Reference in new issue
Block a user