docs(迭代35卡①): 实现报告+代拍板追认单落 reports/(T4 产出物三件齐:实现报告/代拍板/反哺点+卡② 停工呈报)——闸读数待审后补

This commit is contained in:
DKChan committed 2026-10-24 06:47:28 +08:00
1 parent c0059bc5db
commit 6074b3c3c7
2 files changed
+91 -1

No files matched your search

@@ -10,7 +10,7 @@
| ② | 「支路」度量口径 | 支路互斥段 = 自出边起的可达集,减去同岔口其余出边可达集的并集(即「至再汇合/终点止」的独占段);类型构成按该独占段的**多重集**(类型名排序数组)比较;「每支路至少一个别的支路没有的类型」判据 = 该独占段内存在一个类型不出现在任何其他支路的独占段 | `node_map_generator.gd` `_check_fork_rules`;断言〔fv5〕 |
| ③ | 生成器内持有结构与句柄赋值序 | 图持有 = `_pool`(Array[Dictionary])+`_by_id`;节点字段恰 `id/type/depth/next`;id 赋值序 = 入口 → 主链段自浅到深 → 各区域自终点倒序回填 → 侧链岔口;`generate` 返回 `{nodes, entries, terminals}` | 同上 `_build`/`_mk`;读面对齐 §7 接口块 |
| ④ | 参数档 .tres 行键形态与 provisional 微调 | `rows: Array[Dictionary]`,键 = `level_index`,字段键集 = `ROW_KEYS` 十二键闭集(含 `fork_ways_min/max`);三行取卡片 §8.1 表原值(layers 6/9/13、branch_density .30/.50/.70、配比三档、entry 1/2/2、exit 1/2/3、battle_floor 4/6/8),未做域内微调 | `game/data/schemas/level_gen_params.gd`、`game/data/tables/level_gen_params.tres`;断言〔fv2〕 |
| ⑤ | 长图算法具体步骤(HOW) | 单出口图(L1)= 入口→定长链→商店→Boss,链上挂侧链岔口;多出口图(L2/L3)= 入口→主链段→**归属大岔口**(主链段末节点切 e 条区域)→各区域单调链(区域内禁再扩岔);岔口侧链与主去路同深度、汇入主去路的后继(保「深度=最长路径步数」不变量);相邻两层禁同时扩岔(否则上层支路独占段吞掉下层侧链,破契约 5③);分支密度实际生效数 = min(round(bd×层高), 可用锚点数)——L2 实测 3 岔口、L3 实测 2 岔口生效(provisional 期的实现自由面,定值批若要「十几次决策点」须放宽锚点几何) | `node_map_generator.gd` `_build`/`_add_forks` |
| ⑤ | 长图算法具体步骤(HOW) | 单出口图(L1)= 入口→定长链→商店→Boss,链上挂侧链岔口;多出口图(L2/L3)= 入口→主链段→**归属大岔口**(主链段末节点切 e 条区域)→各区域单调链(区域内禁再扩岔);岔口侧链与主去路同深度、汇入主去路的后继(保「深度=最长路径步数」不变量);相邻两层禁同时扩岔(否则上层支路独占段吞掉下层侧链,破契约 5③);分支密度实际生效数 = min(round(bd×层高), 可用锚点数)——种子 42 实测侧支节点数 L1=4/L2=4/L3=3(总节点 11/19/29 减无岔口基线 7/15/26),provisional 期的实现自由面,定值批若要「十几次决策点」须放宽锚点几何) | `node_map_generator.gd` `_build`/`_add_forks` |
| ⑥ | 提交切分与分支命名 | 分支 `iter35`(单工作区 `../g-plan2-iter35`);提交三笔=卡① 实现(含断言与 manifest)/fv4 判据三分码修订/致命面体例修正+断言判别力补强 | git log(63a6ea80、a039306f、16c776e9) |
## 白名单外、本批自认为需要呈报的两件
@@ -0,0 +1,90 @@
# 迭代 35 卡① 实现报告(节点图生成器核心批·参数化长图生成器)
- 日期:2026-10-24
- 卡片:`reports/需求卡片-节点图生成器核心批-2026-10-21.md` v1.1
- 工作区:独立 worktree `D:/code/g-plan2-iter35`(分支 `iter35`,整迭代单工作区)
- 批性质:代码实现批——本批未写、未改、未新增 `design/` 与根规则文件;文档面义务全落本目录(见反哺点清单)
- 提交序列:卡① 实现(生成器+参数档+断言+manifest)→ fv4 判据三分码 → 致命面体例修正+判别力补强 → 合流图夹具按契约 2 重写 → 战斗保底判据专测夹具
## 一、任务卡状态
| T 卡 | 状态 | 交付面 |
|---|---|---|
| T0 事实坐实与跨卡接口对齐 | 完成(卡② 侧对齐随停工移交) | §3 F1–F8 行号与 §2 取用条款抽查:六处关键锚点实查命中(`level_runner.gd:513-525` enc 组装、`enemy_table.gd:157-161` band_of、`config_db_cross_validator.gd:100-106` 迭代 34 检查、`node_map_templates_test.gd:32-104` 宿主、`rng_service.gd:34/:86` 双面、`run_all.gd` manifest 体例)——零漂移;接口定稿见 §三 注 1;RNG 纯流面与支路口径定稿见 `reports/iter35-卡①-代拍板-2026-10-24.md` ①② |
| T1 参数档数据表 | 完成 | `game/data/schemas/level_gen_params.gd`(LevelGenParams,ROW_KEYS 十二键闭集+validate 域校验+row_by_level_index)、`game/data/tables/level_gen_params.tres`(三行 provisional,照卡片 §8.1 逐行填)、`game/core/config_db.gd`(注册+成员+装载+访问器 `level_gen_params_row()`)、manifest 登记一行 |
| T2 生成器核心 | 完成 | `game/core/rng_service.gd` 新增 `pure_stream(seed_val, scope)`(纯派生、不推 `_counter`、不落事件日志);`game/core/node_map_generator.gd`=`generate(params, seed)` 产图+`validate_output(graph, params)` 产出自证+`check_params` 可行性判定+`is_fatal()` 致命封印读面 |
| T3 验收断言批总装 | 完成 | 三宿主共 70 条断言:`level_gen_params_test.gd`〔fv2〕17 条、`node_map_generator_test.gd`〔fv1/fv3/fv5/fv6/fv7/fv9/fv10〕42 条、`node_map_growth_test.gd`〔fv4/fv8〕16 条;manifest 三行全登记(闸 02 实跑套件数 +3) |
| T4 产出物落位 | 完成(实现报告=本文件;代拍板单、反哺点清单、卡② 停工呈报同批) | `reports/iter35-卡①-实现报告-2026-10-24.md`、`reports/iter35-卡①-代拍板-2026-10-24.md`、`reports/iter35-卡①-反哺点-2026-10-24.md`、`reports/iter35-卡2-停机呈报-2026-10-24.md` |
## 二、完成定义逐条对账(卡片 §1)
| # | 完成定义 | 现实读数 |
|---|---|---|
| 1 | 产出图必过五条+铁律+摆放三条 | `generate` 产前强制 `validate_output`;三档 × 20 种子(42–61)扫描自证零错误〔fv1〕 |
| 2 | 参数档落地 ConfigDB 单点读、生成器不认关卡号 | 三行 .tres 加载零诊断;`generate(params, seed)` 无形参 level_index;件核=全仓 `generate` 调用点零传关卡号 |
| 3 | 确定性(同种子同图、counter 无关、随机只经 RngService) | 同 (seed,params) 两次逐位同图〔fv3〕;两台服务处不同号位(1 vs 999999+7 次取号)产图逐位相同〔fv3〕;`counter()` 前后不变〔fv10〕;生成器内零 `randomize()`/零自建 RNG/零 `open_stream` |
| 4 | 生长递增 | 同种子 42 读数:层高 6/9/13,节点总数 11/19/29,Δ(L1→L2)=8 < Δ(L2→L3)=10〔fv8〕 |
| 5 | 专项兑现 | L1 出口恒 1、大岔口自 L2 起、下一跳互异、支路构成互异各有独有类型、每路径恰一店、多终点深度互异、战斗保底 ≥ 4/6/8——逐项断言〔fv5/fv6/fv7/fv9〕 |
| 6 | 参数无解 fail-fast | `check_params` 拦两类无解夹具(层深 6 放三出口、保底超可放数)〔fv4〕;真实停机通道=致命封印置位→组合根停机(子进程退出码恰 1)〔fv4〕 |
| 7 | 验收断言批全绿+变异记录表 | 三套件独立跑全绿(17+42+16 checks,退出码 0);变异记录表见 §四 |
| 8 | 批末重闸全绿+产出物写齐 | 〔闸读数见 §五〕;三份 `reports/` 产出物+停工呈报在位 |
## 三、实际改动—验收对照表(卡片 §8.2 的行号落地)
> 断言宿主行号取实现当日实测;〔fv#〕尾缀可 grep。
| 尾缀 | 需求点 | 改动落点 | 验收测试(文件:行) | 真实入口 | 撤销/变异证明 |
|---|---|---|---|---|---|
| fv1 | 产出合格+产出自证 | `game/core/node_map_generator.gd` `validate_output()`、`_build()` | `node_map_generator_test.gd:88-89`、`:328-377`(正负向夹具) | `generate(params, seed)` 产前强制+`validate_output(graph, params)` 直调 | m4 首写深度→`:361` 红;m5 注掉终点恒 Boss→`:350` 红;夹具级:dup/dangling/enum/回边/合流各命中对应类别 |
| fv2 | 参数档 schema+.tres+ConfigDB | `level_gen_params.gd`、`level_gen_params.tres`、`config_db.gd:22/:42/:146/:250` | `level_gen_params_test.gd:16,47,50,55,59`+域负向 `:66-101` | `LevelGenParams.validate()`/`ConfigDB.level_gen_params_row()` | m1 L1 出口改 2→`:16` 红;m2 配比合计 0.5→`:16` 红 |
| fv3 | 可复现(纯函数+counter 无关) | `node_map_generator.gd` `generate/_setup_and_build`、`rng_service.gd` `pure_stream` | `node_map_generator_test.gd:99,109,119` | `generate(params, seed)` 同种子两次直调+跨号位双实例对拍 | m3 取数改 `open_stream("node_map")`→`:109` 红 |
| fv4 | 执行边界(无兜底图/fail-fast) | `node_map_generator.gd` `check_params()`+`_fatal()`+`is_fatal()` | `node_map_growth_test.gd:64,70,74,91` | 无解参数档调 `generate`;子进程 `-- fatal-fixture` 真实停机通道 | m11 致命短路改 `pass`→`:91` 红(停机码不再是 1) |
| fv5 | 岔路取舍两条 | `node_map_generator.gd` `_check_fork_rules()`、`_add_forks()` 双禁相邻扩岔 | `node_map_generator_test.gd:163-164`、`:412` | 产图岔口扫描+同类型下一跳夹具 | m8 侧支类型写死 battle→套件经致命通道转红(`:412` 夹具级判据直证下一跳互异) |
| fv6 | 恰一店+归属锁定+多终点深度互异 | `node_map_generator.gd` 区域链/商店位构造、`_check_fork_rules` 独占段 | `node_map_generator_test.gd:228-230`、`:387,397,404` | `validate_output` 前驱/店数/DFS 路径+depth 比对;DFS 全路径枚举 | m6 商店位改 rest、m7 双终点同 depth→套件经致命通道转红;夹具级 `:387/:404` 直证两类判据 |
| fv7 | 战斗保底 | `node_map_generator.gd` `_assign_types` 保底优先守卫、`validate_output` 保底判据 | `node_map_generator_test.gd:257`、`:343-346` | 产图战斗计数+合法形状低保底夹具 | m9b 注掉保底判据→`:343` 红;m9 砍穿保底→`:257` 所在套件转红(中止于空图读面) |
| fv8 | 生长递增 | `level_gen_params.tres` 三档 provisional 值 | `node_map_growth_test.gd:57-58` | 三档 `generate` 读数对拍(同种子 42) | m10(L3 分支密度归零)NOT-RED——如实标注拦截边界,见 §四 注 |
| fv9 | 含岔口与出口结构 | `node_map_generator.gd` `_add_forks` 起始 wanted、大岔口构造 | `node_map_generator_test.gd:285-287` | 三档 × 种子扫描结构计数 | m12 强制零岔口→`:285` 红 |
| fv10 | RNG 单点(纯流面) | `rng_service.gd` `pure_stream()` | `node_map_generator_test.gd:313-318` | `pure_stream` 直调+`counter()` 前后读数 | 与 m3 同发注入(counter 不变断言红)+静态扫描 09 零 `randomize()` |
| fv11 | 反哺点清单 | 无代码改动(非行为改动) | 件核:`reports/iter35-卡①-反哺点-2026-10-24.md` 七条落点 | T4 产出物件核 | 缺任一落点→件核不收口 |
注 1(接口定稿对卡② 的裁剪):`generate(params, seed)` **不收 level_index**(契约 6),返回 `{nodes:[{id,type,depth,next}], entries:[int], terminals:[int]}`;参数档字段名 = `layers/branch_density/battle_ratio/reward_ratio/rest_ratio/shop_ratio/entry_count/exit_count/battle_floor/fork_ways_min/fork_ways_max`;两条硬语义(同种子同图、纯函数复现)由〔fv3〕〔fv10〕锁住。卡② 重编时 T0 按本表对齐接线。
## 四、变异验证记录表(注入→最窄套件见红→`git checkout` 还原)
| # | 注入 | 期望红点 | 实测 |
|---|---|---|---|
| m1 | `level_gen_params.tres` L1 `exit_count` 1→2 | fv2 值域 | RED-OK:`生产 level_gen_params.tres 随全表加载 + validate 零违例〔fv2〕` 红 |
| m2 | L3 `battle_ratio` .55→.05(合计 ≠1) | fv2 合计 1 | RED-OK:同上断言红 |
| m3 | 生成器取数 `pure_stream` → `open_stream("node_map")` | fv3 counter 无关 | RED-OK:`counter 无关(不同号位态同种子同图)〔fv3〕` 红 |
| m4 | 最长路径计算 `maxi(...)` → 首写 only | fv1 深度语义 | RED-OK:`合法合流图(第二入口直插主链,深度取最长路 3)自证零错误〔fv1〕` 红 |
| m5 | `validate_output` 注掉「终点(无出边)非 Boss」判据 | fv1 | RED-OK:`非 Boss 终点夹具命中「终点(无出边)非 Boss」判据〔fv1〕` 红 |
| m6 | 区域商店位 `_mk("shop",…)` → `_mk("rest",…)` | fv6 | 拦截发生(进程红),红点落在空图致命通道(套件在〔fv3〕后中止);判据本体由 `:404` 夹具级断言直证 |
| m7 | 终点深度 `L - r` → `L - (r/2)`(两终点同深) | fv6 | 同 m6:进程红;判据本体由 `:387` 夹具级断言直证 |
| m8 | 岔口侧支类型修型写死 `battle` | fv5 | 同 m6:进程红;判据本体由 `:412` 夹具级断言直证 |
| m9 | 配比填余守卫 `if chain_battles - 1 < floor_n:` → `if False:` | fv7 | 拦截发生(进程红,中止于空图读面)——红点未落在〔fv7〕尾缀,改以 m9b 作判据级证明 |
| m9b | `validate_output` 注掉「低于保底」判据 | fv7 | RED-OK:`战斗节点低于 battle_floor 的合法形状夹具命中「低于保底」判据〔fv7〕` 红 |
| m10 | L3 `branch_density` 0.7→0.0 求增幅倒挂 | fv8 | **NOT-RED**(实测 L3 仍 27 节点、Δ 未倒挂)——本几何族下「只调分支密度」不足以破坏增幅递增,如实标注为拦截边界;层高/节点数的单调性由参数档 schema 域校验(层深递增且增幅变大)与〔fv8〕三档读数共同承载 |
| m11 | `generate` 无解路径 `_fatal(...)` → `pass` | fv4 | RED-OK:`无解参数档置致命封印并由组合根停机(退出码恰 1)〔fv4〕` 红 |
| m12 | 岔口数 `wanted` 写死 0 | fv9 | RED-OK:`三关参数档生成图各含 ≥1 岔口节点(第一关即含)〔fv9〕` 红 |
跑批前后各一遍三套件:BASE/FINAL 均 exit=0 all green(17/42/16 checks)。
## 五、批末重闸读数
〔闸读数待补——`tools/run_all_gates.sh --code` 回执与逐闸况〕
## 六、独立验收审计结论
〔待补——审计件 `reports/iter35-卡①-验收审计-2026-10-24.md`〕
## 七、实机目检总清单(登记不阻塞)
1. 三关生成图选路观感:多入口首跳、大岔口取舍、多终点走向可见、第一关即有选择——**依赖卡②/卡④ 落地后才能实机看到**(本批只产图不接运行时)。
2. 生成图规模随关卡推进变大(11/19/29 节点、层高 6/9/13)可感知——同上。
## 八、遗留读数义务与停机面
- 参数档数值全 provisional;定值批须重跑〔fv8〕与 MC 对拍(本批零数值改动未跑 MC)。
- 分支密度实际生效数受构型锚点几何限制:种子 42 实测侧支节点数 L1=4/L2=4/L3=3(总节点 11/19/29 减无岔口基线 7/15/26 之差),与 D1 调参表「一局十几次决策点」的意图有距离——已记入代拍板 ⑤ 与反哺点,定值批若要提密度须放宽锚点几何(属实现自由面,不改产出规格)。
- 卡② 停工:其 §0 硬交付序列的「生成图深度扩面覆盖批」未立卡,本批未切运行时图源——详见 `reports/iter35-卡2-停机呈报-2026-10-24.md`。迭代 35 因此未做「一次合并」,合回与否待用户裁拆批。
- 生成图深度域实测 L1 0–6/L2 0–9/L3 0–13 已写进反哺点③,供覆盖批立卡时当量程依据。