From 933d67eca74880103aa29858ee035c59397f90fa Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sat, 7 Nov 2026 06:35:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=99=E5=8D=A1(QA=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E4=BD=99=E9=87=8F=E6=94=B6=E5=8F=A3=E6=89=B9=C2=B7=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E6=88=90=E7=AB=8B):=20B4/B5=20=E5=A4=8D=E6=A0=B8?= =?UTF-8?q?=E5=88=86=E6=B5=81=E8=90=BD=E5=8D=A1=E2=80=94=E2=80=94=E9=87=8D?= =?UTF-8?q?=E7=94=9F=E6=88=90=E8=AF=BB=E6=95=B0211=E6=9D=A1(=E6=8A=A5?= =?UTF-8?q?=E5=91=8A212=E7=B3=BBelite=E8=A1=8C=E5=85=A5=E8=A1=A8=E6=BC=82?= =?UTF-8?q?=E7=A7=BB)=E8=A3=81=E5=86=B3=E7=9C=9F=E7=BC=BA=E5=8F=A346?= =?UTF-8?q?=E8=A1=A5=E6=B5=8B(G1=E5=8D=81=E4=B8=83=E8=BF=9D=E7=BA=A6?= =?UTF-8?q?=E8=AF=8Dvalidate=E8=AF=8A=E6=96=AD=E9=9D=A2=E8=B4=9F=E9=9D=A2?= =?UTF-8?q?=E6=96=AD=E8=A8=80/settlement=E9=92=89=E5=80=BC+=E6=8D=A2?= =?UTF-8?q?=E7=AE=97=E7=8E=87=E9=92=89/cap=E6=AE=B5=E4=B8=83=E6=A7=BD?= =?UTF-8?q?=E9=92=89/=E5=B8=83=E5=B1=80=E4=B8=A4=E5=AD=97=E6=AE=B5/?= =?UTF-8?q?=E6=A0=91=E9=9D=A2=E5=9B=9B=E8=A1=8C=E4=B8=80=E7=BB=84/defensiv?= =?UTF-8?q?e=5Fstance=E5=80=BC=E6=96=AD=E8=A8=80/L3=E4=B8=A4=E5=8F=98?= =?UTF-8?q?=E5=BC=82=E8=A1=8C/reward=E7=94=9F=E4=BA=A7=E8=A1=8C=E8=AF=BB?= =?UTF-8?q?=E5=80=BC/cell=5Fmark=E6=A8=A1=E6=80=81=E6=96=AD=E8=A8=80+?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E7=9C=9F=E8=BE=93=E5=85=A5=E5=8A=A8=E7=BA=BF?= =?UTF-8?q?=E6=89=A9=E9=9D=A2=E5=8D=81=E4=BA=8C=E6=AE=B5)+=E8=B1=81?= =?UTF-8?q?=E5=85=8D165=E6=9D=A1=E7=99=BB=E8=AE=B0(=E9=A2=84=E7=95=99?= =?UTF-8?q?=E5=9F=8B=E7=82=B916+=E6=8C=82=E8=B5=B7=E4=BB=B61+=E5=81=87?= =?UTF-8?q?=E7=BC=BA=E5=8F=A3148,=20=E8=B5=B0coverage=5Fexemptions.js?= =?UTF-8?q?=E4=BA=BA=E5=B7=A5=E7=BB=B4=E6=8A=A4)+p=5Fperfect=E6=8E=A5?= =?UTF-8?q?=E7=BA=BF=E8=AF=BB=E8=A1=A8(=E6=95=B0=E5=80=BC=E5=8D=95?= =?UTF-8?q?=E4=B8=80=E4=BA=8B=E5=AE=9E=E6=BA=90=E7=BA=A2=E7=BA=BF,=20?= =?UTF-8?q?=E5=80=BC=E9=92=89+100=E6=A1=A3=E6=B4=BB=E6=80=A7=E6=96=AD?= =?UTF-8?q?=E8=A8=80=E9=98=B2=E6=AD=BB=E6=8E=A5=E7=BA=BF);=20=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=E8=A1=8C=E5=90=8C=E6=89=B9=E5=85=A5=E8=A1=A8(?= =?UTF-8?q?=E6=96=B0=E5=A2=9E3=E8=A1=8C+=E5=8F=97=E5=BD=B1=E5=93=8D3?= =?UTF-8?q?=E8=A1=8C=E6=9B=B4=E6=96=B0,=20=E8=AE=A1=E5=88=92=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=8D=A1=E7=89=87=E9=94=9A=E5=AE=9A);=20grilling?= =?UTF-8?q?=E5=AF=B9=E6=8A=97=E5=A4=8D=E6=A0=B8=E4=B8=80=E8=BD=AE12?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=E5=85=A8=E5=A4=84=E7=BD=AE(=E8=A1=A5?= =?UTF-8?q?=E5=86=999+=E8=87=AA=E5=88=A43,=20=E9=9B=B6=E5=BE=85=E8=A3=81?= =?UTF-8?q?=E7=82=B9),=20=E5=A4=8D=E6=A0=B8=E8=AE=B0=E5=BD=95=E5=9C=A8?= =?UTF-8?q?=E5=8D=A1=C2=A717,=20=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E6=8E=A8=E8=BF=9B=E5=B7=B2=E5=86=99=E5=8D=A1?= =?UTF-8?q?=E3=80=82=E8=AF=BB=E6=95=B0:=20--docs=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=9F=9F=E9=97=B8=E5=85=A8=E7=BB=BF=E3=80=90=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E3=80=91=E6=97=A0=E6=96=B0=E5=A2=9E=E7=BA=A2?= =?UTF-8?q?(=E6=B5=81=E6=B0=B4=E7=BA=BF=E9=97=B8=E7=BA=A2=E9=A1=B90+?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E5=AE=A1=E8=AE=A1=E7=BA=A2=E9=A1=B90,=20?= =?UTF-8?q?=E5=9B=9E=E6=89=A7game/tests/.gates/receipt.json)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/README.md | 10 +- .../需求卡片-QA覆盖余量收口批-2026-11-07.md | 270 ++++++++++++++++++ 待办清单.md | 4 +- 3 files changed, 279 insertions(+), 5 deletions(-) create mode 100644 reports/需求卡片-QA覆盖余量收口批-2026-11-07.md diff --git a/game/tests/README.md b/game/tests/README.md index 2a65b4c9..f8e9c51d 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -86,7 +86,8 @@ tests/ | 技能池数据面与回放独立 | 敌人系统 | `BattleOrchestrator.begin_battle()`(技能池抽号/校验) | `round_flow_skill_pool_test.gd:_smoke_skill_pool_data`;`round_flow_skill_pool_test.gd:_smoke_skill_pool_replay_independence`;`trigger_cond_test.gd:_init`;`pool_case_d_test.gd:_init` | | Boss 半血解锁技门控 | 敌人系统 | `BattleOrchestrator.begin_battle()`(Boss 行) | `skill_unlock_test.gd:_test_gate_predicate`;`skill_unlock_test.gd:_test_latch_irreversible` | | 封印与极性路由/不可逆 | 地图战斗资源×战斗结算 | 效果引擎 × `BattleOrchestrator.begin_battle()` | `seal_polarity_test.gd:_smoke_seal_ap_exhausted`;`seal_polarity_test.gd:_smoke_seal_irreversible_quadrants`;`seal_polarity_test.gd:_smoke_polarity_routing` | -| 变异布置门控 | 地形变异 | `BattleOrchestrator.begin_battle()`(变异布置段) | `variant_placement_test.gd:_smoke_variant_placement`;`variant_placement_test.gd:_smoke_global_variant`;`variant_placement_test.gd:_test_pack_min_from_table` | +| 状态效果施加与行值(减伤/持续/叠层读表) | 战斗结算 | `BattleOrchestrator.begin_battle()`(状态施加段) | `round_flow_skill_pool_test.gd:_check_defensive_stance_values`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | +| 变异布置门控 | 地形变异 | `BattleOrchestrator.begin_battle()`(变异布置段) | `variant_placement_test.gd:_smoke_variant_placement`;`variant_placement_test.gd:_smoke_global_variant`;`variant_placement_test.gd:_test_pack_min_from_table`;`variant_placement_test.gd:_test_l3_rockfall_minedust_rows`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | **旅程段四:奖励、经济与局外成长** @@ -101,7 +102,8 @@ tests/ | 锻造与相邻通道隔离(祝福件购买锻造零变化/默认轴与钥匙解耦/甲型切换双轴可感) | 锻造工坊×元进度 | `MetaProgression.forge_select()`/`hero_type_axes()`/商店购买口 | `meta_progression_forge_test.gd:_test_blessing_no_forge_leak`;`meta_progression_forge_test.gd:_test_default_axes_pre_key`;`meta_progression_forge_test.gd:_test_armor_switch_dual_axes` | | 天赋树购买与六键合成 | 天赋树 | `MetaProgression.tree_buy()`/`MetaStateStore.tree_state()`/`MetaStateStore.set_tree_level()` | `meta_progression_forge_test.gd:_smoke_tree`;`meta_progression_forge_test.gd:_smoke_tree_rules`;`tree_rules_v11_test.gd:_init`;`tree_requires_level_test.gd:_init` | | 规则键参数读表(六键参数字典校验与激活侧透传) | 天赋树 | `MetaTreeTable.validate()`/`EffectEngine.rebuild()`/`MetaProgression.tree_rules()` | `tree_rules_v11_test.gd:_test_rule_key_params` | -| 秘宝结构冻结与 12 件效果 | 秘宝 | `TreasureItems.add_item()`/`query_inventory()`/`validate_use()` | `treasure_items_test.gd:_init`;`treasure_effects_test.gd:_init` | +| 天赋树节点行值与侧投影(秘宝匣钥匙门/零刷新/fork 两行/侧名与脉络投影) | 天赋树 | `MetaProgression.tree_buy()` 真链读生产行 | `meta_progression_forge_test.gd:_check_ks_workshop_row`;`meta_progression_forge_test.gd:_check_fork_side_projection`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | +| 秘宝结构冻结与 12 件效果 | 秘宝 | `TreasureItems.add_item()`/`query_inventory()`/`validate_use()` | `treasure_items_test.gd:_init`;`treasure_effects_test.gd:_init`;`treasure_effects_test.gd:_test_rap_transfer_row_e2e`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | **旅程段五:排雷循环** @@ -143,7 +145,7 @@ tests/ | 站桩显示档与素材分辨率绑定 | 战斗表现 | `StandeeBody.portrait_probe()`/`StandeeMotion.PORTRAIT_DISPLAY_H` | `standee_present_values_test.gd:_check_display_tier` | | B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) | HUD框架 | `BattleStageView.set_board_type()` | `stage_background_test.gd:_test_background_selection`;`stage_background_test.gd:_test_ground_layer_geometry`;`stage_background_test.gd:_test_beams_retired` | | 动画帧数规格(待机/攻击/受击;现役单帧形制锚定) | 战斗表现 | `UiKit.load_tex()`(`TEX_HERO_*` 四态件装载链——棋盘站立/行走与舞台三态同源) | `animation_frame_spec_test.gd:_test_spec_table`;`animation_frame_spec_test.gd:_test_current_form` | -| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula` | +| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula`;`stage_background_test.gd:_test_ap_bar_height_from_table`/`_test_log_band_settle_height`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | | 调参测速批量模拟(逐帧步进与统计读数) | 调参测量 | `TuneSimController.run()`(调试浮窗批量模拟入口) | `tune_sim_batch_parity_test.gd:_init`(配对对拍套件) | | sim 驱动循环单点(缺省零变化与策略/日志回调形态) | 调参测量 | `BattleDriver.drive_round()`(两参缺省与五参回调两形态) | `battle_driver_drive_test.gd:_smoke_drive_round_contract` | | 模拟玩家 0 格连锁算子(经真实闭包,零盲挖语义保持) | 调参测量×排雷玩法 | `AutoPlayer._deduce()`(经 `perfect_action()` 装配链) | `auto_player_deduce_test.gd:_smoke_zero_chain_rule` | @@ -170,6 +172,7 @@ tests/ | 终局结算框关闭动线零引擎报错 | 战斗表现 | fx_probe/screen_flow_probe 真实败走关闭动线(`BattleEndOverlay.open_defeat()` → `BattleEndOverlay.close()`)孤立直跑,日志零报错行读数 | `fx_probe.gd:_ready`(计划测试——需求卡片「QA harness 缺陷与覆盖遗漏收口批」2026-11-06 锚定) | | 停手钮真输入命中与停手收轮落效 | 行动经济 | ui_click_probe 使能窗真输入点击(AP 条停手钮经 `ProbeUiUtil.push_click()`)+journey_player 全线跑批(sim) | `ui_click_probe.gd:_stoptest_tick`(计划测试——需求卡片「QA harness 缺陷与覆盖遗漏收口批」2026-11-06 锚定) | | 停点链与控件级真输入命中 | HUD框架 | 探针与测试宿主真输入驱动(节点继续/三选一选卡·确认/弃图刷新确认/奖励刷新/地图候选矩形中心/调试浮窗钮,一律经 `ProbeUiUtil.push_click()`/`push_click_at()` 进 `push_input`) | `ui_click_probe.gd:_ready`(停点链段——计划测试,需求卡片「QA harness 缺陷与覆盖遗漏收口批」2026-11-06 锚定) | +| 控件动线扩面真输入可达(图例关闭/节点继续/三选一与商店/秘宝架/树高档与先手/弃图链/地图放弃/进入下一层/Esc 设置/减动效开关)+cell_mark 模态断言 | HUD框架×各屏 | 合成 InputEvent 经 `Viewport.push_input()` 真点(`ProbeUiUtil.push_click_at()`;扩面十二段,高档钮经调试注钥使能) | `ui_click_probe.gd:_ready`(动线扩面段);`ui_struct_probe.gd:_ready`(cell_mark 段)(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | **旅程段七:数据配置与跨系统契约** @@ -181,6 +184,7 @@ tests/ | 运行期越域致命与进程非 0 退出 | 数据配置 | `BoardGenTable.resolve_row()`/`ConfigDbResolver.resolve_enemy_rowset()` | `config_db_fatal_oob_test.gd:_trigger_oob`;`config_db_resolver_test.gd:_test_request_oob` | | 加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域/效果类型出域 | 数据配置×秘宝×奇物 | `ConfigDB.load_tables()` | `reward_dangling_treasure_test.gd:_init`;`counter_prefix_fatal_test.gd:_assert_rejected`;`treasure_target_violation_test.gd:_init`;`effect_kind_retired_test.gd:_assert_rejected`;`extended_row_violation_test.gd:_init` | | 表结构守卫:域校验/行序键/跨字段互锁/配额锚 | 数据配置×敌人系统×地形变异×冒险结构 | `EnemyTable.validate()`/`VariationTable.variant_pool()`/`AdventureTable.validate()` | `table_structure_guard_test.gd:_smoke_enemy_bands`;`table_structure_guard_test.gd:_smoke_variation_framework`;`table_structure_guard_test.gd:_smoke_adventure_table`;`table_structure_guard_test.gd:_test_feat_cap_required` | +| schema 违约词拒绝路径与关键表值钉(空表/冻结/出域/白名单/settlement 钉/cap 段七槽钉) | 数据配置×战斗结算 | 各表 schema `validate()` 直调注入坏行(`BoardGenTable.validate()` 同款面)/表行读值 | `schema_vocab_violation_test.gd:_check_empty_tables`;`table_structure_guard_test.gd:_check_settlement_pin_values`;`table_structure_guard_test.gd:_check_curio_cap_segment_pins`(计划——需求卡片「QA覆盖余量收口批」2026-11-07 锚定) | | 变异表头域校验(地形变异) | 地形变异 | `VariationTable.validate()` | `table_structure_guard_test.gd:_test_variation_header_domains` | | 难度修饰套乘:空表零行为/套乘生效/越域 clamp | 难度曲线与Boss | `UnitContainer.spawn()`/`ConfigDbResolver.resolve_difficulty_modifiers()` | `table_structure_guard_test.gd:_smoke_difficulty_table`;`config_db_resolver_test.gd:_test_difficulty_clamp` | | Boss 出场门控(每区域恰一 Boss 终点/Boss 节点开战必选 Boss 行集) | 难度曲线与Boss | `NodeMapGenerator.generate()`/`BattleOrchestrator.begin_battle()` | `node_map_generator_test.gd:_test_boss_exit_per_region`;`boss_gate_test.gd:_test_boss_node_spawns_boss_rowset` | diff --git a/reports/需求卡片-QA覆盖余量收口批-2026-11-07.md b/reports/需求卡片-QA覆盖余量收口批-2026-11-07.md new file mode 100644 index 00000000..f3745988 --- /dev/null +++ b/reports/需求卡片-QA覆盖余量收口批-2026-11-07.md @@ -0,0 +1,270 @@ +# 需求卡片——QA 覆盖余量收口批(B4/B5 复核分流落地) + +> **日期**:2026-11-07 / **批名**:QA覆盖余量收口批 / **预计**:≈8.25 个工作日(区间 7–10.5,切分预案见 §7 尾) +> **来源**:待办清单「QA harness 覆盖遗漏余量——B4 本体缺口与 B5 控件零命中缺口复核分流」(2026-11-07 登记,P0,待写卡)。 +> **唯一事实源**:本卡为需求性工程条目,设计事实源=证据指认(见 §2)。 +> **验收档:中**(失败后果=验证承载面静默弱化,玩家不可见、无状态残留;触多档按最高档申报口径取中)。 + +## 1. 目标与完成定义 + +把 QA harness 覆盖余量(B4 本体对账缺口 211 条/62 类+B5 控件级零真输入命中)逐条复核分流后的结论落地: + +- **真缺口**(46 条,附录 A):补验证——数据表违约词负面断言、表值钉、行为值断言、屏可见性断言、探针真输入动线扩面。 +- **豁免**(165 条,附录 B):登记进 `tools/coverage_exemptions.js`(假缺口/预留埋点/挂起件三类),面板亮豁免灯不亮缺口灯。 +- **完成定义**:①附录 A 全部真缺口有对应断言落地并跑绿;②附录 B 全部条目入豁免清单且带 reason;③重跑 `python tools/coverage_enum.py` 与两探针,本体缺口清单清零(未豁免未补测=0)+ui_click/screen_flow 零命中集合与附录 C 豁免面一致;④单元测试全套件绿(新增套件+被触碰套件)+场景探针绿。 + +## 2. 设计事实源 + +需求性工程条目(改测试承载面与一处结算接线),跳过设计线,证据指认: + +- 待办清单条目「QA harness 覆盖遗漏余量——B4 本体缺口与 B5 控件零命中缺口复核分流」(`待办清单.md`,2026-11-07 登记,P0,状态待写卡)。 +- 登记处证据:`reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md`(B4=`game/tests/.gates/coverage/ontology_gaps.js`+覆盖面板第四节;B5=`probe_hits_ui_click.js`/`probe_hits_screen_flow.js` 的 seen−hit 差集;诚实边界=:42 假缺口假覆盖须人工逐条复核)。 +- 本卡写卡段复核分流逐条裁决=附录 A(真缺口 46 条)/附录 B(豁免 165 条)/附录 C(B5 零命中 94 键归并裁决),由两名未参与撰写的只读子代理分裁决+写卡人按普查口径与代码事实校准(校准记录见 §17 复核记录)。 + +## 3. 现状事实(代码级,开工自行复核) + +- **对账工具语义**:`tools/coverage_enum.py:14-22` 枚举五源(表行/schema 词表与字段/场景按钮/自绘命中类/屏与模态),断言文料=`tools/extract_checks.py` 提取的 unit+system_test 全量;`:127` 按 id 文本包含记关联。诚实边界自述=假缺口(断言测了但文本没带 id)与假覆盖(文本带 id 但断言弱)。 +- **B4 数据**:`game/tests/.gates/coverage/ontology_gaps.js`(2026-11-07 05:22 重生成)=870 实体/缺口 211 条(62 分组中 40 组带缺口)。QA 报告记 212 条——elite 行随迭代 54 卡 3 入表致数据漂移 1 条,本卡以重生成读数为准。 +- **B5 数据**:`probe_hits_ui_click.js`(seen 91/真输入命中 38 次·去重 27 键)与 `probe_hits_screen_flow.js`(seen 116/真输入命中 25 次·去重 19 键),生成于 2026-11-06T07:55——**早于迭代 54 合回**,其零命中集合含已修复项(停手钮)。两文件键形双源:BaseButton pressed 走场景路径键(`…camp_scene_view/Control#chest`),营地自绘物件走 `camp_object#chest` 裸键——同一物件两键形。 +- **iter54 已收口不重做**:A1/A2/B1/B2 随迭代 54 卡 1 完成(能力行 `game/tests/README.md:170-172` 计划测试已转实锚);停手钮真输入已落(`ui_click_probe.gd:_stoptest_tick`)。 +- **p_perfect 脱节**:表值 200 在册(`game/data/tables/settlement.tres:29`,域 `{100,200}` 冻结于 schema),GDD 句声称读表(`design/gdd/systems/战斗循环/战斗结算.md:124`),实现为结构硬编码不读表(`game/core/reward_grant.gd:418-421`)——触「数值单一事实源」红线,本批接线读表(§7 T2,值若相等=行为零漂移)。 +- **equivalence_ref_damage 运行时零消费**:表值 4 在册(`game/data/tables/settlement.tres:34`),唯一消费=离线审计工具手工镜像常量(`tools/clear_dominance_audit.py:39` D_REF=4),零测试钉——漂移即审计口径静默失效。 +- **cap 段半钉**:`game/tests/unit/table_structure_guard_test.gd:114-115` 只钉 `curio_cap("gp")==99`/`curio_cap("attack")==99`,其余七 cap 槽零断言;quota 段 13 槽与 value 段 13 槽已由和锚+逐槽钉值承载(`:104-113`)。 +- **树面**:购买钮禁用态由 `can_buy` 驱动(`game/presentation/views/tree_view.gd:74`)——高档钮在探针存档内不可负担=禁用=真输入不可达,须经调试注钥后驱动;fork 组只走 fg_posture 正例与 fg_sense/fg_mastery 反例(`meta_progression_forge_test.gd:588,620,622-631`),fg_economy 组零断言。 +- **变异**:`variant_placement_test.gd:29-30` 只布 L1/L2——第三关两行(rockfall/mine_dust,`variation.tres` deep_underdark)零放置零断言。 +- **秘宝 rap_transfer_mult**:消费接线在役(`game/core/grant_segment.gd:301`),行为测试用字面量 125 直调数学面未装配真实行(`treasure_effects_test.gd:128-146`)——行值变更零测试失败。 +- **状态行 defensive_stance**:同族状态行有值断言先例(`round_flow_skill_pool_test.gd:944,1119` empower/off_guard),本行零。 +- **豁免清单机制现成**:`tools/coverage_exemptions.js`=人工维护、面板与工具只读、每条必带 reason(`:1-4`);`coverage_enum.py:145` 明写「人工核销走豁免清单,不落本文件」。 +- **预留埋点口径**:`reports/普查-效果通道与事件词零现役-2026-11-06.md` §1/§2——词表先行内容后接,零现役词面全部保留;秘宝表旧词 9 个「迁移完成」收尾待用户另裁(不在本批)。 + +## 4. 设计契约(违反即返工,🔴 触碰=L3 停机) + +- 🔴 **禁变异类测试与撤销类取证**——人为制造红属伪造证据(test-conventions §8.4);每条断言从真实入口进入、判据绑被测改动特有的可观测提交面。 +- 🔴 **豁免清单只手工编辑**——`tools/coverage_exemptions.js` 禁代码生成、禁随跑覆写(文件头纪律);每条豁免必带 reason,无理由条目面板标红。 +- 🔴 **探针驱动一律走真输入管线**——合成 InputEvent 经 `push_input`、press+release 成对(test-conventions §2);信号直发只许〔接线断言〕位并当场标注。 +- 🔴 **G1 违约注入走 validate 诊断面、禁混进现役非负面套件**——本卡全部违约词经各表 schema `validate()` 直调取 errs 断言(非致命通道,不进 manifest negative 名单);若实装发现某违约词只在 load_tables 致命通道暴露,停机呈报另立独立负面套件(test-conventions §5.6)。 +- 🔴 **数值单一事实源**——p_perfect 接线只经 ConfigDB 既有读法取 `settlement_core_table` 行值;禁自建 `load()`、禁第二处数值字面量。 +- 🔴 **实现批禁写 `design/` 与根规则文件与 `game/tests/README.md`**——能力行已随本卡(写卡段)入表;收尾核对发现名实不符=停卡呈报(回表走写卡段通道,实现段不自行改表)。 +- 🔴 **测试削弱零申报不发生**——本批零删除断言;G8 的合成行断言一律保留、新增生产行断言并存(申报面见 §8 尾)。 +- 🔴 **拆分边界沿职责轴**(code-conventions §1.1)——新增负面套件=「schema 违约词拒绝路径」单一职责一件;禁为凑对照表行数拆碎或为省文件混装无关违约。 + +## 5. 范围边界 + +**收件**:附录 A 真缺口 46 条的验证补齐+p_perfect 接线+附录 B 165 条豁免登记+附录 C B5 探针动线扩面(十二动线组+cell_mark 屏断言)。 + +**不收件(去向在案)**: + +- 普查在册预留词不重开:本批新认定预留词(ap_grant/risk/cell_removal/neq/hero_hp_pct/slot_cost/chain_ap_cost/move_ap_cost/ap_rounds_front/effective_rounds/mine_hit_halve/reflect_damage/refresh_pick/reward_weight_bias)随附录 B 豁免,词面不动;秘宝表旧词 9 个「迁移完成」收尾归普查条目待用户裁,不属本批。 +- `settlement_review_overlay` 挂起死件不动(生涯条目承载处置两途)。 +- iter54 已收口面(A1/A2/B1/B2/B3/B6)不重做;停手钮零命中属数据陈旧,随附录 C 排除。 +- 覆盖面板与 `coverage_enum.py`/登记件本体零改动——B5 双源键形差异以人工复核记录(附录 C)承载,键形改造若要做归工程批另行登记。 +- 未入探针 seen 的屏(如关卡结算屏族)不在 B5 对账面(登记件完备性边界在案);cell_mark_overlay 因属 B4 屏类真缺口仍收(探针补断言)。 +- 豁免≠放弃:预留埋点词未来接线内容时须撤豁免补验证(撤豁免动作随接线批走)。 + +## 6. 关联文档同步面 + +| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | +|---|---|---| +| `design/gdd/systems/战斗循环/战斗结算.md` v1.8 | :124 完美第二份兑付「读表」句——接线后该句由声称变属实 | 零文本改动义务;若 T2 核对发现硬编码值≠表值(L3 案),反哺点登记句义与实现形态冲突 | +| `game/tests/README.md`(能力清单) | 本批新增能力行与代表用例更新 | **已随本卡入表**(写卡段义务,随卡同一 worktree 提交);实现照单落名,名实不符=停卡退回 | + +反哺点清单随实现报告落 `reports/iter-反哺点-<日期>.md`(预期零条,上表第一行为条件触发)。 + +## 7. 任务卡 T0..T11 + +**卡前·文件结构图**(每个文件一行:路径+职责+行为改动标注): + +| 文件 | 职责 | 行为改动 | +|---|---|---| +| `game/core/reward_grant.gd`(存量触碰) | 完美第二份兑付改读 ConfigDB 表值(:418-421 硬编码点) | 是(接线,值相等则可观测零漂移)→ 对照表 V10 | +| `game/tests/unit/schema_vocab_violation_test.gd`(新增) | G1 十六违约词 validate 诊断面断言 | 非产品码(测试承载)→ V1 | +| `game/tests/unit/table_structure_guard_test.gd`(存量触碰) | +4 检查函数:settlement 钉值/cap 段七槽钉值/reward stacks 行钉/meta per_level 钉 | 非产品码 → V2/V3/V8/V16 | +| `game/tests/run_all.gd`(存量触碰) | manifest 登记新套件 `schema_vocab_violation_test`(`_suites()` 显式枚举面,:167-175) | 非产品码(套件注册) | +| `game/tests/unit/adventure_feats_test.gd`(存量触碰) | +1 检查函数:feat_ticket_quota 配额满分支 | 非产品码 → V4 | +| `game/tests/unit/treasure_effects_test.gd`(存量触碰) | +1 检查函数:rap_transfer_mult 真行端到端 | 非产品码 → V5 | +| `game/tests/unit/stage_background_test.gd`(存量触碰) | +2 检查函数:AP 条高/结算日志带高读表断言 | 非产品码 → V6 | +| `game/tests/unit/meta_progression_forge_test.gd`(存量触碰) | +4 检查函数:ks_workshop/ks_refresh/fork 两行/fork 侧投影 | 非产品码 → V7 | +| `game/tests/unit/round_flow_skill_pool_test.gd`(存量触碰) | +1 检查函数:defensive_stance 值断言 | 非产品码 → V9 | +| `game/tests/unit/variant_placement_test.gd`(存量触碰) | +1 检查函数:L3 两变异行放置+效果 | 非产品码 → V11 | +| `game/tests/unit/seal_polarity_test.gd`(存量触碰) | +2 检查函数:enemy_alert/ap_drain 生产行读值 | 非产品码 → V12 | +| `game/probe/ui_click_probe.gd`(存量触碰) | 动线扩面十二段(附录 C 真缺口面) | 测量面 → V13 | +| `game/probe/ui_struct_probe.gd`(存量触碰) | cell_mark_overlay 可见性/模态断言段 | 测量面 → V14 | +| `tools/coverage_exemptions.js`(存量触碰) | 附录 B 165 条登记 | 工程配套(面板配置,随批) | + +### T0 开工(0.25 日) +- [ ] worktree 内拷导入缓存三件套,`git status` 归属核对 +- [ ] 改前读数锚:`python tools/coverage_enum.py`(缺口 211 读数)+两探针跑批落 `.gates`(零命中基线)+单元全套件绿读数 +- [ ] 读数写进本步提交信息 + +### T1 G1 schema 违约词负面断言(1.0 日) +- [ ] 新增 `game/tests/unit/schema_vocab_violation_test.gd`:七个检查函数——`_check_empty_tables`(八表空行集注入→errs 含 empty_table)、`_check_settlement_vocab`(missing_segment/pperfect_oob/segorder_violation 三注入)、`_check_zero_flat_guard`(feat+treasure 两表 zero_flat 白名单违约注入)、`_check_keystone_cost_domain`(meta attune 行 keystone_cost 域外注入)、`_check_use_phase_domain`(treasure use_phase 出域注入,覆盖 active_dig 枚值面)、`_check_solver_frozen`(board_gen solver_rules="single" 注入→frozen 拒,同钉 single_subset 冻结语义)、`_check_meta_tree_load_bearing`(meta_tree 彩蛋 cap>3 违约注入→category=load_bearing) +- [ ] 注入形态沿在役先例 `load(schema).new()` 新实例+行注入(`meta_progression_forge_test.gd:581` 同款)——禁改共享 Resource(避引擎 Gotcha:共享 Resource 池污染) +- [ ] 每检查函数带 `# oracle:` 注记锚 `design/engineering/test-conventions.md:67` +- [ ] `game/tests/run_all.gd` `_suites()` manifest 登记新套件(缺登记则全套件不含本件) +- [ ] 验证:单件直跑绿(读数入提交信息) + +### T2 G2 结算数值钉与 p_perfect 接线(0.75 日) +- [ ] 核对 `reward_grant.gd:418-421` 硬编码值与表值 200 相等,读数落本步提交信息;不等→**停机呈报(L3)** +- [ ] 接线:`reward_grant.gd` 完美第二份兑付改读 `ConfigDB` settlement_core 行(行为零漂移) +- [ ] `table_structure_guard_test.gd` +`_check_settlement_pin_values`:equivalence_ref_damage==4 钉(含工具镜像一致性注记)+p_perfect==200 钉+**读数活性断言**(注入域内另一档 p_perfect=100 后兑付倍率随表值变化——防「接线但弃用」死接线的假绿) +- [ ] `table_structure_guard_test.gd` +`_check_meta_per_level_pins`:per_level_shift_pct 三关档 6/9/1 钉(换算率档漂移保护) +- [ ] `treasure_effects_test.gd` +`_test_rap_transfer_row_e2e`:装配 reserve_jar 生产行→attune 注入→断言转移倍率==行值 125(替字面量路径作行值主证) +- [ ] 验证:触碰套件直跑绿+结算相关套件绿 + +### T3 G3 cap 段七槽钉值+配额满分支(0.75 日) +- [ ] `table_structure_guard_test.gd` +`_check_curio_cap_segment_pins`:curio_cap 七槽(ap/armor/heal/max_hp/rap/refresh/time_sand)逐槽读表钉值(与 gp/attack 同款) +- [ ] `adventure_feats_test.gd` +`_check_ticket_quota_exhausted`:票配额售满后不再出现分支(读生产 `feat_ticket_quota`==2 驱动) +- [ ] 验证:两套件直跑绿 + +### T4 G4 布局字段断言(0.5 日) +- [ ] `stage_background_test.gd` +`_test_ap_bar_height_from_table`/`_test_log_band_settle_height`:经 `BattleLayoutTable` 读 `ap_bar_h`/`log_band_h_settle`,断言真实装配视图几何==表值(装配链经生产读点 `ap_bar_view.gd:35`/`battle_log_view.gd:24`) +- [ ] 验证:套件直跑绿 + +### T5 G5 天赋树行与投影断言(1.0 日) +- [ ] `meta_progression_forge_test.gd` +`_check_ks_workshop_row`(秘宝匣钥匙门行:前置/零价/购买后投影)、`_check_ks_refresh_row`(零刷新分支行值)、`_check_fork_rows`(fork_sense/fork_economy 行值经 tree_buy 真链)、`_check_fork_side_projection`(fg_economy 组切换投影+name_a/name_b 侧名+spine 脉络读行断言) +- [ ] 验证:套件直跑绿 + +### T6 G6 状态行值断言(0.25 日) +- [ ] `round_flow_skill_pool_test.gd` +`_check_defensive_stance_values`:−25% 减伤/2 结算持续/叠层行为(对生产行,同族 :944 先例形态) +- [ ] 验证:套件直跑绿 + +### T7 G7 L3 变异行(0.5 日) +- [ ] `variant_placement_test.gd` +`_test_l3_rockfall_minedust_rows`:第三关 deep_underdark 带 rockfall(flat_damage 3)/mine_dust(hide_number)放置+效果断言 +- [ ] 验证:套件直跑绿 + +### T8 G8 reward 行读值改断(0.5 日) +- [ ] `seal_polarity_test.gd` +`_check_enemy_alert_production_row`/`_check_ap_drain_production_row`:读生产 reward 行值断言(现断言为内联合成行,保留不动) +- [ ] `table_structure_guard_test.gd` +`_check_reward_row_pins`:stacks 生产行值钉 +- [ ] 验证:套件直跑绿 + +### T9 G9+B5 探针扩面(2.0 日) +- [ ] `ui_struct_probe.gd` +cell_mark_overlay 段:开态 visible+遮挡物隐藏模态断言(锚 test-conventions §2 模态条款) +- [ ] `ui_click_probe.gd` +动线扩面十二段(附录 C 真缺口面,全部真输入):图例关闭/节点继续/curio 确认+继续+刷新/商店购买+刷新/秘宝架购买10·25·装配·升级30/树面购买0·高档(调试注钥)·先手压制(fork B 侧)/弃图刷新→确认弃图→确认弹窗/地图放弃/进入下一层/Esc 浮窗设置/减动效开关(store 态断言) +- [ ] 每动线钉「落点」判定(到哪屏/哪层可见),防空转假绿 +- [ ] 验证:两探针直跑绿+`.gates` 零命中差集对附录 C 收敛读数 +- [ ] 套件耗时核对:扩面后探针单件耗时仍在 run_all 截止内(默认 120s,`game/tests/README.md` Running Tests 节),超则按白名单重排段序仍超→L2 记录并呈报 + +### T10 豁免登记与对账(0.5 日) +- [ ] `tools/coverage_exemptions.js` 登记附录 B 165 条(ontology 逐 id+reason,分组照抄附录)+附录 C 豁免面 controls 条目 +- [ ] 复跑 `coverage_enum.py`+两探针:缺口清单=零(未豁免未补测=0)读数入提交信息 +- [ ] 验证:面板打开无红示警(无 reason 缺失条目) + +### T11 产出物落位卡(0.25 日) +- [ ] `reports/iter-实现报告-<日期>.md`:各卡状态+实机目检总清单(探针动线扩面屏点选段)+遗留读数义务+实现决定记录 +- [ ] `reports/iter-反哺点-<日期>.md`:预期零条(§6 条件触发除外) +- [ ] 批末:能力行名字与实际落地核对——名实不符=停卡呈报(回表走写卡段通道) + +**切分预案**:超软盒(>10.5 日)先砍 T9 高档购买钮与先手段(树面 B4 行断言 V7 仍在),余量挂待办清单登记后续批。 + +## 8. 验证闸(改动—验收对照表) + +| # | 需求点(判据出处行锚) | 改动 | 验收测试(名称+落点+尾缀〔QA余 Vn〕) | 层级 | 真实入口 | 判据绑定面 | 能力行 | +|---|---|---|---|---|---|---|---| +| V1 | 十七违约词拒绝路径(`design/engineering/test-conventions.md:67`) | 新增 `schema_vocab_violation_test.gd` 七函数+run_all manifest 登记 | `schema_vocab_violation_test.gd:_check_empty_tables` 等 7 函数 | 单元 | 各表 schema `validate()` 直调注入坏行/坏词表 | errs 类别串恰含目标违约词(逐注入独立可判红) | 新增:schema 违约词拒绝路径与关键表值钉(空表/冻结/出域/白名单/settlement 钉/cap 段七槽钉) | +| V2 | equivalence_ref_damage 钉 4(`design/engineering/test-conventions.md:119`) | `table_structure_guard_test.gd` +函数 | `table_structure_guard_test.gd:_check_settlement_pin_values` | 单元 | 表行读值 | 表值==4(漂移即红) | 新增:schema 违约词拒绝路径与关键表值钉(空表/冻结/出域/白名单/settlement 钉/cap 段七槽钉) | +| V3 | cap 段七槽钉值(`design/engineering/test-conventions.md:119`) | 同上文件+函数 | `table_structure_guard_test.gd:_check_curio_cap_segment_pins` | 单元 | `adventure_table.curio_cap()` 读数 | 七槽逐槽==表值 | 新增:schema 违约词拒绝路径与关键表值钉(空表/冻结/出域/白名单/settlement 钉/cap 段七槽钉) | +| V4 | feat_ticket_quota 配额满分支(`design/engineering/test-conventions.md:133`) | `adventure_feats_test.gd` +函数 | `adventure_feats_test.gd:_check_ticket_quota_exhausted` | 单元 | `AdventureRunner.present_node_curio()` 链 | 售满后 ticket_appeared 恒 false | 既有:专长(奇物)授予与凭证保底 | +| V5 | rap_transfer_mult 行值端到端(`design/engineering/test-conventions.md:133`) | `treasure_effects_test.gd` +函数 | `treasure_effects_test.gd:_test_rap_transfer_row_e2e` | 单元 | `TreasureItems.add_item()`→attune 装配链 | 注入 RAP 增量==行值 125 | 既有:秘宝结构冻结与 12 件效果 | +| V6 | AP 条高/结算带高读表(`design/engineering/test-conventions.md:133`) | `stage_background_test.gd` +两函数 | `stage_background_test.gd:_test_ap_bar_height_from_table`;`_test_log_band_settle_height` | 单元 | 生产读点(`ap_bar_view.gd:35`/`battle_log_view.gd:24`)经装配夹具 | 视图几何==表值 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | +| V7 | 树面四行一组断言(`design/engineering/test-conventions.md:133`) | `meta_progression_forge_test.gd` +四函数 | `_check_ks_workshop_row`;`_check_ks_refresh_row`;`_check_fork_rows`;`_check_fork_side_projection` | 单元 | `MetaProgression.tree_buy()` 真链 | 行值/投影值==生产表行 | 新增:天赋树节点行值与侧投影(秘宝匣钥匙门/零刷新/fork 两行/侧名与脉络投影) | +| V8 | reward stacks 行钉(`design/engineering/test-conventions.md:119`) | `table_structure_guard_test.gd` +函数 | `table_structure_guard_test.gd:_check_reward_row_pins` | 单元 | 表行读值 | 生产行 stacks==表值 | 新增:schema 违约词拒绝路径与关键表值钉(空表/冻结/出域/白名单/settlement 钉/cap 段七槽钉) | +| V9 | defensive_stance 值断言(`design/engineering/test-conventions.md:133`) | `round_flow_skill_pool_test.gd` +函数 | `round_flow_skill_pool_test.gd:_check_defensive_stance_values` | 单元 | `BattleOrchestrator.begin_battle()`(状态施加段) | 减伤/持续/叠层==行值 | 新增:状态效果施加与行值(减伤/持续/叠层读表) | +| V10 | p_perfect 读表接线(`design/engineering/test-conventions.md:133`+`design/gdd/systems/战斗循环/战斗结算.md:124`) | `reward_grant.gd:418-421` 改读 ConfigDB | `table_structure_guard_test.gd:_check_settlement_pin_values`(值钉+p_perfect=100 活性断言)+`seal_polarity_test.gd` 既有真实流完美双份兑付段(:330-401)跑绿 | 单元 | 完美兑付路径(ConfigDB 出口) | 兑付倍率==表值且随表值变化(活性);字面量 grep 零残留为辅证(结构接线形态 grep 不判死接线,主证=活性断言) | 既有:轮内流与结算五段全序 | +| V11 | L3 两变异行(`design/engineering/test-conventions.md:133`) | `variant_placement_test.gd` +函数 | `variant_placement_test.gd:_test_l3_rockfall_minedust_rows` | 单元 | 变异布置段 | 两行放置可达+效果通道命中 | 既有:变异布置门控 | +| V12 | enemy_alert/ap_drain 生产行(`design/engineering/test-conventions.md:133`) | `seal_polarity_test.gd` +两函数 | `_check_enemy_alert_production_row`;`_check_ap_drain_production_row` | 单元 | 效果引擎兑付链读生产行 | 断言真值依赖生产行值 | 既有:封印与极性路由/不可逆 | +| V13 | 十二动线真输入可达(`design/engineering/test-conventions.md:37`) | `ui_click_probe.gd` 动线扩面 | `ui_click_probe.gd:_ready`(扩面段) | 探针 | 合成 InputEvent 经 `push_input` 真点 | 每动线落点可见性断言+登记件 hits 增键 | 新增:控件动线扩面真输入可达(图例关闭/节点继续/三选一与商店/秘宝架/树高档与先手/弃图链/地图放弃/进入下一层/Esc 设置/减动效开关)+cell_mark 模态断言 | +| V14 | cell_mark_overlay 模态断言(`design/engineering/test-conventions.md:35`) | `ui_struct_probe.gd` +段 | `ui_struct_probe.gd:_ready`(cell_mark 段) | 探针 | 真实实例化+开层动线 | 开态 visible+遮挡物隐藏 | 新增:控件动线扩面真输入可达(图例关闭/节点继续/三选一与商店/秘宝架/树高档与先手/弃图链/地图放弃/进入下一层/Esc 设置/减动效开关)+cell_mark 模态断言 | +| V15 | 豁免登记对账清零(`design/engineering/test-conventions.md:119`) | `tools/coverage_exemptions.js` +165 条 | T10 对账读数(`coverage_enum.py` 缺口=0+探针差集=附录 C 豁免面) | 工具直跑 | 工具最小参数全路径 | 读数落 `.gates` 且与附录一致 | 既有:全表装载、就绪态与表清单目录对账 | +| V16 | per_level_shift_pct 三关档钉(`design/engineering/test-conventions.md:119`) | `table_structure_guard_test.gd` +函数 | `table_structure_guard_test.gd:_check_meta_per_level_pins` | 单元 | 表行读值 | 三关档值==6/9/1 | 新增:schema 违约词拒绝路径与关键表值钉(空表/冻结/出域/白名单/settlement 钉/cap 段七槽钉) | + +**独立验收审计**:合回前由未参与实现的会话或子代理执行——审计入口=本卡 §8 对照表+实现报告实际对照表+diff+测试文件,报告落 `reports/iter-验收审计-<日期>.md`;验收档=中,深度按 test-conventions §8.7 中档执行;未过不合回。 + +- **测试方式两分法**:V1–V12/V15=调试接口直改数据(单元面);V13/V14 动线=探针真输入;**用户目检项**=探针动线扩面十二段的屏面观感(登记实现报告目检总清单,登记不阻塞)。 +- **回归措辞**:里程碑步(T 段)出口跑一次该步触碰套件+关联套件;波内修复只做出红最小单元最窄确认;新增测试先行孤立验证再并入全套。 +- **闸口径**:本批改动含 `game/` 非文档行为载体(reward_grant.gd)→ 批末跑代码域闸(冒烟+单元+探针+渲染/静态);批末另有改前改后读数对拍(T0 锚 vs T10 复跑)。 +- **测试削弱申报**:零删除断言、零放宽阈值;G8 合成行旧断言保留并存(非削弱);停手钮零命中排除=iter54 已修非本批动作。 + +## 9. 异常分级 + +- L1 自救(一次重试):探针动线偶发超时、导入缓存陈旧。 +- L2 记录继续:断言尾缀撞号(就地改号记录)、豁免 reason 文案微调。 +- L3 停机写报告等用户:①p_perfect 硬编码值≠表值 200(spec-实现冲突深化)②新增件超 §14 预算=机检预算互斥,上游缺陷停卡退回写卡段 ③某动线真输入打不到目标控件(到达性失败,非等待参数问题)④validate 直调与 schema 现行签名不符 ⑤某违约词只在致命通道暴露(§4 第 4 条)。 + +## 10. 代拍板白名单 + +断言消息尾缀取号与撞号改号;检查函数归并既有套件内的落点微调;探针动线段内等待帧数与滚入参数;豁免 reason 文案微调(语义不变);T9 动线段顺序重排(集合不变)。 + +## 11. 待裁点 + +**零待裁点,开工门=U0**。复核中两处分叉已按自判落定(记录见 §17):①p_perfect 接线方向=修实现读表(数值单一事实源红线唯一答案;硬编码值==表值时行为零漂移);②B5「探针未打开过的屏」口径=零命中集合经并集归并后不存在该类条目(全部落在已开屏或开发面),无需另立豁免口径。 + +## 12. 落位与可复用性预检 + +- **复用面**:46 条真缺口的验证全部落既有套件文件(table_structure_guard/adventure_feats/treasure_effects/stage_background/meta_progression_forge/round_flow_skill_pool/variant_placement/seal_polarity)+两既有探针——零新增产品码文件、零新增数据件;唯一新增件=`schema_vocab_violation_test.gd`,不能复用既有件的理由:现役套件先例两形态——致命通道专件(manifest negative,如 treasure_target_violation_test)与单表 validate 诊断面(level_table_validate_test)——本批十七违约词跨十二表的**违约词族集中面**与任一先例职责不同(单一变化原因=违约词族增删,code-conventions §1.1),拆散塞进各表既有套件会把集中义务打散成十二处触点;独立成件是职责轴切分,不是 §5.6 强制(validate 诊断注入本不触 §5.6)。 +- **唯一面**:豁免登记唯一落点 `coverage_exemptions.js`;对账唯一工具 `coverage_enum.py`(零改动);p_perfect 表值读取唯一经 ConfigDB 出口;同名检查函数零重复(grep 计划名逐一核过)。 +- **分层与交互面**:V10 接线在 core 内经 ConfigDB 既有读法(Core 零 UI 依赖不破);V4/V11 走 AdventureRunner 真链不经 UI;探针扩面只增段不改既有段(既有动线零回归风险面=探针文件内新增);测试面全落 `game/tests/unit`+`game/probe`(静态扫描 S 系面外,test-conventions §1.1 三元组归位:新增单元套件+探针段)。 + +## 13. 禁为机检文本保留无效成员 + +本批零重构拆件;豁免登记的 id 串是**面板消费的数据**非代码成员——禁为对账清零读数而登记无理由豁免(面板标红机制兜底);机检键(能力行代表用例名)与实现落地名互斥时停卡呈报,禁自造第三条路。 + +## 14. 实现规范预算 + +- **新增件三查**(`schema_vocab_violation_test.gd`):①公开方法计划 8(`_ready`+7 个 `_check_*`)≤20 ✓;②成员变量计划 ≤5(夹具表句柄与 errs 收集)≤15 ✓;③迁移函数:无迁移。 +- **存量触面一查**:触碰的 10 个测试件+run_all.gd(manifest 增一行)+1 个探针件均为纯增量(+1~+4 函数,零删改既有函数)——S13 键较登记值只降不升预期成立(无键新增:新增函数不涉 gdstyle 基线键面;探针/测试件不在 S9 扫描面,code-conventions §4.13)。 +- **指标例外通道**:无申报。 + +## 15. 拆分边界纪律 + +本批唯一新增件(`schema_vocab_violation_test.gd`)职责语句=「schema 词表违约词的拒绝路径集中断言面」——单一变化原因=违约词族增删;集体身份=「违约词拒绝」可命名;八表空表注入并函数承载属同一违约类别(empty_table)的八实例,非凑计数袋。禁实现段为对账读数好看而把无关断言塞进该件(发现即 L3 第②条)。 + +## 16. 验收档申报 + +**验收档:中**(头部已申报;用户 U0 时确认或改判)。审计深度按 test-conventions §8.7 中档执行:对照表逐行核对全量、判据绑定面抽查、最窄测试复跑省略(以远端 CI 现查读数代证)。 + +## 17. 复核记录 + +| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 | +|---|---|---|---|---| +| 0(写卡段复核分流) | 两名未参与撰写的只读子代理(Explore)分裁 B4 零命中 92 条与有命中 119 条;写卡人按普查口径与代码事实校准(推翻 2 条:skill neq/treasure cell_removal 属预留埋点;修正 7 条:ap_grant/risk/min_safe_count/indeg/terminals 等按消费事实与预留口径改判) | 裁决与代码事实的偏差(子代理未见普查报告、未查生产消费点) | 自判 | 写卡人逐条以 file:line 复核后定案(附录 A/B/C 底稿);分歧记录=`game/tests/.gates/coverage/review_scratch_b4.txt`(写卡段过程件,不入 git) | +| 1(grilling 对抗复核) | 未参与撰写的只读子代理(Explore),九审点全过+godot-master NEVER/Gotchas/性能预算对照 | ①hits 数 38/25 系事件数非键数 ②settlement.tres :29/:34 行号错位 ③action_economy.gd 跨 :64-68 ④meta_tree load_bearing 漏列附录 A(附录 A 实数 44 非 46)⑤V10 回归套件指错(settle_segments 无完美兑付断言)⑥V10 grep 判据抓不到死接线 ⑦run_all.gd manifest 触碰面漏列 ⑧回表通道三处口径不一 ⑨附录 B 草稿残留(未决问号/terminals 重复)⑩per_level_shift_pct 无验收行 ⑪「62 类」歧义 ⑫§12 复用论据半错 | 补写×9(①②③④⑤⑥⑦⑨⑩)+自判×3(⑧⑪⑫) | ①§3 改「38 次·去重 27 键/25 次·去重 19 键」②:29/:34 更正③:64-68 更正④G1 增第 17 词、真缺口实数修为 46(44+load_bearing+per_level)⑤V10 回归面改指 `seal_polarity_test.gd:330-401`⑥T2/V10 增 p_perfect=100 读数活性断言、grep 降辅证⑦结构图/T1/§12/§14 增 run_all.gd manifest 登记面⑧§4/T11 统一「名实不符=停卡呈报,回表走写卡段通道」(依据 test-conventions §8.3)⑨附录 B 残留清理⑩V16 行+T2 步骤+结构图+预算计数⑪改「62 分组中 40 组带缺口」⑫§12 论据改职责轴切分(单表 validate 诊断面先例 level_table_validate_test 在案,code-conventions §1.1) | +| 1 后(处置自查) | 写卡人(12 处置点逐条回读卡内落地) | 零残留(12/12 落地;待裁 0、退回上游 0) | 自判 | 本节即凭据;卡片成立,进入提交 | + +**零待裁点,开工门=U0**(§11 两处自判依据:architecture.md「数值单一事实源」条款与 QA 报告 :47 完备性边界在案)。 + +--- + +## 附录 A:B4 真缺口明细(46 条,验证落点见 §7/§8) + +**G1 违约词(17)**:empty_table×8(board_gen/enemy/level/meta/reward/shop/skill/status_effect——`trigger_cond_test.gd:46` 仅类别过滤非违约路径);settlement missing_segment/pperfect_oob/segorder_violation(`settlement_table.gd:23,37-38,63-64` 零负面件);feat zero_flat(`feat_table.gd:47` 零负面件);treasure zero_flat(`treasure_item_table.gd:110-112` 零负面件);meta keystone_cost(guard :147/:151 系 treasure unlock_keystone_cost 子串误命中);treasure use_phase+active_dig(schema :106-108 出域分支零注入);board_gen solver_rules+single_subset(`:57-60` frozen 分支零注入);meta_tree load_bearing(彩蛋 cap>3 违约分支零注入,`meta_tree_table.gd:65`)。 +**G2 结算/秘宝数值(3)**:equivalence_ref_damage(运行时零消费、工具镜像零钉);rap_transfer_mult(接线在役、测试字面量);p_perfect(硬编码不读表——接线)。 +**G3 adventure cap/配额(8)**:curio_cap ap/armor/heal/max_hp/rap/refresh/time_sand 七槽(guard :114-115 只钉 gp/attack);feat_ticket_quota(`curio_deck.gd:115` 配额满分支零测试)。 +**G4 布局(2)**:ap_bar_h(`ap_bar_view.gd:35` 消费零断言);log_band_h_settle(`battle_log_view.gd:24,44,58` 消费零断言)。 +**G5 天赋树(8)**:ks_workshop(零断言);ks_refresh(`tree_requires_level_test.gd:52` 仅注释);fork_sense/fork_economy(零断言);fg_economy/name_a/name_b(零断言);spine(`screen_flow_probe.gd:430` 夹具喂几何非语义)。 +**G6–G9(5)**:defensive_stance(零值断言);rockfall/mine_dust(L3 零放置零断言);enemy_alert/ap_drain(合成行未读生产行,`trigger_cond_test.gd:130-133`/`seal_polarity_test.gd:772-773`);cell_mark_overlay(仅封装扫描,无实例化可见性断言);reward stacks(合成行键未读生产行)。 +**G10 换算率钉(1)**:per_level_shift_pct(运行时零消费、离线 verifier 消费端 `tools/balance_verifier.py:77-103`,值 6/9/1 零内容断言——钉值防标定漂移)。 + +## 附录 B:豁免登记清单(约 165 条,执行计数以尾注与 T10 登记清单为准——`tools/coverage_exemptions.js` ontology 逐 id+reason) + +- **豁免·预留埋点(16)**——词表先行内容后接(普查 §2 同口径):action_economy chain_ap_cost/move_ap_cost(schema 冻结 0,`game/core/action_economy.gd:67-68` 零调用方);skill hero_hp_pct(TRIGGER_FACTS 在册、skills.tres 零行使用);skill neq(普查算子词预留在册);treasure ap_rounds_front/effective_rounds/mine_hit_halve/reflect_damage/refresh_pick/reward_weight_bias/slot_cost/ap_grant/risk/cell_removal(EFFECT_KINDS/MAGNITUDE_KINDS/DIMENSIONS 在册、tres 零行使用或普查旧词在案)。 +- **豁免·挂起件(1)**:settlement_review_overlay(全仓零引用,生涯条目承载)。 +- **豁免·假缺口(148)**——验证在役、文本关联盲区,按族登记(reason 逐族): + - adventure quota 段 13 槽+value 段 13 槽:和锚/逐槽钉值在役(`table_structure_guard_test.gd:104-113`、`feat_vouchers_test.gd:44-124`)。 + - cap_gp/cap_attack 两槽:钉值在役(`:114-115`)。 + - feats 22 行+6 计数行(echo_seals/smith_seals/fuse_pts/round_instinct_atk/round_digs/round_blast_spent):`adventure_feats_test.gd:608-759` 逐行行为断言+父专长通用通道读值。 + - enemy/skills harden/venom_spit/shield_bash/hook_horror:`round_flow_skill_pool_test.gd:548-625` 池构成与 EV 锚+`table_structure_guard_test.gd:227-236` 键序。 + - reward heal_backlash/pierce_snare/magic_recoil/gp_lose:`seal_polarity_test.gd:755-758`+guard `:506-530`。 + - meta_tree att_socket2/att_socket3/currency/effects_a/effects_b/requires_level/sense_sharp/zero_flat(`meta_progression_forge_test.gd:634-638`+tree_rules_v11/tree_requires_level/负面反例承载)。 + - 屏与模态 8 屏(battle_end/camp_esc/curio_pick/legend/level_map/node_overlay/save_select/settings):探针真实入口可见性/真输入断言在役(ui_struct_probe/ui_click_probe/screen_flow_probe/reward_overlay_test 各段)。 + - 词表杂项:pity_threshold/min_safe_count(生产消费+行为承载)/atk_max/atk_min/initial_owned/per_level_gain/price_ratio_pct/type_axis/battle_ratio/fork_ways_max/rest_ratio/reward_ratio/shop_ratio/indeg/terminals/rest_heal_pct/gp_drops/price_a/pool_shelf/mult_oor_warning/round_direction/wall_band/canvas/gate_gap/hud_band_h/hotspot_key/texture_rect/log_band_h_dig/info_panel_w/info_visible_layers/curio_candidate_count/feat_ticket_chance/feat_ticket_limit/feat_ticket_pity_step/quota_segment/cap_segment/value_segment/seal_place_ap_cost/per_level_bonus/reserve_jar。 + - treasure 现役词 11(use_phase 归 G1;area_3x3/board_wide/dimension_tags/load_bearing/remove_mines/passive/ap_charge_safe/charge_reset/charges_per_adventure/mine_count_preview/refresh_stock_grant/shop_refresh_bonus/unlock_keystone_cost):`treasure_effects_test`/`treasure_target_violation_test`/guard 现役承载。 + +> 注:per_level_shift_pct 已归附录 A 真缺口(G10);本附录为按族分组登记,T10 执行清单=重生成缺口集与本卡裁决的逐 id 差集(211−46),以登记时逐 id 清单为准。 + +## 附录 C:B5 零命中裁决(并集口径:两探针 hits 归一化〔去尾序位+折叠空锚段〕后取交集) + +- **排除(2 类非缺口)**:ap_bar 停手钮——iter54 卡 1 已修(数据 2026-11-06 早于合回);camp_object 七物件裸键——与场景路径键双源同物,并集后七件全命中(forge/notebook/campfire 由 screen_flow 承载)。 +- **豁免·开发面(9 键)**:debug_overlay 八钮+`(root)/Button#调试`——发布态恒隐玩家不可达面。 +- **豁免·进程终结(2 键)**:MenuScreen 退出游戏/camp_esc 退出游戏——真点即杀探针进程,按〔接线断言〕承载(既有结构断言在位)。 +- **豁免·并集已覆盖(screen_flow 单侧零命中 17 键)**:status_panel 继续/settings 返回/confirm 取消·次选项/save_select 返回/forge 返回营地/图例钮/board_zone 状态/level_map 状态/树面解锁25·购买10·购买20/MenuScreen 进入存档等——ui_click 侧 hits 在案。 +- **真缺口·动线扩面(十二组,T9)**:图例关闭;节点继续;curio 确认选择+继续+刷新钮;商店购买+刷新钮;秘宝架购买10/购买25/装配/升级30;树面购买0/购买30/40/60(调试注钥后真点)/先手压制(fork B 侧);弃图刷新+确认弃图(→确认弹窗);地图放弃;进入下一层;Esc 浮窗设置;减动效开关(settings 两枚 switch_toggle);cell_mark_overlay 屏断言(并入 V14)。 diff --git a/待办清单.md b/待办清单.md index 78101bc5..11426bf1 100644 --- a/待办清单.md +++ b/待办清单.md @@ -293,11 +293,11 @@ #### QA harness 覆盖遗漏余量——B4 本体缺口与 B5 控件零命中缺口复核分流(2026-11-07 登记,来源=批次移交,优先级=P0) -**实况**:前条「QA harness 三批缺陷与覆盖遗漏收口」已编卡部分(A2/B1/B2)随迭代 54 卡 1 完成整条删除,A1 随同批营地交互修复批消(均合回提交 5b5e6297,git 历史可考)。余量=B4 缺陷本体缺口 212 条、B5 控件零命中缺口,人工复核后分流(真缺口立卡/假缺口豁免清单核销);B3 精锚归「测试面真输入化分期」条目、B6 判据收紧轮归复核轮,不在本条。B5 增补实例(iter54 审计观察)=覆盖登记件自动登记通道=BaseButton pressed+营地自绘物件两源,地图画布与 bcard 非 BaseButton 真输入命中不产键。证据=reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md(八类逐条带文件行号与登记处指针)。 +**实况**:前条「QA harness 三批缺陷与覆盖遗漏收口」已编卡部分(A2/B1/B2)随迭代 54 卡 1 完成整条删除,A1 随同批营地交互修复批消(均合回提交 5b5e6297,git 历史可考)。余量=B4 缺陷本体缺口 212 条、B5 控件零命中缺口,人工复核后分流(真缺口立卡/假缺口豁免清单核销);B3 精锚归「测试面真输入化分期」条目、B6 判据收紧轮归复核轮,不在本条。B5 增补实例(iter54 审计观察)=覆盖登记件自动登记通道=BaseButton pressed+营地自绘物件两源,地图画布与 bcard 非 BaseButton 真输入命中不产键。证据=reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md(八类逐条带文件行号与登记处指针)。2026-11-07 写卡段复核分流定案:重生成读数 211 条(报告 212 系 elite 行入表漂移)→真缺口 46 条补测/豁免 165 条登记,零待裁点;卡片(reports/需求卡片-QA覆盖余量收口批-2026-11-07.md)落 reports/。 **改动面**:游戏代码 -**状态**:待写卡 +**状态**:已写卡 #### 闸机超时守卫缺陷修复——gate_run_timeout 标志文件恒真(2026-11-06 登记,来源=批次移交)