fix(迭代34卡③审计缺漏): 补 S15 叙述寻址单测〔fv24〕+V6① 数据侧撤销证明;报告补 V7 十七行勾销表与 V9/fv26 行、四处描述改写
审计第一轮缺漏 4 条处置:V7 补覆盖行+S1–S16 逐条勾销(现工作树 file:line);V9 补件核行; S15 boss_name 补真实入口单测(扫表取 Boss 带键,断言叙述名=boss 行集首行名;变异 "boss"→"battle" 实测红); V6① 撤销证明换数据侧注入(bugbear 带 2→1 时 fv21 仍绿=数据驱动正证,叠加写死坐标才红)。 描述不符 4 条改写:fv17 夹具措辞、fv19 撤销归属、变异第 7 项首红、断言计数(36 条+1 行注释)。 随批入库第一轮审计报告。
This commit is contained in:
1 parent
7bb418913e
commit
68009b4ea8
3 files changed
+185
-7
No files matched your search
@@ -8,10 +8,20 @@ const Kit := preload("res://tests/unit/test_kit.gd")
|
||||
const NarratorScript := preload("res://presentation/battle_narrator.gd")
|
||||
|
||||
|
||||
# 叙述寻址的 runner 替身:只提供 boss_name 实际读的两项(当前节点、关卡行)
|
||||
class _BossRunner:
|
||||
var level_row: Dictionary = {"level_index": 1}
|
||||
var node: Dictionary = {}
|
||||
|
||||
func current_node() -> Dictionary:
|
||||
return node
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
_test_numeric_lines_carry_values()
|
||||
_test_end_text_differs_by_result()
|
||||
_test_phase_text_nonempty()
|
||||
_test_boss_name_uses_boss_rowset()
|
||||
quit(Kit.finish("battle_narrator_test"))
|
||||
|
||||
|
||||
@@ -42,3 +52,31 @@ func _test_phase_text_nonempty() -> void:
|
||||
Kit.check("相位叙述非空(实际「%s」)" % t, t != "")
|
||||
var boss: String = NarratorScript.phase_text(2, "", false, true, "灰矮人石君王")
|
||||
Kit.check("Boss 在场时叙述带入 Boss 名(实际「%s」)" % boss, boss.contains("灰矮人石君王"))
|
||||
|
||||
|
||||
# 叙述寻址按行类取 Boss 行集(S 清单 S15 换代):Boss 节点名必须来自 (关卡, boss, 带) 行集,
|
||||
# 不能落到同深度的战斗行集——期望名由表行集首行读出,不写死字面量。
|
||||
func _test_boss_name_uses_boss_rowset() -> void:
|
||||
var db = load("res://core/config_db.gd").new()
|
||||
var loaded: bool = db.load_tables("res://data/tables", false)
|
||||
Kit.check_quiet(loaded, "叙述寻址用例:数值表加载成功")
|
||||
if not loaded:
|
||||
return
|
||||
var boss_row := {}
|
||||
for row in db.enemy.rows:
|
||||
if int(row.level_index) == 1 and String(row.get("row_kind", "")) == "boss":
|
||||
boss_row = row
|
||||
break
|
||||
Kit.check_quiet(not boss_row.is_empty(), "叙述寻址用例:第一关有 Boss 行")
|
||||
if boss_row.is_empty():
|
||||
return
|
||||
var boss_depth: int = int(boss_row.depth_band)
|
||||
var boss_rows: Array = db.resolve_enemy_rowset(1, boss_depth, "boss")
|
||||
var battle_rows: Array = db.resolve_enemy_rowset(1, boss_depth, "battle")
|
||||
var boss_expect := String(boss_rows[0].get("display_name", ""))
|
||||
var battle_name := String(battle_rows[0].get("display_name", ""))
|
||||
var runner := _BossRunner.new()
|
||||
runner.node = {"node_depth": boss_depth, "type": "boss"}
|
||||
var got: String = NarratorScript.boss_name(runner, db)
|
||||
Kit.check("Boss 名取自 Boss 行集首行(期望「%s」实际「%s」)〔fv24〕" % [boss_expect, got], got == boss_expect)
|
||||
Kit.check("Boss 名与同深度战斗行集名不同(期望「%s」≠「%s」——行类路由可判别)〔fv24〕" % [boss_expect, battle_name], boss_expect != battle_name)
|
||||
@@ -46,16 +46,41 @@
|
||||
| fv14 | 值列零变更 | git diff 件核 | 件核 | `git diff` 逐值列比对 | 改任一值列 → 件核红 |
|
||||
| fv15 | 同关双终点共带报错 | `config_db_cross_validator_test.gd:137` | 单元 | `cross_validate()` 双 Boss 同带夹具 | 变异删判据 → 红(实测) |
|
||||
| fv16 | 顶带消解报错 | `config_db_cross_validator_test.gd:142` | 单元 | 节点深度高于顶带夹具 | 变异判据短路 `if false` → 红(实测) |
|
||||
| fv17 | 单终点图零误报 | `config_db_cross_validator_test.gd:132` | 单元 | 现役三关夹具 | 回退 ④ 敌侧换代 → 红 |
|
||||
| fv17 | 单终点图零误报 | `config_db_cross_validator_test.gd:132` | 单元 | level 1 合成单关夹具(`display_name:"夹具关"`);现役三关零误报由 fv6 兜住 | 回退 ④ 敌侧换代 → 红 |
|
||||
| fv18 | 混编行序 | `smoke_all.gd:4815` | 集成 | 冒烟读 (2,battle,5) 行集 | 变异对调两行 → 红(实测) |
|
||||
| fv19 | 混编骰和 ≤ 4 | `smoke_all.gd:4820` | 集成 | 同行集静态求和 | 放宽判据 → 红 |
|
||||
| fv19 | 混编骰和 ≤ 4 | `smoke_all.gd:4820` | 集成 | 同行集静态求和 | 改运行期守卫 `ROWSET_INSTANCE_MAX` → 同段守卫断言(「两行各定值 3(总 6>4)spawn 被拒」)红;静态求和本身放宽不会红 |
|
||||
| fv21 | 首遇带数据驱动定位 | `smoke_all.gd:2282` | 集成 | 扫表取最低带 | 撤销扫表定位 → 取键失配 |
|
||||
| fv22 | 巨蜘蛛首遇带固定 2 不加骰 | `smoke_all.gd:4801` | 集成 | 扫表定位+行集读数 | 变异加 `unit_count_max: 3` → 红(实测) |
|
||||
| fv23 | bugbear/duergar 首遇带固定 1 | `smoke_all.gd:3473`、:4859 | 集成 | 扫表定位+行集读数 | 变异加 `unit_count_max` → 红 |
|
||||
| fv24 | Boss 行集与毒吐投放面 | `smoke_all.gd:4281`、:4291、:4807、:4865 | 集成 | 扫表定位+Boss 行集 | 回退投放面判据 → 红 |
|
||||
| fv24 | V7 S 清单 17 行逐条换代(尾缀=清单件核;随带定点断言 = Boss 行集与毒吐投放面 + S15 叙述寻址) | `smoke_all.gd:4281`、:4291、:4807、:4865;`battle_narrator_test.gd:81`、:82 | 集成+单元 | 扫表定位+Boss 行集;`boss_name(runner, db)` 经 `resolve_enemy_rowset(..., "boss")` | 变异 `boss_name` 行类 "boss"→"battle" → `battle_narrator_test` fv24 红(实测);逐条勾销见 §2.2.1 |
|
||||
| fv25 | hobgoblin 缺口登记随行 | `smoke_all.gd:2116` | 接口 | 表文件注释在位 | 同 fv12 |
|
||||
| fv26 | V9 反哺点五落点(非行为改动) | `reports/iter34-反哺点-2026-10-22.md` ①–⑤ | 件核 | 反哺点文件与卡片 §6 同步面表逐条比对 | 删任一落点 → 件核红(文档产出物,无代码断言) |
|
||||
|
||||
覆盖说明:`game/` 全域共 35 条断言带 fv 尾缀,覆盖 fv1–fv25(fv14 按卡片约定走 git diff 件核,代码侧无断言);fv9 与 fv20、fv12 与 fv25 各自共用同一断言行,计数时不重复。
|
||||
覆盖说明:`game/` 全域共 37 行带 fv 尾缀(36 条断言,另 `smoke_all.gd:969` 一行是注释),覆盖 fv1–fv26;fv14(值列零变更)与 fv26(反哺点落点)按卡片约定走件核,代码侧无断言;fv9 与 fv20、fv12 与 fv25 各自共用同一断言行,计数时不重复。
|
||||
|
||||
#### 2.2.1 V7:S 清单 17 行逐条勾销(卡片位置 → 现工作树位置)
|
||||
|
||||
| S | 现工作树位置 | 换代内容 | 勾销凭据 |
|
||||
|---|---|---|---|
|
||||
| S1 | `smoke_all.gd:3168`/:3491/:4499 | 三参化(row_kind="battle")+带语义注释 | 三处均显式传 "battle",行集首行读数随带键 |
|
||||
| S2 | `smoke_all.gd:4795`(断言 :4801〔fv22〕) | 首遇带数据驱动定位+恰一行/unit_count=2/无 unit_count_max | 〔fv22〕实测绿;变异加 unit_count_max → 红(§2.3 第 5 项) |
|
||||
| S3 | `smoke_all.gd:4802`(断言 :4807〔fv24〕) | L2 Boss 行集改 `_boss_depth(2)`+"boss" | 〔fv24〕实测绿 |
|
||||
| S4 | `smoke_all.gd:4810`(断言 :4815〔fv18〕、:4820〔fv19〕) | 键改 (2,battle,5),行序契约保持 | 〔fv18〕变异对调 → 红(§2.3 第 6 项) |
|
||||
| S5 | `smoke_all.gd:4852`/:4860(断言 :4859〔fv23〕、:4865〔fv24〕) | 首遇带定位+Boss 三参化 | 两条断言实测绿 |
|
||||
| S6 | `smoke_all.gd:974-984`/:4781-4789/:5256-5258 | en_keys 改 (L,row_kind,depth_band),Boss 节点查 boss 键域 | 三处键串 `"%d_%s_%d"`;L2/L3 跨表行完整断言绿 |
|
||||
| S7 | `smoke_all.gd:2263`/:2279/:2301 | Boss AC 台阶保留;(1,2) 锚定改 bugbear 首遇带定位〔fv21〕;曲线改按 (1,battle) 带键相邻比 ≤ 2.5 | 三条断言实测绿;fv21 变异见 §2.3 第 8 项 |
|
||||
| S8 | `smoke_all.gd:4262-4306` | 毒吐投放面改 `depth_band > 巨蜘蛛首遇带`+池键含 row_kind | 〔fv24〕:4281/:4291 实测绿;键串 `2_battle_5_giant_spider` 等 |
|
||||
| S9 | `smoke_all.gd:3460-3474`(断言 :3473〔fv23〕) | (1,2) 改 bugbear 首遇带定位(固定 1 不加骰) | 〔fv23〕实测绿;数据侧变异下 fv23 红(§2.3 第 8 项) |
|
||||
| S10a | `smoke_all.gd:2024`/:2674/:2699/:3078/:3143/:3230/:3284/:3324/:3354/:3566/:3633/:3651/:3668/:4139/:4359/:4606/:4970/:5040;`damage_probe.gd:95` | 各补 `"node_type": "boss"` | 上述直呼点均带 node_type;冒烟 1161 项 0 失败 |
|
||||
| S10b | `smoke_all.gd:2674`/:2699 | 改 (2,9)+boss | 两处均为 `"node_depth": 9, "node_type": "boss"` |
|
||||
| S11 | `tests/unit/core/config_db_resolver_test.gd`(fv1–fv5) | 换代为带寻址语义断言 | fv1–fv5 实测绿;floor 变异红(§2.3 第 1 项) |
|
||||
| S12 | `tests/unit/data_config/config_db_test.gd`(fv6–fv10) | 夹具键改 row_kind/depth_band,签名三参化 | fv6–fv10 实测绿;枚举判据变异红(§2.3 第 2 项) |
|
||||
| S13 | `tests/unit/core/config_db_cross_validator_test.gd`(fv15–fv17) | 夹具键改名+补两条负向用例 | fv15/fv16 变异红(§2.3 第 3、4 项) |
|
||||
| S14 | `smoke/skill_rhythm_probe.gd:17`;`smoke/damage_probe.gd:269`/:422 | 三参化 | 三处显式传 row_kind |
|
||||
| S15 | `game/presentation/battle_narrator.gd:76`;验收 `tests/unit/presentation/battle_narrator_test.gd:81`/:82〔fv24〕 | 三参化(row_kind="boss")+补真实入口单测 | 实测绿;变异 "boss"→"battle" → fv24 红(§2.3 第 9 项) |
|
||||
| S16 | `smoke_all.gd:3491`(断言 :3496) | erow2 首行读数随带键(三参化) | 全深度×12 种子 60 场断言实测绿 |
|
||||
|
||||
勾销口径:S11–S13 归单测面,S1–S10、S14–S16 归冒烟/探针面,S15 归消费面;17 行全部给出工作树位置与凭据,无一行停在旧坐标语义。
|
||||
|
||||
### 2.3 变异验证记录表(注入 → 最窄闸见红 → 还原)
|
||||
|
||||
@@ -67,9 +92,11 @@
|
||||
| 4 | 顶带消解判据短路为 `if false` | `config_db_cross_validator_test.gd` | Boss 节点越顶带报 level_node_dangling〔fv16〕 | 恢复判据,复跑全绿 |
|
||||
| 5 | 巨蜘蛛首遇行(2,battle,4)加 `unit_count_max: 3` | 冒烟全量 | 巨蜘蛛首遇带行集 = {giant_spider} 恰一行且 unit_count=2 无 unit_count_max〔fv22〕 | 删该字段,冒烟复跑全绿 |
|
||||
| 6 | 混编两行(2,battle,5)文件内对调 | 冒烟全量 | 混编行序 [bugbear→giant_spider]〔fv18〕;20 行键序〔fv11〕;行值复制面 | 还原行序,冒烟复跑全绿 |
|
||||
| 7 | hobgoblin 迁错带键(迁到 (1,battle,2)) | 冒烟全量 | 首次注入直接被加载期同带相邻规则拦下(表校验先红,键位断言未及运行);二次注入改为与 band 2 行互换带键(表可加载),命中「hobgoblin 行在 (1,battle,3)」〔fv12〕〔fv25〕与 20 行键序〔fv11〕 | 还原带键,冒烟复跑全绿 |
|
||||
| 7 | hobgoblin 迁错带键(迁到 (1,battle,2)) | 冒烟全量 | 首次注入在加载期即被跨表校验拦下:`ERROR: [ConfigDB/level_node_dangling] level 1 battle 节点深度 3 高于 (level 1, battle) 顶带键 2——顶 clamp 消解`,随后〔fv6〕红(config_db_test 2/2 项止步);「同带相邻」判据未触发——该行紧接 bugbear 带 2 行之后、文件内相邻。二次注入改为与 band 2 行互换带键(表可加载),命中「hobgoblin 行在 (1,battle,3)」〔fv12〕〔fv25〕与 20 行键序〔fv11〕 | 还原带键,冒烟复跑全绿 |
|
||||
| 8 | 数据侧:L1 bugbear 行 `depth_band` 2→1(V6① 撤销证明换代) | 冒烟全量 | 单跑数据变异时〔fv21〕仍绿(首遇带随之变 1、锚定行随迁——数据驱动的正证),连带〔fv11〕〔fv23〕与 spawn 扫描等共 6 项红;叠加「`_first_encounter_band` 写死返回 2」后〔fv21〕红(期望带 2 找不到 bugbear 行),共 9 项红 | 两处均 `git checkout --` 还原,冒烟 1161 项 0 失败 |
|
||||
| 9 | `battle_narrator.boss_name` 行类 "boss"→"battle"(S15 撤销证明) | `battle_narrator_test.gd` | 「Boss 名取自 Boss 行集首行(期望「食人魔酋长」实际「大地精」)〔fv24〕」红,退出码 1 | 改回 "boss",13 项检查全绿 |
|
||||
|
||||
拦截边界如实记录:第 7 项按卡片写法直接把 hobgoblin 放到带 2 时,报表在加载期校验即被拦下(同带键行被隔断),键位断言的敏感度无法单独观测;改用「与带 2 行互换带键」的表内合法变异后键位断言变红,证明该断言能拦住「行在错带」这一类改动。另:第 1 项连带 fv3 变红,属同一算法单点的预期耦合,不另计。
|
||||
拦截边界如实记录:第 7 项按卡片写法直接把 hobgoblin 放到带 2 时,首条红是跨表 `level_node_dangling`(战斗节点深度 3 落到不存在的顶带),不是同带相邻规则——该行紧接 bugbear 带 2 行之后、文件内相邻,隔断判据不触发;键位断言的敏感度改用「与带 2 行互换带键」的表内合法变异单独观测。第 8 项单跑数据变异时〔fv21〕仍绿,说明该断言跟的是数据而不是写死值;只有「数据已变、坐标仍写死」的组合才让〔fv21〕红,这是它能区分两种实现的边界。另:第 1 项连带 fv3 变红,属同一算法单点的预期耦合,不另计。
|
||||
|
||||
### 2.4 卡片与实际改动面的偏差(逐条说明)
|
||||
|
||||
@@ -91,7 +118,20 @@
|
||||
|
||||
## 三、卡③ 独立验收审计
|
||||
|
||||
审计报告:`reports/iter34-验收审计-2026-10-22.md`(由未参与实现的子代理执行,逐行结论见该文件)。
|
||||
审计报告:`reports/iter34-验收审计-2026-10-22.md`(由未参与实现的子代理执行;只读卡片、本报告、diff、测试与闸回执,自跑最窄命令复现,不采信「已全绿」)。
|
||||
|
||||
**第一轮结论:不通过**——缺漏 4 条+描述不符 4 条(逐行依据见该报告第一至四节)。处置如下:
|
||||
|
||||
| 缺漏 | 处置 | 落点 |
|
||||
|---|---|---|
|
||||
| V7 无覆盖行、fv24 尾缀挂错需求点 | 补 V7 覆盖行+S 清单 17 行逐条勾销表 | 本报告 §2.2 fv24 行、§2.2.1 |
|
||||
| V9/fv26 覆盖行缺失 | 补件核行(反哺点文件 ①–⑤) | 本报告 §2.2 fv26 行 |
|
||||
| S15 `boss_name` 换代无断言 | 补真实入口单测(扫表取 Boss 带键 → 断言叙述名=boss 行集首行名),并做撤销证明 | `game/tests/unit/presentation/battle_narrator_test.gd:56-82`〔fv24〕;§2.3 第 9 项 |
|
||||
| V6①/fv21 撤销证明按记录无法变红 | 改为数据侧变异:bugbear 带 2→1(fv21 仍绿=数据驱动正证)+叠加写死坐标(fv21 红) | §2.3 第 8 项 |
|
||||
|
||||
描述不符 4 条已按审计建议改写:fv17 夹具措辞(level 1 合成单关,非现役三关,现役三关由 fv6 兜住)、fv19 撤销归属(运行期守卫断言,静态求和本身不红)、§2.3 第 7 项拦截首红(跨表 `level_node_dangling`)、断言计数(36 条断言+1 行注释)。
|
||||
|
||||
**第二轮复审结论**:待复审完成后在本节追加。
|
||||
|
||||
## 四、全量代码闸读数
|
||||
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
# 迭代 34 卡③ 独立验收审计(2026-10-22)
|
||||
|
||||
被审对象:实现报告 `reports/iter34-实现报告-2026-10-22.md`、需求卡片 `reports/需求卡片-敌人表深度带换代批-2026-10-21.md`、工作树 `D:\code\g-plan2-iter34-enemy`(分支 `iter34-enemy-band`,HEAD `7bb41891`,基线 `603eba31`)。
|
||||
|
||||
审计方式:只读代码、测试、卡片与 diff。所有结论以审计人自己运行的输出为准,不采信报告「已全绿」的表述。审计期间为复现撤销证明注入的变异,均用单文件 `git checkout -- <file>` 还原并复跑确认,工作树结束时无改动。
|
||||
|
||||
## 审计结论
|
||||
|
||||
不通过:缺漏 4 条(V7 无覆盖行、fv24 尾缀挂错需求点;V9/fv26 覆盖行缺失;S15 `boss_name` 换代无断言;V6①/fv21 撤销证明按记录无法变红),另有描述不符 4 条;其余对照行通过。
|
||||
|
||||
## 一、对照表逐行核对
|
||||
|
||||
核对方法:按报告 §2.2 的 file:line 逐条读断言文本,grep 尾缀〔fv#〕确认可定位,再沿断言回溯到改动点入口(`resolve_enemy_rowset`/`EnemyTable.validate`/`cross_validate`/生产表读数),并在工作树实跑对应套件确认该断言在跑。
|
||||
|
||||
| fv | 需求点 | 测试存在(file:line) | 尾缀可 grep | 真实入口 | 结论 |
|
||||
|---|---|---|---|---|---|
|
||||
| fv1 | V1① 带命中偏难 | `config_db_resolver_test.gd:58`、`:61` | 是 | `resolve_enemy_rowset(1,4/5,"battle")` → `band_of` | 通过 |
|
||||
| fv2 | V1② 行序保序 | `config_db_resolver_test.gd:67`、`:71` | 是 | 同上,断言行集顺序 | 通过 |
|
||||
| fv3 | V1③ 顶带 clamp+告警去重 | `config_db_resolver_test.gd:78`、`:84`、`:87` | 是 | 同上,D=99 与重复请求 | 通过 |
|
||||
| fv4 | V1④ row_kind 路由 | `config_db_resolver_test.gd:93` | 是 | 同 D 传 battle/boss | 通过 |
|
||||
| fv5 | V1⑤ 越域与非法行类 | `config_db_resolver_test.gd:101`、`:104`、`:107` | 是 | `resolve_enemy_rowset(0,…)`/`(1,-1,…)`/`(1,0,"elite")` | 通过 |
|
||||
| fv6 | V2① 生产表校验零错误 | `config_db_test.gd:14` | 是 | `ConfigDB.load_tables` → `EnemyTable.validate` | 通过 |
|
||||
| fv7 | V2② 非法 row_kind 被拒 | `config_db_test.gd:256` | 是 | `validate()` 非法枚举夹具 | 通过 |
|
||||
| fv8 | V2③ dup_key 新键拦截 | `config_db_test.gd:235` | 是 | `validate()` 同带同敌种二行夹具 | 通过 |
|
||||
| fv9/fv20 | V2④、V5③ 同带隔断 | `config_db_test.gd:225`(一条断言两个尾缀) | 是 | `validate()` 隔断夹具 | 通过 |
|
||||
| fv10 | V2⑤ 锚行与 Boss 行集 | `config_db_test.gd:265`、`:273` | 是 | `validate()` 缺锚/缺 Boss 夹具 | 通过 |
|
||||
| fv11 | V3① 20 行计数与键序 | `smoke_all.gd:2106` | 是 | 加载 `enemy.tres` 全表逐行比对 | 通过 |
|
||||
| fv12/fv25 | V3②、V8 hobgoblin 留任 | `smoke_all.gd:2114`、`:2116` | 是 | 同 fv11 读表面+表注释 | 通过 |
|
||||
| fv13 | V3③ 三 Boss 行就位 | `smoke_all.gd:2132` | 是 | 同 fv11 读表面 | 通过 |
|
||||
| fv14 | V3④ 值列零变更 | 无断言(件核):`git diff 603eba31..7bb41891 -- game/data/tables/enemy.tres` | 无(卡片约定件核) | diff 去键列后逐值列比对 | 通过(去键列后值列逐字节一致) |
|
||||
| fv15 | V4① 同带双 boss 报错 | `config_db_cross_validator_test.gd:137` | 是 | `cross_validate()` 双 Boss 共带夹具 | 通过 |
|
||||
| fv16 | V4② 顶 clamp 消解报错 | `config_db_cross_validator_test.gd:142` | 是 | `cross_validate()` Boss 深度 10>顶带 9 | 通过 |
|
||||
| fv17 | V4③ 单终点零误报 | `config_db_cross_validator_test.gd:132` | 是 | `cross_validate()` 合成单关夹具 | 例外:夹具只有 level 1(`display_name:"夹具关"`),报告写「现役三关夹具」不实;现役三关零误报由 fv6 兜住 |
|
||||
| fv18 | V5① 混编行序 | `smoke_all.gd:4815` | 是 | 读 (2,battle,5) 行集顺序 | 通过 |
|
||||
| fv19 | V5② 骰和 ≤4 | `smoke_all.gd:4820` | 是 | 读同行集静态求和 | 例外:断言是静态求和,放宽它本身不会红;能变红的是同段未编号的运行期守卫断言 |
|
||||
| fv21 | V6① 首遇带数据驱动 | `smoke_all.gd:2282`(定位助手 `:3516`) | 是 | `_first_encounter_band` 扫表+行集读数 | 通过(撤销证明不成立,见第四节第 4 条) |
|
||||
| fv22 | V6② 巨蜘蛛首遇带固定 2 | `smoke_all.gd:4801` | 是 | 扫表定位+行集读数 | 通过 |
|
||||
| fv23 | V6③ L1/L3 首遇带固定 1 | `smoke_all.gd:3473`、`:4859` | 是 | 同上 | 通过 |
|
||||
| fv24 | 报告写作「Boss 行集与毒吐投放面」 | `smoke_all.gd:4281`、`:4291`、`:4807`、`:4865` | 是 | 扫表定位+Boss 行集 | 缺漏:卡片 V7 要求「S 清单 17 行逐条换代+清单件核」,这 4 条断言不是该需求点的验证;报告无 V7 行,也无 S1–S16 逐条勾销表 |
|
||||
| fv25 | V8 缺口登记随行 | `smoke_all.gd:2116`(与 fv12 共用行) | 是 | 表文件注释在位 | 通过 |
|
||||
| —(V9/fv26) | V9 反哺点五落点件核 | 报告 §2.2 无此行 | — | 应为 `reports/iter34-反哺点-2026-10-22.md` 五条落点件核 | 缺漏:反哺点文件已有 ①–⑤ 五节,但对照表没有 fv26 覆盖行 |
|
||||
|
||||
需求点覆盖对照:V1①–⑤=fv1–fv5,V2①–⑤=fv6–fv10,V3①–④=fv11–fv14,V4①–③=fv15–fv17,V5①–③=fv18–fv20,V6①–③=fv21–fv23,V8=fv25;V7 与 V9 没有对应覆盖行(见上表两处缺漏)。
|
||||
|
||||
## 二、撤销证明抽查
|
||||
|
||||
抽查 6 项(报告 §2.3 七条中取 5 条复现,另核 1 条不可复现)。每条流程:改一个文件注入 → 跑报告指明的最窄命令 → 确认对应断言变红 → `git checkout -- <单文件>` 还原 → 复跑回绿。
|
||||
|
||||
| 变异 | 复现结果 | 红输出首行 | 还原结论 |
|
||||
|---|---|---|---|
|
||||
| 1. `EnemyTable.band_of` 判据 `>=` 改 `<=`(反向 floor) | 已复现 | `[FAIL] 带命中取偏难一侧:请求深度 4 命中带 5(逐字不回带 0)〔fv1〕`;连带〔fv1〕第二条与〔fv3〕两条 | `git checkout -- game/data/schemas/enemy_table.gd`;resolver 套件 14 项全绿 |
|
||||
| 2. `validate` 的 row_kind 枚举判据前置 `if false and` | 已复现 | `[FAIL] 非法 row_kind 被拒(封闭枚举 {battle, boss})〔fv7〕`(1/29 项失败) | 同文件 checkout;config_db_test 29 项全绿 |
|
||||
| 3. 删除跨表「Boss 同带」判据 | 已复现 | `[FAIL] 同关双终点共带报 rowset_rule〔fv15〕` | `git checkout -- game/core/config_db_cross_validator.gd`;跨表套件 7 项全绿 |
|
||||
| 4. 顶带消解判据短路 `if false` | 已复现 | `[FAIL] Boss 节点越顶带报 level_node_dangling〔fv16〕` | 同文件 checkout;7 项全绿 |
|
||||
| 5. hobgoblin 与带 2 行互换带键(报告第 7 项第二注入法) | 已复现 | 冒烟首红〔fv11〕「敌人表 20 行且键序=迁移表序…」,随后〔fv12〕〔fv25〕红 | `git checkout -- game/data/tables/enemy.tres`;冒烟 1161 项检查 0 失败 |
|
||||
| 6. hobgoblin 直接改到带 2(报告第 7 项第一注入法) | 已复现,但拦截者与报告所写不同 | `ERROR: [ConfigDB/level_node_dangling] level 1 battle 节点深度 3 高于 (level 1, battle) 顶带键 2——顶 clamp 消解`;随后〔fv6〕红,套件 2/2 项失败即止 | 同文件 checkout;config_db_test 29 项全绿 |
|
||||
| 7. V6①「撤销扫表定位、写回写死坐标」 | 未复现(按记录设计不成立) | — | 未注入:助手 `_first_encounter_band`(`smoke_all.gd:3516`)返回值与旧写死值同为 L1=2/L2=4/L3=0,写回后断言值不变、不会红;要让 fv21 变红只能改数据把首遇行移带 |
|
||||
|
||||
实际运行命令(均在工作树,`PYTHONIOENCODING=utf-8`,Godot 4.7.2 console 版 headless,一次只跑一个进程):
|
||||
|
||||
- `--script res://tests/unit/core/config_db_resolver_test.gd`(多轮,含注入与还原后复跑)
|
||||
- `--script res://tests/unit/data_config/config_db_test.gd`(多轮)
|
||||
- `--script res://tests/unit/core/config_db_cross_validator_test.gd`(多轮)
|
||||
- `--script res://tests/run_all.gd`(全量单元 35 套件)
|
||||
- `--script res://smoke/smoke_all.gd`(1161 项检查 0 失败,多轮)
|
||||
- `git diff`、`git status`、`git checkout -- <单文件>`
|
||||
|
||||
补充核验:把 `battle_narrator.gd:76` 的 `"boss"` 改为 `"battle"` 后,35 个单元套件与整轮冒烟仍全绿,说明该改动点没有被任何断言拦住(见第四节缺漏 3)。
|
||||
|
||||
## 三、测试削弱检查
|
||||
|
||||
检查范围:`git diff 603eba31..7bb41891 -- game/tests game/smoke`(删 173 行、增 418 行)。逐项核对删除、阈值、扫描面与入口层级:
|
||||
|
||||
1. `config_db_resolver_test.gd` 删除 `_test_ceil_progress_key`(board_gen ceil 3 条断言):属卡片 §8.2 旧断言预声明 S11「换代为 V1 带寻址语义断言」;board_gen 的 ceil/越顶/去重仍由 `config_db_test.gd:30-82` 覆盖,未失效。
|
||||
2. gp 掉落断言由硬编码 `[2,4]` 改为读 `shop.tres` Boss 档区间+关级加值:报告 §2.4 第 2 条已申报;判据仍比对结算输出,强度不低于原式。
|
||||
3. `skill_unlock_test.gd` Boss 用例 `spawn(2,9)` 补显式 `"boss"`:报告 §2.4 第 3 条已申报。
|
||||
4. 冒烟多处补 `node_type:"boss"`/补行类参数:报告 §2.4 第 1 条已申报。
|
||||
5. 未发现「真实入口换低层直调」:fv1–fv5 仍走 `resolve_enemy_rowset`,fv6–fv10 走 `EnemyTable.validate`(经加载),fv15–fv17 走 `cross_validate`,冒烟断言走 `_db.enemy.rows` 与 `spawn`。
|
||||
6. 检查数量:冒烟 1156→1161,单元 35 套件不变;无净收缩。其余删除行均为按 S 清单把旧坐标断言改写为带键断言,语义保持。
|
||||
7. 未发现未申报的阈值放宽或扫描面缩小。
|
||||
|
||||
结论:未发现未申报的测试削弱。另有一处计数描述不符:报告称「35 条断言带 fv 尾缀」,实测带尾缀行 35 行,其中 `smoke_all.gd:969` 是注释,断言为 34 条。
|
||||
|
||||
## 四、缺漏与例外
|
||||
|
||||
缺漏:
|
||||
|
||||
1. **V7 无覆盖行、fv24 尾缀挂错需求点**。位置:报告 §2.2 表(无 V7 行);卡片 §8.2 V7 要求「S 清单 17 行逐条换代+实现报告逐条勾销」。事实:fv24 的 4 条断言(`smoke_all.gd:4281`/`:4291`/`:4807`/`:4865`)验证的是 Boss 行集与毒吐投放面,不是 S 清单完整性;报告也没有 S1–S16 逐条勾销表。建议:补 V7 覆盖行与逐条勾销表,或经卡片所有者同意把 V7 的验收方式改写为实际断言。
|
||||
2. **V9/fv26 覆盖行缺失**。位置:报告 §2.2 表;卡片 §8.2 V9。事实:`reports/iter34-反哺点-2026-10-22.md` 已有 ①–⑤ 五节落点,实物在,但对照表没有 fv26 件核行,无法按表逐行核对。建议:补一行「V9|五条落点各一|件核:反哺点文件 ①–⑤|非行为改动|通过」。
|
||||
3. **S15 `boss_name` 换代无断言**。位置:`game/presentation/battle_narrator.gd:76`;卡片 §8.1 S15、§8.2 V7。事实:把该处 `"boss"` 改成 `"battle"` 后,35 个单元套件与整轮冒烟 1161 项全绿;`battle_narrator_test.gd` 从未调用 `boss_name`。建议:补一条走真实入口的单测(构造 Boss 节点,断言叙述名取 boss 行集名),或在报告 §2.4 如实声明该处无断言并说明理由。
|
||||
4. **V6①/fv21 撤销证明不成立**。位置:卡片 §8.2 V6① 撤销证明、报告 fv21 行。事实:按记录「撤销扫表定位、写回写死坐标」还原后,助手返回值与写死值相同(L1=2/L2=4/L3=0),断言不会红;该撤销证明无法区分「数据驱动」与「写死」。建议:改为数据侧变异(把首遇行移到别的带,断言应取键失配变红)或如实标注撤销边界。
|
||||
|
||||
例外(描述不符,不影响其余覆盖):
|
||||
|
||||
5. **fv17 夹具描述**。位置:`config_db_cross_validator_test.gd:128-132`;报告 §2.2 fv17 行写「现役三关夹具」。事实:夹具是 level 1 合成单关(`display_name:"夹具关"`);现役三关零误报由 fv6(生产表加载零 error)覆盖。建议:改报告措辞,或补现役三关夹具。
|
||||
6. **fv19 撤销归属**。位置:`smoke_all.gd:4820`。事实:静态求和断言被放宽不会红;真正能红的是同段未编号的运行期守卫断言(「两行各定值 3(总 6>4)spawn 被拒」)。建议:报告撤销证明改写为「改 `ROWSET_INSTANCE_MAX` 守卫 → 守卫断言红」。
|
||||
7. **§2.3 第 7 项拦截边界描述有误**。位置:报告 §2.3 注①。事实:hobgoblin 直接改到带 2 时,首条红是跨表 `level_node_dangling`(战斗节点深度 3 无带可落),不是「同带相邻规则」;同带相邻未触发,是因为 hobgoblin 紧接在 bugbear 带 2 行之后、文件内相邻。建议:按实际首红改写。
|
||||
8. **断言计数**。位置:报告 §2.2 覆盖说明「共 35 条断言带 fv 尾缀」。事实:带尾缀行 35 行,其中 1 行为注释(`smoke_all.gd:969`),断言 34 条。建议:改为 34 条。
|
||||
|
||||
审计结束时工作树 `git status --short` 为空,HEAD 仍为 `7bb41891`;除本报告外未新增或修改任何文件。
|
||||
Reference in new issue
Block a user