merge(写卡批§9对账): 四卡按 test-conventions §9 实质对账补齐缺口
This commit is contained in:
commit
c232e56ecf
4 files changed
+38
-28
No files matched your search
@@ -172,8 +172,8 @@
|
||||
| # | 需求点 | 测什么(断言内容) | 落点 | 变异注入实验 |
|
||||
|---|---|---|---|---|
|
||||
| V1 | 邻近 N 层见类型 | 层距 ≤ N 的 id ∈ `type_visible_ids()`、层距 N+1 的非豁免 id ∉;入口停点锚层 0 | `level_map_type_vis_test` ①⑤ | 判定 `<=N` 改 `<N` → 边界断言红 |
|
||||
| V2 | 范围外只见结构 | 雾下节点 draw_icon=false、draw_label=false;方块/编号通道不受决策面约束(决策面不输出结构隐藏旗标) | `level_map_info_fog_test` ① | `draw_icon` 强制 true → 红 |
|
||||
| V3 | Boss/终点不入雾+多终点标记 | type=="boss" 节点恒 ∈ 可见集且 boss_border=true(双 Boss 夹具逐个验证) | 两套件各一组 | 删 Boss 豁免分支 → 红 |
|
||||
| V2 | 范围外只见结构 | 雾下节点 draw_icon=false、draw_label=false;方块/编号通道不受决策面约束(决策面不输出结构隐藏旗标) | `level_map_info_fog_test` ①+`display_probe()` 绘制面〔fv2〕 | `draw_icon` 强制 true → 红 |
|
||||
| V3 | Boss/终点不入雾+多终点标记 | type=="boss" 节点恒 ∈ 可见集且 boss_border=true(双 Boss 夹具逐个验证) | 两套件各一组+`display_probe()` boss_border 读数〔fv3〕 | 删 Boss 豁免分支 → 红 |
|
||||
| V4 | 下一跳恒可见 | 候选集 ⊆ 可见集(含跨层跳边夹具);真图 L2 入口停点候选 ⊆ 可见集 | 单测 ②+冒烟 | 删候选豁免 → 跨层夹具红 |
|
||||
| V5 | 节点内详情不显示 | 携带内容键节点与不带者决策面输出逐键相等;label_text 不含内容值 | `level_map_info_fog_test` ③ | label 拼 content 字段 → 红 |
|
||||
| V6 | N 进数据表 | 字段在档读数 2;改表值可见窗随动;越域(0/负)validate 判 domain 红 | `level_map_type_vis_test` ⑥ | 删越域校验 → validate 断言红 |
|
||||
@@ -192,15 +192,17 @@
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件:行+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| fv1 邻近 N 层见类型 | `game/core/level_runner.gd` 新增 `type_visible_ids()`(层距判定) | type_vis ①层距边界+⑤入口锚/单链退化〔fv1〕 `tests/unit/core/level_map_type_vis_test.gd` | 单元 | `LevelRunner.type_visible_ids()` 直调 | 变异:`<=N` 改 `<N` → 边界断言红 |
|
||||
| fv2 范围外只见结构 | `level_map_screen.gd:467-489` 图标/类型文字改读 `node_display` | info_fog ①显隐+④label_text 三态〔fv2〕 `tests/unit/presentation/level_map_info_fog_test.gd` | 单元 | `LevelMapScreen.node_display` 纯函数 | 变异:`draw_icon` 强制 true → 红 |
|
||||
| fv3 Boss/终点不入雾+多终点标记 | `level_runner.gd` 豁免集含 type=="boss";`level_map_screen.gd:457-461` boss_border 决策面 | info_fog ②〔fv3〕+type_vis ③〔fv3〕(两套件) | 单元 | `node_display`/`type_visible_ids()` 直调(双 Boss 夹具) | 变异:删 Boss 豁免分支 → 红 |
|
||||
| fv4 下一跳恒可见 | `type_visible_ids()` 候选集豁免 | type_vis ②〔fv4〕+smoke_all 真图断言〔fv4〕 | 单元+冒烟 | `type_visible_ids()`/`smoke_all.gd _smoke_level_graph` | 变异:删候选豁免 → 跨层跳边夹具红 |
|
||||
| fv2 范围外只见结构 | `level_map_screen.gd:467-489` 图标/类型文字改读 `node_display` | info_fog ①显隐+④label_text 三态〔fv2〕 `tests/unit/presentation/level_map_info_fog_test.gd`+`display_probe()` 绘制面断言(draw_icon/draw_label 读数)〔fv2〕 | 单元+探针 | `LevelMapScreen.node_display` 纯函数+真机 `display_probe()` 读绘制面(接线层验收——防「断言在、接线坏、不红」,§9.2) | 变异:`draw_icon` 强制 true → 红 |
|
||||
| fv3 Boss/终点不入雾+多终点标记 | `level_runner.gd` 豁免集含 type=="boss";`level_map_screen.gd:457-461` boss_border 决策面 | info_fog ②〔fv3〕+type_vis ③〔fv3〕(两套件)+`display_probe()` boss_border 读数〔fv3〕 | 单元+探针 | `node_display`/`type_visible_ids()` 直调(双 Boss 夹具)+真机 `display_probe()` | 变异:删 Boss 豁免分支 → 红 |
|
||||
| fv4 下一跳恒可见 | `type_visible_ids()` 候选集豁免 | type_vis ②〔fv4〕+smoke_all 真图断言〔fv4〕 | 单元+集成 | `type_visible_ids()`/`smoke_all.gd _smoke_level_graph` | 变异:删候选豁免 → 跨层跳边夹具红 |
|
||||
| fv5 节点内详情不显示 | `node_display` 只消费 type/状态(零内容键) | info_fog ③〔fv5〕 | 单元 | `node_display` 纯函数(携带内容键夹具) | 变异:label 拼 `enemy_id` → 红 |
|
||||
| fv6 N 进数据表 | `level_table.gd:7` 后 `info_visible_layers` 字段+validate 越域;`level.tres` 挂值 | type_vis ⑥〔fv6〕 | 单元 | `LevelTable.validate()`/`db.level.info_visible_layers` 读值 | 变异:删越域校验 → validate 断言红 |
|
||||
| fv7 单圈语义 | `type_visible_ids()` 纯函数于锚点(visited 不豁免) | type_vis ④〔fv7〕+⑦续玩重建同值〔fv7〕 | 单元 | `type_visible_ids()` 直调+`start_level_external` resume_state | 变异:改累积可见(visited 恒显)→ 红 |
|
||||
| fv8 画布自适应 | `level_map_screen.gd:289-304` 包络公式(现役保留);`ui_input_probe.gd:98` 常数锚同源化 | info_fog 大图组〔fv8〕+`ui_input_probe` ⑬ | 单元+探针 | `canvas_probe()`/`layout_probe()`(11 层×6 槽夹具)+真机 push_input | 变异:去 `NODE_HALF.x` 项 → 大图断言红 |
|
||||
| fv9 显隐接线(雾不扩可点域) | `level_map_screen.gd:355-386` 命中面零改动(候选即合法集) | `ui_input_probe` ⑱〔fv9〕 | 探针 | 真机 `push_input`+`display_probe()` | 变异:命中面放宽到全节点 → ⑱ 点击零提交断言红 |
|
||||
|
||||
**旧断言预声明(test-conventions §9.5)**——允许改写的旧断言清单及理由:①`ui_input_probe.gd:98` 常数锚同源化(**非行为改动**——纯引用同源,判据与断言语义零变化);②既有 `ui_input_probe` ⑬/⑱ 与 `display_probe` 相关断言仅随绘制面读数源接线而扩观测点(理由:fv2/fv3 接线层验收补探针读数),判据不放宽。除此之外的断言删除/放宽/换下层直调=未声明削弱,停卡呈报、独立审计判红。
|
||||
|
||||
**独立验收审计(test-conventions §9.7,2026-10-21 起)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告实际对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T5 合并前置)。
|
||||
|
||||
## 8. 异常分级
|
||||
|
||||
@@ -269,15 +269,17 @@
|
||||
| V4① 同带双 boss 报错 | `config_db_cross_validator.gd:63-65/:81-85` ④ 敌侧带化+「同关多 boss 节点解析带键互异」判据(类别 `rowset_rule`) | 同带双 boss 负向报错〔fv15〕 `game/tests/unit/core/config_db_cross_validator_test.gd`(S13 新增负向) | 单元 | `ConfigDbCrossValidator.cross_validate()` 同带双 boss 夹具 | 变异:删「boss 节点带互异」判据(T2 变异步)→ 本用例红 |
|
||||
| V4② 顶 clamp 消解报错 | ④ 敌侧 `band_of != -1` 判据(-1=顶 clamp 消解,报 `level_node_dangling`) | 顶 clamp 负向报错〔fv16〕 `config_db_cross_validator_test.gd` | 单元 | `cross_validate()` 节点深度高于顶带夹具 | 变异:④ 敌侧判据短路为恒真(T2 变异步)→ 本用例红 |
|
||||
| V4③ 单终点三关零误报 | ④ 敌侧半边换代、board_gen 半边零改动(:62/:82-83) | 既有三用例回归零误报〔fv17〕 `config_db_cross_validator_test.gd` 既有三用例(S13 夹具键改名) | 单元 | `cross_validate()` 现役三关夹具 | 撤销证明:回退 ④ 敌侧换代 hunk → 改名后既有三用例红 |
|
||||
| V5① 混编行序 | (2,5) 双行迁 (2,battle,5)、行序 [bugbear→giant_spider] 与文件相邻不变(`enemy.tres`) | 混编 (2,battle,5) 双行行序〔fv18〕 冒烟 S4 `smoke_all.gd:4706-4719` 换代 | 冒烟 | 冒烟 S4 段读 (2,battle,5) 行集 | 变异:混编两行文件内对调(T3 变异步)→ 行序断言红 |
|
||||
| V5② 骰和 ≤ 4 | 行集实例总数纪律带键化(`enemy_table.gd:29` `ROWSET_INSTANCE_MAX`+`unit_container.gd:81-84` 守卫) | Σ(unit_count_max 缺省=unit_count) ≤ 4〔fv19〕 冒烟 S4 | 冒烟 | 同 fv18 读行集面 | 撤销证明:放宽 ≤4 判据/守卫 hunk → 断言红 |
|
||||
| V5① 混编行序 | (2,5) 双行迁 (2,battle,5)、行序 [bugbear→giant_spider] 与文件相邻不变(`enemy.tres`) | 混编 (2,battle,5) 双行行序〔fv18〕 冒烟 S4 `smoke_all.gd:4706-4719` 换代 | 集成 | 冒烟 S4 段读 (2,battle,5) 行集 | 变异:混编两行文件内对调(T3 变异步)→ 行序断言红 |
|
||||
| V5② 骰和 ≤ 4 | 行集实例总数纪律带键化(`enemy_table.gd:29` `ROWSET_INSTANCE_MAX`+`unit_container.gd:81-84` 守卫) | Σ(unit_count_max 缺省=unit_count) ≤ 4〔fv19〕 冒烟 S4 | 集成 | 同 fv18 读行集面 | 撤销证明:放宽 ≤4 判据/守卫 hunk → 断言红 |
|
||||
| V5③ 同带隔断加载拒 | 同 fv9 面(`enemy_table.gd:121-130` rowset_rule 带键化) | 同带隔断加载拒〔fv20〕 `config_db_test.gd`(V2④ 面合用) | 接口 | `validate()` 隔断夹具 | 撤销证明:同 fv9(回退 rowset_rule 键串 hunk → 断言红) |
|
||||
| V6① 首遇带数据驱动定位 | T3 首遇断言定位换代为扫表取该 (L,battle,eid) 最低 depth_band(禁写死坐标,契约 8) | 首遇带=数据驱动最低带〔fv21〕 冒烟 S2/S9 `smoke_all.gd:4692-4697`/`:3406-3411` 换代 | 冒烟 | 冒烟 S2/S9 段扫 `enemy.tres` | 撤销证明:撤销扫表定位 hunk(写回写死坐标)→ 三断言取键失配红;件核零写死坐标(契约 8) |
|
||||
| V6② L2 巨蜘蛛首遇带 | S2 换代:首遇带行集恰一行、`unit_count=2`、无 `unit_count_max`(S2 :4692-4697) | 巨蜘蛛首遇带恰一行固定 2 不加骰〔fv22〕 冒烟 S2 `smoke_all.gd:4692-4697` 换代 | 冒烟 | 同 fv21 扫表定位面 | 变异:巨蜘蛛首遇行加 `unit_count_max: 3`(T3 变异步)→「不加骰」断言红 |
|
||||
| V6③ L1/L3 首遇带固定数 | S9/S5 换代:L1 bugbear 首遇带固定 1、L3 duergar 首遇带固定 1、均无 `unit_count_max` | bugbear/duergar 首遇带固定 1 不加骰〔fv23〕 冒烟 S9 `smoke_all.gd:3406-3411`+S5 `:4747-4759` 换代 | 冒烟 | 同 fv21 扫表定位面 | 变异:首遇行加 `unit_count_max`(T3 变异步同法注入 L1/L3 首遇行)→ 断言红 |
|
||||
| V7 S 清单随动完整 | §8.1 S1–S16(17 行)逐条换代(`smoke_all.gd`/`skill_rhythm_probe.gd`/`damage_probe.gd`/单测三件) | S 清单 17 行无一留旧坐标语义〔fv24〕 清单件核(实现报告逐条勾销)+冒烟/探针全绿 | 冒烟+探针+单元 | 冒烟/探针/`tests/run_all` 全套入口 | 分证变异挂 fv1/fv2/fv7/fv18/fv22(T1–T3 变异步);整面撤销证明:任一 S 条留旧语义(撤销该 hunk)→ 对应断言红 |
|
||||
| V8 hobgoblin 缺口行去向 | `enemy.tres` (1,battle,3,hobgoblin) 留任随迁、行值零变更、缺口登记随行(契约 9:不删行不补立绘) | hobgoblin 在役+缺口登记随行〔fv25〕 冒烟结构断言(V3 面)+git diff 件核 | 接口+件核 | 同 fv11 读表面+`git diff` 件核 | 变异:hobgoblin 迁错带键(T3 变异步,同 fv12)→ 键位断言红;删/补件由 git diff 件核兜 |
|
||||
| V9 反哺点清单 | T4 `reports/iter<N>-反哺点-<完成日>.md` §6 五条各一落点(①敌人系统.md 记法措辞/②关卡节点地图.md :146/③关卡节点图生成.md 推论条款 A/④06 状态回写/⑤roadmap 编入笔) | §6 五条每条有落点〔fv26〕 件核对表(T4 出口) | 件核 | 反哺点清单对 §6 同步面表件核 | 撤销证明:删一落点(如⑤)→ T4 出口件核红 |
|
||||
| V6① 首遇带数据驱动定位 | T3 首遇断言定位换代为扫表取该 (L,battle,eid) 最低 depth_band(禁写死坐标,契约 8) | 首遇带=数据驱动最低带〔fv21〕 冒烟 S2/S9 `smoke_all.gd:4692-4697`/`:3406-3411` 换代 | 集成 | 冒烟 S2/S9 段扫 `enemy.tres` | 撤销证明:撤销扫表定位 hunk(写回写死坐标)→ 三断言取键失配红;件核零写死坐标(契约 8) |
|
||||
| V6② L2 巨蜘蛛首遇带 | S2 换代:首遇带行集恰一行、`unit_count=2`、无 `unit_count_max`(S2 :4692-4697) | 巨蜘蛛首遇带恰一行固定 2 不加骰〔fv22〕 冒烟 S2 `smoke_all.gd:4692-4697` 换代 | 集成 | 同 fv21 扫表定位面 | 变异:巨蜘蛛首遇行加 `unit_count_max: 3`(T3 变异步)→「不加骰」断言红 |
|
||||
| V6③ L1/L3 首遇带固定数 | S9/S5 换代:L1 bugbear 首遇带固定 1、L3 duergar 首遇带固定 1、均无 `unit_count_max` | bugbear/duergar 首遇带固定 1 不加骰〔fv23〕 冒烟 S9 `smoke_all.gd:3406-3411`+S5 `:4747-4759` 换代 | 集成 | 同 fv21 扫表定位面 | 变异:首遇行加 `unit_count_max`(T3 变异步同法注入 L1/L3 首遇行)→ 断言红 |
|
||||
| V7 S 清单随动完整 | §8.1 S1–S16(17 行)逐条换代(`smoke_all.gd`/`skill_rhythm_probe.gd`/`damage_probe.gd`/单测三件) | S 清单 17 行无一留旧坐标语义〔fv24〕 清单件核(实现报告逐条勾销)+冒烟/探针全绿 | 单元+集成+探针 | 冒烟/探针/`tests/run_all` 全套入口 | 分证变异挂 fv1/fv2/fv7/fv18/fv22(T1–T3 变异步);整面撤销证明:任一 S 条留旧语义(撤销该 hunk)→ 对应断言红 |
|
||||
| V8 hobgoblin 缺口行去向 | `enemy.tres` (1,battle,3,hobgoblin) 留任随迁、行值零变更、缺口登记随行(契约 9:不删行不补立绘) | hobgoblin 在役+缺口登记随行〔fv25〕 冒烟结构断言(V3 面)+git diff 件核 | 接口 | 同 fv11 读表面+`git diff` 件核 | 变异:hobgoblin 迁错带键(T3 变异步,同 fv12)→ 键位断言红;删/补件由 git diff 件核兜 |
|
||||
| V9 反哺点清单(**非行为改动**——纯文档产出物,无游戏行为,§9.1) | T4 `reports/iter<N>-反哺点-<完成日>.md` §6 五条各一落点(①敌人系统.md 记法措辞/②关卡节点地图.md :146/③关卡节点图生成.md 推论条款 A/④06 状态回写/⑤roadmap 编入笔) | §6 五条每条有落点〔fv26〕 件核对表(T4 出口) | 非行为改动 | 反哺点清单对 §6 同步面表件核 | 撤销证明:删一落点(如⑤)→ T4 出口件核红 |
|
||||
|
||||
**旧断言预声明(test-conventions §9.5)**——允许改写的旧断言清单及理由:§8.1 S1–S16(17 行)全部条目(理由:遭遇寻址由(关卡序号×节点深度)坐标换代为(关卡序号×row_kind×深度带)带键,断言取键与定位方式随动;标注「断言语义保持」者只换键/定位、判据不动)。除此之外的断言删除/放宽/换下层直调=未声明削弱,停卡呈报、独立审计判红。
|
||||
|
||||
**独立验收审计(test-conventions §9.7,2026-10-21 起)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告实际对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T4 合并前置)。
|
||||
|
||||
|
||||
@@ -217,15 +217,19 @@
|
||||
|
||||
### 8.2 改动—验收对照表
|
||||
|
||||
| 需求点 | 改动 | 验收测试 | 真实入口 | 撤销或变异证明 |
|
||||
|---|---|---|---|---|
|
||||
| 加载校验四检+良构 | `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 红 |
|
||||
| 商店编排冒烟换代 | `smoke_all.gd` `_smoke_shop_graph` 三条性质断言换代 | V5(终点前恰一店/商店数=终点数/全路径恰穿一店,种子扫描) | 冒烟商店段(`python tools/run_smoke.py`) | 变异:终点前驱改非店→①红;路径加第二店→③红 |
|
||||
| 定位信息两样 | `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 红 |
|
||||
| 15 张模板清理 | `level.tres` 三行 `templates` 键删除+模板池代码路径清退 | V9(表断言+件核) | 冒烟表校验段+`git diff` 件核(仅删模板段) | 变异:留一个 `templates` 键→V9 红 |
|
||||
| 反哺点清单 | §6 六条落 `reports/iter<N>-反哺点-<完成日>.md` | V10(件核对表) | T4 产出物件核 | 撤销证明:缺任一落点→V10 件核红 |
|
||||
> 六格齐(test-conventions §9.3);层级列只填 §9.2 四层词(单元/接口/集成/探针),件核是证明方式不是层级;T0 为事实坐实卡(无行为改动),其红证并入 V1(加载判据事实面)与 V8(模板链路事实面);纯产出物行按 §9.1 标「非行为改动」。
|
||||
|
||||
| 需求点 | 改动 | 验收测试 | 层级 | 真实入口 | 撤销或变异证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| 加载校验四检+良构 | `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 红 |
|
||||
| 商店编排冒烟换代 | `smoke_all.gd` `_smoke_shop_graph` 三条性质断言换代 | V5(终点前恰一店/商店数=终点数/全路径恰穿一店,种子扫描) | 集成 | 冒烟商店段(`python tools/run_smoke.py`) | 变异:终点前驱改非店→①红;路径加第二店→③红 |
|
||||
| 定位信息两样 | `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 红 |
|
||||
| 15 张模板清理 | `level.tres` 三行 `templates` 键删除+模板池代码路径清退 | V9(表断言+件核) | 接口 | 冒烟表校验段+`git diff` 件核(仅删模板段) | 变异:留一个 `templates` 键→V9 红 |
|
||||
| 反哺点清单(**非行为改动**——纯文档产出物,无游戏行为,§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.7):合并前由未参与实现的会话或子代理执行——审计入口=只读需求卡片+本对照表+diff+测试文件+实现报告,自跑最窄测试抽查(不采信「已全绿」自述);审计报告文件=`reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」,未通过不得合并。测试执行两入口铁规不变(审计在迭代 loop 内启动的子代理算 loop;另开会话须用户点名)。
|
||||
|
||||
|
||||
@@ -204,25 +204,27 @@
|
||||
|
||||
**闸口径**:轻闸每任务卡出口自跑;批末重闸=`tools/run_all_gates.sh` 按改动域选档(本批碰 `game/` 代码与数据表+测试 → 代码域档)全绿才合并+改前改后读数对拍。回归措辞:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
|
||||
|
||||
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):L1 出口改 2(V2 红)/配比合计 0.5(V2 红)/取数改 `open_stream` 推计数器(V3 counter 无关红)/depth 赋值改最短路径(V3/V6 多终点深度互异或无环红)/产出自证注「终点恒 Boss」(V1 红)/终点前驱改非店(V6 红)/两终点同 depth(V6 红)/岔口两去路同类型(V5 红)/战斗砍低于 battle_floor(V7 红)/生长倒挂(V8 红)/无解路径改返回空图(V4 红)。变异不红则改判据或如实标注拦截边界。
|
||||
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):L1 出口改 2(V2 红)/配比合计 0.5(V2 红)/取数改 `open_stream` 推计数器(V3 counter 无关红)/depth 赋值改最短路径(V3/V6 多终点深度互异或无环红)/产出自证注「终点恒 Boss」(V1 红)/终点前驱改非店(V6 红)/两终点同 depth(V6 红)/岔口两去路同类型(V5 红)/战斗砍低于 battle_floor(V7 红)/生长倒挂(V8 红)/无解路径改返回空图(V4 红)/生成路径强制无岔口(V2/fv9 岔口存在性红)/L1 参数出口置 2 产出侧(fv9 出口计数红)。变异不红则改判据或如实标注拦截边界。
|
||||
|
||||
### 8.2 改动—验收对照表(2026-10-21 验收闭合批新规,test-conventions §9.3)
|
||||
|
||||
> 各新增断言 desc 统一尾缀〔fv#〕(本表「验收测试」列可 grep 定位);撤销/变异证明逐条对应 §8 变异验证伴生与 T1–T3 变异步、T4 件核(每张任务卡至少一条,test-conventions §9.4)。
|
||||
> 各新增断言 desc 统一尾缀〔fv#〕(本表「验收测试」列可 grep 定位);撤销/变异证明逐条对应 §8 变异验证伴生与 T1–T3 变异步、T4 件核(每张任务卡至少一条,test-conventions §9.4)——T0 为事实对齐卡(无行为改动),其事实核对红证并入 fv2(参数档 schema 事实面)与 fv10(RngService 现用法事实面)。层级列只填 §9.2 四层词(单元/接口/集成/探针);件核是证明方式不是层级,留在「撤销或变异证明」格。纯产出物行按 §9.1 标「非行为改动」。
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件:行+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| fv1 产出合格(产出约束五条+结构铁律) | `game/core/node_map_generator.gd`(新建)`validate_output()` 产出侧自证:道路系统/宽度/层高/归属锁定/战斗保底+结构铁律(无环/多入口多终点/每路径恰一入一出) | `node_map_generator_test` 产出合格+违规夹具〔fv1〕 `game/tests/unit/core/node_map_generator_test.gd` | 单元 | `NodeMapGenerator.validate_output(graph)`+`generate(params, seed)` 产前强制 | 变异:产出自证注「终点恒 Boss」→ 非 Boss 终点夹具红(T2) |
|
||||
| fv2 参数档 schema+.tres | `game/data/schemas/level_gen_params.gd`(新建)`validate()`/`row_by_level_index()`;`game/data/tables/level_gen_params.tres`(新建)三行;`game/core/config_db.gd` 注册+访问器 `level_gen_params_row()`(对齐 :20/:142/:245 体例) | `level_gen_params_test` validate+值域+读回〔fv2〕 `game/tests/unit/data_config/level_gen_params_test.gd` | 单元 | `LevelGenParams.validate()`/`ConfigDB.level_gen_params_row()` 直调 | 变异:L1 出口改 2/配比合计 0.5 → 值域、合计 1 断言红(T1) |
|
||||
| fv3 可复现(纯函数+counter 无关) | `node_map_generator.gd` 同(seed, params)逐位同图+counter 无关;`game/core/rng_service.gd` `pure_stream()` 不推 `_counter` | `node_map_generator_test` 可复现(深比较+counter 无关)〔fv3〕 `game/tests/unit/core/node_map_generator_test.gd` | 单元 | `generate(params, seed)` 同种子两次直调 | 变异:取数改 `open_stream` 推计数器 → counter 无关断言红(T2) |
|
||||
| fv4 执行边界(无兜底图/fail-fast) | `node_map_generator.gd` 参数无解致命中止(push_error/assert),无残图、无兜底回退分支 | `node_map_growth_test` 参数无解 fail-fast〔fv4〕 `game/tests/unit/core/node_map_growth_test.gd`+件核(生成器零回退分支) | 单元+件核 | 无解参数档调 `generate(params, seed)`(期望 fatal) | 变异:无解路径改「返回空图」→ fail-fast 断言红(T3) |
|
||||
| fv4 执行边界(无兜底图/fail-fast) | `node_map_generator.gd` 参数无解致命中止(push_error/assert),无残图、无兜底回退分支 | `node_map_growth_test` 参数无解 fail-fast〔fv4〕 `game/tests/unit/core/node_map_growth_test.gd`+件核(生成器零回退分支) | 单元 | 无解参数档调 `generate(params, seed)`(期望 fatal) | 变异:无解路径改「返回空图」→ fail-fast 断言红(T3) |
|
||||
| fv5 岔路取舍两条 | `node_map_generator.gd` `validate_output()` 岔路取舍判据(下一跳类型互异/支路构成互异) | `node_map_generator_test` 岔路取舍两条〔fv5〕 `game/tests/unit/core/node_map_generator_test.gd` | 单元 | `validate_output()` 岔口扫描直调 | 变异:岔口两去路设同类型 → 下一跳断言红(T3) |
|
||||
| fv6 必经恰一店+归属锁定+多终点深度互异 | `node_map_generator.gd` 商店位/归属锁定/多终点 depth 互异判据(契约 2/5) | `node_map_generator_test` 必经恰一店+归属锁定+多终点深度互异〔fv6〕 `game/tests/unit/core/node_map_generator_test.gd` | 单元 | `validate_output()`+DFS 路径枚举/区域可达/depth 比对 | 变异:终点前驱改非店→必经恰一店红、两终点同 depth→深度互异红(T3);depth 赋值改最短路径→互异或无环红(T2) |
|
||||
| fv7 战斗保底 | `node_map_generator.gd` 战斗保底判据(battle_floor) | `node_map_generator_test` 战斗保底〔fv7〕 `game/tests/unit/core/node_map_generator_test.gd` | 单元 | 产图战斗节点计数断言 | 变异:战斗节点砍低于 battle_floor → 战斗保底红(T3) |
|
||||
| fv8 生长递增 | 三档参数档产图读数(`level_gen_params.tres` provisional 域内取值) | `node_map_growth_test` 生长递增三档读数〔fv8〕 `game/tests/unit/core/node_map_growth_test.gd` | 单元 | L1/L2/L3 `generate` 读数对拍 | 变异:L2/L3 参数节点数增幅倒挂 → 生长递增红(T3) |
|
||||
| fv9 含岔口与出口结构(第一关即含岔口/L1 出口恒 1/大岔口自 L2 起) | `node_map_generator.gd` 道路系统/出口归属产出(契约 3) | `node_map_generator_test` 岔口存在性+出口计数+区域结构〔fv9〕 `game/tests/unit/core/node_map_generator_test.gd` | 单元 | 产图结构扫描(三关参数档×固定种子) | —(缺变异注入实验:§8 变异验证伴生与 T1–T3 变异步均未列,如实登记、实施期补) |
|
||||
| fv10 RNG 单点(纯流面) | `game/core/rng_service.gd`(改)新增 `pure_stream(seed_val, scope)` 纯流面(不推 `_counter`、不落日志),生成器取数唯一源 | `node_map_generator_test` counter 不变断言〔fv10〕 `game/tests/unit/core/node_map_generator_test.gd`+件核/静态扫描(零 `randomize()`/零自建 RNG/零 `open_stream`) | 单元+件核 | `RngService.pure_stream()` 直调+`counter()` 前后读数 | 变异:取数改 `open_stream` 推计数器 → counter 不变断言红(T2,与 fv3 同发注入) |
|
||||
| fv11 反哺点清单 | §6 六条反哺点落 `reports/iter<N>-反哺点-<完成日>.md`(T4) | 件核对表〔fv11〕(§6 六条每条一落点)`reports/iter<N>-反哺点-<完成日>.md` | 件核 | T4 产出物件核(六条落点逐条核对) | 撤销:反哺点缺条 → 件核对表不收口(T4,纯文档产物无代码变异) |
|
||||
| fv9 含岔口与出口结构(第一关即含岔口/L1 出口恒 1/大岔口自 L2 起) | `node_map_generator.gd` 道路系统/出口归属产出(契约 3) | `node_map_generator_test` 岔口存在性+出口计数+区域结构〔fv9〕 `game/tests/unit/core/node_map_generator_test.gd` | 单元 | 产图结构扫描(三关参数档×固定种子) | 变异:生成路径强制无岔口(分支密度 0)→ 岔口存在性断言红;L1 参数出口置 2 → 出口计数断言红(T1/T3 变异步,与 fv2 出口值域注入同发) |
|
||||
| fv10 RNG 单点(纯流面) | `game/core/rng_service.gd`(改)新增 `pure_stream(seed_val, scope)` 纯流面(不推 `_counter`、不落日志),生成器取数唯一源 | `node_map_generator_test` counter 不变断言〔fv10〕 `game/tests/unit/core/node_map_generator_test.gd`+件核/静态扫描(零 `randomize()`/零自建 RNG/零 `open_stream`) | 单元 | `RngService.pure_stream()` 直调+`counter()` 前后读数 | 变异:取数改 `open_stream` 推计数器 → counter 不变断言红(T2,与 fv3 同发注入) |
|
||||
| fv11 反哺点清单(**非行为改动**——纯文档产出物,无游戏行为,§9.1) | §6 六条反哺点落 `reports/iter<N>-反哺点-<完成日>.md`(T4) | 件核对表〔fv11〕(§6 六条每条一落点)`reports/iter<N>-反哺点-<完成日>.md` | 非行为改动 | T4 产出物件核(六条落点逐条核对) | 撤销:反哺点缺条 → 件核对表不收口(T4,纯文档产物无代码变异) |
|
||||
|
||||
**旧断言预声明(test-conventions §9.5)**:本卡零旧断言改写——断言面全新建(node_map_generator/growth/level_gen_params 三套新测试),`rng_service.pure_stream()` 为新增纯函数、不触既有断言。实现期确需改旧断言=上游缺陷,停卡呈报;未声明的削弱由独立审计判红。
|
||||
|
||||
**独立验收审计(test-conventions §9.7,2026-10-21 起)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告实际对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T4 合并前置)。
|
||||
|
||||
|
||||
Reference in new issue
Block a user