diff --git a/game/presentation/armed_timer.gd b/game/presentation/armed_timer.gd index 1d0f305e..fe8bd67a 100644 --- a/game/presentation/armed_timer.gd +++ b/game/presentation/armed_timer.gd @@ -1,5 +1,5 @@ ## 武装确认计时器:三处二次确认(AP 条弃图刷新/选路放弃钮/战斗总结结算框)共用的计时+脉冲机制,视觉各自保留。 -## 探针接缝禁动:AP 条 press_refresh_for_probe/confirm_visible/press_confirm_for_probe 三缝与结算框挂起态的组合根读写面。 +## 探针接缝禁动:AP 条 is_refresh_ready()/confirm_visible()/refresh_remaining_text() 三读缝与结算框挂起态 settlement_stop_timer 的组合根读写面。 ## 减动效档判据单点 motion_still()——视觉层共用此处取相位/静态化,禁各自内联 motion_scale 判断。 class_name ArmedTimer extends RefCounted diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index f4deee69..224a0600 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -371,7 +371,7 @@ func apply_status(payload: Dictionary) -> void: _map.bonus_row.visible = bool(payload["bonus_row_visible"]) or _map.feat_value.text != "" -# ---- 图上命中(布局决策 2——唯一提交通道;探针 press_candidate 同路径) ---- +# ---- 图上命中(布局决策 2——唯一提交通道;探针经 candidate_rect 取热点真点同路径) ---- # 拖拽与点击以拖动距离阈值区分(布局决策 5):按下起跟踪拖距,超阈值进拖拽态逐帧平移视口, # 抬杆不提交;未超阈值的完整点击(按下→抬杆)=提交沿——命中候选即提交,语义零改动。 diff --git a/game/probe/ui_click_probe.gd b/game/probe/ui_click_probe.gd index 01c0506b..446fa902 100644 --- a/game/probe/ui_click_probe.gd +++ b/game/probe/ui_click_probe.gd @@ -788,7 +788,7 @@ func _ready() -> void: if not cap_found: _problems.append("地图屏加成帽未换代为「属性值提升」(wa2)") # 选路定向(卡⑤ d4——wa4 转正的必达前提):候选含奖励节点优先选(真实 - # press_candidate 命中路径零变化,只改索引策略);无奖励候选回退交替(岔路使用率观测面保留) + # candidate_rect 命中路径零变化,只改索引策略);无奖励候选回退交替(岔路使用率观测面保留) # 迭代 55 B5 扩面——节点继续段未测时休息候选最优先(node_overlay 仅休息停点开启) var pick := _route_clicks % 2 if main.run_scope.runner != null: diff --git a/game/probe/ui_input_probe.gd b/game/probe/ui_input_probe.gd index 1b7111b0..c9df8ca9 100644 --- a/game/probe/ui_input_probe.gd +++ b/game/probe/ui_input_probe.gd @@ -36,7 +36,7 @@ func _ready() -> void: await get_tree().process_frame # ---- ⑫ 图上命中真实输入(回归闸):入口停点候选节点中心 # push_input 真实鼠标路径 motion+click → 悬停预承诺置位 → route_chosen 到达组合根。 - # 由来=真机 bug:深层节点(L1 Boss 内容 x=802)在固定画布命中区外,press_candidate 直调 + # 由来=真机 bug:深层节点(L1 Boss 内容 x=802)在固定画布命中区外,旧视图方法口直调 # 命中函数探针全绿、真鼠标点不中——本 case 封住输入管线,⑬封住几何拟合。 if main.ui.modals.run.level_screen.visible: var ro = main.ui.modals.run.level_screen diff --git a/game/probe/ui_struct_probe.gd b/game/probe/ui_struct_probe.gd index d7f3b989..4af85ef6 100644 --- a/game/probe/ui_struct_probe.gd +++ b/game/probe/ui_struct_probe.gd @@ -267,7 +267,7 @@ func _ready() -> void: # ---- 节点结算层(旧模态、首过结构族):rest 兑付真路径开 #(组合根 _open_modal 登记册+show_rest 合成喂入)→结构断言族→continue_pressed 信号真路径关 - #(press_continue→组合根 _on_node_continue→_close_modal)。 + #(真点继续钮→组合根 _on_node_continue→_close_modal)。 main.ui.flow.open(main.ui.modals.run.node_overlay) main.ui.modals.run.node_overlay.show_rest(3, 15, 20) _settle() diff --git a/game/tests/unit/presentation/reward_overlay_test.gd b/game/tests/unit/presentation/reward_overlay_test.gd index 42556ea7..d30ef8b3 100644 --- a/game/tests/unit/presentation/reward_overlay_test.gd +++ b/game/tests/unit/presentation/reward_overlay_test.gd @@ -65,7 +65,7 @@ func _run() -> void: ProbeUiUtil.push_click(root, ov._refresh_btn) # 真点刷新钮(disabled 守卫=真实拒绝路径) if not _req("真点刷新未外发 refresh_requested", refreshed.size() == 1): return - # ② 点选→高亮→确认外发(真输入管线:bcard gui_input 点选——与 press_card 同一 _select_card 处理器);确认前改选以最后点选为准 + # ② 点选→高亮→确认外发(真输入管线:bcard gui_input 点选→玩家点选同一 _select_card 处理器);确认前改选以最后点选为准 ProbeUiUtil.push_click_at(root, (ov._bcards[0] as Control).get_global_rect().get_center()) ProbeUiUtil.push_click_at(root, (ov._bcards[1] as Control).get_global_rect().get_center()) await process_frame # 确认钮现形当帧容器重排在途——排版帧后矩形成形再真点 diff --git a/reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md b/reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md index d03cdbb4..086ace6a 100644 --- a/reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md +++ b/reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md @@ -29,12 +29,12 @@ ### B2 视图层测试方法面未真输入化 - **现象**:弃图刷新确认链(press_refresh_for_probe/press_confirm_for_probe)、地图候选(press_candidate)、节点与三选一停点(press_continue/press_card/press_confirm)等驱动走视图方法口,非输入管线——保「逻辑通」不保「玩家点击可达」。 -- **登记处**:待办清单「测试面真输入化分期与存量断言逐条精锚」条目①余项;C 的两方法口在归因字段如实标注通道。 +- **登记处**:已收口——视图方法口 41 处全清转真输入+死接缝 11 方法清理(iter54-卡1,提交 96123978);C 的两方法口在归因字段如实标注通道。 ### B3 存量 996 条断言判据出处精锚 - **现象**:链式锚已保可核(capability_audit 链断 0),逐条出处粒度精锚未做。 -- **登记处**:同上条目②,原样在案。 +- **登记处**:判据换代后收口——现行规格把出处注记粒度定在**验证函数**(test-conventions §8.3「测试函数的判据出处注记」,2026-11-06 立;非逐条断言),内容锚改版见提交 a69310b7(604 条注记挂 `<文档>「节名」<行关键词>`);机检=`tools/capability_audit.py` 判据出处注记道。 ### B4 本体对账缺口 212 条/62 类 diff --git a/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md b/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md index 16444b1b..4d292015 100644 --- a/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md +++ b/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md @@ -362,15 +362,15 @@ |---|---|---|---|---|---|---| | 1. D 区侧栏+提示条退役(判据:`design/ux/battle.md「Layout Zones」side_rail_w`、`design/gdd/systems/表现与支撑/HUD框架.md「战斗屏三区双舞台:挖掘与结算同屏不切场景」D 区全高归棋盘`) | `battle_layout_table.gd`、`battle_layout.tres`、`ap_bar_view.gd`、`board_zone_view.gd:23-37,74-79,91-92` | `board_side_rail_test.gd:_test_side_rail_layout`+`_test_signals`;`stage_background_test.gd:_test_side_rail_width_from_table`;`layout_probe.gd:_ready` | 单元+探针 | `BoardZoneView.new(layout)`→`ap_bar`/`_board_area`(测试读私有) | 左/右栏各宽 200、board_area 高 548、`side_rail_w==200`、hint 节点不存在、toast 不压棋盘 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | | 2. 格边/原点/顶预留/重建接线(判据:`design/ux/battle.md「Layout Zones」棋盘格尺寸公式`) | `board_view.gd:205-232,403-404,428-439`、`main.gd:470`、`main_debug_flow.gd:104` | `board_terrain_test.gd:_test_cell_formula_base`+`_test_hit_test_logical_rect`;`layout_probe.gd:_ready`;`ui_input_probe.gd` | 单元+探针 | `BoardView.set_cell_area(Vector2(1036,548), 200)`/`rebuild(..., 200)` | `_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`、局部原点 (279,44)/(281,44)、屏幕 (523,296)、全格命中 | 新增:棋盘点击命中与格边公式(逻辑格矩形) | -| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|材质与装饰`) | `board_terrain_layer.gd`(新增)、`board_view.gd`、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry`+`_test_material_assets_present`+`_test_material_vs_structure`;`standee_present_values_test.gd:_init`(V11 源码锚改指 `board_terrain_layer.gd`);三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()`→`_world/TerrainBack`、`_world/TerrainFront` 的 `mass_rects()`/`tex_paths_for()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;6 张 512×512 贴图在库且被消费、相邻格 UV 连续;V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 4. 投影/崖面/受光(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|受光与崖面`) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios`;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘 1px 受光口沿+1px 深墨线、东崖 4×55、北/西 1+1+外2、南/东内阴影 3×1、崖面无贯通岩层线、南向投影 4×4 α0.25/0.16/0.09/0.04、东向 α0.22/0.14/0.07/0.04 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 5. 脚底排序遮挡(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|绘制序与遮挡`) | `board_terrain_layer.gd`、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order`;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]`/`CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | -| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|浮空数字`、`design/ux/battle.md「D 区布局与棋盘画法预览」浮空字`) | `board_float_layer.gd`(新增)、`board_label_shadow_layer.gd`(新增) | `board_float_label_test.gd:_test_label_geometry`+`_test_shadow_circle`+`_test_contrast`;`ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()`→`FloatLayer.set_entries()`/`_world/LabelShadow.setup()` | 字高 21(墨高)、间距 15、视觉顶 38、线 2(格顶−12..+4,接圆上缘)、1px 投影;**绘制基线 = 矩形底边、行 y 按步距(格边+2)**;圆 10×6、圆心格顶+7、z=0 低于 hero;**封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) | +| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md「3.2 环境几何」材质与装饰`) | `board_terrain_layer.gd`(新增)、`board_view.gd`、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry`+`_test_material_assets_present`+`_test_material_vs_structure`;`standee_present_values_test.gd:_init`(V11 源码锚改指 `board_terrain_layer.gd`);三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()`→`_world/TerrainBack`、`_world/TerrainFront` 的 `mass_rects()`/`tex_paths_for()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;6 张 512×512 贴图在库且被消费、相邻格 UV 连续;V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 4. 投影/崖面/受光(判据:`design/art/art-bible.md「3.2 环境几何」受光与崖面`) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios`;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘 1px 受光口沿+1px 深墨线、东崖 4×55、北/西 1+1+外2、南/东内阴影 3×1、崖面无贯通岩层线、南向投影 4×4 α0.25/0.16/0.09/0.04、东向 α0.22/0.14/0.07/0.04 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 5. 脚底排序遮挡(判据:`design/art/art-bible.md「3.2 环境几何」绘制序与遮挡`) | `board_terrain_layer.gd`、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order`;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]`/`CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | +| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md「3.2 环境几何」浮空数字`、`design/ux/battle.md「D 区布局与棋盘画法预览」浮空字`) | `board_float_layer.gd`(新增)、`board_label_shadow_layer.gd`(新增) | `board_float_label_test.gd:_test_label_geometry`+`_test_shadow_circle`+`_test_contrast`;`ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()`→`FloatLayer.set_entries()`/`_world/LabelShadow.setup()` | 字高 21(墨高)、间距 15、视觉顶 38、线 2(格顶−12..+4,接圆上缘)、1px 投影;**绘制基线 = 矩形底边、行 y 按步距(格边+2)**;圆 10×6、圆心格顶+7、z=0 低于 hero;**封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) | | 7. 浮空层最顶/顶行不裁切(判据:`design/ux/battle.md「D 区布局与棋盘画法预览」禁裁切`) | `board_view.gd` 层装配、`board_float_layer.gd` | `board_float_label_test.gd:_test_topmost_layer`+`_test_desaturation`;三关截图 | 单元+探针 | `BoardView` 固定名字子件 z 序与 entries/`set_desaturated()` | `FloatLayer` 为 BoardView 子 Control、z 最高;`TerrainBack`/`TerrainFront`/`LabelShadow` 固定名字在树;顶行 rect top=6 local;无元素遮数字/线;结算期浮空层与地形层同拍灰化 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) | | 8. 顶面锚点/封印/交互(判据:`design/art/art-bible.md「3.2 环境几何」封印印记`、`design/ux/battle.md「封印格呈现预览」色牌`) | `board_view.gd`、`cell_mark_overlay.gd`、`seal_mark_layer`、`cell_type_glow_layer`、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor`+`_test_seal_substrate`;`seal_mark_params_test.gd`;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.visual_rect`/`CellUnit.z_index`/封印格 `plate` | **封印圆心=逻辑格心(不偏移)**、变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;封印格 `plate=true`、`glyph` 为危/数字、无浮空/无圆、色牌叠法阵上;封印格 z=0 低于小人,其余格件北 0/南 3 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | | 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md「6.5 视野迷雾与黑暗区域渲染」记忆态`) | `board_cell_unit.gd:_draw_fog_layer`/`MemoryGround`、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect`+`_test_memory_cover`;`ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.fog_state`/`MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);封印格记忆态随格隐没;封印格地面=palette.light_edge;记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) | | 10. 命中逻辑格(判据:`design/ux/battle.md「Layout Zones」格边按公式现算`) | `board_view.gd:428-439` | `board_terrain_test.gd:_test_hit_test_logical_rect` | 单元 | `BoardView.cell_center_local()`/`_cell_at()` | 全格 `_cell_at(cell_center_local(c))==c`;顶面左上角点按逻辑归北/西邻格;板外 (-9,-9) | 新增:棋盘点击命中与格边公式(逻辑格矩形) | -| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|旧资产处理`) | `game/assets/art/board/`、`tile_palette.gd`、`cell_base_layer.gd`、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path`;`repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*`、零 `TilePalette`/`CellBaseLayer`/`u.base`、`seal_mark.png` 与 6 张 `board_rock_*`/`board_ground_*` 在库、普通数字零 `plate_digit`/`_digit_ink_mode`(封印格 `plate`/`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 | +| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md「3.2 环境几何」旧资产处理`) | `game/assets/art/board/`、`tile_palette.gd`、`cell_base_layer.gd`、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path`;`repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*`、零 `TilePalette`/`CellBaseLayer`/`u.base`、`seal_mark.png` 与 6 张 `board_rock_*`/`board_ground_*` 在库、普通数字零 `plate_digit`/`_digit_ink_mode`(封印格 `plate`/`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 | | 12. 侧栏信号/setter(判据:`design/ux/battle.md「Component Inventory」行动资源侧栏`) | `ap_bar_view.gd` | `board_side_rail_test.gd:_test_signals` | 单元 | 真实按钮 `pressed`/setter | `stop_pressed`/`refresh_confirmed`/`legend_toggled` 逐信号;`set_ap`/`set_rap`/`set_refresh_state` 读数 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) | | 13. 接触带延续(判据:`design/art/art-bible.md「3.2 环境几何」可挖域接触带微光`) | `board_cell_unit.gd`、`board_view.gd:740,764-765` | `board_terrain_test.gd:_test_contact_glow`;`type_glow_test.gd` | 单元 | `BoardView.refresh()`→`ContactGlow.set_bands(..., ground_visible_rect)` | 英雄格地面侧接触带在位,正交整边/斜向角点+两半边,只绘地面可见区、不进岩体;全局 z=-1 | 既有:未开格类型微光(8 邻作用集、五组色相、零玩法写入) | | 14. 三关色板/互辨(判据:`design/art/art-bible.md「4.1 主色板」三关棋盘环境八色`) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards`+`_test_material_assets_present` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")`/`tex_paths_for(...)` | 三关八色与 art-bible v3.53 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定;封印石读 `light_edge`;6 张 512×512 贴图路径在库、单张像素域 ≤32(实测岩顶 9 色、地面 6 色) | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) | diff --git a/待办清单.md b/待办清单.md index f67fe39d..91898a1d 100644 --- a/待办清单.md +++ b/待办清单.md @@ -282,14 +282,6 @@ ### 文档与结构 -#### 测试面真输入化分期与存量断言逐条精锚(2026-11-05 登记,来源=批次移交) - -**实况**:证据=test-conventions §8.3「判据出处行锚」「真实入口判定口径」两条文+§2「UI 驱动断言须走真输入管线」条文(批1补,qa-harness 分支 2cbd2ca9)+「测试函数的判据出处注记」条款与机检 G 道(2026-11-06 批,capability_audit --strict 绿 402 函数)。已承接=探针 emit 站点两批合计(QA 批两探针 51+1 与真输入化批七探针 63 处,8 处在案保留带注记)+判据出处注记全库铺开(402 验证函数挂 `# 判据出处:` 指针)。剩余面=视图层测试方法面(press_candidate/press_continue/press_card/press_confirm/press_refresh_for_probe 等探针消费口,非 emit 站点)。 - -**改动面**:游戏代码 - -**状态**:待执行 - #### 测试面真输入化批发现四项待裁(2026-11-06 登记,来源=批次移交) **实况**:四项全裁(2026-11-09 用户裁),设计定稿=design/engineering/test-conventions.md v1.0(§2 两段式:先接线断言快速失败、后真输入保可达;§8.3「批量模拟测量语义」句=④规格落点)+design/ux/battle.md「按钮组等宽纪律」句(②判据锚,停手/图例钮统一 64px)。①③定性=探针问题非游戏 bug(emit 绕过视图置隐前提,证据=game/probe/ui_struct_probe.gd:227:249 注记)。①②③修复+④测试注记改锚已编成一张卡:reports/需求卡片-测试面四项收口批-2026-11-10.md(复核通过,报告=reports/复核-测试面四项收口批-2026-11-10.md;能力表两新行已随卡入 game/tests/README.md)。