Files
gplan-2/reports/复核-双审-grilling与godot-master-L1深度3混编批-2026-11-04.md

9.2 KiB
Raw Permalink Blame History

双审复核 · L1 深度 3 改混编批(grilling + godot-master,2026-11-04)

性质:需求卡片 v1.0 的独立复核产出物(req-card 纪律「grilling 复核门」+迭代 47 双审先例)。两个未参与撰写的会话各自只读复核,本报告记发现、处置与去向。 被审对象:reports/需求卡片-L1深度3混编-2026-11-04.md v1.0。 复核面:卡片自洽性、规格缺口、验收有效性(grilling);.tres 语义、加载与校验链、随机流、测试夹具与闸面(godot-master)。 总判:改动本体成立,卡片改后可开工——十条阻断全部属「漏引用点/口径写错/入口名写错」级,不动设计定值。已出卡片 v1.1 逐条处置。


一、阻断(10 条,双审合计;v1.1 全部处置)

# 发现 证据 处置
B1 漏第七个引用点:混编注入段还原后硬编码「表回 28 行」,加一行后必红 game/tests/unit/core/level_shop_economy_test.gd:727(== 28,文案写「基线 20 行+覆盖 8 行」) v1.1 新增现状事实 #13、T2 步骤、R8 行;文案改「基线 21 行」
B2 漏第八个引用点:表结构守卫文件头注写「20 行带键行序/hobgoblin 留任」 game/tests/unit/data_config/table_structure_guard_test.gd:4 T2 补步并顺带把「20 行」改「29 行」
B3 漏第九、第十个引用点:同文件另两处 hobgoblin 前提注释 round_flow_skill_pool_test.gd:1108;:711,:722「D3 大地精,多实例同种」「敌 hp 低(表值 6)」 T2 补步改述
B4 目标句「深度 3–5 的战斗」与落带机制相悖:寻址是「取首个 ≥ 深度的带」,L1 battle 带键只有 0/1/2/3/6,band 3 只覆盖深度 3;深度 4/5 落 band 6 game/data/schemas/enemy_table.gd:196-204;game/core/config_db_resolver.gd:57-67;enemy.tres:10,35,60,84,109 §一 目标句改「只说深度 3」;新增契约 4「不碰深度 4/5」;新增 R9 钉住 4/5 仍落 band 6
B5 行序依据引错文件:难度曲线 v1.3 投放记录写「地精 + 熊地精」(地精在前),与真正钉行序的 ⑱「熊地精在前」相反,卡片却把行序归给难度曲线 难度曲线与Boss.md:279(原文);体验验证清单.md:183-184 §二 行序与行值依据改指 ⑱;难度曲线只作机制与投放记录;同批把文档那半句订正为「熊地精 + 地精」(v1.3→v1.4,本提交)
B6 真实入口写成不存在的函数:卡片写 ConfigDbResolver.resolve_rowset,仓库里叫 resolve_enemy_rowset game/core/config_db_resolver.gd:33;game/data/schemas/enemy_table.gd:216 R2/R9 与 §八 统一改为 EnemyTable.resolve_rowset() → ConfigDbResolver.resolve_enemy_rowset()
B7 引用不存在的任务卡:「S13 键在 T0 读数步骤核对」,卡内只有 T1–T3,且与 Alpha 零读数自相矛盾 卡片 v1.0 §九;§四.5 改「零新增件,阈值不适用;S13 只降不升随 T2 声明」,删掉任何读数步骤
B8 全深度 × 12 种子扫描只按「行集首行」判数量区间:单行恒等成立,双行下 n = 1 + 地精(1..2)、首行(熊地精)区间是 [1,1],必判越界 round_flow_skill_pool_test.gd:295-317(:310-317 取 [0] 后比较);行值 enemy.tres:58-67、:7-18 T2 新增口径改造步(逐行求和 [Σunit_count, Σunit_count_max],与 spawn 守卫同口径);R6 行;计入测试削弱申报

二、建议(v1.1 采纳 11 条、判定不改 1 条)

# 发现 证据 处置
S1 R6 原为「≥2 敌」,旧单行行集同样为真,对「是否混编」零判别力;且与结构图标「非行为改动」矛盾 damage_controller_test.gd:417;battle_narrator_test.gd:120 改为 R10「回归护栏」,明示不是混编判别;混编判别归 R2
S2 T3 缺法定产出「实际对照表(测试文件:行+结果)」;「变了回表」与实现批禁写 README 冲突 process-conventions.md:57(§3 第 14 条)、:54(第 11 条) T3 补实际对照表;README 改为「名字不符即停卡退回写卡段」
S3 池模板断言文案写死「二十八行九种」 round_flow_skill_pool_test.gd:611 T2 补步改「二十九行十种」
S4 「大地精」第 4 处在 N1 修批括注 enemy.tres:920 判定不改:该段是带日期的历史裁决记录,只含中文「大地精」、不含 hobgoblin 字面,R10 口径不覆盖
S5 §二 写「四条纪律」与 GDD「三条」及卡内 §四.1 互斥 敌人系统.md:74;卡片 §四 改「三条」
S6 R8「全仓零残留」口径过宽且不可执行:worktree 目录名生成的 game/override.cfg 里就有 hobgoblin game/override.cfg:4;.gitignore:11 R10 缩面为「数据面 + game/ 代码目录 + tools/*.py」,回读命令显式排除 override.cfg
S7 现状事实 #11 与 §八 行号错位:unit_container.gd:34-45 是注释(且重复两遍),spawn 在 :46、默认目标在 :358 unit_container.gd:34-45,46,358-363;battle_narrator.gd:69-78 两条事实分别改指正确位置
S8 R3 文案写「= 3」判据写「≤ 4」,且 3 是设计定值 卡片 R3 断言改 == 3(由两行行值推导后判等)
S9 R7 挂了不受影响的用例 config_db_resolver_test.gd:65-71 从 R7 摘掉 _test_rowset_order_preserved
S10 定点断言段行号偏大 level_shop_economy_test.gd:623-636 改 623-636
S11 T1「删 82-105」会丢一对 }, {,落成空字典 enemy.tres:81,82-105,106 T1 改为「替换 81-106 整段」
S12 表注步骤按改前行号写,删行插行后行号漂移,后两步会切错内容 enemy.tres:81-106 与被替换区净增 19 行 T1 改用文本锚点定位;906-918 改为段尾追加一行(沿 899-905 的追加体例),不改原文
S13 夹具换 bugbear 会与同表 band 0 的 bugbear 重名,削弱「按敌种可辨」;且 R7 写的「合成表 → validate()」不成立(该用例不调 validate) config_db_resolver_test.gd:14-28,40-46 改换 giant_spider;R7 真实入口改「合成行注入 → resolve_enemy_rowset」
S14 _smoke_enemy_buff_targets_self 是种子搜索型用例(找「恰一次 charge 施放」),混编后只有熊地精带 charge,命中面必变 round_flow_skill_pool_test.gd:1096-1136;池差 enemy.tres:93-102 vs :19-28 列入 T2 最后一步:跑不通即按 L3 呈报,禁放宽判据
S15 删 enemy.tres:886-891 后 static_scan.sh 的 FNR==891 豁免指向别的行 game/tests/static_scan.sh:145,194,218,221-222 T2 补步:删该条失效豁免(口径只删豁免、不改扫描规则)

三、观察(记录在案,不改卡)

  • 随机流作用域不位移:遭遇骰每战只 open_stream("encounter") 一次(battle_orchestrator.gd:307),全局计数器 +1(rng_service.gd:103-122),后续 behavior_roll/armor_roll 号位不变;变的是流内取号(单行 2 次 → 双行 3 次)。game/tests/golden/ 只有关卡地图片与调色板基线,无敌人数值 golden,无逐位断言风险。
  • spawn 守卫不误触发:1 + [1,2] = 2..3 ≤ 4(unit_container.gd:86-92、enemy_table.gd:30-33);容器零随机,取号全在结算层。
  • 池顺序无关:池模板断言收成字典比对(round_flow_skill_pool_test.gd:606-609),抽签本体顺序敏感但整行复制保序。
  • 加载校验链全通:同带键两行相邻 → _validate_rowset_closed 只在键「重现」时报错(enemy_table.gd:57-61,178-182);dup_key 键含 enemy_id(:81-84)不误报;跨表池纪律逐行逐池检查(config_db_cross_validator.gd:191-214),新行池与既有行逐字相同。
  • tools/doc_term_audit.py 零行为影响:只扫 *.md/*.yaml,且跳过 #; 注释行(:166,214-219)。
  • enemy.tres:653/:751 两处行号豁免:均为数据行(无 ; 注释),行号漂移后不会误伤;这类豁免按行号维护是既有技术债,建议另批改文本锚(非本批)。
  • 深度 4/5 原本无任何断言钉住(仓库无 resolve_rowset(1,4/5,"battle") 构成断言),本批新增 R9 补上,防未来加 band 4/5 时静默改变内容。
  • 能力清单零动作成立:README 按函数名引用,本批不改函数名;_smoke_encounter_roll/_smoke_level_graph 两个被触碰用例本就未在能力表列名,属既有登记缺口,非本批引入。

四、呈用户裁决项

  1. 表注 886-891 整段删除 vs 静态闸「带日期历史原文不改」惯例:卡片按你的指令「文档与代码中的大地精描述要去掉」取删除,代价是一条命名沿革注只留 git 历史。若你要保原文,则完成定义④须放宽为「非注释面零残留」。
  2. static_scan.sh 行号豁免改文本锚(enemy.tres:653/751 两处):属闸件维护,建议另立小批,本批只删已失效的 891 那条。
  3. 深度 4/5 是否也该换内容:本批按「只做深度 3」写;若你要 L1 后半段也混编,属设计增量,需另立条目。