From 995cfad15529dab322e7893f11229424199303e2 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 10 Nov 2026 02:59:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=99=E5=8D=A1=E4=BF=AE=E8=AE=A2(=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E5=B8=A6=E9=80=80=E5=BD=B9=E5=91=88=E7=8E=B0=E6=94=B9?= =?UTF-8?q?=E7=89=88=E6=89=B9+=E6=96=87=E6=A1=88=E5=85=A5=E8=A1=A8?= =?UTF-8?q?=E6=89=B9=C2=B7=E7=BC=96=E6=8E=92=E9=A2=84=E6=A3=80P1=E5=A4=84?= =?UTF-8?q?=E7=BD=AE):=20=E9=A2=84=E6=A3=80=E4=B8=A4=E5=88=86=E7=89=87?= =?UTF-8?q?=E5=85=AB=E7=B1=BB=E5=AE=9E=E6=A0=B8=E5=87=BAP1=E5=85=AD?= =?UTF-8?q?=E6=9D=A1=E5=85=A8=E9=80=80=E5=9B=9E=E4=BF=AE=E8=AE=A2=E8=90=BD?= =?UTF-8?q?=E5=8D=A1=E2=80=94=E2=80=94=E5=8D=A1A=20=E8=A1=A5=E5=88=A0?= =?UTF-8?q?=E4=BB=B6=E6=96=AD=E7=BC=96=E8=AF=91=E9=9D=A2=E4=B8=A4=E5=A4=84?= =?UTF-8?q?(adventure=5Ffeats=5Ftest:780=20load=20battle=5Fnarrator/run=5F?= =?UTF-8?q?all.gd:195:261=20=E5=A5=97=E4=BB=B6=E6=B8=85=E5=8D=95=E8=A1=8C)?= =?UTF-8?q?+=E6=8E=A2=E9=92=88=E6=9E=9A=E4=B8=BE=E4=B8=89=E8=A1=8C+pacing?= =?UTF-8?q?=5Fqueue=20toast=E6=96=AD=E8=A8=80=E9=80=80=E5=BD=B9=E4=B9=89?= =?UTF-8?q?=E5=8A=A1+=E8=A1=8C=E5=8F=B7/=E6=B3=A8=E9=87=8A/=E8=B1=81?= =?UTF-8?q?=E5=85=8D=E6=92=A4=E6=9D=A1=E6=89=AB=E5=B0=BE;=20=E5=8D=A1B=20?= =?UTF-8?q?=C2=A72=E9=87=8D=E5=86=99=E4=B8=BA=E4=BA=A7=E5=93=81=E7=A0=81?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E6=99=AE=E6=9F=A5=E7=8E=B0=E7=8A=B6(presenta?= =?UTF-8?q?tion=E2=89=88356=E8=A1=8C/core=E2=89=88138=E8=A1=8C=C2=B7?= =?UTF-8?q?=E6=95=B4=E6=96=87=E4=BB=B6=E7=BA=A7=E6=B8=85=E5=8D=9525+?= =?UTF-8?q?=E4=BB=B6=E5=85=A5=E5=8D=A1)+T3=E9=87=8D=E5=86=99=E5=85=A8?= =?UTF-8?q?=E9=87=8F=E8=BF=81=E7=A7=BB(3.5-5.5=E6=97=A5)+T0=E8=A1=A5?= =?UTF-8?q?=E6=99=AE=E6=9F=A5=E8=84=9A=E6=9C=AC=E5=BA=95=E5=86=8C/?= =?UTF-8?q?=E8=B7=A8=E6=89=B9=E6=A0=B8=E9=9D=A2/=E5=88=B7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=B8=89=E6=AD=A5+T2=E6=89=A9core=E9=9D=A2+atr()?= =?UTF-8?q?=E9=80=9A=E9=81=93+player=5Fcopy=5Fsweep=E5=85=AD=E7=BB=84?= =?UTF-8?q?=E9=92=89=E5=80=BC=E6=96=AD=E8=A8=80=E6=94=B9=E5=86=99=E4=B9=89?= =?UTF-8?q?=E5=8A=A1+W6=E8=B1=81=E5=85=8D=E8=AF=8D=E6=B3=95=E8=A1=A5?= =?UTF-8?q?=E5=9B=9B=E8=AF=8D+key=E6=A8=A1=E6=9D=BF=E6=B3=9B=E5=8C=96+?= =?UTF-8?q?=E4=BC=B0=E6=97=B6=E9=87=8D=E7=AE=976.75-9.25=E6=97=A5(?= =?UTF-8?q?=E4=B8=AD=E5=80=BC8.0);=20README:170=20=E8=A1=A5=5Ftest=5Fdecay?= =?UTF-8?q?=5Fcurves=E7=94=A8=E4=BE=8B=E5=90=8D;=20=E4=B8=A4=E5=8D=A1?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=E8=AE=B0=E5=BD=95=E7=AC=AC3=E8=BD=AE(?= =?UTF-8?q?=E9=A2=84=E6=A3=80=E8=BD=AE)=E7=95=99=E7=97=95=E3=80=82?= =?UTF-8?q?=E4=BF=AE=E8=AE=A2=E5=90=8E=E5=BE=85=E5=8A=9E=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E4=B8=8D=E5=8F=98(=E5=B7=B2=E5=86=99=E5=8D=A1);=20=E5=87=AD?= =?UTF-8?q?=E6=8D=AE:=20=E6=B5=81=E6=B0=B4=E7=BA=BF=E9=97=B8=20PASS(32?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE/58=E8=A1=8C/7=E9=93=BE/9=E5=8D=A1)=E3=80=81?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=9F=9F=E9=97=B8=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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/README.md | 2 +- reports/需求卡片-文案入表批-2026-11-10.md | 54 +++++++++++-------- ...œ€求卡片-明细带退役呈现改版批-2026-11-10.md | 32 +++++++---- 3 files changed, 56 insertions(+), 32 deletions(-) diff --git a/game/tests/README.md b/game/tests/README.md index a7323632..25bfa760 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -167,7 +167,7 @@ tests/ | 试玩日志器 ap_per_round 必填注入守卫(未注入拒绝开会话) | 表现与支撑 | `PlaytestLogger.start_session()` | `playtest_logger_guard_test.gd:_smoke_required_injection` | | 终局判定文案与战末账行 | HUD框架 | `BattleEndOverlay.open_victory()`/`open_defeat()`(verdict_line 由组合根直拼传入) | `ui_click_probe.gd:_ready`(终局浮层段) | | B 区零文字带 | HUD框架 | `Main._ready()`(组合根场景树装配)+节点推进/恢复/商店/终局真实流 | `log_band_retired_test.gd:_test_no_log_view_node`;`log_band_retired_test.gd:_test_b_zone_zero_text` | -| 清图兑付浮字 | HUD框架 | `BoardZoneView.spawn_clear_reward_text()`(round_end clear 分支装配) | `clear_reward_text_test.gd:_test_spawn_and_decay`;`clear_reward_text_test.gd:_test_no_overlap` | +| 清图兑付浮字 | HUD框架 | `BoardZoneView.spawn_clear_reward_text()`(round_end clear 分支装配) | `clear_reward_text_test.gd:_test_spawn_and_decay`;`clear_reward_text_test.gd:_test_no_overlap`;`clear_reward_text_test.gd:_test_decay_curves` | | 解锁拍零新增呈现 | HUD框架 | `RowPacer.enqueue()`→`consume_now()`(skill_unlock 高光行消费流,快照取消费时刻) | `unlock_zero_ui_test.gd:_test_zero_delta` | | 文案承载单点 | 数据配置与跨系统契约 | `TranslationServer.set_locale()` 后场景 `Label.tr()` 真实查表 | `player_copy_sweep_test.gd:_sweep_tr_roundtrip` | | 表行文案 key 化 | 数据配置与跨系统契约 | `ConfigDB._ready()`(autoload 加载真实表+schema 校验闸) | `config_table_key_test.gd:_test_display_key_format` | diff --git a/reports/需求卡片-文案入表批-2026-11-10.md b/reports/需求卡片-文案入表批-2026-11-10.md index f1ca35b0..dd6f1855 100644 --- a/reports/需求卡片-文案入表批-2026-11-10.md +++ b/reports/需求卡片-文案入表批-2026-11-10.md @@ -10,18 +10,17 @@ ## 2. 现状事实(file:line 实查) -- 翻译管线现状=零:project.godot 无 internationalization 配置(grep 零命中;默认 locale=en——注册 zh_CN 翻译后须同批设 locale/fallback,否则 tr() 按 key 原样返回);`tr(`/`atr()` 在 game/presentation 与 game/core 零使用。 -- 数据表文案值:game/data/tables/*.tres 含中文字段值约 220 个——display_name 162、desc 48、name_a/name_b 6、settlement.tres source_label_map 7 值(:9 起);另有 493 行中文为表内 `;` 注释(不迁)。 -- schema 键面:「display_name 空/为空」校验实查 13 处/11 件(feat:37、skill:67、status_effect:49、enemy:96、treasure_item:90、hero:23、meta_tree/level/reward/variation/shop 六件同类);键集同步面 4 处:feat_table.gd:16(ROW_KEYS)、meta_tree_table.gd:17(KEY_WHITELIST)、forge_table.gd:16(ROW_KEYS)、treasure_item_table.gd:50(KEY_WHITELIST),另 hero_table.gd:11 默认值——五处随键改名全数同步。 -- core 结算行 display 拼装:core/settlement/grant_segment.gd:73/294(「专长·GP 入账 +%d」)/:318(「坑道小憩 未生效(满血)」)/:321/:333/:399/:414/:438/:441(「封印未中」)等约 15 处、core/damage_controller.gd:397/425(「+奥术%d(必中)」等)/483/508/515/533、core/settlement/verdict_segment.gd:38/42(「战斗失败/胜利」)、core/settlement/round_cycle.gd:109(「%s 解锁了 %s」)。 -- 呈现层残余文案(明细带退役批合入后,实测约 43 处级):camp_shop_presenter.gd show_toast 11 处、treasure_interact_controller.gd 5 处(:92/:110 读 rec.get("name"/"display_name"))、curio_interact_controller.gd 4 处+:79(「继续」)/:137(「专长获取…」)等、main.gd 9 处(:421 清图 toast 已由退役批改浮字装配)+:367(「第 %d 层通过!…」)/:374/:378/:381(终局按钮字串,退役批改写面)/:453/:497/:502、main_adventure_flow.gd 1 处+终局字串 4 处(:113「返回冒险」/:114「本局 GP 入账 · 合计 %d」/:181「战利品 GP +%d · 合计 %d」/:179「下一节点」)+:116/:231/:233/:241(「返回」「攻 +%d」「上限 +%d」「攻击 %s · 护甲 AC %s」)、views/node_overlay.gd 3 处(:20/:27/:29)、views/battle_end_overlay.gd:230/:231 固定名「战利品 GP」、main.gd:404 ks_summary「钥石 · 累计 %d」+HudPresenter.gp_summary_text/bonus_summary_text+hud_presenter.gd:344 phase_text 阶段指示文案组(退役批直连后落地所在)、views/status_slot_row.gd:40 SOURCE_NAMES、退役批新增的浮字装配字串 1 处。 -- 场景静态文案:复核实证 game/ 全部 22 个 .tscn 中文字符=0(呈现层中文实际在 .gd 动态装配,归上方呈现层面)——无独立场景迁移面,W5 降为核验行。 -- 退役批基线:views/board_zone_view.gd `spawn_clear_reward_text(text: String)` 在役(浮字文案由装配处传入)。 - +- 翻译管线现状=零:project.godot 无 internationalization 配置(grep 零命中;默认 locale=en——注册 zh_CN 翻译后须同批设 locale/fallback,否则 tr() 按 key 原样返回);`tr(`/`atr(` 在 game/presentation 与 game/core 零使用。 +- **产品码全量字面量普查(2026-11-10 编排预检实核,非注释非诊断行)**:presentation ≈356 行、core ≈138 行——本卡迁移面=三目录全量(§2.5 红线全量口径,非窄清单)。presentation 整文件级清单(25+ 件):legend_overlay.gd:9-17(ENTRIES)、level_map_screen.gd:18-25、shop_overlay_view.gd(14)、career_overlay.gd(18,main_ui_build.gd:141 已接线)、settings_overlay.gd:49-91、save_select_overlay.gd(13)、status_panel.gd(13)、hero_info_panel_view.gd(13)、treasure_view.gd(16)、board_view.gd:9(u7 钉的 glyph「危」)、forge_view.gd(12)、curio_pick_overlay.gd:41/:48/:77/:81、tree_view.gd(8)、ap_bar_view.gd(9)、ui_kit.gd(4)、confirm_dialog.gd(4)、camp 系四件、ui_assembler.gd(8)、main_overlay_flow.gd(5)、debug_overlay.gd(24)等+既有零散清单(camp_shop_presenter 11/treasure_interact 5/curio_interact 6/main 16/main_adventure_flow 12/node_overlay 3/battle_end_overlay 2/status_slot_row 1/浮字装配 1)。core 件级:reward_grant.gd:100/:102(reason 中文值经 treasure_interact_controller.gd:103 toast 直达玩家)、effect_engine.gd(10)、battle_orchestrator.gd(8)、save_manager.gd(7)、treasure_items.gd(5)、combat_segment.gd(4)及结算四件 17 锚行(grant_segment:73/294/318/321/333/399/414/438/441、damage_controller:397/425/483/508/515/533、verdict_segment:38/42、round_cycle:109)。 +- 数据表文案值:tables/ 实存 21 张 .tres,含文案字段 13 张——display_name 163、desc 48、name_a/name_b 6、settlement.tres:9 source_label_map 7 值(总中文值行 229);另有 493 行中文为表内 `;` 注释(不迁)。 +- schema 键面:「display_name 空/为空」校验 13 处/11 件(feat:36、skill:66、status_effect:48、enemy:95、treasure_item:89、hero:22、shop:51/:93/:119 及 meta_tree/level/reward/variation 五件);键集同步面五处:feat_table.gd:16(ROW_KEYS)、meta_tree_table.gd:17(KEY_WHITELIST)、forge_table.gd:16(ROW_KEYS)、treasure_item_table.gd:50(KEY_WHITELIST)、hero_table.gd:11(默认值「探险者」)。 +- **既有断言钉值面(player_copy_sweep_test.gd 六组,迁移后须同步改写钉 key/译文)**:u1-u3(:50-66 hero 面板段头/兜底)、u4(:78-85 legend 钉值)、u5(:102-104 tooltip 来源注记)、u6(:105-106 source_label_map[mine_hit]==「危险格」)、u7(:153 glyph==「危」)、_sweep_refresh_toast_no_literals(:178-195——源锚=main.gd:721/:724 两 toast 中文字面量,「断言钉在场」与迁移清零对撞,改写义务本卡登记)。 +- 行号基线声明:本节行号=卡A(明细带退役批)执行前实测;卡A 先行改动后行号漂移由 T0 核面步统一重算(§17③)。 +- 场景静态文案:复核实证 game/ 全部 22 个 .tscn 中文字符=0——无独立场景迁移面,W5 降为核验行。 ## 3. 设计契约 - 🔴 文案值单点:玩家可见文案值只住 game/data/l10n/strings.csv(key 列+zh_CN 列);代码、数据表行、场景文件零文案字面量(code-conventions §2.5)。 -- 🔴 key 模板:点分 `<表域>.<行id>.`(表行)/`<界面域>.<用途>`(界面文案);全库唯一,登记于 strings.csv;禁两处同名异值。 +- 🔴 key 模板:点分 `<表域>.<行id或map键>.<字段>`(表行,覆盖 name/name_a/name_b/desc/source_label_map 子键)/`<界面域>.<用途>`(界面文案);全库唯一,登记于 strings.csv;禁两处同名异值。 - 🔴 core 层只发 key 不取文案:结算行 display 字段值改 display_key(行协议字段形态变更已由战斗结算 v2.1 覆盖);core 禁 import 翻译服务取中文。 - 🔴 schema 改名同步:display_key/desc_key 进各表 ROW_KEYS/KEY_WHITELIST,空校验改 key 格式校验(非空+点分),禁保留旧键双轨。 - 🔴 日志落盘零文案不变:text/display 不落盘边界(战斗结算 v2.1)不因本卡改动。 @@ -29,8 +28,8 @@ ## 4. 范围边界 -做:上列管线建立、三处迁移(表行/core 行/呈现层)、场景 key 化、漏网清零断言、能力表同批维护。 -不做(去向):诊断文案(push_error/assert/日志)与 sim/probe/tests 文字(code-conventions §2.5 豁免面);493 行 .tres 注释;静态扫描闸新增 S 规则(tools/ 面=工程改动直改类,登记待办清单另行批);多语言(语言列扩展归设置与本地化后置);UI 呈现观感(零视觉变化,golden 基线不受影响——场景 text 值渲染结果逐像素不变)。 +做:上列管线建立、三处迁移(表行 13 张/core 行全量/呈现层全量 ≈356 行)、漏网清零断言、能力表同批维护。 +不做(去向):诊断文案(push_error/assert/errs.append/fatal_screen/_fatal/logger.log/日志)与 sim/probe/tests 文字(code-conventions §2.5 豁免面);493 行 .tres 注释;静态扫描闸新增 S 规则(tools/ 面=工程改动直改类,登记待办清单另行批);多语言(语言列扩展归设置与本地化后置);UI 呈现观感(零视觉变化,golden 基线不受影响——场景 text 值渲染结果逐像素不变)。 ## 5. 关联文档同步面 @@ -48,21 +47,24 @@ |---|---|---| | game/data/l10n/strings.csv | 新增:文案值唯一承载(key,zh_CN 两列+表头) | 是(W1) | | game/project.godot | 翻译资源注册(internationalization/translations) | 是(W1) | -| game/data/tables/*.tres(18 张) | display_name→display_key、desc→desc_key,值改 key | 是(W2) | +| game/data/tables/*.tres(含文案字段 13 张) | display_name→display_key、desc→desc_key,值改 key | 是(W2) | | game/data/schemas/ 十一件 | 键改名+key 格式校验(13 处「display_name 空/为空」校验全集+键集同步面五处) | 是(W2) | | game/core/config_db.gd 及读取面 | display_name 读取改 display_key(透传 key,取文案归呈现) | 是(W2) | | game/core/settlement/grant_segment.gd、damage_controller.gd、verdict_segment.gd、round_cycle.gd | display 拼装改 key 发射(插值数字留数值字段) | 是(W3) | | game/presentation/ 五控制器/Presenter+views(toast/账行/SOURCE_NAMES/浮字装配) | 字面量改 tr("KEY") | 是(W4) | | game/presentation/views/battle_end_overlay.gd | 固定名「战利品 GP」改 tr | 是(W4) | -| game/tests/unit/presentation/player_copy_sweep_test.gd | 扩展三函数(_sweep_tr_roundtrip/_sweep_no_literal_toast/_sweep_zero_product_literals——复用既有扫描件,见 §12) | 是(W1/W4/W6) | +| game/tests/unit/presentation/player_copy_sweep_test.gd | 扩展三函数+六组既有钉值断言同步改写(u1-u7/refresh_toast——见 §2 断言钉值面) | 是(W1/W4/W6) | | game/tests/unit/core/config_table_key_test.gd | 新增:表行 key 格式断言(W2) | 是 | | game/tests/README.md | 能力行同批维护(写卡段执行,已入表) | 否 | ## 7. 任务卡 -### T0 管线建立(0.5 日) +### T0 管线建立与核面(0.75 日) - [ ] 新建 game/data/l10n/strings.csv:表头 `keys,zh_CN`+首批 3 个探路 key(含 1 个带 %d 占位) - [ ] project.godot 注册翻译资源(设置键 `internationalization/locale/translations`)+**locale 设定**(`internationalization/locale/fallback` 或 test 默认 `TranslationServer.set_locale("zh_CN")`——缺此步 tr() 按 key 原样返回,W1 必红) +- [ ] **跨批核面步**:卡A(明细带退役批)合入后按卡A 终态重算本卡 §2 行号(file:line 窄复核,漂移处就地更新清单) +- [ ] **全量普查脚本步**:跑字面量普查(python 读盘扫描三目录非注释非豁免行,豁免词法见 W6),逐行清单落 reports/iter-实现报告附录——T3 迁移对账的唯一底册 +- [ ] **刷导入步**:`--editor --quit` 触发 strings.csv→.translation 导入(全新 checkout 无导入则 W1 必红) - [ ] 冒烟断言:一个探路 Label 经 tr() 取到中文(player_copy_sweep_test.gd:_sweep_tr_roundtrip 首个用例) - [ ] 接口产出:strings.csv 路径常量 `STRINGS_CSV_PATH`(归 T4 闸用) @@ -73,36 +75,39 @@ - [ ] schema 校验闸+表驱动单元全绿 - [ ] 接口产出:无新签名(键名替换);验证:单元全套件 -### T2 core 行 key 化(0.5–1 日) +### T2 core 行 key 化(1–1.5 日) - [ ] grant_segment/damage_controller/verdict_segment/round_cycle 的 display 拼装字串改 key 常量(`const DISPLAY_KEY_*`),插值数字留原数值字段 +- [ ] core 其余玩家可见面 key 化(按 T0 普查底册逐件):reward_grant.gd:100/:102 reason 中文值(经 treasure_interact_controller.gd:103 toast 直达玩家)改 reason key+呈现面 tr、effect_engine/battle_orchestrator/save_manager/treasure_items/combat_segment 逐件按消费面分类(玩家可见→key;纯诊断→§2.5 豁免登记) - [ ] 单元断言:结算行 display 值全库无中文字符(新用例挂 battle_settlement 套件) - [ ] 接口取用:无;产出:DISPLAY_KEY_* 常量名清单(T3 无消费、登记待办供生涯批取用) -### T3 呈现层迁移(1–1.75 日) -- [ ] 残余玩家可见文案约 43 处级改 tr("KEY")——清单以 §2 现状事实为唯一依据(camp_shop 11/curio 4+2/treasure 5/main 9+6/adventure_flow 1+8/node_overlay 3/battle_end 2/ks 与 HudPresenter 3+phase_text 组/SOURCE_NAMES 1/浮字 1) +### T3 呈现层全量迁移(3.5–5.5 日) +- [ ] 按 T0 普查底册逐件迁移 presentation ≈356 行(§2 整文件级清单 25+ 件+零散清单全量)改 tr("KEY")——每件迁完即跑该件对应测试(改完即测) +- [ ] **atr() 通道**:hud_presenter.gd 等 static 语境(非 Node 实例)用 `atr()`(Object 级翻译)——hud_presenter 十个 static 函数逐个过,禁为取文案把 static 改实例 - [ ] 带插值的字串:tr 取模板后 `%` 格式化(tr("camp.buy_denied") % 值形态) +- [ ] **player_copy_sweep_test 六组钉值断言同步改写**:u1-u7 改钉 key 或 tr 后译文、_sweep_refresh_toast_no_literals 改钉 tr 调用形态(main.gd:721/:724 两 toast 迁 tr 后源锚换 key) - [ ] 接口取用:strings.csv(T0);验证:单元+冒烟 ### T4 漏网清零与收口(0.5 日) -- [ ] player_copy_sweep_test 扩展静态断言 _sweep_zero_product_literals:grep 产品码三目录(core/data/presentation)非豁免文件的玩家可见中文字面量=0(诊断文案按 §2.5 豁免词法:push_error/assert/push_warning/_diag 行白名单);.tscn 面纳入扫描词法(实证现值 0,防回归) +- [ ] player_copy_sweep_test 扩展静态断言 _sweep_zero_product_literals:grep 产品码三目录(core/data/presentation)非豁免文件的玩家可见中文字面量=0(诊断文案按 §2.5 豁免词法:push_error/assert/push_warning/_diag/errs.append/fatal_screen/_fatal/logger.log 行白名单);.tscn 面纳入扫描词法(实证现值 0,防回归) - [ ] 编辑器生成 POT 核对漏网(手动步,读数进实现报告) - [ ] 产出物落位卡:reports/iter-实现报告、反哺点清单(同步面 5 行) -估时合计:3.5–5.25 日(中值 4.375)。 +估时合计:6.75–9.25 日(中值 8.0)。 ## 8. 验证闸(改动—验收对照表) | 需求点 | 改动(文件:行为) | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---| | W1 管线端到端 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」文案值只住` | strings.csv+project.godot 翻译注册+locale 设定 | player_copy_sweep_test::_sweep_tr_roundtrip | 单元 | 场景 Label 实例化 | tr("探路key") 返回值=csv 中文列值 | 新增:文案承载单点 | -| W2 表行 key 化 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」数据表文案字段更名` | 18 tres+十 schema | config_table_key_test::_test_display_key_format+schema 校验闸 | 单元 | ConfigDB 加载真实表 | 行键名=display_key/desc_key+值点分格式+旧键 grep=0(十件全集) | 新增:表行文案 key 化 | +| W2 表行 key 化 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」数据表文案字段更名` | 13 张 tres+十一 schema | config_table_key_test::_test_display_key_format+schema 校验闸 | 单元 | ConfigDB 加载真实表 | 行键名=display_key/desc_key+值点分格式+旧键 grep=0(十一件全集) | 新增:表行文案 key 化 | | W3 core 行 key 化 `design/gdd/systems/战斗循环/战斗结算.md「明细流水」数据表行只登记文案 key` | 结算四件 display 发射 | battle_settlement 套件新用例 | 单元 | 真实结算流(round_end 驱动) | 发射行 display 值无中文字符 | 既有:表行文案 key 化 | | W4 呈现层迁移 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」取文案只经` | toast 33 处/账行/SOURCE_NAMES/浮字/node_overlay | player_copy_sweep_test::_sweep_no_literal_toast | 单元 | 真实 UI 交互流 | show_toast/tr 调用点字面量 grep=0 | 既有:玩家面文案与危险格格面字形 | | W5 场景文案核验 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」场景静态` | .tscn 静态中文核验(复核实证 game/ 22 个 .tscn 中文=0——动态装配中文已归 W4 面) | 渲染闸 golden 比对+_sweep_no_literal_toast 场景面 | 探针+单元 | 渲染闸跑批 | 逐像素不变;.tscn 中文字面量=0(断言纳入 W6 扫描词法) | 既有:文案漏网清零 | | W6 漏网清零 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」禁在` | 静态断言 | player_copy_sweep_test::_sweep_zero_product_literals | 单元 | 闸跑批(读盘 grep) | 产品码三目录豁免词法外中文字面量=0 | 新增:文案漏网清零 | 测试方式两分法:W1–W4、W6 归调试接口验;场景文案渲染观感归用户目检(登记不阻塞)。 -测试削弱申报:无删旧断言;display_name 空串校验改 key 格式校验=判据收紧非放宽。 +测试削弱申报:无删旧断言;player_copy_sweep_test 六组钉值断言改写=钉值对象从字面量换 key/译文,断言强度不减;display_name 空串校验改 key 格式校验=判据收紧非放宽。 独立验收审计:reports/iter-验收审计-<日期>.md;高档全量审计。 ## 9. 异常分级 @@ -160,6 +165,13 @@ key 命名的域段用词(模板内);strings.csv 行排序(按域分组 | 2 | 同上 | N8 卡A §14「新增函数两处」实为一处 | 自判 | 改「一处」 | | 2 | 同上 | N9 行号/编号 drift:battle.md:194→:195、main.gd:420→:421、ks :403→:404、卡B T0「T3 闸用」→T4 | 自判 | 逐处改正 | +| 3 | 编排预检只读子代理(Explore 分片,未参与撰写) | P1-1 呈现层迁移清单与 W4/W6 全量判据不闭合(实测 ≈356 行 vs 清单 ≈50 处,25+ 整文件漏项) | 补写 | §2 重写为全量普查现状(整文件级清单入卡);T3 重写全量迁移(3.5–5.5 日);T0 补普查脚本步(底册落实现报告)——W4/W6 判据不变,迁移面补齐闭合 | +| 3 | 同上 | P1-2 core 面漏项(reward_grant reason 经 toast 直达玩家等 ≈138 行) | 补写 | T2 扩面(结算四件+core 其余件按消费面分类迁移);§2 补件级清单 | +| 3 | 同上 | P1-3 player_copy_sweep 六组钉值断言与 W2/W4/W6 方向对撞未登记改写义务 | 补写 | §2 补断言钉值面;T3 补六组同步改写步;测试削弱申报补强度不减说明 | +| 3 | 同上 | P1-4 _sweep_refresh_toast_no_literals 源锚=main.gd:721/:724 中文字面量,迁移清零与断言钉在场对撞 | 补写 | 两行入迁移面(T3 全量覆盖);断言改写义务同上落卡 | +| 3 | 同上 | P2 W2 行「十 schema/十件」残留;「18 张 tres」失实(21/13);T0 缺核面步与刷导入步;hud_presenter static 无 atr 通道;W6 词法缺 errs.append/fatal_screen/_fatal/logger.log;§2 行号未按卡A 终态重算;main/treasure/adventure_flow 漏行 12 处 | 补写 | 逐条落卡(W2 十一件/T0 两步/T3 atr/W6 词法/基线声明+T0 核面步/§2 全量清单吸收) | +| 3 | 同上 | P3 key 模板不覆盖 name_a/b 与 source_label_map;schema 行锚 +1 漂移;「六件同类」列 5 计 6;T0 缺刷导入 | 自判 | 模板泛化「<表域>.<行id或map键>.<字段>」(§3 契约同步);行号按预检实测改正;T0 补刷导入步 | + 引擎技术面三查(同轮):tr/TranslationServer 回退行为、Tween、Label 描边在 4.7 存在且行为如卡——B3/B8 已按引擎事实落卡,无未判发现。 ## 17. 复核自审七查执行记录 diff --git a/reports/需求卡片-明细带退役呈现改版批-2026-11-10.md b/reports/需求卡片-明细带退役呈现改版批-2026-11-10.md index f236d5ee..fed3b5c4 100644 --- a/reports/需求卡片-明细带退役呈现改版批-2026-11-10.md +++ b/reports/需求卡片-明细带退役呈现改版批-2026-11-10.md @@ -13,12 +13,13 @@ B 区明细带(battle_log_view)整条退役:组件、挂载、六类冒险 - `game/presentation/views/battle_log_view.gd`(全件 70 行,实测):明细带壳——挖掘期摘要位(`_summary`,battle_log_view.gd:62 仅 clear、全库无写入点=恒空)+结算期叙述行 RichTextLabel(`_log.visible = settle`,battle_log_view.gd:69)+提示字「上轮摘要(回看归「生涯」)」(:56)。 - 引用面 10 文件:main_ui_build.gd:45(装配)、scenes/adventure_screen.gd:12-13(壳声明)、ui_battle.gd、ui_assembler.gd、battle_stage_view.gd、hud_presenter.gd、main.gd、main_adventure_flow.gd、main_debug_flow.gd、views/ui_kit.gd:484(注释)。 - 叙述行写入点:main_adventure_flow.gd:36(关卡开场)/65(节点横幅)/70(奖励)/75(恢复)/88(商店)/170(岔路)、main_debug_flow.gd:90(调试开场)。Narrator 其余消费点(删件断编译面,全数登记):main_adventure_flow.gd:109(adventure_summary_text)/111(keystone_settle_text)/179(battle_end_text)喂 end_overlay、main.gd:373/377/380(battle_end_text 开浮层)、hud_presenter.gd:344(phase_text——阶段指示文案,随带退役改组合根直拼或删除)、curio_interact_controller.gd(10 处 `Narrator.` 调用)、curio_pick_overlay.gd(仅 :3/:90 注释引用,零代码消费——删注释即可)。 -- 删件测试断编译面(load/实例化 battle_narrator 与 battle_log_view 的测试件,等价改写义务全数登记):tests/unit/presentation/player_copy_sweep_test.gd:59(load battle_narrator)/:110-112(load battle_log_view 并走方法表)、stage_background_test.gd:194-201(实例化 log_view+log_band 几何断言)、theme_projection_test.gd:46/:385(_smoke_battle_log_view)/:473-480(Narrator.level_open_line 断言)、tests/unit/core/feat_vouchers_test.gd:294-296(load battle_log_view);core/battle_orchestrator.gd:19(注释提 battle_log_view._format_row——注释同步删)。 +- 删件测试断编译面(load/实例化 battle_narrator 与 battle_log_view 的测试件,等价改写义务全数登记;第六处=adventure_feats_test):tests/unit/presentation/player_copy_sweep_test.gd:59(load battle_narrator)/:110-112(load battle_log_view 并走方法表)、stage_background_test.gd:194-201(实例化 log_view+log_band 几何断言)、theme_projection_test.gd:46/:385(_smoke_battle_log_view)/:473-480(Narrator.level_open_line 断言)、tests/unit/core/feat_vouchers_test.gd:294-296(load battle_log_view);tests/unit/core/adventure_feats_test.gd:780(load battle_narrator 直调 feat_card_text);core/battle_orchestrator.gd:19(注释提 battle_log_view._format_row——注释同步删)。 - 清图 toast:main.gd:420 `show_toast("清图奖励:%s"…)`;Boss 解锁技名 toast:row_pacer.gd:94 `show_toast(String(row.get("display_name","")))`。 - 结算明细回看:views/settlement_review_overlay.gd 全件零调用(唯一引用=ui_kit.gd:484 注释)。 - 布局字段:battle_layout_table.gd:11-25(`log_band_h_dig`/`log_band_h_settle` 定义+域校验);游戏视图经 battle_log_view._init 读取(layout.log_band_h_dig,battle_log_view.gd:18)。 - parsed_text/叙述行消费:probe/ui_probe.gd:113(等「节点 1/」)、probe/ui_click_probe.gd:624/684/1119/1152/1569(等「· 种子」叙述行出现)、tests/unit/presentation/battle_log_zero_text_test.gd:80-90(B 区零新增行断言)。 - 恢复点一手呈现:views/node_overlay.gd:26 `show_rest(healed, hp_after, max_hp)`(main_adventure_flow.gd:74 调用)——B 区 rest_line 纯重复。 +- 套件清单引用:tests/run_all.gd:195(battle_log_zero_text_test)、:261(battle_narrator_test)——删件后 spawn 缺脚本=闸红,清单两行随删。 - 渲染基线:game/tests/golden/battle_screen.png、board_L1_dungeon.png、board_L2_underdark.png、board_L3_deep_underdark.png(明细带在画者受影响)。 ## 3. 设计契约 @@ -63,6 +64,8 @@ B 区明细带(battle_log_view)整条退役:组件、挂载、六类冒险 | game/tests/unit/presentation/clear_reward_text_test.gd、log_band_retired_test.gd、unlock_zero_ui_test.gd | 新增(V2/V3、V1/V5、V4) | 是 | | game/probe/ui_probe.gd、ui_click_probe.gd | 等锚改写(叙述行锚→棋盘/意图锚) | 是(V7) | | game/tests/unit/presentation/battle_log_zero_text_test.gd | 删除(被测对象退役)+新增明细带退役断言归属测试 | 是(V1) | +| game/tests/run_all.gd | 套件清单两行随删件同步(:195/:261) | 是(V1/V5) | +| game/tests/unit/core/adventure_feats_test.gd | :780 load battle_narrator 直调 feat_card_text——等价改写(feat 文案读数改直取或删该用例段) | 是(V5) | | game/tests/README.md | 能力行同批维护(本卡写卡段执行,非实现批) | 否 | | game/tests/golden/battle_screen.png、board_L3_deep_underdark.png | 基线换代(逐张呈用户审核) | 是(V6) | @@ -76,26 +79,29 @@ B 区明细带(battle_log_view)整条退役:组件、挂载、六类冒险 ### T1 明细带与叙述行退役(1–1.5 日) - [ ] 删 battle_log_view.gd、settlement_review_overlay.gd、battle_narrator.gd、battle_narrator_test.gd 四件(测试件随被测对象退役,语义由 log_band_retired_test 承接) - [ ] 摘除 6.结构图所列壳与引用(adventure_screen 壳声明、ui_battle/ui_assembler 装配、hud_presenter phase_text 消费改组合根直拼或删除、curio_interact_controller 十处消费点改写、curio_pick_overlay 两处注释删净)+终局消费点改写:main_adventure_flow.gd:109/111/179 与 main.gd:373/377/380(battle_end_text 退役,verdict_line/摘要串由组合根按 battle_result 与 runner 读数直拼——能力锚=game/tests/README.md「终局判定文案与战末账行」行) -- [ ] 测试断编译面等价改写(§2 清单五处):player_copy_sweep_test/stage_background_test/theme_projection_test/feat_vouchers_test 的 load 与断言改写(log_band 几何断言退役);battle_orchestrator.gd:19 删注 +- [ ] 测试断编译面等价改写(§2 清单六处):player_copy_sweep_test/stage_background_test/theme_projection_test/feat_vouchers_test/adventure_feats_test 的 load 与断言改写(log_band 几何断言退役);battle_orchestrator.gd:19 删注 +- [ ] tests/run_all.gd 套件清单 :195/:261 两行随删件同步移除 +- [ ] 注释扫尾:battle_layout_table.gd:2(消费面注释提 BattleLogView)、views/ui_kit.gd:207(语义档注释;HEX_LOG_* 死常量族随带退役一并清) - [ ] main_adventure_flow.gd 删六处 append_bb;main_debug_flow.gd 删调试叙述行 - [ ] row_pacer.gd 删解锁技名 toast(skill_unlock 行呈现侧不再消费 display_name) - [ ] 接口产出:无(纯删改);验证:单元+冒烟 exit 0 ### T2 清图兑付浮字(0.5–1 日) - [ ] board_zone_view.gd 新增 `func spawn_clear_reward_text(text: String) -> void`:单行 Label(字高 17px、暖白 #F5EAD0、2px 深墨描边、微金光晕),自棋盘中央上方起、2.5s 内**上浮约 40px**(位移量,非起始定位——battle.md:195)并渐隐(Tween,尊重减动效开关→直达终态) -- [ ] main.gd 清图 handler(:421 show_toast):`show_toast("清图奖励:%s"…)` 替换为 `board_zone.spawn_clear_reward_text(兑付值)`——兑付值取现行 toast 同源(row.get("display") 清洗后内容),暂以呈现层字串承载(文案入表卡收编);**零兑付守卫保留**(:420 `type != "reward_ineffective"`——未生效行不弹浮字,安静留数据面,语义重述随明细带退役) +- [ ] main.gd 清图 handler(:420 show_toast):`show_toast("清图奖励:%s"…)` 替换为 `board_zone.spawn_clear_reward_text(兑付值)`——兑付值取现行 toast 同源(row.get("display") 清洗后内容),暂以呈现层字串承载(文案入表卡收编);**零兑付守卫保留**(:419 `type != "reward_ineffective"`——未生效行不弹浮字,安静留数据面,语义重述随明细带退役) - [ ] 验收步骤:V2/V3 断言(见对照表)落 tests/unit/presentation/clear_reward_text_test.gd - [ ] 接口取用:无;产出:`spawn_clear_reward_text(text: String)`(T3 探针取用) ### T3 测试与探针锚改写(0.5–1 日) - [ ] 删 battle_log_zero_text_test.gd 与 battle_narrator_test.gd;新增 tests/unit/presentation/log_band_retired_test.gd:adventure_screen 实例树内无 log_view/settlement_review 节点(V1);B 区子树零 RichTextLabel 文字节点(V5) - [ ] 解锁零新增断言:tests/unit/presentation/unlock_zero_ui_test.gd——解锁触发前后 B 区子树逐元素快照比对,新增数=0(V4) -- [ ] ui_probe.gd:113、ui_click_probe.gd 五处等锚改写(替位锚按 T0 附录) +- [ ] ui_probe.gd:113/:134-135、ui_click_probe.gd:624/684/879/1119/1152/1569 等锚改写(替位锚按 T0 附录;:134-135 挖掘期 24px 几何断言与 :879 _summary 私有直读随带退役) - [ ] 能力行落名:见对照表能力列 - [ ] 验证:单元全套件+两探针 exit 0 ### T4 基线换代与收口(0.5 日) - [ ] 渲染闸重截受影响图(battle_screen、board_L3;board_L1/L2 若带在画一并),**逐张呈用户审核后才入库**(触发基线审核关卡) +- [ ] tools/coverage_exemptions.js:49 settlement_review_overlay 豁免条目随件撤除 - [ ] 产出物落位卡:reports/iter-实现报告(实机目检清单:浮字观感/解锁拍/挖掘结算两态布局)、reports/iter-反哺点清单(同步面 4 行逐条给落点) 估时合计:2.75–4.5 日(中值 3.625)。 @@ -104,16 +110,16 @@ B 区明细带(battle_log_view)整条退役:组件、挂载、六类冒险 | 需求点 | 改动(文件:行为) | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---| -| V1 明细带退役 `design/ux/battle.md「Component Inventory」明细带整条退役` | battle_log_view/settlement_review 删除+壳摘除 | log_band_retired_test::test_no_log_view_node | 单元 | adventure_screen 场景实例化 | 场景树节点名集合(无 log_view/settlement_review) | 新增:B 区零文字带 | -| V2 兑付浮字呈现 `design/ux/battle.md「即时反馈画面化预览」清图兑付浮字` | board_zone_view.spawn_clear_reward_text+main.gd 装配 | clear_reward_text_test::test_spawn_and_decay | 单元 | 清图完成信号(round_end clear 分支) | 浮字节点文本=兑付值+2.5s 后 freeing | 新增:清图兑付浮字 | -| V3 浮字不遮棋盘 `design/ux/battle.md「即时反馈画面化预览」浮字全程不与棋盘格面重叠` | 同上 | clear_reward_text_test::test_no_overlap+test_decay_curves | 单元 | 同上 | 四判据全绑:rect 相交=空;底缘距棋盘上缘 ≥6px;渐隐 alpha 帧间步进 ≤0.1;兑付值可读时长 ≥60% 生命期 | 新增:清图兑付浮字 | -| V4 解锁拍零新增 `design/gdd/systems/战斗循环/敌人系统.md「目标顺位与意图线索」解锁拍零新增呈现` | row_pacer.gd 删 toast | unlock_zero_ui_test::test_zero_delta | 单元 | skill_unlock 高光行经 row_pacer 的真实消费流(固定种子令 Boss 半血后摇中闩技;快照取在 row_pacer 消费时刻,非阈值事件发射位) | B 区子树逐元素快照差=0(绑消费点提交面,防发射位空转假绿) | 新增:解锁拍零新增呈现 | -| V5 叙述行全砍 `design/ux/battle.md「Component Inventory」冒险叙述行六类随带全砍` | battle_narrator 删+消费点摘除(main_adventure_flow 六处+main_adventure_flow:109/111/179 终局三处+main.gd:373/377/380+curio 十处+debug_flow 一处) | log_band_retired_test::test_b_zone_zero_text | 单元 | 节点推进/恢复/商店/终局真实流 | B 区零文字节点+battle_narrator 符号 grep=0 | 新增:B 区零文字带 | +| V1 明细带退役 `design/ux/battle.md「Component Inventory」明细带整条退役` | battle_log_view/settlement_review 删除+壳摘除 | log_band_retired_test::_test_no_log_view_node | 单元 | adventure_screen 场景实例化 | 场景树节点名集合(无 log_view/settlement_review) | 新增:B 区零文字带 | +| V2 兑付浮字呈现 `design/ux/battle.md「即时反馈画面化预览」清图兑付浮字` | board_zone_view.spawn_clear_reward_text+main.gd 装配 | clear_reward_text_test::_test_spawn_and_decay | 单元 | 清图完成信号(round_end clear 分支) | 浮字节点文本=兑付值+2.5s 后 freeing | 新增:清图兑付浮字 | +| V3 浮字不遮棋盘 `design/ux/battle.md「即时反馈画面化预览」浮字全程不与棋盘格面重叠` | 同上 | clear_reward_text_test::_test_no_overlap+_test_decay_curves | 单元 | 同上 | 四判据全绑:rect 相交=空;底缘距棋盘上缘 ≥6px;渐隐 alpha 帧间步进 ≤0.1;兑付值可读时长 ≥60% 生命期 | 新增:清图兑付浮字 | +| V4 解锁拍零新增 `design/gdd/systems/战斗循环/敌人系统.md「目标顺位与意图线索」解锁拍零新增呈现` | row_pacer.gd 删 toast | unlock_zero_ui_test::_test_zero_delta | 单元 | skill_unlock 高光行经 row_pacer 的真实消费流(固定种子令 Boss 半血后摇中闩技;快照取在 row_pacer 消费时刻,非阈值事件发射位) | B 区子树逐元素快照差=0(绑消费点提交面,防发射位空转假绿) | 新增:解锁拍零新增呈现 | +| V5 叙述行全砍 `design/ux/battle.md「Component Inventory」冒险叙述行六类随带全砍` | battle_narrator 删+消费点摘除(main_adventure_flow 六处+main_adventure_flow:109/111/179 终局三处+main.gd:373/377/380+curio 十处+debug_flow 一处) | log_band_retired_test::_test_b_zone_zero_text | 单元 | 节点推进/恢复/商店/终局真实流 | B 区零文字节点+battle_narrator 符号 grep=0 | 新增:B 区零文字带 | | V6 基线换代 `design/ux/battle.md「即时反馈画面化预览」战斗屏纵向` | golden 受影响图重截 | 渲染闸 golden 比对 | 探针 | 渲染闸跑批 | 逐像素;**触发基线审核关卡**(T4 呈审) | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | | V7 探针锚等价 `design/ux/battle.md「Component Inventory」结算明细带(已退役)` | ui_probe/ui_click_probe 五处 | 两探针跑批 exit 0 | 探针 | 真实 UI 驱动流 | 锚语义等价(进战斗/换层——叙述行锚失据即换) | 既有:停点链与控件级真输入命中 | 测试方式两分法:V1–V5、V7 归调试接口验;浮字观感、解锁拍目感、两态布局归用户目检(登记不阻塞,写入实现报告实机目检清单)。 -测试削弱申报:battle_log_zero_text_test.gd 与 battle_narrator_test.gd 删除(被测对象退役,语义由 log_band_retired_test 承接;game/tests/README.md「战斗叙述与终局文案」能力行同批退役改写为「终局判定文案与战末账行」——已入表);无阈值放宽。 +测试削弱申报:battle_log_zero_text_test.gd 与 battle_narrator_test.gd 删除(被测对象退役,语义由 log_band_retired_test 承接;game/tests/README.md「战斗叙述与终局文案」能力行同批退役改写为「终局判定文案与战末账行」——已入表);pacing_queue_test.gd:242-257「解锁技名 toast 计数与行分布」断言随 V4 退役(钉住被删 toast 面,语义由 unlock_zero_ui_test 零新增断言承接);无阈值放宽。 独立验收审计:reports/iter-验收审计-<日期>.md,入口=本对照表全量;未过禁合并。 ## 9. 异常分级 @@ -163,6 +169,12 @@ L1 自救:探针锚替位的一次重试、Tween 参数微调。L2 记录继 | 1 | 同上 | A10 估时加总实为 2.75–4.5 | 自判 | 合计改 2.75–4.5 日(中值 3.625) | | 1 | 同上 | A11 零兑付守卫(main.gd:418-420)去留未钉 | 补写 | T2 补守卫保留句(未生效行不弹浮字,语义重述随带退役) | +| 3 | 编排预检只读子代理(Explore 分片,未参与撰写) | F1-P1 删件断编译面第六处漏登记:adventure_feats_test.gd:780 load battle_narrator 直调 feat_card_text | 补写 | §2/结构图/T1 三处补登记(等价改写义务) | +| 3 | 同上 | F2-P1 run_all.gd:195/:261 套件清单引用两待删测试件,删件后 spawn 缺脚本=闸红;run_all.gd 全卡未登记 | 补写 | §2/结构图/T1 补清单两行随删 | +| 3 | 同上 | F3-P2 探针删件直读面漏 3 行(ui_probe:134-135 几何断言、ui_click_probe:879 私有直读) | 补写 | T3 枚举补全 | +| 3 | 同上 | F4-P2 pacing_queue_test.gd:242-257 解锁 toast 计数断言钉住被删面,与 V4 冲突 | 补写 | 测试削弱申报补退役义务(语义由 unlock_zero_ui_test 承接) | +| 3 | 同上 | F5-P3 行号漂移(T2 :421→:420、守卫 :420→:419;battle_log_view :69/:56 漂移);F6-P3 注释残留面(battle_layout_table:2、ui_kit:207 HEX_LOG 死常量);F7-P3 coverage_exemptions.js:49 豁免条目随件报废;F8-P3 README:170 缺 _test_decay_curves 用例名;F9-P3 工作区 12 件未跟踪棋盘贴图 | 自判/补写 | 行号改正;注释扫尾入 T1;豁免撤条入 T4;README 用例名已补(写卡段);F9 留痕——开工前确认入库/忽略口径 | + 引擎技术面三查(同轮):Tween/Label 描边/减动效直达在 4.7 存在且行为如卡;UI 移动走 Tween 合 NEVER-9;Gotcha-3(Tween 随节点消亡)由 board_zone_view 常驻宿主承载——无发现。 ## 17. 复核自审七查执行记录