merge(写卡批v1.2): 两卡按第二轮 grilling 重落断言宿主合回——仓库在 v1.1 合回后退役 game/smoke/(16c6f136),卡A 断言面重落新单测 player_copy_sweep_test+锋段现址、卡C 静态半落 theme_projection_test+断点形态钉死选路停点形;检索口径/十二注入/最窄闸/golden README 对齐全部收口;文档域闸 --docs 全绿

This commit is contained in:
DKChan committed 2026-10-24 02:42:44 +08:00
commit 305f8ee63c
2 files changed
+154 -135

No files matched your search

@@ -1,16 +1,17 @@
# 需求卡片:开场后缀营地灰字迷雾测点批(开场行后缀认加算区+营地六处灰字深化+迷雾测点三关扩对)
- 版本:**v1.1**(2026-10-24 写卡会话成文同日 grilling 复核修订定稿;自审六查+grilling 复核结论见 §12)
- 版本:**v1.2**(2026-10-24 v1.0 成文→同日 grilling 第一轮修订 v1.1→第二轮 grilling 后按仓库换代〔`game/smoke/` 退役〕重落断言宿主定稿;两轮复核结论见 §12)
- 来源:[待办清单](../待办清单.md)「qa/ 实现报告收尾·孤儿遗留七项」(2026-10-14 登记,来源=批次移交,设计面=工程直入,状态=待写卡(备选))第②③④项+用户 2026-10-24 会话四裁(②③④走本卡、④走甲·归一后基准、第⑥项整条注销)(唯一事实源:工程直入证据指认=本卡 §3 逐条 file:line 实查+迷雾三关对比度本机复算(§3 F10);4-1/4-2 裁=交接文档 `reports/需求澄清-工程直入九项与卡片切分-2026-10-24.md` §三口径 6/7,4-3 甲·归一后基准=2026-10-24 会话四裁)
- 归属:`game/presentation/main.gd`(开场行后缀条件)+ `game/presentation/views/camp_overlay_view.gd`(六处灰字)+ `game/smoke/ui_contrast_probe.gd`(迷雾测点三行)+ `game/presentation/views/board_cell_unit.gd`(注释随动)+ 断言面(smoke_all / ui_click_probe / ui_contrast_probe)
- 归属:`game/presentation/main.gd`(开场行后缀条件)+ `game/presentation/views/camp_overlay_view.gd`(六处灰字)+ `game/probe/ui_contrast_probe.gd`(迷雾测点三行)+ `game/presentation/views/board_cell_unit.gd`(注释随动)+ 断言面(`game/tests/unit/presentation/theme_projection_test.gd` 扩段 + `game/probe/ui_click_probe.gd` 增段 + `game/probe/ui_contrast_probe.gd` 迷雾段改写)
- 排期:未编入(卡片不预占迭代号;本卡估时 ≈1.5–2.5 工作日,低于编排硬下限 5 工作日,须与其他卡同批编入——归 iter-plan 段四查③)
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(v1.1 已过,见 §12)
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(v1.2 已过两轮,见 §12)
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-24 写卡会话)**:来源条目设计面=工程直入、状态=待写卡(备选),第②③④项现状带 file:line 证据指认(写卡会话逐处复核到行号,营地六处行号较条目原文 :116/:403/:414 已漂移订正为现行 :167/:417/:476/:509/:513/:525)→ **放行写卡**。第⑥项(TG_* 装饰带)经用户 2026-10-24 裁整条注销,不入本卡(注销动作归 §6 反哺点)。
- 本卡与「文案与禁字清扫批」(2026-10-24 同会话卡 A)**零改动单元交叠**,可同批编入亦可分批;但**断言面共用** `smoke_all.gd`/`ui_click_probe.gd` 两文件、且两卡 T2 都需「驱动至三选一停点」的驱动基建——同批编入时挂段协调与驱动段共用归 iter-plan 编排注记。
- 迷雾测点值依赖素材盘上状态:本卡写卡会话已按 `_normalize_floor_luma` 同式对三关素材复算(§3 F10,grilling 复核独立复算吻合),实现批 T0 只对拍不复算。
- **仓库换代注记(2026-10-24,v1.2 立此存照)**:本卡 v1.1 合回(`5fba5efd`)六分钟后,`game/smoke/` 目录退役合并入库(`16c6f136`)——探针迁 `game/probe/`、`smoke_all.gd` 删除(断言面分流迁 `game/tests/` 各单测与 `system_test.gd`)。v1.1 的断言宿主失效,v1.2 已重落(§3 F4/F8/F11、§7)。
- 本卡与「文案与禁字清扫批」(2026-10-24 同会话卡 A)**零改动单元交叠**,可同批编入亦可分批;但**断言面共用** `game/probe/ui_click_probe.gd` 且两卡 T2 都驱动三选一停点区,两处分歧须点名:①选卡策略——卡 A 只读弹层头即离(`press_card(0)` 无条件选首件形态,:356-366 先例),本卡须专选 atk/max_hp 属性值提升卡再推进;②参数污染——卡 A 段 `set_sliders(400,200)`(:320)残值会使本卡白板反向假红(`_start_adventure` 只关窗不清值、残值跨段存活)。**同批共用时驱动参数须段内自洽、跨段显式复位**,归 iter-plan 编排注记。
- 迷雾测点值依赖素材盘上状态:本卡写卡会话已按 `_normalize_floor_luma` 同式对三关素材复算(§3 F10,两轮 grilling 独立复算吻合),实现批 T0 只对拍不复算。
## 1. 目标与完成定义
@@ -31,27 +32,28 @@
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | 工程直入证据指认(待办条目第②③④项现状+写卡会话 2026-10-24 逐处实查+grilling 复核独立补查,本卡 §3 F1–F12) | 三件缺陷的 file:line 现值与消费链 |
| D1 | 工程直入证据指认(待办条目第②③④项现状+写卡会话 2026-10-24 逐处实查+两轮 grilling 独立补查,本卡 §3 F1–F13) | 三件缺陷的 file:line 现值与消费链 |
| D2 | 用户裁决(2026-10-24 会话四裁+交接文档 §三口径 6/7) | 4-1 裁 A=两条路径各自有验收;4-2 裁 A=营地六处统一 STONE_DEEP;4-3 裁甲·归一后基准(裁定点=2026-10-24 会话四裁)=三关三行、测点与真实棋盘一致 |
| D3 | `game/presentation/views/board_view.gd:951-957/:995-1021`(地板亮度归一——现行生产路径)+`game/smoke/ui_contrast_probe.gd` 头注(测点对一律取 UiKit 常量实时求值,代码侧换色即闸红) | 迷雾测点基准须按归一后真实渲染面取值;探针哲学=值随真实路径派生 |
| D3 | `game/presentation/views/board_view.gd:951-957/:995-1021`(地板亮度归一——现行生产路径)+`game/probe/ui_contrast_probe.gd` 头注(测点对一律取 UiKit 常量实时求值,代码侧换色即闸红) | 迷雾测点基准须按归一后真实渲染面取值;探针哲学=值随真实路径派生 |
| D4 | `design/art/art-bible.md` §6.5 :395(迷雾记忆态在册复算值≈6.7:1、地板均值 #453020——**原图基准**) | 本批换代为归一后三关基准后,该在册值须同步(→§6 反哺点) |
## 3. 现状事实(2026-10-24 主区实查+grilling 复核独立补查;开工日 T0 复核行号)
## 3. 现状事实(2026-10-24 主区实查+两轮 grilling 独立补查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | 开场行后缀条件只认局外:`_on_adventure_level_started` 内显示值取 `runner.effective_atk()/effective_max_hp()`(注释自证「表值+永久强化 flat+**加算区 flat** 后乘调试浮窗 pct」),后缀布尔=`meta.hero_override()` atk/max_hp>0 ∨ 调试浮窗 pct>0×2——**局内加算区 flat 不在条件里**,拿了属性值提升显示值变大却不带注记 | `game/presentation/main.gd:603-612` |
| F2 | 后缀词=「(含面板加成)」由 `Narrator.level_open_line(display, seed, atk, max_hp, boosted)` 尾接(battle_narrator.gd:36-38);该函数**零既有断言**(全仓检索「level_open_line/含面板加成」在 smoke/tests 零命中) | `game/presentation/battle_narrator.gd:36-38` |
| F3 | 加算区账本:`run_ledger.bonus` 四键 {atk, max_hp, armor_class, ap}——冒险开始归零(:91)、断点续玩回填(:151-154,缺键钳 0);`_on_adventure_level_started` 首行已先重取 `run_scope.runner = run_scope.adventure.runner()`(main.gd:604)——条件处 runner 恒在役 | `game/core/adventure_runner.gd:29`/:91/:151-154;`game/presentation/main.gd:604` |
| F4 | 两条验收路径的机制前提:`level_started` 信号每关含首关都发(`_start_current_level` :857/:879,:879 在 resume 分支前无条件 emit——续玩必重发);`has_breakpoint()` 消费口唯一=`main._resume_from_menu`(:519-521)——**生产「继续上局」钮已随三入口化撤出**(ui_click_probe:319 注记 mn8),该函数现况=探针直调中间态(main.gd:486-487 注记 mn10 同族、卡④大门待接)——路径③按「等价真实信号」形态走此唯一消费口 | `game/core/adventure_runner.gd:857/:879`;`game/presentation/main.gd:519-521`/:486-487;`game/smoke/ui_click_probe.gd:319` |
| F5 | 白板局现状正确半:新开冒险 ov 全零+bonus 归零+调试关 → 无后缀(本批保回归);属性值提升经三选一/商店兑付入 bonus(奖励节点渠道=属性值提升+补给,同会话卡 A F2)——候选池滤掉 relic/feat_ticket 后仍可含 armor(→armor_class)与 ap(→ap)卡 | `main.gd:608-612`;`adventure_runner.gd:673-676` |
| F6 | 营地六处裸 `UiKit.STONE`(#786E62,对亮板实测 3.59–4.02:1 越带)::167 柜台结构位锁文、:417 秘宝行「未解锁」态色、:476 工坊行状态字、:509 同调行「被动/主动·充能」、:513 同调行档位标签、:525 刷新行「三选一刷新 +%d 次/冒险」;:75 已有换色先例与理由注记(STONE 对铭牌板 3.59:1 越带,换 STONE_DEEP 5.98:1) | `game/presentation/views/camp_overlay_view.gd:167`/:417/:476/:509/:513/:525/:75` |
| F7 | 六处底板色两类:柜台板=`PANEL_DATA`(`_counter_panel` :196-197,:167 所在图鉴柜与 :509/:513/:525 同调段所在秘宝匣柜台板)与行板=`CAMP_ROW_PLATE`(`ROW_PLATE_COL` :19 常量,:417/:476 所在行卡 :459);STONE_DEEP×两板两对色对**已在对比度探针在册**(铭牌副题 5.98:1/行价格 6.70:1) | `camp_overlay_view.gd:19`/:459/:196-197;`ui_contrast_probe.gd:50/:52` |
| F8 | 营地真实入口先例:ui_click_probe `open_camp_via_savesel(main, …)`(:59-60)+`main.camp_overlay` 成员直取+`refresh_camp(main._camp_data())`(:71);营地 label 上色经 `add_theme_color_override("font_color", …)`(UiKit.label 工厂与 camp :422 同式)——取色断言读法须走 `get_theme_color("font_color")` | `game/smoke/ui_click_probe.gd:59-82`;`camp_overlay_view.gd:422` |
| F9 | 迷雾现状与基准缺陷:记忆态=地板纹理直画+`FOG_MEMORY_PLATE #3A3A3A` α.66 灰罩+`FOG_MEMORY_INK #C4C4C4` 记忆墨;探针测点单行、地板均值取 art-bible §389 在册 #453020(**原图 PNG 均值**);但 `board_view._load_board_tiles`(:951-957)装载时对每张地板瓦片做**亮度归一**(8×8 双线性测光→k=(0.10/L)^(1/2.2) 钳 [0.6,1.8]→逐通道 sRGB 乘 k——现行瓦片原图 L≈0.036 被提亮),**真实渲染面≠原图均值** | `board_cell_unit.gd:267-275`;`ui_kit.gd:148-149`;`ui_contrast_probe.gd:61-64`;`board_view.gd:951-957`/:995-1021 |
| F10 | 三关对比度复算(写卡会话 2026-10-24 PIL 逐像素,素材在盘、按 §3 F9 归一同式;grilling 复核独立复算**逐值吻合**,三关 k 值 1.05–1.62 均未触钳位;门槛=探针 `MIN_RATIO 4.5`)——**原图基准**(上一会话口径):L1 6.72:1/L2 5.95:1/L3 6.62:1;**归一后基准**(真实渲染面,本卡采用):L1 地板均值 #6F4D33→合成底 #4C4037→**5.70:1**;L2 #4F5566→#414349→**5.65:1**(最差);L3 #4C5169→#40414A→**5.75:1**——两基准均全过 4.5:1,余量充足;三关归一后收敛(归一目标同 L≈0.10,色相差为残差);复算环境(PIL)与探针运行时(Godot 导入管线+bilinear)不同源,±2/255 内差异以 T0 探针派生首跑为准(§7 T0) | 素材=`game/assets/art/board/terrain_floor_{dungeon,underdark,deep_underdark}_{1..5}.png` 15 张实算 |
| F11 | 对比度探针形态:门槛 4.5 无区域例外;测点表 [名称, 墨色, 直背景, 墨α] 常量实时求值;合成底混成式=墨/板分量按 α 在 sRGB 域线性叠加(现行迷雾行同式) | `game/smoke/ui_contrast_probe.gd:3-9`/:61-64` |
| F12 | 改前读数基线=开工日 T0 采集(冒烟/单测/探针通过数对拍面)——写卡会话不跑测(测试执行两入口铁规),本卡不预写数字 | — |
| F2 | 后缀词=「(含面板加成)」由 `Narrator.level_open_line(display, seed, atk, max_hp, boosted)` 尾接(battle_narrator.gd:36-38);该函数**零既有断言**(全仓检索「level_open_line/含面板加成」零命中) | `game/presentation/battle_narrator.gd:36-38` |
| F3 | 加算区账本:`run_ledger.bonus` 四键 {atk, max_hp, armor_class, ap}——冒险开始归零(:91)、断点续玩回填(:151-154,缺键钳 0);`_on_adventure_level_started` 首行已先重取 `run_scope.runner = run_scope.adventure.runner()`(main.gd:604)——条件处 runner 恒在役;`level_runner.run_ledger` 为公有成员(level_runner.gd:680),冒险模式逐关经 adventure 装配链注入 | `game/core/adventure_runner.gd:29`/:91/:151-154;`game/presentation/main.gd:604` |
| F4 | 两条验收路径的机制前提(三态分支,2026-10-24 第二轮 grilling 订正):`level_started` 信号每关含首关都发(`_start_current_level` :857/:879);**但 `resume_adventure` 对断点形态三态分流**(:211-235)——断点带 `bonus_pending`(:211-229,emit `curio_choice_presented` 后提前 return)或 `bonus_result`(:230-235 提前 return)两种**三选一停点形**根本不调 `_start_current_level`、**不发 level_started**;唯两键皆空的**选路停点形**(bonus 已入账、停在下关选路点)走 :236→`_start_current_level()`→:879 重发开场行。`has_breakpoint()` 消费口唯一=`main._resume_from_menu`(:519-521)——**生产「继续上局」钮已随三入口化撤出**(ui_click_probe:319 注记 mn8),该函数现况=探针直调中间态(main.gd:486-487 注记 mn10 同族、卡④大门待接)——路径③按「等价真实信号」形态走此唯一消费口;**路径③断点形态钉值=选路停点形**(T2③) | `game/core/adventure_runner.gd:211-235`/:857/:879;`game/presentation/main.gd:519-521`/:486-487;`game/probe/ui_click_probe.gd:319` |
| F5 | 白板局现状正确半:新开冒险 ov 全零+bonus 归零+调试关 → 无后缀(本批保回归);属性值提升经三选一/商店兑付入 bonus(奖励节点渠道=属性值提升+补给);候选池滤掉 relic/feat_ticket 后的 kind 集含 attack/max_hp/armor/gp/ap/heal/refresh/rap/time_sand(`adventure_table.gd:23` CURIO_KINDS)——armor/ap 卡选了不触发后缀,兜底须按「无 atk/max_hp 卡即推进」 | `main.gd:608-612`;`adventure_runner.gd:673-676`;`game/data/schemas/adventure_table.gd:23` |
| F6 | 营地六处裸 `UiKit.STONE`(#786E62,对亮板实测 3.59–4.02:1 越带)::167 柜台结构位锁文、:417 秘宝行「未解锁」态色、:476 工坊行状态字、:509 同调行「被动/主动·充能」、:513 同调行档位标签、:525 刷新行「三选一刷新 +%d 次/冒险」;:75 已有换色先例与理由注记(STONE 对铭牌板 3.59:1 越带,换 STONE_DEEP 5.98:1) | `game/presentation/views/camp_overlay_view.gd:167`/:417/:476/:509/:513/:525/:75 |
| F7 | 六处底板色两类:柜台板=`PANEL_DATA`(`_counter_panel` :196-197,:167 所在图鉴柜与 :509/:513/:525 同调段所在秘宝匣柜台板)与行板=`CAMP_ROW_PLATE`(`ROW_PLATE_COL` :19 常量,:417/:476 所在行卡 :459);STONE_DEEP×两板两对色对**已在对比度探针在册**(铭牌副题 5.98:1/行价格 6.70:1,`game/probe/ui_contrast_probe.gd:50/:52`) | `camp_overlay_view.gd:19`/:459/:196-197;`game/probe/ui_contrast_probe.gd:50/:52` |
| F8 | 营地真实入口先例:`game/probe/ui_click_probe.gd` `open_camp_via_savesel(main, …)`(:59-60)+`main.camp_overlay` 成员直取+`refresh_camp(main._camp_data())`(:71);营地 label 上色经 `add_theme_color_override("font_color", …)`(UiKit.label 工厂 :429-434 与 camp :422 同式)——取色断言读法须走 `get_theme_color("font_color")` | `game/probe/ui_click_probe.gd:59-82`;`camp_overlay_view.gd:422`;`ui_kit.gd:429-434` |
| F9 | 迷雾现状与基准缺陷:记忆态=地板纹理直画+`FOG_MEMORY_PLATE #3A3A3A` α.66 灰罩+`FOG_MEMORY_INK #C4C4C4` 记忆墨;探针测点单行(`game/probe/ui_contrast_probe.gd:61-64`)、地板均值取 art-bible §389 在册 #453020(**原图 PNG 均值**);但 `board_view._load_board_tiles`(:951-957)装载时对每张地板瓦片做**亮度归一**(8×8 双线性测光→k=(0.10/L)^(1/2.2) 钳 [0.6,1.8]→逐通道 sRGB 乘 k——现行瓦片原图 L≈0.036 被提亮),**真实渲染面≠原图均值** | `board_cell_unit.gd:267-275`;`ui_kit.gd:148-149`;`game/probe/ui_contrast_probe.gd:61-64`;`board_view.gd:951-957`/:995-1021 |
| F10 | 三关对比度复算(写卡会话 2026-10-24 PIL 逐像素,素材在盘、按 §3 F9 归一同式;两轮 grilling 独立复算**逐值吻合**,三关 k 值 1.05–1.62 均未触钳位;门槛=探针 `MIN_RATIO 4.5`)——**原图基准**(上一会话口径):L1 6.72:1/L2 5.95:1/L3 6.62:1;**归一后基准**(真实渲染面,本卡采用):L1 地板均值 #6F4D33→合成底 #4C4037→**5.70:1**;L2 #4F5566→#414349→**5.65:1**(最差);L3 #4C5169→#40414A→**5.75:1**——两基准均全过 4.5:1,余量充足;三关归一后收敛(归一目标同 L≈0.10,色相差为残差);复算环境(PIL)与探针运行时(Godot 导入管线+bilinear)不同源,素材 `.import` 为无损导入(compress/mode=0)佐证实际不会失配,±2/255 内差异以 T0 探针派生首跑为准(§7 T0/L2) | 素材=`game/assets/art/board/terrain_floor_{dungeon,underdark,deep_underdark}_{1..5}.png` 15 张实算 |
| F11 | 对比度探针形态(现址 `game/probe/ui_contrast_probe.gd`):门槛 4.5 无区域例外(:9);测点表 [名称, 墨色, 直背景, 墨α] 常量实时求值(头注);合成底混成式=墨/板分量按 α 在 sRGB 域线性叠加(现行迷雾行 :61-64 同式);BoardView 可直呼(`board_view.gd:4` `class_name BoardView`;:68 `TILE_FLOOR_FMT` 路径常量;:995 `static func _normalize_floor_luma(tex, target_l, lumas_out)`) | `game/probe/ui_contrast_probe.gd:9`/:61-64;`board_view.gd:4`/:68`/:995-1021` |
| F12 | 仓库换代(2026-10-24 `16c6f136`):`game/smoke/` 退役——探针迁 `game/probe/`(ui_click_probe/ui_contrast_probe/ui_struct_probe 均在)、`smoke_all.gd` 删除、断言面分流迁 `game/tests/` 各单测与 `system_test.gd`;单测 runner=`game/tests/run_all.gd` 套件清单协议(显式登记制 :91/:101);叙述行/日志行协议类断言现役宿主=`game/tests/unit/presentation/theme_projection_test.gd`(run_all 清单 :101 在册「战斗日志行协议」域)——本卡静态半断言扩段落此,无需新清单行 | `game/tests/run_all.gd:91/:101`;`game/tests/unit/presentation/theme_projection_test.gd` |
| F13 | 改前读数基线=开工日 T0 采集(单测/探针通过数对拍面)——写卡会话不跑测(测试执行两入口铁规),本卡不预写数字 | — |
## 4. 设计契约(红线,违反 = L3 停机呈报)
@@ -59,17 +61,17 @@
🔴 **契约 2 · 营地六处全换+源内零残留**:六处逐字 `UiKit.STONE`→`UiKit.STONE_DEEP`(:167/:417/:476/:509/:513/:525);换后 `camp_overlay_view.gd` 源内零裸 `UiKit.STONE`(后跟 `_DEEP` 者不计)——由源 token 扫描断言钉住;`ui_kit.gd` 的 `STONE` 常量本体与全仓他用零改动。
🔴 **契约 3 · 迷雾测点钉值(甲·归一后基准)**:单行换代三行,行值=三关归一后地板均值(L1 (111,77,51)/L2 (79,85,102)/L3 (76,81,105),写卡会话复算值〔grilling 独立复算吻合〕,行尾注出处与「素材更新随动」义务);合成底按探针既有混成式(PLATE×0.66+均值×0.34,逐通道);**派生校验断言**:探针运行时按生产归一函数(复用 `board_view._normalize_floor_luma` 静态真函数——禁在探针内复制 k 公式)对 15 张地板素材实算归一后均值,逐关比对行值,容差 ±2/255(8-bit 量化级)——行值回原图基准或素材换代未随动均红;**素材缺位=按闸预检处置拷贝齐盘,禁跳过派生校验**(探针依赖 15 张 _1.._5 全在,闸预检只钉每关 _1 号件)。三行须全过 4.5:1。
🔴 **契约 3 · 迷雾测点钉值(甲·归一后基准)**:单行换代三行,行值=三关归一后地板均值(L1 (111,77,51)/L2 (79,85,102)/L3 (76,81,105),写卡会话复算值〔两轮 grilling 独立复算吻合〕,行尾注出处与「素材更新随动」义务);合成底按探针既有混成式(PLATE×0.66+均值×0.34,逐通道);**派生校验断言**:探针运行时按生产归一函数(复用 `BoardView._normalize_floor_luma` 静态真函数——禁在探针内复制 k 公式)对 15 张地板素材实算归一后均值,逐关比对行值,容差 ±2/255(8-bit 量化级)——行值回原图基准或素材换代未随动均红;**素材缺位=按闸预检处置拷贝齐盘,禁跳过派生校验**(探针依赖 15 张 _1.._5 全在,闸预检只钉每关 _1 号件)。三行须全过 4.5:1。
🔴 **契约 4 · 核心层零改动**:bonus 记账/回填/兑付(`run_ledger` 全链)零触碰——缺陷在呈现条件半边,核心已闭环(F3/F4);迷雾绘制本体(`board_cell_unit` 绘制路径)与 `FOG_MEMORY_*` 常量零改动(:270 注释随动除外——非行为)。
🔴 **契约 5 · 验收闭合**:三件改动各带对照表行,真实入口+撤销变红双证;「条件加了就绿」不成立——两条路径(菜单开新局/断点续玩)分别断言(4-1 裁 A)。
🔴 **契约 5 · 验收闭合**:三件改动各带对照表行,断言+撤销变红双证;「条件加了就绿」不成立——两条路径(菜单开新局/断点续玩)分别断言(4-1 裁 A);**路径③断点形态钉值=选路停点形**(bonus 已入账、`bonus_pending`/`bonus_result` 皆空——F4 三态分流下唯此形态重发开场行),禁用三选一停点形断点硬凑(续玩后无开场行可判即形态选错,先排形态再谈基建缺口——L3 判据)。
🔴 **契约 6 · 断言面零未申报削弱**:既有断言零删除零放宽;对比度探针既有行(含迷雾单行)由「换代」替代而非并存——旧单行删除属换代申报(§8.3),其余行零改动。
## 5. 范围边界
**做**:main.gd 后缀条件;营地六处换色+扫描断言+取色断言;迷雾测点三行+派生校验断言+:270 注释随动;三件的新增断言(smoke_all/ui_click_probe/ui_contrast_probe);反哺点清单(含孤儿第⑥项注销与 art-bible 换代两条)。
**做**:main.gd 后缀条件;营地六处换色+扫描断言+取色断言;迷雾测点三行+派生校验断言+:270 注释随动;三件的新增断言(theme_projection_test 扩段/ui_click_probe 增段/ui_contrast_probe 迷雾段改写);反哺点清单(含孤儿第⑥项注销与 art-bible 换代两条)。
**不做**(明示去向):
- `armor_class`/`ap` 加成是否也上开场行显示(显示值本身扩轴)——显示面改动另立,本批只修注记失真;
@@ -86,10 +88,10 @@
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/art/art-bible.md` §6.5 :395 | 在册复算值「≈6.7:1(地板纹理均值 #453020 与灰罩合成后 #3E3731 复算,迭代 16 T0)」系**原图基准**——本批测点换代归一后基准(5.65–5.75:1 三关)后该句过时 | 反哺点 · 列清单(①§6.5 复算值换代为「归一后(真实渲染面)三关 5.65–5.75:1+归一口径注+素材更新随动义务」;依据=本卡 F9/F10) |
| `待办清单.md`「qa/ 实现报告收尾·孤儿遗留七项」 | 第②③④项随本卡销号;第⑥项(TG_* 装饰带)按用户 2026-10-24 裁**整条注销**(不另立「功能性非文字检测」替代项);第⑦项留存——条目本体保留至 ⑦ 处置;条目状态推进「已写卡(本卡路径)」 | 反哺点 · 列清单(②⑥注销与②③④销号及状态推进归 batch-closure/文档批——**本写卡会话受「不改根清单」约束未执行,编排/开工前须补**) |
| `待办清单.md`「qa/ 实现报告收尾·孤儿遗留七项」 | 第⑥项(TG_* 装饰带)按用户 2026-10-24 裁**整条注销**(不另立「功能性非文字检测」替代项);第②③④项随本卡销号;第⑦项留存——条目本体保留至 ⑦ 处置;条目状态推进「已写卡(本卡路径)」 | 反哺点 · 列清单(②⑥注销与②③④销号及状态推进归 batch-closure/文档批——**本写卡会话受「不改根清单」约束未执行,编排/开工前须补**) |
| `roadmap.md` | 迭代行编入笔(编入哪一迭代由 iter-plan 段发令,本卡不预占) | 反哺点 · 列清单(③) |
| `game/presentation/`、`game/smoke/` | 实施本体与断言面 | 实施本体(可写) |
| `design/gdd/`(全树) | **无陈述被本批改变**——开场行后缀口径、营地灰字、迷雾测点基准在 GDD 零在册(2026-10-24 实查+grilling 复核补查:全树检索「含面板加成/开场行」零命中;HUD框架 :183 只登记「数字对格底 ≥4.5:1」常量要求,本批不触) | 无关联文档(查讫) |
| `game/presentation/`、`game/probe/`、`game/tests/unit/presentation/` | 实施本体与断言面 | 实施本体(可写) |
| `design/gdd/`(全树) | **无陈述被本批改变**——开场行后缀口径、营地灰字、迷雾测点基准在 GDD 零在册(2026-10-24 实查+两轮 grilling 复核补查:全树检索「含面板加成/开场行」零命中;HUD框架 :183 只登记「数字对格底 ≥4.5:1」常量要求,本批不触) | 无关联文档(查讫) |
## 7. 任务卡
@@ -101,52 +103,55 @@
|---|---|---|
| `game/presentation/main.gd` | 后缀条件扩两项(:608-612 段内;复用既有·修改) | 行为改动 → wc1/wc2/wc3 |
| `game/presentation/views/camp_overlay_view.gd` | 六处 STONE→STONE_DEEP(复用既有·修改) | 行为改动 → wc4 |
| `game/smoke/ui_contrast_probe.gd` | 迷雾单行→三行+派生校验断言(复用既有·改写验收函数——变异伴生义务) | 行为改动(断言面)→ wc5 |
| `game/probe/ui_contrast_probe.gd` | 迷雾单行→三行+派生校验断言(复用既有·改写验收函数——变异伴生义务) | 行为改动(断言面)→ wc5 |
| `game/presentation/views/board_cell_unit.gd` | :270 注释复算值随动换代(非行为) | 非行为改动 → wc6 |
| `game/smoke/smoke_all.gd` | 开场行断言段(静态半:`level_open_line` 尾接行为;复用既有·增段) | 行为改动(断言面)→ wc1 静态半 |
| `game/smoke/ui_click_probe.gd` | 开场行三路径断言+营地取色断言(挂既有局中/营地段;复用既有·增段) | 行为改动(断言面)→ wc1/wc2/wc3/wc4 |
| `game/tests/unit/presentation/theme_projection_test.gd` | 开场行静态半断言扩段(`level_open_line` 尾接行为——战斗日志行协议域宿主,run_all 清单 :101 在册;复用既有·增段,零清单改动) | 行为改动(断言面)→ wc1 静态半 |
| `game/probe/ui_click_probe.gd` | 开场行三路径断言+营地取色断言(挂既有局中/营地段;复用既有·增段) | 行为改动(断言面)→ wc1/wc2/wc3/wc4 |
| `reports/iter<N>-实现报告/代拍板追认单/反哺点`(三份,批末写) | 产出物落位 | 非行为改动 → wc7 |
本批**零新增文件、零新增数据件**;新增函数仅探针内私有派生助手(见预检)。
本批**零新增文件、零新增数据件、零 run_all 清单改动**(静态半落既有在册宿主扩段);新增函数仅探针内私有派生助手(见预检)。
### 接口块(全卡共用,后卡引用以此为准)
- **main 后缀条件**(`_on_adventure_level_started` 内,main.gd:608-612 段):`var boosted: bool = int(ov.get("atk", 0)) > 0 or int(ov.get("max_hp", 0)) > 0 or debug_overlay.atk_pct() > 0 or debug_overlay.hp_pct() > 0 or int(run_scope.runner.run_ledger.bonus.get("atk", 0)) > 0 or int(run_scope.runner.run_ledger.bonus.get("max_hp", 0)) > 0`——布尔直传 `Narrator.level_open_line(...)` 第五参(签名零变)。
- **ui_contrast_probe 派生助手**:`static func _norm_floor_avg(board_type: String) -> Color`(探针内私有)——装载 `terrain_floor_<board_type>_{1..5}` 五纹理、逐张调 `board_view._normalize_floor_luma(tex, 0.10, null)`、逐像素归一后均值再五张平均,返回 sRGB Color;仅供迷雾三行行值比对与行构造共用(生产归一逻辑唯一落点仍在 board_view,探针只消费)。
- **ui_contrast_probe 派生助手**:`static func _norm_floor_avg(board_type: String) -> Color`(探针内私有)——纹理路径经 `BoardView.TILE_FLOOR_FMT % [board_type, i]`(`board_view.gd:68` 常量,禁复制字面量);装载 `terrain_floor_<board_type>_{1..5}` 五纹理(`UiKit.load_tex`);逐张调 `BoardView._normalize_floor_luma(tex, 0.10, null)`(:995 static func 直呼);逐像素归一后均值再五张平均,返回 sRGB Color;仅供迷雾三行行值比对与行构造共用(生产归一逻辑唯一落点仍在 board_view,探针只消费)。
- 迷雾三行行名:「迷雾·记忆墨/合成底L1地牢」「迷雾·记忆墨/合成底L2幽暗」「迷雾·记忆墨/合成底L3深幽」(名称 L1 可调,尾缀〔wc5〕)。
- 断言尾缀〔wc#〕与 §8.2 对照表互指;各断言族最窄闸(注入实验跑法):
- 单测族(theme_projection_test)=`D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/theme_projection_test.gd` 单件直跑;
- 探针族两件(ui_click_probe / ui_contrast_probe)=窗口化/headless 单件直跑 `…console.exe --path game res://probe/ui_click_probe.tscn`(窗口化——驱动真实 UI)与 `…console.exe --headless --path game res://probe/ui_contrast_probe.tscn`(探针自持形态,头注运行行为准)。
### 落位与可复用性预检(本批新增件逐条三问)
- **`_norm_floor_avg(board_type) -> Color`(探针私有派生助手)**——复用面:归一逻辑**复用** `board_view._normalize_floor_luma` 生产静态函数(真渲染同源——禁探针内复制 k 公式即本条设计动机);为什么不复用「直接手填行值不派生」:派生校验是契约 3 的行值一致性断言面,手填无断言即撤销售证明缺(test-conventions §9.4)。唯一面:探针内唯一、全仓无第二处「按板型算归一后均值」实现(board_view 只逐张归一不聚合均值——聚合属探针判据面)。分层与交互面:探针→生产静态函数单向只读调用,零 UI 依赖、零核心写口;素材经 `UiKit.load_tex` 现成装载面(探针环境可用;缺位处置=契约 3 齐盘条款)。
- **`_norm_floor_avg(board_type) -> Color`(探针私有派生助手)**——复用面:归一逻辑**复用** `BoardView._normalize_floor_luma` 生产静态函数(真渲染同源——禁探针内复制 k 公式即本条设计动机);为什么不复用「直接手填行值不派生」:派生校验是契约 3 的行值一致性断言面,手填无断言即撤销售证明缺(test-conventions §9.4)。唯一面:探针内唯一、全仓无第二处「按板型算归一后均值」实现(board_view 只逐张归一不聚合均值——聚合属探针判据面);路径经 `TILE_FLOOR_FMT` 常量取(零第二处路径字面量)。分层与交互面:探针→生产静态函数单向只读调用,零 UI 依赖、零核心写口;素材经 `UiKit.load_tex` 现成装载面;缺位处置=契约 3 齐盘条款。
- **后缀条件/营地换色/注释随动**——零新增件,改既有行;营地取色断言复用 ui_click_probe 既有营地段(F8)与 `UiKit.STONE_DEEP` 常量直比(零第二色值定义;读法走 `get_theme_color("font_color")`——F8)。
- **开场行断言段**——复用 `_start_adventure_from_menu()`(ui_click_probe:323 先例)与 `main.log_view` 成员直取(营地/弹层成员直取先例同款);log 行文本读取用现成 `log_view._log`(RichTextLabel)文本判(F2 的消费面)。
- **开场行静态半落 theme_projection_test.gd 扩段**——为什么:迁移后断言按域分文件(F12),叙述行/日志行协议域现役宿主即该文件(run_all 清单 :101「战斗日志行协议」注记);新立文件=域错位+徒增清单行。**驱动面**:三路径断言复用 `_start_adventure_from_menu()`(`game/probe/ui_click_probe.gd:323` 先例)与 `main.log_view` 成员直取(营地/弹层成员直取先例同款);log 行文本读取用现成 `log_view._log`(RichTextLabel)文本判。
### T0 事实坐实(≈0.25d)
- [ ] 复核 §3 全部 file:line;确认断点写入点与续玩重建时 `level_started` 重发链(F4)在现行码上的准确形态(断点何时写:`save_manager` 停点/战斗开始时点);确认三选一停点确定性取卡路径(同种子同候选——`reward_pick` 封闭流)与 ui_click_probe 驱动局种子控制法——可核查结果:三路径驱动方案记进实现报告素材。
- [ ] 复核营地六处取色断言的 label 定位锚(文本锚/结构锚各六处;读法=`get_theme_color("font_color")`,F8);迷雾三行复算值 T0 用探针派生函数首跑对拍(行值 vs 派生值 ±2/255——**复算环境 PIL 与探针运行时 Godot 不同源,失配超容差时以探针派生首跑值为准修手填行值,走 L2 不走 L3**)——可核查结果:对拍读数在案。
- [ ] 改前读数基线采集(冒烟/单测/探针通过数,两入口铁规下随 T1 loop 首跑取值)——可核查结果:基线读数记录在案。
- [ ] 复核 §3 全部 file:line;确认选路停点形断点的构造链(T2② 推进至下一关选路停点时 `adventure_runner.gd:982` `_snapshot_breakpoint` 自然落盘——「选路停点=唯一可恢复停点形态;战斗中不存」:982 注记自证);确认三选一停点确定性取卡路径(同种子同候选——`reward_pick` 封闭流)与 ui_click_probe 驱动局种子控制法(:324-325 seed_edit 钉死先例)——可核查结果:三路径驱动方案记进实现报告素材。
- [ ] 复核营地六处取色断言的 label 定位锚(文本锚/结构锚各六处;读法=`get_theme_color("font_color")`,F8);迷雾三行复算值 T0 用探针派生函数首跑对拍(行值 vs 派生值 ±2/255——复算环境 PIL 与探针运行时 Godot 不同源,失配超容差时以探针派生首跑值为准修手填行值,走 L2 不走 L3)——可核查结果:对拍读数在案。
- [ ] 改前读数基线采集(单测/探针通过数,两入口铁规下随 T1 loop 首跑取值)——可核查结果:基线读数记录在案。
### T1 后缀条件+营地换色+断言(≈0.75–1d)
- [ ] 实装 main 后缀条件(接口块钉值六项布尔)。可核查结果:条件在位、`level_open_line` 签名与后缀词零变化。
- [ ] 实装营地六处换色(契约 2 六行)。可核查结果:`camp_overlay_view.gd` 源检索 `UiKit.STONE`(非 `_DEEP`)零命中。
- [ ] 实装 smoke 开场行静态半断言:`Narrator.level_open_line("层", 1, 5, 30, true)` 含「(含面板加成)」、`(..., false)` 零后缀(尾接行为钉住——F2 零既有断言的补位)。可核查结果:该段绿。
- [ ] 实装 theme_projection_test 开场行静态半断言(扩段):`Narrator.level_open_line("层", 1, 5, 30, true)` 含「(含面板加成)」、`(..., false)` 零后缀(尾接行为钉住——F2 零既有断言的补位)。可核查结果:该段绿。
- [ ] 实装 ui_click_probe 营地取色断言(挂 :59-82 营地段后):真实入口开营地后,按定位锚取六 label,断言 `get_theme_color("font_color") == UiKit.STONE_DEEP` ×6。可核查结果:探针该段绿。
- [ ] 实装源 token 扫描断言(挂 ui_struct_probe 营地相关段或冒烟静态扫描段——repo 源码 token 扫描先例=ui_struct_probe ⑧ 零动效 token 扫描):`camp_overlay_view.gd` 源码零正则命中 `UiKit\.STONE(?!_DEEP)`。可核查结果:该断言绿。
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 精确还原→记录):①回退 main 条件 hunk(去 bonus 两项)→wc1/wc2 正向断言红(T2 落地后跑;本卡先录注入方案);②营地任一处回 `UiKit.STONE`→取色断言红+token 扫描红;③扫描正则临时放宽为匹配 `_DEEP`→自断言误红(证明正则判别边界)。记录表进实现报告。
- [ ] 实装源 token 扫描断言(挂 ui_struct_probe 营地相关段或探针静态扫描段——repo 源码 token 扫描先例=ui_struct_probe ⑧ 零动效 token 扫描):`camp_overlay_view.gd` 源码零正则命中 `UiKit\.STONE(?!_DEEP)`。可核查结果:该断言绿。
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 精确还原→记录;最窄闸=接口块所列单件直跑命令):①回退 main 条件 hunk(去 bonus 两项)→wc1/wc2 正向断言红(T2 落地后跑;本卡先录注入方案);②营地任一处回 `UiKit.STONE`→取色断言红+token 扫描红;③扫描正则临时放宽为匹配 `_DEEP`→自断言误红(证明正则判别边界)。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批只碰 `game/` → `--code`),期望代码域全绿。
### T2 开场行三路径真实入口断言(≈0.5–1d)
- [ ] 实装 ui_click_probe 开场行三路径断言(真实入口驱动,`log_view._log` 文本判「(含面板加成)」有无):①**菜单开新局·白板反向**——`_start_adventure_from_menu()`(种子固定)开局,L1 开场行零后缀(防坑:**勿复用 :320-321 `set_sliders(400,200)` 先例**——pct>0 会使后缀恒真、路径①假红;白板=调试浮窗关);②**菜单开新局·局内加算区正向**——续驱动至奖励节点三选一(:356-366 先例),按同种子确定性候选选一张 atk 或 max_hp 属性值提升卡,**候选无 atk/max_hp 卡即推进至下一停点循环兜底(其余无论是补给/护甲/AP 卡都不选——选了不触发后缀)**,推进至下一关开场,断言开场行带后缀;③**断点续玩正向**——于带 bonus 的进行态退出落断点(T0 复核断点写入时点),经 `_resume_from_menu()` 唯一消费口驱动(F4:生产钮已撤出,此即现况唯一真实入口形态——mn10 探针直调中间态同族),断言重建开场行带后缀。可核查结果:三路径断言绿。
- [ ] 变异验证:①回退 main 条件 hunk→②③红、①仍绿(反向断言钉另一侧——两侧各自闭合);②条件误删 ov 四项中任一→既有局外加成路径回归断言红(补一条 ov/pct>0 带后缀的既有行为回归断言——F5 正确半保回归);还原复绿。记录表进实现报告。
- [ ] 实装 ui_click_probe 开场行三路径断言(真实入口驱动,`log_view._log` 文本判「(含面板加成)」有无):①**菜单开新局·白板反向**——`_start_adventure_from_menu()`(种子固定 :324-325 先例)开局,L1 开场行零后缀(防坑:**滑条须显式归零**——`_start_adventure`(main.gd:581)只关窗不清值,`:320` set_sliders(400,200) 残值在同探针会话跨段存活,白板反向段前须归零或独立隔离段);②**菜单开新局·局内加算区正向**——续驱动至奖励节点三选一(:356-366 先例),按同种子确定性候选选一张 atk 或 max_hp 属性值提升卡,**候选无 atk/max_hp 卡即推进至下一停点循环兜底(其余无论是补给/护甲/AP 卡都不选——选了不触发后缀)**,推进至下一关开场,断言开场行带后缀;③**断点续玩正向·选路停点形**——于路径②的下一关选路停点(bonus 已入账、`bonus_pending`/`bonus_result` 皆空——:982 自然落盘)退出落断点,经 `_resume_from_menu()` 唯一消费口驱动(F4:生产钮已撤出,此即现况唯一真实入口形态——mn10 探针直调中间态同族),断言重建开场行带后缀。可核查结果:三路径断言绿。
- [ ] 变异验证(注入→最窄闸见红→还原→记录;最窄闸=接口块探针单件直跑):①回退 main 条件 hunk→②③红、①仍绿(反向断言钉另一侧——两侧各自闭合);②条件误删 ov 四项中任一→既有局外加成路径回归断言红(补一条 ov/pct>0 带后缀的既有行为回归断言——F5 正确半保回归);还原复绿。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`--code`),期望代码域全绿。
### T3 迷雾测点三行+派生校验(≈0.25–0.5d)
- [ ] 实装探针迷雾段换代:单行删、三行入(契约 3 钉值三关均值+行尾出处注「写卡会话复算+素材更新随动」);`_norm_floor_avg` 派生助手;派生校验断言(三关行值 vs 派生值 ±2/255);`:270` 注释随动(「≈6.7:1/#453020 复算在册」→「归一后(真实渲染面)三关 5.65–5.75:1——测点行值与素材随动,见 ui_contrast_probe 迷雾段」)。可核查结果:探针迷雾段三行绿+派生校验绿。
- [ ] 变异验证:①三行任一行值回原图基准(如 L1 回原图均值)→该行对比度仍过但**派生校验红**(钉的就是基准一致性);②行值人为调偏 ±4→派生校验红;③派生助手参数误改(`target_l` 0.10→0.05——k 值真实漂移;注:三关现行 k 均未触钳位、钳位形态如「下钳改 1.2」亦可、**单纯去钳不红**)→校验红。还原复绿。记录表进实现报告。
- [ ] 实装 `game/probe/ui_contrast_probe.gd` 迷雾段换代:单行删、三行入(契约 3 钉值三关均值+行尾出处注「写卡会话复算+素材更新随动」);`_norm_floor_avg` 派生助手(接口块钉值:路径经 `BoardView.TILE_FLOOR_FMT`、归一经 `BoardView._normalize_floor_luma` 直呼);派生校验断言(三关行值 vs 派生值 ±2/255);`board_cell_unit.gd:270` 注释随动(「≈6.7:1/#453020 复算在册」→「归一后(真实渲染面)三关 5.65–5.75:1——测点行值与素材随动,见 ui_contrast_probe 迷雾段」)。可核查结果:探针迷雾段三行绿+派生校验绿。
- [ ] 变异验证(注入→最窄闸见红→还原→记录;最窄闸=接口块 ui_contrast_probe 单件直跑):①三行任一行值回原图基准(如 L1 回原图均值)→该行对比度仍过但**派生校验红**(钉的就是基准一致性);②行值人为调偏 ±4→派生校验红;③派生助手参数误改(`target_l` 0.10→0.05——k 值真实漂移;注:三关现行 k 均未触钳位、钳位形态如「下钳改 1.2」亦可、**单纯去钳不红**)→校验红。还原复绿。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`--code`),期望代码域全绿+渲染闸照跑(回归线:本批零视觉改动面,changed 读数应全 0.00% 档——超阈即存量异常呈报)。
### T4 产出物落位卡(≈0.25d,末卡)
@@ -154,7 +159,7 @@
- [ ] 轻闸全绿后、合并前写齐三份:`reports/iter<N>-实现报告-<完成日>.md`(三件状态+变异验证记录表+实机目检总清单〔开场行后缀观感/营地灰字观感两条〕+遗留读数义务)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§10 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§6 三条各一落点——含孤儿⑥注销动作与待办清单状态推进的补执行清单)。可核查结果:三文件在 `reports/` 且 §6 每条有落点。
- [ ] 合并前置:独立验收审计(§8.3 末段)完成且报告 `reports/iter<N>-验收审计-<完成日>.md` 逐行「通过」——未通过不得合并。可核查结果:审计报告在 `reports/` 且逐行「通过」。
**估时合计 ≈1.5–2.5d**(T0 0.25+T1 0.75–1+T2 0.5–1+T3 0.25–0.5+T4 0.25)。切分预案:T1/T2/T3 三件相互独立可切波,建议按 T1→T2→T3 顺序(T2 驱动基建最重);超软盒预挂:T2 断点续玩驱动若超 0.5d,允许把路径③降为「探针等价真实信号」形态并记录,禁删断言。**编排注记**:本卡估时低于 iter-plan 四查③硬下限 5 工作日,单独不成迭代——与其他卡(如同会话卡 A)同批编入;同批时断言面挂段与三选一驱动基建与卡 A 协调共用(§0)。
**估时合计 ≈1.5–2.5d**(T0 0.25+T1 0.75–1+T2 0.5–1+T3 0.25–0.5+T4 0.25)。切分预案:T1/T2/T3 三件相互独立可切波,建议按 T1→T2→T3 顺序(T2 驱动基建最重);超软盒预挂:T2 断点续玩驱动若超 0.5d,允许把路径③降为「路径②推进至选路停点后直接以既有断点快照喂 `_resume_from_menu`」的等价形态并记录,禁删断言、禁改用三选一停点形断点(契约 5)。**编排注记**:本卡估时低于 iter-plan 四查③硬下限 5 工作日,单独不成迭代——与其他卡(如同会话卡 A)同批编入;同批时 `ui_click_probe.gd` 挂段与三选一驱动基建与卡 A 协调共用、驱动参数段内自洽(§0 两处分歧点名)。
## 8. 验证闸
@@ -162,10 +167,10 @@
| # | 需求点 | 测什么(断言/行为) | 落点/判定手段 |
|---|---|---|---|
| V1 | 后缀认加算区(新开路径) | 白板 L1 零后缀(反向)+三选一拿属性值提升后下一关开场行带后缀 | smoke 静态半+ui_click_probe 路径①② |
| V2 | 后缀认加算区(续玩路径) | 断点含 bonus 续玩重建开场行带后缀 | ui_click_probe 路径③ |
| V1 | 后缀认加算区(新开路径) | 白板 L1 零后缀(反向)+三选一拿属性值提升后下一关开场行带后缀 | theme_projection 静态半+ui_click_probe 路径①② |
| V2 | 后缀认加算区(续玩路径) | 选路停点形断点(含 bonus)续玩重建开场行带后缀 | ui_click_probe 路径③ |
| V3 | 既有口径回归 | 局外加成(ov/pct>0)带后缀的现行行为不回归 | ui_click_probe 回归断言(T2 变异步②) |
| V4 | 营地六处换色 | 六 label 取色==STONE_DEEP(`get_theme_color` 读法)+源内零裸 STONE+既有探针在册两行零改动仍绿 | ui_click_probe 取色+token 扫描+ui_contrast_probe 回归 |
| V4 | 营地六处换色 | 六 label `get_theme_color("font_color")`==STONE_DEEP+源内零裸 STONE+既有探针在册两行零改动仍绿 | ui_click_probe 取色+token 扫描+ui_contrast_probe 回归 |
| V5 | 迷雾测点三关扩对 | 三行 ≥4.5:1+行值与运行时归一派生值一致(±2/255) | ui_contrast_probe 迷雾段+派生校验断言 |
| V6 | 注释随动 | :270 复算值换代 | 件核(T3) |
| V7 | 反哺点清单 | §6 三条每条有落点 | 件核对表(T4 出口) |
@@ -176,11 +181,11 @@
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|---|---|---|---|---|---|
| wc1 开场行后缀·新开路径 | `main.gd:608-612` 条件扩两项+smoke 静态半断言+ui_click_probe 路径①② | level_open_line 尾接行为+白板反向+局内加成正向〔wc1〕 `smoke_all.gd` 静态段+`ui_click_probe.gd` 开场行段 | 单元+探针 | 静态直调+`_start_adventure_from_menu()`(:323)真实开局+三选一停点真实驱动(:356-366) | 撤销:回退 main 条件 hunk→路径②红、路径①仍绿(两侧各自闭合);变异:ov 项误删→回归断言红 |
| wc2 开场行后缀·续玩路径 | 同 wc1 条件改动(同 hunk)+ui_click_probe 路径③ | 断点含 bonus 续玩重建开场行带后缀〔wc2〕 `ui_click_probe.gd` 开场行段 | 探针 | `_resume_from_menu()`(:519)唯一消费口——生产钮已撤出(F4),此即现况唯一真实入口形态 | 撤销:回退同 hunk→路径③红 |
| wc1 开场行后缀·新开路径 | `main.gd:608-612` 条件扩两项+theme_projection 静态半+ui_click_probe 路径①② | level_open_line 尾接行为+白板反向+局内加成正向〔wc1〕 `theme_projection_test.gd` 扩段+`ui_click_probe.gd` 开场行段 | 单元+探针 | 静态直调+`_start_adventure_from_menu()`(:323)真实开局+三选一停点真实驱动(:356-366) | 撤销:回退 main 条件 hunk→路径②红、路径①仍绿(两侧各自闭合);变异:ov 项误删→回归断言红 |
| wc2 开场行后缀·续玩路径 | 同 wc1 条件改动(同 hunk)+ui_click_probe 路径③ | 选路停点形断点(含 bonus)续玩重建开场行带后缀〔wc2〕 `ui_click_probe.gd` 开场行段 | 探针 | `_resume_from_menu()`(:519)唯一消费口——生产钮已撤出(F4),此即现况唯一真实入口形态;断点=路径②推进至下一关选路停点 :982 自然落盘 | 撤销:回退同 hunk→路径③红 |
| wc3 既有口径回归 | 同 wc1 条件改动(回归面) | ov 局外加成存在→带后缀(现行行为不回归)〔wc3〕 `ui_click_probe.gd` 回归断言 | 探针 | 调试浮窗 pct>0(现役门控——能力验证两分法)或带 ov 的存档真实开局 | 变异:条件 ov 四项误删任一→本断言红 |
| wc4 营地六处换色 | `camp_overlay_view.gd:167/:417/:476/:509/:513/:525` 换色 | 六 label `get_theme_color("font_color")`==STONE_DEEP+源零裸 STONE〔wc4〕 `ui_click_probe.gd` 营地段+token 扫描断言 | 探针+静态扫描 | `open_camp_via_savesel`(:59-60)真实入口开营地 | 变异:任一处回 STONE→取色断言红+扫描红(T1②) |
| wc5 迷雾测点三行+派生校验(改写验收函数) | `ui_contrast_probe.gd:61-64` 单行换代三行+`_norm_floor_avg` 派生+校验断言 | 三行 ≥4.5:1+行值 vs 派生值 ±2/255〔wc5〕 `ui_contrast_probe.gd` 迷雾段 | 探针 | 素材经 `UiKit.load_tex` 真实装载+生产归一函数真实调用(`_normalize_floor_luma`) | 变异:行值回原图基准→校验红;调偏 ±4→红;派生 target_l 0.10→0.05→红(T3①②③) |
| wc5 迷雾测点三行+派生校验(改写验收函数) | `game/probe/ui_contrast_probe.gd:61-64` 单行换代三行+`_norm_floor_avg` 派生+校验断言 | 三行 ≥4.5:1+行值 vs 派生值 ±2/255〔wc5〕 `ui_contrast_probe.gd` 迷雾段 | 探针 | 素材经 `UiKit.load_tex` 真实装载+生产归一函数真实调用(`BoardView._normalize_floor_luma`) | 变异:行值回原图基准→校验红;调偏 ±4→红;派生 target_l 0.10→0.05→红(T3①②③) |
| wc6 注释随动(**非行为改动**) | `board_cell_unit.gd:270` 复算值注释换代 | 注释含「归一后」口径与三关值〔wc6〕 件核 | 非行为改动 | — | 件核(T3 可核查结果) |
| wc7 反哺点清单(**非行为改动**) | T4 三份产出物(§6 三落点) | §6 三条每条有落点〔wc7〕 件核对表 | 非行为改动 | 反哺点清单对 §6 表件核 | 撤销:删一落点→T4 件核红 |
@@ -188,24 +193,24 @@
**闸口径**:轻闸每任务卡出口自跑;批末重闸=`tools/run_all_gates.sh` 按改动域选档(本批只碰 `game/` → `--code`)全绿才合并+改前改后读数对拍。回归措辞:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):smoke 静态半/ui_click_probe 三路径+回归+取色/token 扫描/探针迷雾段与派生校验均为新增或改写断言——注入已挂 T1(wc4×2+扫描正则边界)/T2(wc1 双侧+wc3)/T3(wc5×3);变异不红则改判据或如实标注拦截边界。
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):theme_projection 扩段/ui_click_probe 三路径+回归+取色/token 扫描/探针迷雾段与派生校验均为新增或改写断言——注入已挂 T1(wc4×2+扫描正则边界)/T2(wc1 双侧+wc3)/T3(wc5×3);变异不红则改判据或如实标注拦截边界。
### 8.3 测试削弱申报(test-conventions §9.5)
允许改/删的旧断言清单及理由:`ui_contrast_probe.gd:61-64` 迷雾**单行删除**——理由=该行属本批需求点的换代对象(单值→三行+派生校验),非规避拦截;替换判据比原判据更严(三关实测基准+一致性校验 vs 单值手填)。除此之外零删除、零放宽、零缩小扫描面、零换下层直调;探针其余行、冒烟、探针族既有断言原样。
允许改/删的旧断言清单及理由:`game/probe/ui_contrast_probe.gd:61-64` 迷雾**单行删除**——理由=该行属本批需求点的换代对象(单值→三行+派生校验),非规避拦截;替换判据比原判据更严(三关实测基准+一致性校验 vs 单值手填)。除此之外零删除、零放宽、零缩小扫描面、零换下层直调;探针其余行、单测族既有断言原样。
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T4 合并前置)。
## 9. 异常分级
- **L1(自救)**:断言名与消息措辞;迷雾三行行名;`:270` 注释措辞;token 扫描挂段位置。
- **L2(记录继续)**:路径③驱动形态细节(断点落点构造法);三选一候选兜底循环参数;取色断言 label 定位锚形态(文本锚 vs 结构锚);派生校验容差在 ±2/255 内微调;**手填行值与探针派生首跑失配时的行值修订**(以探针派生为准,F10/T0)。
- **L3(停机呈报)**:`run_scope.runner` 空指针(F3 前置被打破=状态机缺陷,禁加 null 软回退);三关任一行 <4.5:1(素材已换代——重算行值并呈报,禁放宽门槛);断点续玩路径无法经 `_resume_from_menu` 唯一消费口驱动(驱动基建缺口——呈报方案,禁删断言了事);发现六处之外第七处裸 STONE 越带位(存量呈报,不顺手扩面);任何顺带动 bonus 记账/迷雾绘制/STONE 常量的诉求。
- **L2(记录继续)**:路径③断点构造细节(自然落盘 vs 既有快照喂入——超软盒预挂的等价形态);三选一候选兜底循环参数;取色断言 label 定位锚形态(文本锚 vs 结构锚);派生校验容差在 ±2/255 内微调;**手填行值与探针派生首跑失配时的行值修订**(以探针派生为准,F10/T0)。
- **L3(停机呈报)**:`run_scope.runner` 空指针(F3 前置被打破=状态机缺陷,禁加 null 软回退);三关任一行 <4.5:1(素材已换代——重算行值并呈报,禁放宽门槛);路径③续玩后无开场行可判——**先排除断点形态选错**(三选一停点形断点不发 level_started,F4——形态对了仍不可驱动才是基建缺口,呈报方案);禁删断言了事;发现六处之外第七处裸 STONE 越带位(存量呈报,不顺手扩面);任何顺带动 bonus 记账/迷雾绘制/STONE 常量的诉求。
## 10. 代拍板白名单(超清单必呈报)
1. 迷雾三行行名与注释措辞——约束:含关别(L1/L2/L3)与「归一后」口径。
2. 路径③断点态构造与驱动细节(断点落点取法)——约束:必须经 `_resume_from_menu` 唯一消费口。
2. 路径③断点态构造细节(自然落盘 vs 既有快照喂入)——约束:断点必须为选路停点形(bonus 已入账、bonus_pending/bonus_result 皆空)且经 `_resume_from_menu` 唯一消费口。
3. 三选一候选兜底循环的推进上限——约束:只选 atk/max_hp 属性值提升卡,补给/护甲/AP 卡都不选、候选无即推进。
4. 取色断言定位锚形态(文本锚 vs 结构锚)。
5. 提交切分与 worktree 分支命名。
@@ -221,6 +226,8 @@
## 12. 自审六查与 grilling 复核记录
**自审六查(2026-10-24 写卡会话)**:①规格覆盖——§1 三件改动/五项完成定义逐条挂 T 卡(条件+营地=T1、三路径=T2、迷雾=T3、产出物=T4),各指到对照表 wc1–wc7,无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,函数体零给出(接口块只给条件布尔与助手签名);③类型一致性——接口块签名(`level_open_line` 第五参 bool、`_norm_floor_avg(board_type: String) -> Color`)与 T 卡/对照表引用逐字一致;④审查焦点+改动覆盖——补挂失败模式:既有口径回归(wc3+T2 变异步②)、基准回潮仍过阈(wc5 变异①派生校验拦截)、断点驱动缺口(L3 分级+超软盒预挂)、白板反向被调试浮窗污染(T2① 防坑句);文件结构图 6 个行为改动行+1 个非行为行全部指到对照表行;⑤篇幅比例——规格≈1 屏、任务卡≈实现面 1:1,零代码块(接口块布尔表达式属钉值非函数体);⑥落位与复用——唯一新增件 `_norm_floor_avg` 的「为什么不能复用既有/落点唯一/调用路径」已在预检节答清(复用生产静态归一函数、聚合属探针判据面),与文件结构图互指一致。
**自审六查(2026-10-24 写卡会话)**:①规格覆盖——§1 三件改动/五项完成定义逐条挂 T 卡(条件+营地=T1、三路径=T2、迷雾=T3、产出物=T4),各指到对照表 wc1–wc7,无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,函数体零给出(接口块只给条件布尔与助手签名);③类型一致性——接口块签名(`level_open_line` 第五参 bool、`_norm_floor_avg(board_type: String) -> Color`、`BoardView.TILE_FLOOR_FMT`/`_normalize_floor_luma(tex, 0.10, null)`)与 F11 实查及 T 卡/对照表引用逐字一致;④审查焦点+改动覆盖——补挂失败模式:既有口径回归(wc3+T2 变异步②)、基准回潮仍过阈(wc5 变异①派生校验拦截)、断点形态选错(F4 三态+契约 5+L3 先排形态)、白板反向被滑条残值污染(T2① 防坑句);文件结构图 6 个行为改动行+1 个非行为行全部指到对照表行;⑤篇幅比例——规格≈1 屏、任务卡≈实现面 1:1,零代码块(接口块布尔表达式属钉值非函数体);⑥落位与复用——唯一新增件 `_norm_floor_avg` 的「为什么不能复用既有/落点唯一/调用路径」已在预检节答清(复用生产静态归一函数与路径常量、聚合属探针判据面),静态半落既有在册宿主扩段的域理由已答(F12),与文件结构图互指一致。
**grilling 复核记录(2026-10-24,独立子代理对抗复核,不采访用户——可推导定值写依据、真归用户列 §11)**:事实面(main 条件四项逐字、bonus 链、营地六处与底板映射、探针形态、:879 无条件 emit、HUD框架 :183、F2 零断言全仓证实)逐条实核成立;**F10 归一后数值独立复算逐值吻合**(15 张素材、k 1.05–1.62 未触钳)。零阻断;三条应修+五条建议:【应修】C-1 路径③「继续上局真实钮」失实(生产钮已随 mn8 撤出、`_resume_from_menu` 系 mn10 探针直调中间态——F4/wc2/T2③ 改为唯一消费口口径);C-2 T2② 兜底触发条件覆盖不全(armor/ap 卡非补给也不可选——改「候选无 atk/max_hp 卡即推进」);C-3 T3 变异③「去钳位」必绿(三关 k 未触钳、钳位非结合分支——改 target_l 0.10→0.05 可漂移形态并注记);【建议】C-4 D2 引用口径对号(裁定点=会话四裁非 §三口径 8);C-5 素材缺位处置(契约 3 补齐盘条款——闸预检只钉 _1 号件);C-6 PIL↔Godot 复算不同源(行值以 T0 探针派生首跑为准、失配走 L2);C-7 白板反向防坑句(勿复用 set_sliders(400,200) 先例);C-8 取色读法(`get_theme_color("font_color")`)。v1.1 修订内容:上述八条全部折进 F4/F5/F8/T0/T1/T2/T3/契约 3/§9/§10;§0 补「与卡 A 断言面共用两文件+驱动基建共用」编排注记。复核结论:修订后零阻断零应修,零待裁点成立。
**grilling 第一轮复核记录(2026-10-24,独立子代理对抗复核)**:零阻断;三应修(C-1 续玩「真实钮」失实→唯一消费口口径;C-2 兜底触发条件覆盖不全→「无 atk/max_hp 卡即推进」;C-3 变异③去钳必绿→target_l 漂移形态)+五建议(C-4 D2 引用对号;C-5 素材齐盘条款;C-6 PIL↔Godot 复算不同源走 L2;C-7 白板防坑句;C-8 取色读法)全折 v1.1。
**grilling 第二轮复核记录(2026-10-24 用户令「确保步骤明确、无灰色地带、无冲突」再开一轮,独立子代理对抗复核)**:判回炉一处【阻断】——**仓库换代**:v1.1 合回六分钟后 `game/smoke/` 退役合并(`16c6f136`),本卡断言宿主(smoke_all/ui_click_probe/ui_contrast_probe)路径整体失效、smoke_all 删除。随同一应修(Y-1 F4「续玩必重发」假泛化——`resume_adventure` 对 bonus_pending/bonus_result 形断点提前 return 不发 level_started,仓内仅有的两个续玩夹具先例恰是 bonus_pending 形、照抄必卡死→F4 补三态事实+契约 5/T2③/代拍板 2 把断点形态钉死为选路停点形+L3 先排形态判据)+五建议(S-1 最窄闸逐族命名→接口块;S-2 滑条归零防坑半句;S-3 与卡 A 的选卡策略/参数污染两处分歧点名→§0;S-4 派生助手补路径常量与静态调用形态→接口块/F11;S-5 §6 cell 语序订正)。v1.2 修订内容:①断言宿主重落——静态半=theme_projection_test.gd 扩段(战斗日志行协议域宿主,零清单改动)、探针=game/probe/ 新址;F4 三态分支事实+F11 补 BoardView 直呼三锚(:4/:68/:995);②契约 5 断点形态钉值+T2③ 选路停点形构造链(:982 自然落盘)+超软盒等价形态约束+L3 先排形态;③T2① 滑条显式归零防坑;④§0 两处分歧点名;⑤§6 语序订正(⑥注销与②③④销号)。复核结论:修订后零阻断零应修,零待裁点成立。
@@ -1,21 +1,22 @@
# 需求卡片:文案与禁字清扫批(玩家面旧术语与「雷」族禁字清零换新)
- 版本:**v1.1**(2026-10-24 写卡会话成文同日 grilling 复核修订定稿;自审六查+grilling 复核结论见 §12)
- 来源:[待办清单](../待办清单.md)「现役 UI/文案两处自相冲突」(2026-10-09 登记,来源=审计发现,设计面=工程直入,状态=待写卡)+「玩家面残留禁字清扫——图例/明细/日志/字形五处」(2026-10-20 登记,来源=批次移交,设计面=工程直入,状态=待写卡)+清单外两处「特性」泄漏(2026-10-24 用户裁收进本卡)+第 13 处战斗日志禁字(grilling 复核发现增补)(唯一事实源:工程直入证据指认=本卡 §3 逐条 file:line 实查;术语口径=[术语表](../design/gdd/术语表.md)「用语规范」节禁用字面行(:158)+用户 2026-10-24 会话四裁)
- 归属:`game/presentation/views/`(hero_info_panel_view / legend_overlay / status_slot_row / board_view / level_map_screen)+ `game/presentation/battle_narrator.gd` + `game/presentation/views/battle_log_view.gd`(消费面断言)+ `game/core/battle_orchestrator.gd`(u13 单行文案)+ `game/data/tables/settlement.tres` + 断言面(smoke_all / ui_click_probe / ui_font_asset_test)+ 渲染闸 golden 判定动作
- 排期:未编入(卡片不预占迭代号;本卡估时 ≈1–1.5 工作日,低于编排硬下限 5 工作日,须与其他卡同批编入——归 iter-plan 段四查③)
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(v1.1 已过,见 §12)
- 版本:**v1.2**(2026-10-24 v1.0 成文→同日 grilling 第一轮修订 v1.1→第二轮 grilling 后按仓库换代〔`game/smoke/` 退役〕重落断言宿主定稿;两轮复核结论见 §12)
- 来源:[待办清单](../待办清单.md)「现役 UI/文案两处自相冲突」(2026-10-09 登记,来源=审计发现,设计面=工程直入,状态=待写卡)+「玩家面残留禁字清扫——图例/明细/日志/字形五处」(2026-10-20 登记,来源=批次移交,设计面=工程直入,状态=待写卡)+清单外两处「特性」泄漏(2026-10-24 用户裁收进本卡)+第 13 处战斗日志禁字(第一轮 grilling 发现增补)(唯一事实源:工程直入证据指认=本卡 §3 逐条 file:line 实查;术语口径=[术语表](../design/gdd/术语表.md)「用语规范」节禁用字面行(:158)+用户 2026-10-24 会话四裁)
- 归属:`game/presentation/views/`(hero_info_panel_view / legend_overlay / status_slot_row / board_view / level_map_screen)+ `game/presentation/battle_narrator.gd` + `game/presentation/views/battle_log_view.gd`(消费面断言)+ `game/core/battle_orchestrator.gd`(u13 单行文案)+ `game/data/tables/settlement.tres` + 断言面(新单测 `game/tests/unit/presentation/player_copy_sweep_test.gd` + `game/tests/unit/core/meta_progression_forge_test.gd` 锋段 + `game/tests/run_all.gd` 清单行 + `game/probe/ui_click_probe.gd` + `game/tests/unit/presentation/ui_font_asset_test.gd`)+ 渲染闸 golden 判定动作
- 排期:未编入(卡片不预占迭代号;本卡估时 ≈1.5–2 工作日,低于编排硬下限 5 工作日,须与其他卡同批编入——归 iter-plan 段四查③)
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(v1.2 已过两轮,见 §12)
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-24 写卡会话)**:两条来源条目均设计面=工程直入、状态=待写卡,条目现状带 file:line 证据指认(写卡会话逐处复核到行号,两处行号漂移已订正:narrator 旧记 :160 现行 :156、board_view 三点实核一致)→ **放行写卡**。
- 与「状态面板瘦身批」(2026-10-23,未开工)边界清晰:彼卡 §5 明示不碰 HUD C 区「特性」冲突(归本卡),两卡先后或同批均可、零交叠(彼卡改 status_panel.gd 与 main._status_data(),本卡改 hero_info_panel_view.gd 与 battle_narrator.gd 等,不同文件)。
- 本卡与「开场后缀营地灰字迷雾测点批」(2026-10-24 同会话卡 C)**零改动单元交叠**,可同批编入亦可分批;但**断言面共用** `smoke_all.gd`/`ui_click_probe.gd` 两文件,且两卡 T2 都需「驱动至三选一停点」的驱动基建——同批编入时挂段协调与驱动段共用归 iter-plan 编排注记。
- **仓库换代注记(2026-10-24,v1.2 立此存照)**:本卡 v1.1 合回(`5fba5efd`)六分钟后,`game/smoke/` 目录退役合并入库(`16c6f136`/`40c14dc2`)——探针件迁 `game/probe/`、测量/驱动件迁 `game/sim/`、`smoke_all.gd` 删除(断言面分流迁入 `game/tests/` 各单测与 `game/tests/system_test.gd`)。v1.1 的断言宿主与先例指认随之失效,v1.2 已全部重落(§3 F8–F11)。
- 与「状态面板瘦身批」(2026-10-23,未开工):彼卡改 status_panel.gd、main._status_data()、两屏角标 tooltip——本卡 u10 与彼卡 tooltip 同落 `level_map_screen.gd`(彼 :107 角标、本 :171 加成帽,**同文件不同 hunk,零 hunk 交叠**);合并无冲突面,同批编入时按文件级 rebase 惯例处理。
- 本卡与「开场后缀营地灰字迷雾测点批」(2026-10-24 同会话卡 C)**零改动单元交叠**,可同批编入亦可分批;但**断言面共用** `game/probe/ui_click_probe.gd`——两卡 T2 都驱动三选一停点区:卡 A 只读弹层头即离(`:356-366` 先例 `press_card(0)` 无条件选首件形态),卡 C 须专选 atk/max_hp 属性值提升卡再推进,且卡 A 段的 `set_sliders(400,200)`(:320)残值会污染卡 C 白板反向(`_start_adventure` 只关窗不清值)——**同批共用时选卡策略与滑条参数须段内自洽、跨段显式复位**,归 iter-plan 编排注记。
- 「卡顶色带与格面微光两带统一」待办条已删除(commit `9f8beb35`),与本卡无关,不复提。
## 1. 目标与完成定义
**目标**:玩家面(玩家可见字符串与已开危险格字形)残留的旧分类词「特性」、渠道旧话「同池同权重同上限」、禁字「雷」族(挖雷/踩雷/雷字形)全部换代为现行术语与口径——共 **12 个代码改动单元+1 个断言面新增**;每个改动单元带真实入口断言与撤销变红证明;golden 按仓库纪律做「判定先于动作」。
**目标**:玩家面(玩家可见字符串与已开危险格字形)残留的旧分类词「特性」、渠道旧话「同池同权重同上限」、禁字「雷」族(挖雷/踩雷/雷字形)全部换代为现行术语与口径——共 **12 个代码改动单元+1 个断言面新增**;每个改动单元带断言与撤销变红证明;golden 按仓库纪律做「判定先于动作」。
**改动单元清单**(钉值表,🔴 契约 1):
@@ -33,15 +34,15 @@
| u10 | `level_map_screen.gd:171`(本关加成框帽) | 「特性」 | 「属性值提升」 | 清单外(2026-10-24 用户裁收) |
| u11 | `battle_narrator.gd:142`(`feat_card_text` 兜底) | `"特性\n???"` | `"专长\n???"` | 清单外(2026-10-24 用户裁收) |
| u12 | `ui_font_asset_test.gd:18`(字形在集断言) | 攻/雷/旗/封 | 增「危」入集(雷/旗/封保留) | 断言面新增(u7 前置:字体必含「危」) |
| u13 | `battle_orchestrator.gd:797`(惊巢反制效果日志行) | `"惊巢反制——挖雷惩罚减半(%d→%d)"` | `"惊巢反制——危险格挖掘惩罚减半(%d→%d)"` | grilling 复核发现增补(2026-10-24,第 13 处——在册三处+清单外两处之外;经 step_row 链进战斗日志 effect 行,玩家可见) |
| u13 | `battle_orchestrator.gd:797`(惊巢反制效果日志行) | `"惊巢反制——挖雷惩罚减半(%d→%d)"` | `"惊巢反制——危险格挖掘惩罚减半(%d→%d)"` | 第一轮 grilling 发现增补(第 13 处;`_grant_routed` :771 mine_hit 减半分支,经 step_row 链进战斗日志玩家可见) |
**u3 新文案的三条机制事实**(措辞可 L1 微调,三事实不可缺):①与通关三选一**同一冒险牌库**(`bonus_deck` 混编余库,`adventure_runner.gd:663`);②**按渠道分流**——本节点(奖励节点)出属性值提升与补给,通关/Boss 渠道只出专长(`adventure_runner.gd:669-676` 渠道白名单过滤);③三选一选一件带走。禁再出现「同权重」「同上限」「提升池」字样(现行无独立权重旋钮、无共享上限语义——`adventure_runner.gd:656-668` 头注)。
**u3 新文案的三条机制事实**(措辞可 L1 微调,三事实不可缺):①与通关三选一**同一冒险牌库**(`bonus_deck` 混编余库,`adventure_runner.gd:661`);②**按渠道分流**——本节点(奖励节点)出属性值提升与补给,通关/Boss 渠道只出专长(`adventure_runner.gd:669-676` 渠道白名单过滤);③三选一选一件带走。禁再出现「同权重」「同上限」「提升池」字样(现行无独立权重旋钮、无共享上限语义——`adventure_runner.gd:656-668` 头注)。
**完成定义**(全部满足才算本批完成):
1. 钉值表 12 个代码改动单元落地(u12 为断言新增),玩家面全量检索「踩雷」「挖雷」「插错」「同权重」「同上限」「提升池」零命中(实施本体+`data/tables` 值域),已开危险格渲染字形=「危」且两处哨兵同批一致;
2. §8.2 对照表逐行断言绿(每改动单元至少一行、真实入口+撤销变红双证齐);变异验证记录表进实现报告;
3. 内部注记面(`ui_kit.gd:36` 常量名 `RED_MINE` 及其注释、`board_view.gd:776` 与 `board_cell_unit.gd` 及数据表注记里的「雷」内部语、`术语表.md:128` 所指文档内部机制词)零改动;
1. 钉值表 12 个代码改动单元落地(u12 为断言新增),**玩家面检索零残留**——检索口径钉值:六词(「踩雷」「挖雷」「插错」「同权重」「同上限」「提升池」)扫 `game/presentation/` 与 `game/core/` 的**玩家面字符串字面量**(排除 `#` 注释行)+ `game/data/tables/*.tres` 值域,零命中;契约 2 保留面(注释、内部常量名与注记、测试断言消息串)不入检索域;已开危险格渲染字形=「危」且两处哨兵同批一致;
2. §8.2 对照表逐行断言绿(每改动单元至少一行、撤销变红双证齐——u1/u2/u6/u11 注入与其余单元同等排程);变异验证记录表进实现报告;
3. 内部注记面(`ui_kit.gd:36` 常量名 `RED_MINE` 及其注释、`board_view.gd:776` 与 `board_cell_unit.gd` 及数据表注记里的「雷」内部语、`hero_info_panel_view.gd:67/:87` 等段注释、`术语表.md:128` 所指文档内部机制词)零改动;
4. 渲染闸 golden 判定动作完成且读数进实现报告(§4 契约 4);
5. 批末代码域闸全绿+改前改后读数对拍;三份 `reports/` 产出物写齐(T3)。
@@ -51,42 +52,43 @@
|---|---|---|
| D1 | `design/gdd/术语表.md`(现行版)「用语规范」节禁用字面行(:158) | 「雷」及相关字面(雷格/踩雷)**禁止进入对外命名**——对外世界观=探索地下城/挖掘地下城;「插旗」「旗」全库禁用(u4 的「插错」属旗族遗留词干);:128 机制词(标中/踩雷等)在文档内部照常用=内部注记面保留的口径依据 |
| D2 | 用户 2026-10-24 会话四裁(本批收进的两条:清单外两处裁收+golden 走判定)+交接文档 `reports/需求澄清-工程直入九项与卡片切分-2026-10-24.md` §三已定口径 4/5 | 玩家面禁「雷」:用「危险格/安全格」、危险格字用「危」;「特性」不是现行术语,分类=专长/属性值提升/补给(u1/u2/u10/u11 的换词依据) |
| D3 | 工程直入证据指认(两条待办条目现状+写卡会话 2026-10-24 逐处实查+grilling 复核独立补查,本卡 §3 F1–F11) | 12 个代码改动单元的 file:line 现值 |
| D3 | 工程直入证据指认(两条待办条目现状+写卡会话 2026-10-24 逐处实查+两轮 grilling 独立补查,本卡 §3 F1–F12) | 12 个代码改动单元的 file:line 现值 |
| D4 | `game/tests/golden/README.md`(时效判定纪律,迭代 29 T7 立) | golden「判定先于动作」:判有效=基线留位加注一次判定记录;判失效=按迭代 26 T6 先例显式重制+呈报+复闸 |
## 3. 现状事实(2026-10-24 主区实查+grilling 复核独立补查;开工日 T0 复核行号)
## 3. 现状事实(2026-10-24 主区实查+两轮 grilling 独立补查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | HUD C 区两段同标「特性」:`_feat_section`(:69-76,段头 :73;内容=三选一专长兑付持有,`set_feat_holdings` :110 投喂)与 `_curio_section`(:89-96,段头 :93;内容=`set_level_bonuses` :132 投喂的关卡奖励属性提升=加算区)——同屏两段同标、分类语义撞车 | `game/presentation/views/hero_info_panel_view.gd:73`/:93 |
| F2 | 奖励节点三选一头部旧话:`node_curio_header()` 返回「……与通关三选一同池同权重同上限……」;现行实现=渠道白名单过滤(level_clear 只留 `kind=="relic"`=专长;reward_node 滤掉 relic 与 feat_ticket=属性值提升+补给),「同池同权重同上限」是落码前旧话 | `game/presentation/battle_narrator.gd:154-156`;`game/core/adventure_runner.gd:669-676` |
| F2 | 奖励节点三选一头部旧话:`node_curio_header()` 返回「……与通关三选一同池同权重同上限……」;现行实现=渠道白名单过滤(level_clear 只留 `kind=="relic"`=专长;reward_node 滤掉 relic 与 feat_ticket=属性值提升+补给),「同池同权重同上限」是落码前旧话 | `game/presentation/battle_narrator.gd:154-156`;`game/core/adventure_runner.gd:661`/:669-676 |
| F3 | 图例行旗族与雷族残留:「封印印记(呈现名·不能拔)——轮末自动判定标中;插错可左键直接挖开(安全格零奖励、危险格吃挖雷惩罚)」——「标中」在前(现行词),「插错」为旗族遗留(与「标中」失对) | `game/presentation/views/legend_overlay.gd:11` |
| F4 | 明细来源名「踩雷」双源并存:呈现层常量 `SOURCE_NAMES`(:40,`status_slot_row.gd:162` 消费——状态槽 meta 行来源注记)与 ConfigDB 表 `source_label_map`(`settlement.tres:14`,`battle_log_view.gd:136` `_source_label` 消费——战斗日志行尾来源括注);两处值同步靠人工、值层无校验器(`config_db_cross_validator.gd:49-53` 只校键集不校值) | `game/presentation/views/status_slot_row.gd:40`/:162;`game/data/tables/settlement.tres:14`;`game/presentation/views/battle_log_view.gd:133-136` |
| F5 | 已开危险格字形=「雷」,两处哨兵按字形串比对:`:730 glyph = "雷"`(rec kind=="mine" 分支)、`:778 glyph != "雷"`(牌载判定排除项)、`:782 glyph == "雷"`(牌载包含项)——三点一改,漏改哨兵=危险格牌载语义断链;`:731` 雷字墨=`UiKit.RED_MINE` | `game/presentation/views/board_view.gd:730-731`/:778/:782 |
| F6 | 随包字体=Fusion Pixel zh_hans(CJK 全量 ttf),既有断言只查 攻/雷/旗/封 四字形在集;「危」(U+5371 常用字)按字体覆盖面应然在集,但**未断言**——u7 落地前置 | `game/tests/unit/presentation/ui_font_asset_test.gd:14-19`;字体路径 `ui_kit.FONT_UI` |
| F7 | golden 基线四张(棋盘 L1/L2/L3+menu_boot);棋盘基线由 `board_shot_probe` 生成——驱动走 `auto_player` **novice 档**(`board_shot_probe.gd:64`;novice 无处可推时回退盲挖边界格 `auto_player.gd:47-50`——非「构造保证零踩雷」,基线无踩雷是种子事实);**四张基线图 PIL 像素级实查零 `RED_MINE` 雷字朱像素(2026-10-24 写卡会话全图扫描)=基线内无雷字是实查事实**;菜单基线同理无涉 | `game/smoke/board_shot_probe.gd:64`;`game/smoke/auto_player.gd:47-50`;`game/tests/golden/`(四图扫描读数 0 命中) |
| F8 | 既有断言面:冒烟 ⑦c 段直建 hero 面板断言 `_feat_section.visible`/`_feat_list.get_child_count()`(:1644-1649,按成员名引用,**不断言段头文案**——段头换词零牵连);`feat_card_text` desc 直读断言(:1650-1651);禁字扫描族只扫 feats 表行(:1340-1346),**不扫呈现层字符串** | `game/smoke/smoke_all.gd:1643-1651`/:1340-1346 |
| F9 | 直建 BoardView 冒烟先例(:1708 `load(...board_view.gd).new()` → `board_generator.generate(...)` → `rebuild(b, null)` → 读内部态);直建三选一弹层真实入口先例(ui_click_probe 开局 :323 → 停点 `curio_overlay` 驱动 :356-366);图例真实入口=AP 条图例钮(`board_zone_view.gd:78` `ap_bar.legend_toggled` → `main._on_legend_toggled` :1385 开模态) | `game/smoke/smoke_all.gd:1705-1719`;`game/smoke/ui_click_probe.gd:323`/:356-366;`game/presentation/views/board_zone_view.gd:78`;`game/presentation/main.gd:1385` |
| F10 | 战斗日志效果行禁字(第 13 处,grilling 复核 2026-10-24 发现):持有「锋」类订阅且 halve_pct>0 时 `battle_orchestrator.gd:797` 发 `"惊巢反制——挖雷惩罚减半(%d→%d)"` 效果行——display_name 经 effect 行排版(`battle_log_view.gd:155-167` `name_` 直拼进正文)入战斗日志玩家可见;smoke_all:6285 锋段只断言计数器、不断言该文案(零既有断言牵连) | `game/core/battle_orchestrator.gd:793-797`;`game/presentation/views/battle_log_view.gd:155-167`;`game/smoke/smoke_all.gd:6285` |
| F11 | 改前读数基线=开工日 T0 采集(冒烟/单测通过数对拍面)——写卡会话不跑测(测试执行两入口铁规),本卡不预写数字 | — |
| F7 | golden 基线四张(棋盘 L1/L2/L3+menu_boot);棋盘基线由 `board_shot_probe` 生成——驱动走 `auto_player` **novice 档**(`game/probe/board_shot_probe.gd:64`;novice 无处可推时回退盲挖边界格 `game/sim/auto_player.gd:47-50`——非「构造保证零踩雷」,基线无踩雷是种子事实);**四张基线图 PIL 像素级实查零 `RED_MINE` 雷字朱像素(2026-10-24 写卡会话全图扫描,第二轮 grilling 独立复扫吻合)=基线内无雷字是实查事实**;菜单基线同理无涉 | `game/probe/board_shot_probe.gd:64`;`game/sim/auto_player.gd:47-50`;`game/tests/golden/`(四图扫描读数 0 命中) |
| F8 | 既有断言面(smoke_all 迁移后现址):hero 面板 ⑦c 族现落 `game/tests/unit/core/adventure_feats_test.gd:715-722`(断言 `_feat_section.visible`/`_feat_list.get_child_count()`,按成员名引用,**不断言段头文案**——段头换词零牵连);禁字扫描族(30 行 display/desc 零「雷/旗」)现落同文件 `:443-445`(只扫 feats 表行,**不扫呈现层字符串**);`feat_card_text` desc 直读断言同段在位 | `game/tests/unit/core/adventure_feats_test.gd:443-445`/:715-722 |
| F9 | 直建与驱动先例现址:BoardView 直建=`game/tests/unit/presentation/theme_projection_test.gd:200`(`load(...board_view.gd).new()`→`rebuild`→读内部态——presentation 单测宿主);三选一弹层真实入口驱动=`game/probe/ui_click_probe.gd:356-366`(`curio_overlay.visible`→`press_card(0)`);开局=同探针 `:323` `main._start_adventure_from_menu()`;地图屏选路真链=同探针 `:327-331`(`level_screen.visible`→`press_candidate(0)`);图例真实入口=AP 条图例钮(`board_zone_view.gd:78` `ap_bar.legend_toggled` → `main._on_legend_toggled` :1385 开模态) | 上列 file:line |
| F10 | 战斗日志效果行禁字(第 13 处,第一轮 grilling 发现):持「锋」类订阅且 halve_pct>0 时 `battle_orchestrator._grant_routed` :771 的 mine_hit 减半分支(:793-797)发 `"惊巢反制——挖雷惩罚减半(%d→%d)"` 效果行——display_name 经 effect 行排版(`battle_log_view.gd:155-167` `name_` 直拼进正文)入战斗日志玩家可见;锋计数器断言现落 `game/tests/unit/core/meta_progression_forge_test.gd:654`(只断计数器、不断文案——零既有断言牵连);**编排器单测构造先例**=同文件 `:666/:696`(`battle_orchestrator.gd").new(_db, rng)`)——`_grant_routed(snap, polarity, source_class, cell, ri, …, halve_pct)` 实例方法签名干净,负向 mine_hit+halve_pct>0 分支可直调触达 | `game/core/battle_orchestrator.gd:771/:793-797`;`game/presentation/views/battle_log_view.gd:155-167`;`game/tests/unit/core/meta_progression_forge_test.gd:654/:666` |
| F11 | 仓库换代(2026-10-24 `16c6f136`):`game/smoke/` 退役——探针迁 `game/probe/`、驱动件迁 `game/sim/`、`smoke_all.gd` 删除、断言面分流迁 `game/tests/` 各单测与 `game/tests/system_test.gd`(宿主注记自证);**单测 runner=`game/tests/run_all.gd` 套件清单协议**(显式登记制,迁移行先例 `:91/:101`)——新单测文件必须登记清单行(`{path, expect:0}`)才入闸 | `game/tests/run_all.gd:91/:101`;`tools/run_system_test.py` 头注 |
| F12 | 改前读数基线=开工日 T0 采集(单测/探针通过数对拍面)——写卡会话不跑测(测试执行两入口铁规),本卡不预写数字 | — |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 钉值表逐字**:§1 钉值表 13 行逐字落地(u3 措辞 L1 微调仅限三机制事实不变前提);u5 与 u6 **必须同批同值**(「危险格」),禁只改一处留双源漂移;u7/u8/u9 **必须同批**,禁只改字形漏哨兵;u13 是核心层文件内的**玩家面日志文案串**(纯字符串替换——core 触碰面以此一行为限,零逻辑改动)。
🔴 **契约 2 · 内部注记面零改动**:`ui_kit.gd:36` 常量名 `RED_MINE` 与其注释原文、「雷」字内部语注记(`board_view.gd:776`、`board_cell_unit.gd`、数据表注记)全部保留不改名不重述;`术语表.md:128` 与 `战斗结算.md:101/:131/:338` 等文档内部机制词非本批对象(禁用令只及对外命名)。测试断言**消息串**里的「踩雷」等字属内部语,保留。
🔴 **契约 2 · 内部注记面零改动**:`ui_kit.gd:36` 常量名 `RED_MINE` 与其注释原文、「雷/踩雷/挖雷/同池同权重/提升池」等**注释与内部语注记**(`board_view.gd:776`、`board_cell_unit.gd`、`hero_info_panel_view.gd:67/:87/:109/:131`、`battle_narrator.gd:136/:154`、`main.gd:627`、`curio_interact_controller.gd:114`、`adventure_runner.gd:509`、`adventure_table.gd:17`、数据表注记、测试断言消息串)全部保留不改名不重述;`术语表.md:128` 与 `战斗结算.md` 等文档内部机制词非本批对象。完成定义 1 的检索域**不含**这些保留面(口径见完成定义 1)。
🔴 **契约 3 · 验收闭合**:每个改动单元一行对照表行,真实入口+撤销变红双证;「只改字符串就写已实现」不成立。撤销证明=精确回退该单元 hunk → 对应断言红 → 还原复绿。
🔴 **契约 3 · 验收闭合**:每个改动单元一行对照表行,断言+撤销变红双证——**注入排程覆盖全部 12 个单元**(含 u2/u6/u11,见 T1 变异步);「只改字符串就写已实现」不成立。撤销证明=精确回退该单元 hunk → 对应断言红 → 还原复绿。
🔴 **契约 4 · golden 判定先于动作**(对条目 9 原文「改字形须同步重制 C 档基准」的核订):本批**不预重制** golden。核订依据=四张基线图像素级实查**零 `RED_MINE` 雷字朱像素**(F7——现行基线无雷字;注意 novice 取证含盲挖回退,**任何后续重制的基线可能含雷字、重制件须复检**)。批内跑一次渲染闸读棋盘三图+菜单 changed 读数:changed=0.00% =**判有效**——基线留位+`game/tests/golden/README.md` 判定记录节加注一行;**changed>0(无论是否超 2% 阈)且差异像素落在棋盘裁剪区 ⇒ 判失效**(换代面落裁剪区即失效,不因未超阈而误判有效)——按迭代 26 T6 先例显式重制+呈报+复闸。禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。
🔴 **契约 4 · golden 判定先于动作**(对条目 9 原文「改字形须同步重制 C 档基准」的核订):本批**不预重制** golden。判定按 golden README 双态执行:**判有效**(changed 远低于 2% 阈值)=基线留位+README 判定记录节加注一行;**判失效**(changed 超阈值或换代面落在裁剪区外)=按迭代 26 T6 先例显式重制+呈报+复闸。核订依据=四张基线图像素级实查**零 `RED_MINE` 雷字朱像素**(F7——现行基线无雷字;注意 novice 取证含盲挖回退,**任何后续重制的基线可能含雷字、重制件须复检**)。**本批加严句**:若棋盘三图 changed>0(未超阈也在内)且差异像素落在棋盘裁剪区——本批按判失效处理(显式呈报后定重制),防字形差被 2% 容差吞掉;该加严口径严于 README「远低于阈值=有效」,随批列反哺点呈报用户裁是否写入 README 纪律句。禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。
🔴 **契约 5 · 断言面零未申报削弱**:本批对既有断言**零删除零放宽**;新增断言=ui_font_asset_test 一行(u12)+冒烟隔离档新段+ui_click_probe 新段(§8.2);⑦c 段既有断言原样保留(F8)。
🔴 **契约 5 · 断言面零未申报削弱**:本批对既有断言**零删除零放宽**;新增=新单测文件 `game/tests/unit/presentation/player_copy_sweep_test.gd`(含 run_all.gd 清单登记行)+`meta_progression_forge_test.gd` 锋段扩一条+`ui_click_probe.gd` 增段+`ui_font_asset_test.gd` 增一行;⑦c 族与禁字扫描族现址原样保留(F8)。
🔴 **契约 6 · 数值与随机零触碰**:本批纯文案/字形/断言面,`data/tables` 只改 `settlement.tres` 一处文案值;禁顺带改任何数值、`RngService` 流、呈现结构、编排器逻辑(u13 仅字符串)。
## 5. 范围边界
**做**:§1 钉值表 13 行(12 代码单元+1 断言);冒烟隔离档新段(u1/u2/u3/u4/u5/u6/u7/u13 的断言族);ui_click_probe 新段(C 区段头/地图加成帽/三选一头部/图例行真实入口断言);ui_font_asset_test 增行(u12);渲染闸 golden 判定动作+README 加注;反哺点清单。
**做**:§1 钉值表 13 行(12 代码单元+1 断言);新单测 `player_copy_sweep_test.gd`(直建断言族①–⑦+两处源 token 扫描⑧⑩)+run_all.gd 清单行;锋段扩展(u13 行名断言⑨);`game/probe/ui_click_probe.gd` 新段(C 区段头/地图加成帽/三选一头部/图例行真实入口断言);`ui_font_asset_test.gd` 增行(u12);渲染闸 golden 判定动作+README 加注;反哺点清单。
**不做**(明示去向):
- `RED_MINE` 常量改名或注释重述(契约 2,纪律保留);
@@ -103,11 +105,11 @@
|---|---|---|
| `design/gdd/ux/node-reward.md` :14 | 在册逐字引 u3 旧头部全文,且明写「文案换代归内容批,已呈报」——本卡即该内容批,u3 换代后该行过时 | 反哺点 · 列清单(①:14 行换代为新头部全文引文;依据=本卡 u3) |
| `design/gdd/systems/表现与支撑/教学引导.md` :58 | 在册逐字引 u4 旧句「(安全格零奖励、危险格吃挖雷惩罚)」原文——u4 换代后该句过时 | 反哺点 · 列清单(②:58 句换代为新句引文;依据=本卡 u4) |
| `design/art/art-bible.md` 与 `design/gdd/` 其余全树 | 无陈述被本批改变(雷字/RED_MINE/来源名/图例文案/C 区段头零注册行——2026-10-24 实查+grilling 复核补查) | 无关联文档(查讫) |
| `待办清单.md` | 两条来源条目批后退役(条目「现役 UI/文案两处自相冲突」+「玩家面残留禁字清扫」);状态推进「已写卡(本卡路径)」 | 反哺点 · 列清单(③状态推进与批末退役归 batch-closure——**本写卡会话受「不改根清单」约束未执行状态推进,编排/开工前须补**) |
| `roadmap.md` | 迭代行编入笔(编入哪一迭代由 iter-plan 段发令,本卡不预占) | 反哺点 · 列清单(④) |
| `game/tests/golden/README.md` 判定记录节 | 判有效加注一行(2026-xx-xx 本批:changed 读数×4、判有效、核订依据=基线图 RED_MINE 零像素实查〔F7〕) | 实施本体(可写——测试资产) |
| `game/presentation/`、`game/core/battle_orchestrator.gd`(u13 单行)、`game/data/tables/settlement.tres`、`game/smoke/`、`game/tests/unit/presentation/` | 实施本体与断言面 | 实施本体(可写) |
| `design/art/art-bible.md` 与 `design/gdd/` 其余全树 | 无陈述被本批改变(雷字/RED_MINE/来源名/图例文案/C 区段头零注册行——2026-10-24 实查+两轮 grilling 复核补查) | 无关联文档(查讫) |
| `game/tests/golden/README.md` | 判定记录节加注一行(判有效读数);**加严口径与纪律句的收紧差**(契约 4——changed>0 且落裁剪区本批按失效)呈报用户裁是否入纪律句 | 实施本体(可写——测试资产;纪律句改写与否列反哺点③) |
| `待办清单.md` | 两条来源条目批后退役(条目「现役 UI/文案两处自相冲突」+「玩家面残留禁字清扫」);状态推进「已写卡(本卡路径)」 | 反哺点 · 列清单(④状态推进与批末退役归 batch-closure——**本写卡会话受「不改根清单」约束未执行状态推进,编排/开工前须补**) |
| `roadmap.md` | 迭代行编入笔(编入哪一迭代由 iter-plan 段发令,本卡不预占) | 反哺点 · 列清单(⑤) |
| `game/presentation/`、`game/core/battle_orchestrator.gd`(u13 单行)、`game/data/tables/settlement.tres`、`game/tests/`、`game/probe/ui_click_probe.gd` | 实施本体与断言面 | 实施本体(可写) |
## 7. 任务卡
@@ -126,48 +128,55 @@
| `game/presentation/views/level_map_screen.gd` | u10 加成框帽换词(复用既有·修改) | 行为改动 → wa2 |
| `game/core/battle_orchestrator.gd` | u13 惊巢反制效果日志行换词(复用既有·修改——纯字符串,core 触碰面以此一行为限) | 行为改动 → wa12 |
| `game/tests/unit/presentation/ui_font_asset_test.gd` | u12「危」字形在集断言增行(复用既有·增断言) | 行为改动(断言面)→ wa9 |
| `game/smoke/smoke_all.gd` | 隔离档新段「禁字清扫断言族」(直建面板/图例/状态槽/叙述静态/BoardView 字形/锋段效果行——F8/F9/F10 先例式;复用既有·增段) | 行为改动(断言面)→ wa1/wa3/wa4/wa5/wa6/wa7/wa8/wa12 |
| `game/smoke/ui_click_probe.gd` | 真实入口断言新段(C 区段头/地图帽/三选一头/图例钮——F9 先例式;复用既有·增段) | 行为改动(断言面)→ wa1/wa2/wa4/wa5 |
| `game/tests/unit/presentation/player_copy_sweep_test.gd` | **新增**:玩家面文案清扫直建断言族①–⑦+源 token 扫描⑧⑩(形制=SceneTree+test_kit,同 ui_font_asset_test.gd;新增·新文件) | 行为改动(断言面)→ wa1/wa3/wa4/wa5/wa6/wa7/wa8/wa12 静态半 |
| `game/tests/run_all.gd` | 新套件清单登记行(`player_copy_sweep_test.gd, expect=0`——迁移行 :91/:101 同式;复用既有·增行) | 行为改动(断言面接线)→ 新套件入闸 |
| `game/tests/unit/core/meta_progression_forge_test.gd` | u13 行名断言⑨(锋段 :654 族同段扩;编排器构造 :666 先例同构;复用既有·增断言) | 行为改动(断言面)→ wa12 行为半 |
| `game/probe/ui_click_probe.gd` | 真实入口断言新段(C 区段头/地图帽/三选一头/图例钮——F9 先例式;复用既有·增段) | 行为改动(断言面)→ wa1/wa2/wa4/wa5 |
| `reports/iter<N>-实现报告/代拍板追认单/反哺点`(三份,批末写) | 产出物落位(含 golden 判定读数) | 非行为改动 → wa10/wa11 |
本批**零新增文件、零新增数据件**;零新增函数(断言段挂既有探针/冒烟段内)。
### 接口块(全卡共用,后卡引用以此为准)
- 无新增接口:全部改动为既有函数内字符串/哨兵/断言替换,签名零变化(`node_curio_header() -> String`、`feat_card_text(row: Dictionary) -> String`、`SOURCE_NAMES` 常量、`source_label_map` 表值、BoardView 字形赋值、`_emit_row` 调用串)。
- 冒烟新段名建议 `_ban_word_sweep_checks()`(挂 smoke_all 既有装配节;段名 L1 可调);ui_click_probe 新断言分散进既有 局中/地图/停点/图例 各段内(不立新文件)。
- 无新增产品码接口:全部产品码改动为既有函数内字符串/哨兵替换,签名零变化(`node_curio_header() -> String`、`feat_card_text(row: Dictionary) -> String`、`SOURCE_NAMES` 常量、`source_label_map` 表值、BoardView 字形赋值、`_grant_routed` 调用串)。
- **新单测文件形制**:`player_copy_sweep_test.gd`——`extends SceneTree`+`const Kit := preload("res://tests/unit/test_kit.gd")`+`_init()` 内逐断言+`quit(Kit.finish("<套件名>"))`(ui_font_asset_test.gd:7-28 逐行同构);头注写运行命令与「扫玩家面字符串字面量,注释/内部语不入域(契约 2)」。
- run_all.gd 清单行:`{"path": "res://tests/unit/presentation/player_copy_sweep_test.gd", "expect": 0}`(:91/:101 迁移行同式,含一句来源注)。
- 断言尾缀〔wa#〕与 §8.2 对照表互指;各断言族最窄闸(注入实验跑法):
- 单测族三件(player_copy_sweep_test / meta_progression_forge_test / ui_font_asset_test)=`D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/<相对路径>.gd` 单件直跑;
- 探针族(ui_click_probe)=窗口化单件直跑 `…console.exe --path game res://probe/ui_click_probe.tscn`(探针族现行调用形态)。
### 落位与可复用性预检(本批新增件逐条三问)
- **零新增文件/函数/数据件**——复用面:全部断言落进既有冒烟段与探针段(F8/F9/F10 直建与驱动先例);唯一新增「断言行」落在既有测试文件内(ui_font_asset_test 增一行 `has_char`)。唯一面:钉值表 13 处各只有本卡一处落点,无第二处同值定义(「踩雷」双源 F4 是既有形态、本批同批同改由契约 1 钉死)。分层与交互面:u13 虽落 `game/core/`,但改动是编排器 `_emit_row` 调用的**玩家面文案串**(呈现语义,消费面=战斗日志),零逻辑零数值——core 触碰面以此一行为限(契约 1);其余纯呈现层与测试断言,零核心触碰、零 ConfigDB 结构变化(`source_label_map` 只改值不动键——键集校验器 F4 无涉)。
- **为什么「危」字形断言放 ui_font_asset_test 而非新探针**:字体资产契约的唯一在册落点就是该测试(F6 先例同源),新增第二处=落点漂移。
- **为什么 u13 断言挂 smoke 锋段而不新立探针**:锋段(smoke_all:6285 族)已是「锋类订阅+mine_hit dispatch」的唯一在册驱动面,同驱动面扩一条效果行名断言=复用;新立=第二驱动实现。
- **`player_copy_sweep_test.gd`(新单测文件)**——复用面:断言内容全部直建既有视图/静态函数(hero 面板=adventure_feats_test.gd:715-722 ⑦c 族同构、BoardView=theme_projection_test.gd:200 同构、battle_log/battle_narrator/status_slot_row 直建);为什么新文件而不能并入既有:迁移后断言按域分文件(run_all 清单 :91/:101 注记自证),本断言族横跨 hero/legend/status/narrator/board/battle_log 六视图的「玩家面文案」是独立域,任何单一现役文件都不是该域宿主;并入 adventure_feats_test(冒险域)或 theme_projection_test(呈现投影域)都域错位。唯一面:全仓唯一「玩家面字符串字面量」断言宿主;与禁字扫描族(feats 表行扫描,adventure_feats_test:443-445)扫域不同(表值 vs 码内字面量)、互不替代。分层与交互面:纯呈现层直建+静态源扫描,零核心依赖;源 token 扫描读文件文本(`FileAccess`),注释剥离=按行首 `#` 判(§10-4)。
- **run_all.gd 清单行**——为什么不并入其他 runner:套件清单协议是单测唯一入闸口(F11),登记即接线、无第二入口。
- **u13 断言挂 meta_progression_forge_test.gd 锋段**——为什么:锋段(:654 族)是「锋订阅+mine_hit」唯一在册驱动面、同文件 :666 有编排器构造先例;`_grant_routed`(:771)签名干净可直调(F10)——复用既有构造与驱动,新立=第二驱动实现。
- **为什么「危」字形断言放 ui_font_asset_test 而非新文件**:字体资产契约的唯一在册落点就是该测试(F6 先例同源),新增第二处=落点漂移。
- **产品码八件**——零新增函数/数据件;唯一面:钉值表 13 处各只有本卡一处落点(「踩雷」双源 F4 是既有形态、本批同批同改由契约 1 钉死);分层:u13 虽落 `game/core/` 但改动是编排器玩家面文案串(呈现语义,消费面=战斗日志),零逻辑零数值(契约 1)。
### T0 事实坐实(≈0.25d)
- [ ] 复核 §3 全部 file:line(含 smoke_all 段位行号、ui_click_probe 各挂段行号)+玩家面全量检索「踩雷」「挖雷」「插错」「同权重」「同上限」「提升池」确认改动点全集无第 14 处——可核查结果:订正记录或「零漂移」声明进实现报告素材。
- [ ] 改前读数基线采集(冒烟/单测通过数,两入口铁规下随 T1 loop 首跑取值)——可核查结果:基线读数记录在案。
- [ ] 复核 §3 全部 file:line(含迁移后各断言宿主行号、ui_click_probe 挂段行号)+按完成定义 1 钉值口径跑一次玩家面六词检索(排除注释行/测试消息串/内部注记——契约 2 保留面),确认改动点全集无第 14 处——可核查结果:检索读数(命中清单与契约 2 保留面比对)或「零漂移」声明进实现报告素材。
- [ ] 改前读数基线采集(单测/探针通过数,两入口铁规下随 T1 loop 首跑取值)——可核查结果:基线读数记录在案。
### T1 钉值表落地+隔离档断言(≈0.5–0.75d)
### T1 钉值表落地+断言族(≈0.75–1d)
- [ ] 实装钉值表 u1–u11+u13(12 个代码编辑点;u7/u8/u9 同 commit;u5/u6 同 commit)。可核查结果:玩家面检索六词零命中;两源 `mine_hit` 值==「危险格」。
- [ ] 实装 u12+冒烟新段断言族:`_ban_word_sweep_checks()`——①直建 hero 面板(⑦c 同构),断言 `_feat_section` 段头 text==「专长」、`_curio_section` 段头 text==「属性值提升」;②`Narrator.node_curio_header()` 含「冒险牌库」「属性值提升与补给」「同库分流」零「同权重」「同上限」「提升池」;③`feat_card_text({})`==「专长\n???」;④直建 LegendOverlay(`_init(rap_cost)` 现签名),断言封印行含「标空」「受挖掘惩罚」零「插错」「挖雷」;⑤直建 status_slot_row 喂 `{"source_class": "mine_hit"}` 效果行,断言 meta 来源注记==「危险格」;⑥`_db.settlement.source_label_map["mine_hit"]`==「危险格」(经 ConfigDB 真装载)+直建 battle_log_view 断言 mine_hit 来源行含「(危险格)」;⑦直建 BoardView(F9 :1705-1719 先例式:`board_generator.generate(...)`→`rebuild(b, null)`)喂含已开危险格棋盘,断言该格 CellUnit `glyph=="危"`、`plate==true` 且 `glyph_color==UiKit.RED_MINE`;⑧源 token 扫描断言(挂冒烟静态扫描段——repo 源码 token 扫描先例=ui_struct_probe ⑧ 零动效 token 扫描):`board_view.gd` 源码零字面量 `"雷"` 命中(哨兵族 u7/u8/u9 统一钉住);⑨锋段扩展(:6285 族同驱动面):持「锋」订阅 dispatch mine_hit 采 step_row 效果行 display_name,断言==「惊巢反制——危险格挖掘惩罚减半(…)」零「挖雷」。可核查结果:新段绿、⑦c 旧段原样绿。
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 精确还原→记录):①u1 段头回「特性」→断言①红;②u4 回「插错」或「挖雷」→断言④红;③u5 回「踩雷」→断言⑤红;④u7 回「雷」→断言⑦ glyph 半红+⑧扫描红;⑤u8 单独回「雷」(u7/u9 保持「危」)→断言⑦ glyph_color 半红+⑧扫描红(哨兵回潮即字符串命中);⑥u9 单独回「雷」→断言⑦ plate 半红+⑧扫描红;⑦u3 回「同池同权重同上限」→断言②红;⑧u13 回「挖雷」→断言⑨红;⑨u12 断言参数临时换字体必无的扩展区字(如 U+20000)→断言行红(证明 has_char 判别力)。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批只碰 `game/` → `--code`),期望代码域全绿。
- [ ] 实装钉值表 u1–u11+u13(12 个代码编辑点;u7/u8/u9 同 commit;u5/u6 同 commit)。可核查结果:按完成定义 1 口径玩家面检索六词零命中;两源 `mine_hit` 值==「危险格」。
- [ ] 新建 `player_copy_sweep_test.gd`+run_all.gd 清单行,实装直建断言族:①直建 hero 面板(⑦c 族同构),断言 `_feat_section` 段头 text==「专长」、`_curio_section` 段头 text==「属性值提升」;②`Narrator.node_curio_header()` 含「冒险牌库」「属性值提升与补给」「同库分流」零「同权重」「同上限」「提升池」;③`feat_card_text({})`==「专长\n???」;④直建 LegendOverlay(`_init(rap_cost)` 现签名),断言封印行含「标空」「受挖掘惩罚」零「插错」「挖雷」;⑤直建 status_slot_row 喂 `{"source_class": "mine_hit"}` 效果行,断言 meta 来源注记==「危险格」;⑥`_db.settlement.source_label_map["mine_hit"]`==「危险格」(经 ConfigDB 真装载)+直建 battle_log_view 断言 mine_hit 来源行含「(危险格)」;⑦直建 BoardView(theme_projection_test.gd:200 先例式:`board_generator.generate(...)`→`rebuild(b, null)`)喂含已开危险格棋盘,断言该格 CellUnit `glyph=="危"`、`plate==true` 且 `glyph_color==UiKit.RED_MINE`;⑧源 token 扫描一:`board_view.gd` 源码零字面量 `"雷"` 命中(哨兵族 u7/u8/u9 统一钉住);⑩源 token 扫描二:`battle_orchestrator.gd` 玩家面字符串字面量零「挖雷」(u13 静态半;注释剥离同⑧式)。可核查结果:新套件绿、adventure_feats_test ⑦c/扫描族原样绿。
- [ ] 实装 u13 行为断言⑨(meta_progression_forge_test.gd 锋段扩):编排器构造(:666 先例同构)→ 连 `step_row` → 直调 `_grant_routed({"cell_type": <极性字典负性行类型>, "power": 10}, "negative", "mine_hit", Vector2i.ZERO, 0, "", "", 50)` → 断言效果行 display_name==「惊巢反制——危险格挖掘惩罚减半(10→5)」零「挖雷」。可核查结果:该断言绿。
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 精确还原→记录;最窄闸=接口块所列单件直跑命令):①u1 段头回「特性」→断言①红;②u2 段头回「特性」→断言①红(两段头同一断言族分钉);③u4 回「插错」或「挖雷」→断言④红;④u5 回「踩雷」→断言⑤红;⑤u6 回「踩雷」→断言⑥表值半+行半双红;⑥u7 回「雷」→断言⑦ glyph 半红+⑧扫描红;⑦u8 单独回「雷」(u7/u9 保持「危」)→断言⑦ glyph_color 半红+⑧扫描红;⑧u9 单独回「雷」→断言⑦ plate 半红+⑧扫描红;⑨u3 回「同池同权重同上限」→断言②红;⑩u11 回「特性\n???」→断言③红;⑪u13 回「挖雷」→断言⑨红+⑩扫描红;⑫u12 断言参数临时换字体必无的扩展区字(如 U+20000)→断言行红(证明 has_char 判别力)。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批只碰 `game/` → `--code`),期望代码域全绿(新套件入单测档)。
### T2 真实入口断言(≈0.25–0.5d)
- [ ] 实装 ui_click_probe 新断言(挂既有段内):①局中(:323 开局后)hero 面板两段头文本==「专长」/「属性值提升」(C 区随战斗常驻=真实入口);②地图屏(选路态)本关加成框帽 text==「属性值提升」(零加成隐藏态下先经真实选局产加成、受限再调试注值——T0 复核取法);③三选一停点(:356-366 驱动先例)弹层头部含「冒险牌库」「属性值提升与补给」;④AP 条图例钮(`legend_toggled` 真实信号)开层后封印行含「标空」零「挖雷」。可核查结果:探针全绿。
- [ ] 变异验证(回退 hunk→探针红→精确还原→记录):①回退 u1 →断言①红;②回退 u10 →断言②红;③回退 u3 →断言③红;④回退 u4 →断言④红。记录表进实现报告。
- [ ] 实装 `game/probe/ui_click_probe.gd` 新断言(挂既有段内):①局中(:323 开局后)hero 面板两段头文本==「专长」/「属性值提升」(C 区随战斗常驻=真实入口);②地图屏(选路态——:327-331 `level_screen.press_candidate` 选路真链)本关加成框帽 text==「属性值提升」(零加成隐藏态下先经真实选局产加成、受限再调试注值——取法=§10-3 代拍板项);③三选一停点(:356-366 驱动先例)弹层头部含「冒险牌库」「属性值提升与补给」;④AP 条图例钮(`legend_toggled` 真实信号)开层后封印行含「标空」零「挖雷」。可核查结果:探针全绿。
- [ ] 变异验证(回退 hunk→探针红→精确还原→记录;最窄闸=接口块所列探针单件直跑):①回退 u1 →断言①红;②回退 u10 →断言②红;③回退 u3 →断言③红;④回退 u4 →断言④红。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`--code`),期望代码域全绿。
### T3 渲染闸 golden 判定+产出物落位卡(≈0.25d,末卡)
- [ ] golden 判定(契约 4):跑渲染闸读棋盘三图+菜单 changed 读数×4;判有效→`game/tests/golden/README.md` 判定记录节加注一行;changed>0 且差异落裁剪区→判失效:显式重制+呈报+复闸(重制件复检雷字——F7 注)。可核查结果:读数与判定结论进实现报告。
- [ ] 轻闸全绿后、合并前写齐三份:`reports/iter<N>-实现报告-<完成日>.md`(各单元状态+变异验证记录表+golden 判定读数+实机目检总清单〔危险格「危」字观感/图例新句通顺两条〕+遗留读数义务)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§10 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§6 四条各一落点)。可核查结果:三文件在 `reports/` 且 §6 每条有落点。
- [ ] golden 判定(契约 4):跑渲染闸读棋盘三图+菜单 changed 读数×4;判有效→`game/tests/golden/README.md` 判定记录节加注一行(含核订依据=四基线图 RED_MINE 零像素实查〔F7〕);加严口径触发(changed>0 且落裁剪区)或判失效→显式呈报后定重制+复闸(重制件复检雷字——F7 注)。可核查结果:读数与判定结论进实现报告。
- [ ] 轻闸全绿后、合并前写齐三份:`reports/iter<N>-实现报告-<完成日>.md`(各单元状态+变异验证记录表+golden 判定读数+实机目检总清单〔危险格「危」字观感/图例新句通顺两条〕+遗留读数义务)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§10 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§6 五条各一落点)。可核查结果:三文件在 `reports/` 且 §6 每条有落点。
- [ ] 合并前置:独立验收审计(§8.3 末段)完成且报告 `reports/iter<N>-验收审计-<完成日>.md` 逐行「通过」——未通过不得合并。可核查结果:审计报告在 `reports/` 且逐行「通过」。
**估时合计 ≈1–1.5d**(T0 0.25+T1 0.5–0.75+T2 0.25–0.5+T3 0.25)。切分预案:T1 内文案与断言可两波,但断言钉的就是文案、建议同轮落;本卡无超软盒预挂面。**编排注记**:本卡估时低于 iter-plan 四查③硬下限 5 工作日,单独不成迭代——与其他卡(如同会话卡 C)同批编入;同批时断言面 `smoke_all.gd`/`ui_click_probe.gd` 挂段与三选一驱动基建与卡 C 协调共用(§0)。
**估时合计 ≈1.5–2d**(T0 0.25+T1 0.75–1+T2 0.25–0.5+T3 0.25)。切分预案:T1 内文案与断言可两波,但断言钉的就是文案、建议同轮落;本卡无超软盒预挂面。**编排注记**:本卡估时低于 iter-plan 四查③硬下限 5 工作日,单独不成迭代——与其他卡(如同会话卡 C)同批编入;同批时 `ui_click_probe.gd` 挂段与三选一驱动基建与卡 C 协调共用、驱动参数段内自洽(§0)。
## 8. 验证闸
@@ -175,15 +184,15 @@
| # | 需求点 | 测什么(断言/行为) | 落点/判定手段 |
|---|---|---|---|
| V1 | 分类词换代(u1/u2/u10/u11) | 四处段头/帽/兜底文本==钉值新词;同屏分类撞车消除 | 冒烟隔离档①③+ui_click_probe①② |
| V2 | 渠道旧话换代(u3) | 头部含三机制事实词、零旧话词;停点弹层真链路一致 | 冒烟②+ui_click_probe③ |
| V3 | 图例行换代(u4) | 封印行含「标空」「受挖掘惩罚」零「插错」「挖雷」;图例钮真实开层路径一致 | 冒烟④+ui_click_probe④ |
| V4 | 来源名换代(u5/u6) | 双源值==「危险格」;状态槽 meta 与战斗日志行消费半各自断言 | 冒烟⑤⑥+battle_log 直建断言 |
| V5 | 字形换代(u7/u8/u9) | 已开危险格 CellUnit glyph==「危」+plate==true+glyph_color==RED_MINE+`board_view.gd` 源零 `"雷"` 字面量 | 冒烟⑦⑧(BoardView 直建+token 扫描) |
| V1 | 分类词换代(u1/u2/u10/u11) | 四处段头/帽/兜底文本==钉值新词;同屏分类撞车消除 | player_copy_sweep 断言①③+ui_click_probe①② |
| V2 | 渠道旧话换代(u3) | 头部含三机制事实词、零旧话词;停点弹层真链路一致 | player_copy_sweep②+ui_click_probe③ |
| V3 | 图例行换代(u4) | 封印行含「标空」「受挖掘惩罚」零「插错」「挖雷」;图例钮真实开层路径一致 | player_copy_sweep④+ui_click_probe④ |
| V4 | 来源名换代(u5/u6) | 双源值==「危险格」;状态槽 meta 与战斗日志行消费半各自断言 | player_copy_sweep⑤⑥+battle_log 直建断言 |
| V5 | 字形换代(u7/u8/u9) | 已开危险格 CellUnit glyph==「危」+plate==true+glyph_color==RED_MINE+`board_view.gd` 源零 `"雷"` 字面量 | player_copy_sweep⑦⑧ |
| V6 | 字体前置(u12) | 「危」字形在集 | ui_font_asset_test 增行 |
| V7 | 战斗日志行换代(u13) | 锋段效果行 display_name==新串零「挖雷」 | 冒烟⑨(锋段扩展) |
| V7 | 战斗日志行换代(u13) | 锋局 mine_hit 效果行 display_name==新串零「挖雷」+源零「挖雷」字面量 | 锋段⑨+player_copy_sweep⑩ |
| V8 | golden 判定 | 棋盘三图+菜单 changed 读数记录+判定结论(预期判有效加注) | 渲染闸+README 判定记录 |
| V9 | 反哺点清单 | §6 四条每条有落点 | 件核对表(T3 出口) |
| V9 | 反哺点清单 | §6 五条每条有落点 | 件核对表(T3 出口) |
### 8.2 改动—验收对照表
@@ -191,43 +200,44 @@
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|---|---|---|---|---|---|
| wa1 C 区段头×2 | `hero_info_panel_view.gd:73/:93` 换词 | 段头文本==「专长」/「属性值提升」〔wa1〕 `smoke_all.gd` 隔离档+`ui_click_probe.gd` 局中段 | 集成+探针 | 冒烟=⑦c 同构直建;探针=`_start_adventure_from_menu()`(:323)开局后 C 区随战斗常驻 | 变异:u1 回「特性」(T1①/T2①)→双面红 |
| wa2 地图加成帽 | `level_map_screen.gd:171` 换词 | 帽 text==「属性值提升」〔wa2〕 `ui_click_probe.gd` 地图段 | 探针 | 选路屏真实开屏(地图屏随节点事件弹出) | 撤销:回退 u10 hunk→本断言红 |
| wa3 专长卡兜底 | `battle_narrator.gd:142` 换词 | `feat_card_text({})`==「专长\n???」〔wa3〕 `smoke_all.gd` 隔离档 | 单元 | 静态函数直调(数据缺行时的真实兜底路径) | 撤销:回退 u11 hunk→本断言红 |
| wa4 奖励点头部 | `battle_narrator.gd:156` 换新 | 头部含三机制事实词零旧话词〔wa4〕 `smoke_all.gd` 隔离档+`ui_click_probe.gd` 停点段 | 单元+探针 | 静态直调+三选一停点真实开层(:356-366 先例) | 变异:u3 回旧话(T1⑦/T2③)→双面红 |
| wa5 图例行 | `legend_overlay.gd:11` 换词 | 封印行含新词零旧词〔wa5〕 `smoke_all.gd` 隔离档+`ui_click_probe.gd` 图例段 | 集成+探针 | 直建(`_init(rap_cost)` 现签名)+AP 条图例钮真实信号开层 | 变异:u4 回旧词(T1②/T2④)→双面红 |
| wa6 状态槽来源名 | `status_slot_row.gd:40` 换词 | mine_hit 来源注记==「危险格」〔wa6〕 `smoke_all.gd` 隔离档 | 集成 | 直建状态槽喂真实效果行结构(`source_class` 键=生产消费面 :162 同构) | 变异:u5 回「踩雷」(T1③)→本断言红 |
| wa7 结算明细来源名 | `settlement.tres:14` 换值 | `source_label_map["mine_hit"]`==「危险格」〔wa7〕 `smoke_all.gd` 隔离档(经 ConfigDB 真装载)+battle_log `_format_row` 行含「(危险格)」 | 集成 | ConfigDB 表装载+`battle_log_view.gd:133-136` 生产消费路径直建 | 变异:u6 回「踩雷」→表值断言与行断言双红 |
| wa8 危险格字形族 | `board_view.gd:730/:778/:782` 同批换 | glyph==「危」+plate==true+glyph_color==RED_MINE+`board_view.gd` 源零 `"雷"` 字面量〔wa8〕 `smoke_all.gd` 隔离档+token 扫描断言(:1705 直建先例式) | 集成+静态扫描 | 直建 BoardView `rebuild` 真实刷新路径(缺素材程序化回退态——fresh checkout 冒烟同纪律) | 变异:u7 回「雷」(T1④)→glyph 红;u8 单独回(T1⑤)→glyph_color 红+扫描红;u9 单独回(T1⑥)→plate 红+扫描红 |
| wa9 字体「危」在集(断言面新增) | `ui_font_asset_test.gd:18` 增行 | `has_char(危)`==true〔wa9〕 `ui_font_asset_test.gd` | 单元 | `UiKit.FONT_UI` 随包字体真实装载(测试现路径) | 变异:断言参数换 U+20000(T1⑨)→本断言红(判别力证明) |
| wa1 C 区段头×2 | `hero_info_panel_view.gd:73/:93` 换词 | 段头文本==「专长」/「属性值提升」〔wa1〕 `player_copy_sweep_test.gd` 断言①+`ui_click_probe.gd` 局中段 | 单元+探针 | 单测=⑦c 族同构直建;探针=`_start_adventure_from_menu()`(:323)开局后 C 区随战斗常驻 | 变异:u1 回「特性」(T1①)/u2 回「特性」(T1②)→断言①红;T2① 回退 u1 →探针段红 |
| wa2 地图加成帽 | `level_map_screen.gd:171` 换词 | 帽 text==「属性值提升」〔wa2〕 `ui_click_probe.gd` 地图段(:327-331 选路真链) | 探针 | 地图屏随节点事件真实开屏→选路真链 | 撤销:回退 u10 hunk→本断言红(T2②) |
| wa3 专长卡兜底 | `battle_narrator.gd:142` 换词 | `feat_card_text({})`==「专长\n???」〔wa3〕 `player_copy_sweep_test.gd` 断言③ | 单元 | 静态函数直调(数据缺行时的真实兜底路径) | 变异:u11 回旧串(T1⑩)→本断言红 |
| wa4 奖励点头部 | `battle_narrator.gd:156` 换新 | 头部含三机制事实词零旧话词〔wa4〕 `player_copy_sweep_test.gd` 断言②+`ui_click_probe.gd` 停点段 | 单元+探针 | 静态直调+三选一停点真实开层(:356-366) | 变异:u3 回旧话(T1⑨/T2③)→双面红 |
| wa5 图例行 | `legend_overlay.gd:11` 换词 | 封印行含新词零旧词〔wa5〕 `player_copy_sweep_test.gd` 断言④+`ui_click_probe.gd` 图例段 | 单元+探针 | 直建(`_init(rap_cost)` 现签名)+AP 条图例钮真实信号开层 | 变异:u4 回旧词(T1③/T2④)→双面红 |
| wa6 状态槽来源名 | `status_slot_row.gd:40` 换词 | mine_hit 来源注记==「危险格」〔wa6〕 `player_copy_sweep_test.gd` 断言⑤ | 单元 | 直建状态槽喂真实效果行结构(`source_class` 键=生产消费面 :162 同构) | 变异:u5 回「踩雷」(T1④)→本断言红 |
| wa7 结算明细来源名 | `settlement.tres:14` 换值 | `source_label_map["mine_hit"]`==「危险格」〔wa7〕 `player_copy_sweep_test.gd` 断言⑥(经 ConfigDB 真装载)+battle_log `_format_row` 行含「(危险格)」 | 单元 | ConfigDB 表装载+`battle_log_view.gd:133-136` 生产消费路径直建 | 变异:u6 回「踩雷」(T1⑤)→表值半+行半双红 |
| wa8 危险格字形族 | `board_view.gd:730/:778/:782` 同批换 | glyph==「危」+plate==true+glyph_color==RED_MINE+`board_view.gd` 源零 `"雷"` 字面量〔wa8〕 `player_copy_sweep_test.gd` 断言⑦⑧(:200 直建先例式) | 单元+静态扫描 | 直建 BoardView `rebuild` 真实刷新路径(缺素材程序化回退态——fresh checkout 冒烟同纪律) | 变异:u7 回「雷」(T1⑥)→glyph 红;u8 单独回(T1⑦)→glyph_color 红+扫描红;u9 单独回(T1⑧)→plate 红+扫描红 |
| wa9 字体「危」在集(断言面新增) | `ui_font_asset_test.gd:18` 增行 | `has_char(危)`==true〔wa9〕 `ui_font_asset_test.gd` | 单元 | `UiKit.FONT_UI` 随包字体真实装载(测试现路径) | 变异:断言参数换 U+20000(T1⑫)→本断言红(判别力证明) |
| wa10 golden 判定(**非行为改动**——闸判定动作) | 判定记录加注(README)+读数落报告 | changed 读数×4+判定结论〔wa10〕 实现报告记录表 | 非行为改动 | 渲染闸真实取证段 | 不适用(判定动作非代码改动)——读数即凭据;判失效路径走显式重制+复闸 |
| wa11 反哺点清单(**非行为改动**) | T3 三份产出物(§6 四落点) | §6 四条每条有落点〔wa11〕 件核对表 | 非行为改动 | 反哺点清单对 §6 表件核 | 撤销:删一落点→T3 件核红 |
| wa12 惊巢反制日志行 | `battle_orchestrator.gd:797` 换词 | 锋局 mine_hit 效果行 display_name==新串零「挖雷」〔wa12〕 `smoke_all.gd` 锋段扩展(:6285 族同驱动面) | 集成 | 锋类订阅+编排器 mine_hit 真实 dispatch 链(step_row 信号采行名) | 撤销:回退 u13 hunk→本断言红 |
| wa11 反哺点清单(**非行为改动**) | T3 三份产出物(§6 五落点) | §6 五条每条有落点〔wa11〕 件核对表 | 非行为改动 | 反哺点清单对 §6 表件核 | 撤销:删一落点→T3 件核红 |
| wa12 惊巢反制日志行 | `battle_orchestrator.gd:797` 换词 | 直调 `_grant_routed` 采 step_row 效果行 display_name==新串零「挖雷」〔wa12〕 `meta_progression_forge_test.gd` 锋段⑨+`player_copy_sweep_test.gd` 扫描⑩ | 单元+静态扫描 | 编排器真实构造(:666 先例)+`_grant_routed`(:771)真实调用链(效果行=战斗日志 step_row 真实生产面) | 变异:u13 回「挖雷」(T1⑪)→断言⑨红+扫描⑩红 |
**测试方式两分法**:V1–V7 全部机检自动化;能力验证经真实路径(开局/停点/图例钮/效果链)驱动,无需调试接口改数。**用户目检项**(登记不阻塞):危险格「危」字观感(字形密度/可读性对「雷」的观感替代)+图例新句通顺——观测项写进实现报告实机目检总清单。
**闸口径**:轻闸每任务卡出口自跑;批末重闸=`tools/run_all_gates.sh` 按改动域选档(本批只碰 `game/` → `--code`)全绿才合并+改前改后读数对拍。回归措辞:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):冒烟新段与 ui_font_asset_test 增行为新增断言——九注入已挂 T1(wa1/wa4/wa5/wa6/wa8×3/wa12/wa9);探针新段四注入挂 T2(wa1/wa2/wa4/wa5 的 hunk 回退)。既有断言零改动零注入(回归线)。变异不红则改判据或如实标注拦截边界。
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):新单测族+锋段扩展+ui_font_asset_test 增行+探针新段均为新增断言——十二注入已挂 T1(wa1×2/wa4/wa5/wa6/wa7/wa8×3/wa12×2/wa9)+四注入挂 T2(wa1/wa2/wa4/wa5 探针面 hunk 回退),**12 个改动单元注入全覆盖**;既有断言零改动零注入(回归线)。变异不红则改判据或如实标注拦截边界。
### 8.3 测试削弱申报(test-conventions §9.5)
**零削弱**:本批对既有断言零删除、零放宽、零缩小扫描面、零换下层直调。⑦c 段(`smoke_all.gd:1643-1651`)与禁字扫描族(:1340-1346)原样保留;`ui_font_asset_test` 既有四字断言保留、只增「危」。golden 基线**不预重制**(契约 4 判定先于动作——这不是削弱,是 README 纪律的正序执行;判失效时按先例显式重制并呈报)。
**零削弱**:本批对既有断言零删除、零放宽、零缩小扫描面、零换下层直调。⑦c 族与禁字扫描族现址(`adventure_feats_test.gd:443-445/:715-722`)原样保留;`ui_font_asset_test` 既有四字断言保留、只增「危」。golden 基线**不预重制**(契约 4 判定先于动作——这不是削弱,是 README 纪律的正序执行;判失效时按先例显式重制并呈报)。
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T3 合并前置)。
## 9. 异常分级
- **L1(自救)**:u3 措辞微调(三机制事实不变);断言名与消息措辞;`:776` 注释随动改「危」;新段段名与挂段位置选择。
- **L2(记录继续)**:断言定位写法(子树扫描 vs 逐 label 直引);T2② 零加成隐藏态的注值取法(真实选局 vs 调试注值);BoardView 直建夹具的棋盘构造细节;锋段扩展的 step_row 行名采集写法。
- **L3(停机呈报)**:发现钉值表之外第 14 处玩家面残留(证据失真——订正本卡再续);golden 判定读数 changed>0(判失效路径——显式重制须呈报);「危」字形不在字体集(u7 落不了地——呈报换字或字体方案,禁私自换字);任何要求顺带改内部注记面/合并双源/动数值/动编排器逻辑的诉求;⑦c 旧段或禁字扫描族出红(非本批改动所致的存量红——呈报存量)。
- **L1(自救)**:u3 措辞微调(三机制事实不变);断言名与消息措辞;`:776` 注释随动改「危」;断言段内挂段位置微调(同文件内)。
- **L2(记录继续)**:断言定位写法(子树扫描 vs 逐 label 直引);T2② 零加成隐藏态的注值取法(§10-3);BoardView 直建夹具的棋盘构造细节;u13 直调夹具的 cell_type 取值(极性字典任一负性行类型);源扫描的注释剥离实现细节(§10-4)。
- **L3(停机呈报)**:按完成定义 1 口径检索发现第 14 处玩家面残留(证据失真——订正本卡再续);golden 读数 changed>0(含加严口径触发——显式呈报后定);「危」字形不在字体集(u7 落不了地——呈报换字或字体方案,禁私自换字);`player_copy_sweep_test` 清单登记后 run_all 出现套件跳过(实跑数校验红);任何要求顺带改内部注记面/合并双源/动数值/动编排器逻辑的诉求;⑦c 族或禁字扫描族现址出红(非本批改动所致的存量红——呈报存量)。
## 10. 代拍板白名单(超清单必呈报)
1. u3 最终措辞——约束:三机制事实词齐(同库/渠道分流/属性值提升与补给)、「同权重」「同上限」「提升池」零残留。
2. 断言名与消息措辞、断言定位写法。
3. T2② 地图帽断言的加成注值取法(真实选局 vs 调试注值——倾向真实选局,受限再调试)。
4. 提交切分与 worktree 分支命名。
4. 源扫描的注释剥离实现写法(行首 `#` 判定式 vs 正则前剥离)。
5. 提交切分与 worktree 分支命名。
## 11. 待裁点
@@ -235,11 +245,13 @@
三处灰色地带已按设计事实推导定值(用户可否决,随 T3 反哺点清单逐条列示呈报):
- **u4 新句用「标空」与「受挖掘惩罚」**——依据=交接文档 §4.1 钉值(「标空」与行内现行「标中」成对:标中=封印落危险格、标空=封印落安全格;「受挖掘惩罚」替换「吃挖雷惩罚」消雷字);备选「封错」淘汰依据=与「标中」动词失对。
- **golden 不预重制、改为判定先于动作**——依据=golden README 纪律+F7 像素实查(四张基线图零 RED_MINE 雷字朱像素,字形改动动不了基线像素);备选「按条目 9 原文直接重制」淘汰依据=违 README「不得顺手重制」,且重制会把「基线无涉」这一事实证据抹掉。**此为对登记条目原文的核订,呈报用户确认。**
- **golden 不预重制、改为判定先于动作+本批加严句**——依据=golden README 纪律+F7 像素实查(四张基线图零 RED_MINE 雷字朱像素,字形改动动不了基线像素);加严句(changed>0 且落裁剪区=本批按失效)严于 README 阈值口径,随反哺点呈报用户裁是否入纪律句;备选「按条目 9 原文直接重制」淘汰依据=违 README「不得顺手重制」,且重制会把「基线无涉」这一事实证据抹掉。**此为对登记条目原文的核订,呈报用户确认。**
- **双源(u5/u6)同批同改不合并**——依据=合并收口是结构改动(status_slot_row 需引入 db 访问面)超本批文案边界;备选「同批顺手收口」淘汰依据=范围蔓延+断言面骤增。
## 12. 自审六查与 grilling 复核记录
**自审六查(2026-10-24 写卡会话)**:①规格覆盖——§1 钉值表 13 单元逐条挂 T 卡(u1–u13=T1、真实入口=T2、golden=T3),各指到对照表 wa1–wa12,无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,零函数体;③类型一致性——本卡零新增接口,引用的既有签名(`node_curio_header()/feat_card_text(row)/_init(rap_cost)`)与 F1–F10 实查逐字一致;④审查焦点+改动覆盖——补挂失败模式:哨兵漏改(wa8 三半断言+token 扫描)、双源漂移(wa6/wa7 双断言)、字体缺字前置(wa9)、旧话残留第三态(冒烟②零「提升池」词)、核心层效果行禁字(wa12);文件结构图 11 个行为改动行全部指到对照表行;⑤篇幅比例——规格≈1 屏、任务卡≈实现面 1:1,零代码块;⑥落位与复用——零新增文件/函数/数据件,预检节三问已答(双源同改不合并、u13 core 单行落点理由、ui_font_asset_test 落点唯一、锋段驱动面复用),与文件结构图互指一致。
**自审六查(2026-10-24 写卡会话)**:①规格覆盖——§1 钉值表 13 单元逐条挂 T 卡(u1–u13=T1、真实入口=T2、golden=T3),各指到对照表 wa1–wa12,无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,零函数体;③类型一致性——引用的既有签名(`node_curio_header()/feat_card_text(row)/_init(rap_cost)/_grant_routed(snap,…,halve_pct)`)与 F1–F11 实查逐字一致;④审查焦点+改动覆盖——补挂失败模式:哨兵漏改(wa8 三半断言+token 扫描)、双源漂移(wa6/wa7 双断言)、字体缺字前置(wa9)、旧话残留第三态(断言②零「提升池」词)、核心层效果行禁字(wa12 行为+扫描双半)、套件登记漏接(L3 实跑数校验兜底);文件结构图 13 个行为改动行全部指到对照表行;⑤篇幅比例——规格≈1 屏、任务卡≈实现面 1:1,零代码块;⑥落位与复用——唯一新增文件 `player_copy_sweep_test.gd` 的「为什么不能并入既有/落点唯一/分层」已在预检节答清(迁移后断言按域分文件、玩家面文案是独立域),与文件结构图互指一致。
**grilling 复核记录(2026-10-24,独立子代理对抗复核,不采访用户——可推导定值写依据、真归用户列 §11)**:事实面(u1–u12 行号、F1–F9、术语表/art-bible/cross_validator、探针与冒烟先例、u3 机制事实)逐条实核全部成立;F10 迷雾数值独立复算吻合。判回炉一处:**【阻断】钉值表漏第 13 处玩家面禁字**——`battle_orchestrator.gd:797`「惊巢反制——挖雷惩罚减半」经 step_row 链进战斗日志玩家可见且可产(锋类订阅),完成定义「挖雷零命中」原表落空。随同改:【应修】A-2 契约 4 证据链张冠李戴(「零踩雷」系完美档语义、探针实走 novice 档含盲挖——核订依据改挂基线图像素实查零 RED_MINE,注「重制件须复检」);A-3 契约 4 补中间态(changed>0 且差异落裁剪区=判失效,不因未超阈误判有效);A-4 §6 漏两反哺点(`node-reward.md:14` 在册逐字引 u3 旧文+明写「换代归内容批」、`教学引导.md:58` 在册逐字引 u4 旧句——补两行);A-5 变异⑤推演不红(u8 单独回退时 plate 恒真——断言⑦补 glyph_color==RED_MINE 半、增 token 扫描⑧统一钉哨兵族、补 u9 变异⑥);A-6 §0「零文件交叠」失实(断言面共用两文件——改「零改动单元交叠+挂段协调」);A-7 自审④行为改动行计数订正。v1.1 修订内容:①钉值表增 u13(含 wa12 对照行+T1 断言⑨+变异⑧+锋段驱动面复用预检);②契约 4/F7 证据链换代为像素实查+中间态处置句;③§6 增两反哺点行、序号重排①–④;④wa8 断言升三半+token 扫描、变异④⑤⑥重排;⑤§0 交叠措辞+编排注记补挂段协调与驱动基建共用。复核结论:修订后零阻断零应修,零待裁点成立。
**grilling 第一轮复核记录(2026-10-24,独立子代理对抗复核)**:判回炉一处【阻断】——钉值表漏第 13 处玩家面禁字(`battle_orchestrator.gd:797` 惊巢反制日志行经 step_row 链玩家可见且可产);随同五应修(A-2 golden 证据链张冠李戴→改挂像素实查;A-3 契约 4 补中间态;A-4 §6 漏 node-reward/教学引导两反哺点;A-5 u8 变异推演不红→wa8 升三半+token 扫描;A-6 §0 交叠措辞失实)+一建议。v1.1 全部折入。
**grilling 第二轮复核记录(2026-10-24 用户令「确保步骤明确、无灰色地带、无冲突」再开一轮,独立子代理对抗复核)**:判回炉一处【阻断】——**仓库换代**:v1.1 合回六分钟后 `game/smoke/` 退役合并(`16c6f136`)——探针迁 `game/probe/`、驱动件迁 `game/sim/`、`smoke_all.gd` 删除,本卡断言宿主与全部先例指认失效(⑦c 族/扫描族/BoardView 直建/锋段现址均已分流迁 `game/tests/`)。随同四应修(S1 玩家面全量检索与契约 2 保留面自相矛盾→检索口径钉值+保留面出域;S2 u2/u6/u11 缺注入→T1 十二注入全覆盖;S3 契约 4 与 golden README 同输入不同答案→对齐 README 双态+加严句列反哺点;S4 最窄闸未命名→接口块逐族命名)+四建议(J1 瘦身批同文件不同 hunk 表述、J2 T2② 指向 §10-3+地图段先例补引、J3 裁剪区外第三态收口〔随 S3 并入契约 4 双态表述〕、J4 :663→:661 行号订正与保留面枚举扩充)。v1.2 修订内容:①断言宿主全面重落——新单测 `player_copy_sweep_test.gd`(形制同 ui_font_asset_test+run_all 清单登记行)、锋段现址 `meta_progression_forge_test.gd`(编排器构造 :666 先例+`_grant_routed` :771 直调)、探针路径 `game/probe/`;F8/F9/F10 先例全部改指现址;②检索口径钉值(完成定义 1/T0/契约 2 三处同口径);③T1 变异步扩为十二注入(12 单元全覆盖);④契约 4 对齐 README 双态+加严句+反哺点③;⑤接口块逐族命名最窄闸。复核结论:修订后零阻断零应修,零待裁点成立。