docs(迭代34卡③): 第二轮独立复审通过(A–F 六项全通过)——实现报告 §3 写入复审结论,复审报告随批入库

复审被审 HEAD=68009b4e:第一轮 4 缺漏与 4 描述不符全部闭合,修补未引入未申报削弱。
This commit is contained in:
DKChan committed 2026-10-22 05:30:04 +08:00
1 parent 68009b4ea8
commit 9ff0909a95
2 files changed
+99 -1

No files matched your search

+1 -1
View File
@@ -131,7 +131,7 @@
描述不符 4 条已按审计建议改写:fv17 夹具措辞(level 1 合成单关,非现役三关,现役三关由 fv6 兜住)、fv19 撤销归属(运行期守卫断言,静态求和本身不红)、§2.3 第 7 项拦截首红(跨表 `level_node_dangling`)、断言计数(36 条断言+1 行注释)。
**第二轮复审结论**:待复审完成后在本节追加。
**第二轮复审结论:通过**(`reports/iter34-验收审计-复审-2026-10-22.md`,被审 HEAD `68009b4e`)——A–F 六项全通过:V7 覆盖行与 17 行勾销表齐备(抽 6 行实读属实)、fv26 件核行在位、S15 单测走真实入口且变异红、V6① 数据侧撤销证明复现一致、四条描述不符已按实改写、修补未引入未申报的测试削弱。卡③ 合并前置满足。
## 四、全量代码闸读数
@@ -0,0 +1,98 @@
# 迭代 34 卡③ 独立验收审计·第二轮复审(2026-10-22)
- 被审 HEAD:`68009b4e`(`iter34-enemy-band`,基线 `603eba31`);第一轮被审 HEAD `7bb41891`
- 被审对象:实现报告 `reports/iter34-实现报告-2026-10-22.md`(§2.2/§2.2.1/§2.3/§3)、第一轮审计报告 `reports/iter34-验收审计-2026-10-22.md`、修补 diff `7bb41891..68009b4e`、卡片 `reports/需求卡片-敌人表深度带换代批-2026-10-21.md`
- 审计方式:只读代码、测试、卡片与 diff;所有结论以审计人自己运行的命令输出为准,不采信报告「实测/已全绿」表述。为复现撤销证明注入的变异一律单文件 `git checkout --` 还原并复跑确认;不跑全量闸(`tools/run_all_gates.sh` 留给实现会话在最终提交上跑)。审计结束时工作树 `git status --short` 为空(本报告除外)。
## 结论速览
**A–F 六项全部通过;总结论:通过。** 第一轮 4 条缺漏与 4 条描述不符全部真闭合,本次修补未引入测试削弱,无阻塞遗留例外。
---
## A. 缺漏 1(V7 覆盖行+17 行勾销表)——通过
依据:
1. 报告 §2.2 已新增 fv24 覆盖行,需求点改写为「V7 S 清单 17 行逐条换代」,撤销列指向「逐条勾销见 §2.2.1」。
2. 报告 §2.2.1 存在 17 行勾销表:S1–S9、**S10a/S10b 分列**、S11–S16,逐行给出「现工作树位置/换代内容/勾销凭据」,S11–S13 归单测面、S15 归消费面,口径与卡片 §8.1 一致。
3. 按任务要求抽查 6 行(逐行实读代码确认位置与换代内容属实):
| 抽查 | 报告所记位置 | 实读确认 |
|---|---|---|
| S1 | `smoke_all.gd:3168`/:3491/:4499 | 三处均为 `resolve_enemy_rowset(1, …, "battle")[0]` 三参化,且带「行集首行(…battle 键域)」注释,属实 |
| S6 | `smoke_all.gd:974-984`/:4781-4789/:5256-5258 | 三处 `en_keys["%d_%s_%d" % [level_index, row_kind, depth_band]]`/`"%d_boss_9"` 查 boss 键域,属实 |
| S8 | `smoke_all.gd:4262-4306` | `_first_encounter_band(2,"giant_spider")` 取首遇带、判据改 `depth_band > spider_lead_band`、`expect_pools` 键串含 row_kind(如 `2_battle_5_giant_spider`),属实 |
| S10a | `smoke_all.gd:2024`/:2674/:2699…;`damage_probe.gd:95` | 抽 3 行均为 `"node_type": "boss"` 直呼;另用脚本核了表中全部 18 个 `smoke_all.gd` 行号,每个都含 `node_type": "boss"`,属实 |
| S14 | `skill_rhythm_probe.gd:17`;`damage_probe.gd:269`/:422 | 三处均显式传 row_kind(`"battle"`/`t`/`kind`),属实 |
| S16 | `smoke_all.gd:3491`(断言 :3496) | `erow2 = _db.resolve_enemy_rowset(1, int(depth_v), "battle")[0]`,下行 `scan_bad == 0` 断言,属实 |
另核 S2/S3/S4/S5/S7/S9 的行号指向(4795/4802/4810/4852/4860、2263/2279/2301、3460-3474),均与断言实际位置对得上,未发现空指或错指。
## B. 缺漏 2(V9/fv26 覆盖行)——通过
- 报告 §2.2 新增 fv26 行:「V9 反哺点五落点(非行为改动)|`reports/iter34-反哺点-2026-10-22.md` ①–⑤|件核」,与卡片 V9「§6 五条每条有落点」对应。
- `reports/iter34-反哺点-2026-10-22.md` 实读确有 ①–⑤ 五节(① 敌人系统.md 记法与措辞、② 关卡节点地图.md :146、③ 关卡节点图生成.md 产出规格、④ 待办清单.md 状态回写、⑤ roadmap.md 迭代行),每节均写「文件与位置/改成/依据」。
## C. 缺漏 3(S15 `boss_name` 断言)——通过
- 用例位置:`game/tests/unit/presentation/battle_narrator_test.gd:59-82`,`_test_boss_name_uses_boss_rowset()` 由 `_init` 调用。
- 真实入口成立:用例加载生产表后调 `NarratorScript.boss_name(runner, db)`(`battle_narrator.gd:72`),函数内走 `db.resolve_enemy_rowset(..., "boss")`(`:76`);生产调用点 `presentation/main.gd:1331` 同款。runner 替身只提供 `boss_name` 实际读取的 `level_row`/`current_node()` 两项,与 `core/level_runner.gd` 的同名面一致。
- 期望值由数据读出:`boss_depth` 扫表取 L1 boss 行 `depth_band`,`boss_expect`/`battle_name` 分别由 boss/battle 行集首行 `display_name` 读出,无写死字面量;另有一条「boss 名 ≠ 同深度请求的战斗行集名」判别断言。
- 自跑(命令与首行输出):
- `PYTHONIOENCODING=utf-8 "<Godot>" --headless --path . --script res://tests/unit/presentation/battle_narrator_test.gd`
→ `[battle_narrator_test] all green (13 checks)`,EXIT=0
- 撤销注入:把 `battle_narrator.gd:76` 的 `"boss"` 改 `"battle"` 后重跑
→ `[FAIL] Boss 名取自 Boss 行集首行(期望「食人魔酋长」实际「大地精」)〔fv24〕`;`[battle_narrator_test] 1/13 项失败`,EXIT=1
- `git checkout -- game/presentation/battle_narrator.gd` 后复跑 → `[battle_narrator_test] all green (13 checks)`,EXIT=0
- 与报告 §2.3 第 9 项所记(红断言原文、13 项回绿)逐字相符。
## D. 缺漏 4(V6①/fv21 撤销证明)——通过(实测与报告一致)
实测流程与结果:
1. 数据侧变异:`game/data/tables/enemy.tres` 的 (level_index 1, row_kind battle, depth_band 2, bugbear) 行 `depth_band` 2→1,跑 `res://smoke/smoke_all.gd`
→ `=== 冒烟完成:1161 项检查,6 项失败 ===`(EXIT=1)。〔fv21〕**不在**失败列表(首遇带随数据变为 1、锚定行随迁——数据驱动正证成立)。6 项红为:〔fv11〕20 行键序、〔fv23〕熊地精首遇带固定 1、全深度×12 种子 spawn 扫描、「二十行九种池模板」、「先手击杀→摇定技能作废」、「行集内每个战斗/Boss 节点…精确行集(缺失 1)」。报告所记「共 6 项红」属实。
2. 叠加写死:在 `smoke/smoke_all.gd` 的 `_first_encounter_band` 首行插入 `return 2`,重跑冒烟
→ 首条红即 `[FAIL] 熊地精首遇带(1,battle,2)降档锚定(hp 22 · ac 2 · 池 attack6/charge2/heavy2 零改动——迭代 24 N1;首遇带数据驱动定位)〔fv21〕`;`=== 冒烟完成:1161 项检查,9 项失败 ===`(EXIT=1)。报告所记「共 9 项红」属实。
3. `git checkout -- game/data/tables/enemy.tres game/smoke/smoke_all.gd` 还原,复跑
→ `=== 冒烟完成:1161 项检查,0 项失败 ===`(EXIT=0)。
结论:该撤销证明现在能真正区分「数据驱动定位」与「写死坐标」——单跑数据变异〔fv21〕绿、叠加写死才红,报告 §2.3 第 8 项的记述与实测逐项一致。
## E. 描述不符 4 条——通过(4/4 已按实改写)
1. **fv17 夹具措辞**:`config_db_cross_validator_test.gd:95-116` 的 `_loaded()` 只构造 `level_index: 1`、`display_name: "夹具关"` 的合成单关夹具;fv17(:132)在该夹具上断言零误报。报告已改为「level 1 合成单关夹具;现役三关零误报由 fv6 兜住」,与实读一致。**通过**。
2. **fv19 撤销归属**:`smoke_all.gd:4810-4820` 的静态求和(首遇混编数据 Σ=4,阈值 `<= 4`)放宽阈值不会红;真正能红的是同段运行期守卫(`:4891-4914` 注入 (1,battle,6) 两行各 3 只,`:4909` 断言 `not over_sys.spawn(...)`,由 `ROWSET_INSTANCE_MAX` 守卫兜住)。报告已改为「改运行期守卫 → 守卫断言红;静态求和本身放宽不会红」,归属正确。**通过**。
3. **§2.3 第 7 项拦截首红**(可选复现已做):把 hobgoblin 行 `depth_band` 3→2 后跑 `res://tests/unit/data_config/config_db_test.gd`,首条错误为
`ERROR: [ConfigDB/level_node_dangling] level 1 battle 节点深度 3 高于 (level 1, battle) 顶带键 2——顶 clamp 消解`
随后 `[FAIL] 全部表加载 + 校验通过(含跨表护栏零 error 诊断)〔fv6〕`,EXIT=1;`git checkout --` 还原。与报告改写后的「跨表 level_node_dangling 首红、同带相邻未触发」一致。**通过**。
4. **断言计数**:`grep -rn "〔fv[0-9]*〕" tests/ smoke/ --include=*.gd` 得 37 行;逐行核对,`smoke_all.gd:969` 为注释(`# 同带多行合法,带键聚合天然兼容〔fv24〕)`),其余 36 行均为断言行 → 「36 条断言+1 行注释」属实;fv14/fv26 按卡片约定走件核,代码侧无尾缀,覆盖说明自洽。**通过**。
## F. 测试削弱检查——通过
检查范围:`git diff 603eba31..68009b4e -- game/tests game/smoke`(8 个文件,+449/−166)与本次修补 `git diff 7bb41891..68009b4e`。
1. **本次修补未碰产品代码与既有断言**:`7bb41891..68009b4e` 仅 `battle_narrator_test.gd` 38 行新增(0 删除)+两份报告;新增用例为纯增量,无删断言、无阈值放宽、无扫描面缩小。
2. **全量 diff 的删除行均属卡片 §8.2「旧断言预声明」允许的 S1–S16 改写**:删除面集中在 `config_db_resolver_test.gd`(S11 换代)、`config_db_test.gd`(S12 夹具键改名)、`config_db_cross_validator_test.gd`(S13)、`smoke_all.gd`(S1–S10)、两份探针(S14);`skill_unlock_test.gd` 的 `spawn(2,9)` 补显式 `"boss"`、冒烟 gp 掉落断言改读 `shop.tres` Boss 档区间+关级加值,均在报告 §2.4 第 1–3 条申报。
3. **无阈值放宽 / 无扫描面缩小**:diff 中没有 seed/`range()` 扫描规模改动;第一关曲线阈值 `≤ 2.5`、混编 `≤ 4`、首遇 `unit_count=2`/固定 1 等判据原样保留;gp 掉落断言由硬编码 `[2,4]` 改为数据驱动 `Boss 档 [6,10] + 关级加值`(因 S10a 把该战改为 boss 语义,掉落档合法切换),判据仍比对结算输出,强度不降。
4. **真实入口未换下层直调**:fv1–fv5 走 `resolve_enemy_rowset`,fv6–fv10 走加载后的 `EnemyTable.validate`,fv15–fv17 走 `cross_validate`,fv18–fv23 走冒烟表读取+`spawn`,S15 走 `boss_name` → `resolve_enemy_rowset(..., "boss")`。
5. **数量面**:冒烟 1156→1161(本卡 +5),单元套件 35 个不变;`battle_narrator_test` 检查数 11→13(新增 2 条)。无净收缩。
结论:未发现未申报的测试削弱,本次修补为纯增量。
---
## 遗留例外/观察(不阻塞)
1. 第一轮审计报告第三节所记 diff 行数「删 173 行、增 418 行」与实测 `git diff --numstat 603eba31..7bb41891 -- game/tests game/smoke`(+411/−166)不一致,属第一轮报告的计数笔误(不影响其结论,也不属实现报告内容);本轮结论以实测为准。
2. 新单测在解析 L1 battle 行集时(同深度请求落在 Boss 深度 4)会触发一次 `resolve_depth_clamp` 警告——这是顶带 clamp 的预期语义,非失败;用例仍 13 项全绿。
## 运行命令清单(均为工作树 `game/` 下、Godot 4.7.2 console 版、`PYTHONIOENCODING=utf-8`、一次一个进程)
- `--headless --path . --script res://tests/unit/presentation/battle_narrator_test.gd`(注入前后与还原后共 3 轮)
- `--headless --path . --script res://smoke/smoke_all.gd`(数据变异/叠加写死/还原后共 3 轮)
- `--headless --path . --script res://tests/unit/data_config/config_db_test.gd`(hobgoblin 错带复现 1 轮)
- `git diff 603eba31..68009b4e -- game/tests game/smoke`、`git diff --numstat`、`grep -rn "〔fv[0-9]*〕"`、`git checkout -- <单文件>`、`git status --short`
审计结束时工作树除本报告外无改动,HEAD=`68009b4e`。