合并(迭代52批后收尾·文档批): 反哺点六条落文(architecture v1.36呈现层与minesweeper_rules换代/art-bible v3.42六枚SEAL_HALO_FRAC/体验验证清单判据换法阵呈现+新节51目检三项/asset-path-map战末蜡封专用)+账面换代(迭代52行已完成+当前位/待办清单删五条目)+产出物退役八件+迭代51残留四卡; --docs全绿; post-merge钩子推送触发远端CI
ci / gates (push) Successful in 26s

This commit is contained in:
DKChan committed 2026-11-05 04:02:05 +08:00
commit a71e23799d
18 files changed
+32 -2091

No files matched your search

+2 -2
View File
@@ -1,6 +1,6 @@
# 美术圣经(Art Bible)— Dungeon Sweeper # 美术圣经(Art Bible)— Dungeon Sweeper
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.41,历次修订明细见 git 提交史 > 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.42,历次修订明细见 git 提交史
> >
> **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。 > **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。
> 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。 > 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。
@@ -522,7 +522,7 @@
- **画布基准(暂定值)**: - **画布基准(暂定值)**:
- **主角人设原图 = 48×72**(1× 基准,暂定;与站姿降采样可读性验证一致); - **主角人设原图 = 48×72**(1× 基准,暂定;与站姿降采样可读性验证一致);
- **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」),32px 源档的去留已定终值 = **保留 32×32 源档**(沿「独立小源档」路线;N=12 板下显示占位上限 27px = 0.84 倍,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销; - **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」),32px 源档的去留已定终值 = **保留 32×32 源档**(沿「独立小源档」路线;N=12 板下显示占位上限 27px = 0.84 倍,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销;
- **封印印记参数表(绘制件,非贴图件)**:形与画法见 §3.2。定值——**环外径 = 0.82 × 格边**(26 格 21.3px/46 格 37.7px);**环壁厚 = 0.11 × 环径**(≈2.3/4.1px);**十字臂宽 = 0.156 × 环径**(≈3.3/5.9px);**环外光圈宽 = 0.09 × 格边**(≈2.3/4.1px),向外衰减指数 1.6、峰值 alpha 0.50;圆心 = 格心。色 = 封印黑单色(光圈只改 alpha)。本件随格边连续缩放,**不适用甲类整数倍纪律**(非贴图件,见上条清单)。参数单点 = `ui_kit.gd` 五枚常量 `SEAL_RING_FRAC`/`SEAL_WALL_FRAC`/`SEAL_ARM_FRAC`/`SEAL_HALO_ALPHA`/`SEAL_HALO_GAMMA`,本节为条款侧对照值。改值须本节与 §3.2 同批修订。验收:机检〈ui_kit 五常量与本表逐值一致〉+目检〈渲染帧量环径落 82%±1px、光圈不越格边〉 - **封印印记参数表(绘制件,非贴图件)**:形与画法见 §3.2。定值——**环外径 = 0.82 × 格边**(26 格 21.3px/46 格 37.7px);**环壁厚 = 0.11 × 环径**(≈2.3/4.1px);**十字臂宽 = 0.156 × 环径**(≈3.3/5.9px);**环外光圈宽 = 0.09 × 格边**(≈2.3/4.1px),向外衰减指数 1.6、峰值 alpha 0.50;圆心 = 格心。色 = 封印黑单色(光圈只改 alpha)。本件随格边连续缩放,**不适用甲类整数倍纪律**(非贴图件,见上条清单)。参数单点 = `ui_kit.gd` 六枚常量 `SEAL_RING_FRAC`/`SEAL_WALL_FRAC`/`SEAL_ARM_FRAC`/`SEAL_HALO_ALPHA`/`SEAL_HALO_GAMMA`/`SEAL_HALO_FRAC`,本节为条款侧对照值。改值须本节与 §3.2 同批修订。验收:机检〈ui_kit 六常量与本表逐值一致〉+目检〈渲染帧量环径落 82%±1px、光圈不越格边〉
- **站桩立绘显示档 = 三档绝对高**:小型 96 / 中型 144 / 大型 188。逐件归档——小:地精、巨蜘蛛、灰矮人;中:主角、钩爪恐魔、熊地精;大:食人魔酋长、蛛化卓尔、灰矮人石君王。**源 = 原稿像素网格**(八敌 `pixel-1`、主角手修 2× 三态稿),紧裁后原样入包,**禁再降采样**;显示倍率 = 档高 ÷ 源高,NEAREST,宽度随源图比例(高定宽随不变,见上条)。定档依据 = 生物体型(体量=物种体型,非强度线性映射,见 character-design §5.2),**顺序由显示档承载、不由源高承载**。已接受项:中型三件与地精/巨蜘蛛的源高(92/94/123/90/81)低于档高,属放大显示;食人魔酋长显示宽 157 超桩盒 150。验收:机检〈standee_asset_check 逐件显示档高与归档一致、纵横倍率恒等〉+目检〈同屏体量顺序成立〉 - **站桩立绘显示档 = 三档绝对高**:小型 96 / 中型 144 / 大型 188。逐件归档——小:地精、巨蜘蛛、灰矮人;中:主角、钩爪恐魔、熊地精;大:食人魔酋长、蛛化卓尔、灰矮人石君王。**源 = 原稿像素网格**(八敌 `pixel-1`、主角手修 2× 三态稿),紧裁后原样入包,**禁再降采样**;显示倍率 = 档高 ÷ 源高,NEAREST,宽度随源图比例(高定宽随不变,见上条)。定档依据 = 生物体型(体量=物种体型,非强度线性映射,见 character-design §5.2),**顺序由显示档承载、不由源高承载**。已接受项:中型三件与地精/巨蜘蛛的源高(92/94/123/90/81)低于档高,属放大显示;食人魔酋长显示宽 157 超桩盒 150。验收:机检〈standee_asset_check 逐件显示档高与归档一致、纵横倍率恒等〉+目检〈同屏体量顺序成立〉
- **站桩立绘排版**:① 区高 B 区 ≈1/3 屏 / C 区 ≈2/3 屏,**扫雷盘原尺寸不缩、格子不变**(区高事实源 = 布局表 `battle_layout.tres`;压缩由 C 区面板空档吸收);② 站桩内部重排——立绘双脚落石台上缘(弃盒内居中)、**血条+状态/名字行落底排**(立绘→血条→状态 顺序,全场血条对齐一线;血条嵌石板位、台缘线留作地面线、落影保留接地感),状态空时该行退化为名字行;③ 大体档(显示 >150px 级:食人魔酋长/蛛化卓尔/灰矮人石君王)**允许向上溢出盒顶 N px**(N 按实测尺寸算定,**与背景/光柱无关**——现行溢出区恰为临时光柱氛围层〔§6.1 方向稿四柱,x 基准 110/900/1055/1210@1280,`battle_stage_view.gd:47-56`〕,正式舞台背景插画(三关变体)到位后该层直接退役(背景不画光柱),**溢出判定不随之变更**;横向禁止压到顶部中央轮次·阶段指示,溢出上限用真图复算 x 区间定),血条仍落底(落底排的第二个收益=头部探顶不带出血条);意图徽标悬浮头顶上方(探顶档压胸);④ 「血条悬浮头顶+立绘盒内居中」排式已弃——盒顶固定 y 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉 - **站桩立绘排版**:① 区高 B 区 ≈1/3 屏 / C 区 ≈2/3 屏,**扫雷盘原尺寸不缩、格子不变**(区高事实源 = 布局表 `battle_layout.tres`;压缩由 C 区面板空档吸收);② 站桩内部重排——立绘双脚落石台上缘(弃盒内居中)、**血条+状态/名字行落底排**(立绘→血条→状态 顺序,全场血条对齐一线;血条嵌石板位、台缘线留作地面线、落影保留接地感),状态空时该行退化为名字行;③ 大体档(显示 >150px 级:食人魔酋长/蛛化卓尔/灰矮人石君王)**允许向上溢出盒顶 N px**(N 按实测尺寸算定,**与背景/光柱无关**——现行溢出区恰为临时光柱氛围层〔§6.1 方向稿四柱,x 基准 110/900/1055/1210@1280,`battle_stage_view.gd:47-56`〕,正式舞台背景插画(三关变体)到位后该层直接退役(背景不画光柱),**溢出判定不随之变更**;横向禁止压到顶部中央轮次·阶段指示,溢出上限用真图复算 x 区间定),血条仍落底(落底排的第二个收益=头部探顶不带出血条);意图徽标悬浮头顶上方(探顶档压胸);④ 「血条悬浮头顶+立绘盒内居中」排式已弃——盒顶固定 y 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉
- **站桩石板地台件**:`scene_stage_plaza.png`,源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定、不吃 §4.3 `wall_ambient` tint(独立理由见 §6.1 近景地台独立件条)。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉 - **站桩石板地台件**:`scene_stage_plaza.png`,源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定、不吃 §4.3 `wall_ambient` tint(独立理由见 §6.1 近景地台独立件条)。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉
+1 -1
View File
@@ -28,7 +28,7 @@
| `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 | | `character/` | 角色棋盘帧 + B 区立绘 | character_hero_idle/walk(棋盘 32×32 朝左基准)、character_hero_portrait(B 区立绘 46×48)+ character_enemy_<键> 八敌 |
| `fx/` | 特效帧 | shovel_swing_f0/f1/f2(挥铲三帧,握把锚 (18,12)) | | `fx/` | 特效帧 | shovel_swing_f0/f1/f2(挥铲三帧,握把锚 (18,12)) |
| `scene/` | **场景图**(背景层 + 地面层 + 围墙层 + 可点物件层;营地场景图首批) | 营地 10 张:`scene_camp_bg`(背景层,不透明全幅=天空+远山+地面+门洞小路)+ `scene_camp_wall`(围墙层,透明底、门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件,不可点)+ `scene_stage_bg_dungeon` / `scene_stage_bg_underdark` / `scene_stage_bg_deep_underdark`(B 区战斗舞台背景层三关变体,✦ 插画级,顶部空区+远景天然洞壁,不画近景地面,按 board_type 选图)+ `scene_stage_ground`(B 区连续近景地面层,✦ 插画级,泥土/砂砾/碎石+顶缘分隔带,跨关恒定)+ `scene_stage_plaza`(B 区角色脚下小石台,48×12 九宫格件)——B 区战斗舞台背景与连续地面已入包;营地 10 张已入包(`scene_camp_*` 十件在役、`TEX_CAMP_*` 十键消费;用户游戏内终审如有置换,按本行键名同径替换) | | `scene/` | **场景图**(背景层 + 地面层 + 围墙层 + 可点物件层;营地场景图首批) | 营地 10 张:`scene_camp_bg`(背景层,不透明全幅=天空+远山+地面+门洞小路)+ `scene_camp_wall`(围墙层,透明底、门洞留透明缺口)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件,不可点)+ `scene_stage_bg_dungeon` / `scene_stage_bg_underdark` / `scene_stage_bg_deep_underdark`(B 区战斗舞台背景层三关变体,✦ 插画级,顶部空区+远景天然洞壁,不画近景地面,按 board_type 选图)+ `scene_stage_ground`(B 区连续近景地面层,✦ 插画级,泥土/砂砾/碎石+顶缘分隔带,跨关恒定)+ `scene_stage_plaza`(B 区角色脚下小石台,48×12 九宫格件)——B 区战斗舞台背景与连续地面已入包;营地 10 张已入包(`scene_camp_*` 十件在役、`TEX_CAMP_*` 十键消费;用户游戏内终审如有置换,按本行键名同径替换) |
| `board/` | 砖面/封印印记(三关换皮 + 封印印记件) | terrain_floor_<board_type>_<n>.png(三关地面系)、seal_mark.png | | `board/` | 砖面(三关换皮);seal_mark.png 现役用途=战末金蜡封徽记专用(战末弹层消费——棋盘侧贴图绘制路径已退役) | terrain_floor_<board_type>_<n>.png(三关地面系)、seal_mark.png(战末蜡封专用) |
## 4. 坐标/朝向等工程侧约定备查 ## 4. 坐标/朝向等工程侧约定备查
+12 -12
View File
@@ -2,7 +2,7 @@
## 文档状态 ## 文档状态
- 版本:1.35 - 版本:1.36
- 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定) - 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定)
- 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调) - 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调)
- 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准) - 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准)
@@ -100,7 +100,7 @@
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API | | 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|---|---|---|---|---| |---|---|---|---|---|
| **board_generator**(A1) | 生成算法(五阶段管线)、BoardGenTable 回填、生成期指标集、合法性谓词(clearable / R₀≠S / min_safe)、可推理率度量(metric_version);生成姿态 = MVP 同步生成 + 加载幕(切片实证 10×10/12×12 同步可接受,WorkerThread 留扩展) | `generate(L, D, rng) -> Board`;度量独立入口×3(推理器 / F3 度量 / 合法性谓词——独立纯函数、同一实现) | ConfigDB(BoardGenTable/VariationTable);board_gen 流(一次 open_stream = 一张图);dig_ap_cost 只读 | 无 | | **board_generator**(A1) | 生成算法(五阶段管线)、BoardGenTable 回填、生成期指标集、合法性谓词(clearable / R₀≠S / min_safe)、可推理率度量(metric_version);生成姿态 = MVP 同步生成 + 加载幕(切片实证 10×10/12×12 同步可接受,WorkerThread 留扩展) | `generate(L, D, rng) -> Board`;度量独立入口×3(推理器 / F3 度量 / 合法性谓词——独立纯函数、同一实现) | ConfigDB(BoardGenTable/VariationTable);board_gen 流(一次 open_stream = 一张图);dig_ap_cost 只读 | 无 |
| **minesweeper_rules**(A2) | 棋盘状态(已开集 O / 封印集 G / 小人位)、三事件面、批次仲裁、install 四不变式 | `install_board(board)`;`settle_batch(intents)`(唯一提交入口);查询只读面(current_board / hero_pos / is_revealed / has_seal 等);`compute_move_path(cell)` 只读;`preview_reveal(cell)` 只读预览口(零写入零事件——0 格连锁传播闭包);`retire_board()`;+harmful_variants/harmful_adjacent 两有害判定面(编排器归位);三源拒绝(board_face / resource_face / phase)+ sub_reason 封闭枚举;公开方法面 21(超阈值贴顶——还债归待办清单 P0 条目「minesweeper_rules 公开面还债」) | A1 产物(Board class_name 数据契约);A3 try_spend / last_round_end/ 相位 | 无(零表读取、零 UI——切片实证) | | **minesweeper_rules**(A2) | 棋盘状态(已开集 O / 封印集 G / 小人位)、三事件面、批次仲裁、install 四不变式 | `install_board(board)`;`settle_batch(intents)`(唯一提交入口);查询只读面(current_board / hero_pos / is_revealed / has_seal 等);`compute_move_path(cell)` 只读;`preview_reveal(cell)` 只读预览口(零写入零事件——0 格连锁传播闭包);`retire_board()`;+harmful_variants/harmful_adjacent 两有害判定面(编排器归位);三源拒绝(board_face / resource_face / phase)+ sub_reason 封闭枚举;公开方法面 20(`safe_remaining` 已私有化为 `_safe_remaining`,唯一生产消费点=同类 `clear_map_cleared`),gdstyle S13 归绿零基线键 | A1 产物(Board class_name 数据契约);A3 try_spend / last_round_end/ 相位 | 无(零表读取、零 UI——切片实证) |
| **unit_container**(B2) | hero/enemy 单位实例(hp/atk/实例池:池快照+冷却+摇定动作+保底计数)、行值快照 | spawn / query_alive / rollable_skills / special_skills / check_trigger_unlocks / set_pending_action / pending_action / basic_streak / commit_action / tick_cooldowns / apply_damage / heal / default_target / check_skill_unlocks / despawn_all(query_beat/query_attack/advance 已随行为环退役;rollable_skills/special_skills/check_trigger_unlocks 带 facts 参——情境条件触发器在役,事实缺键=条件假拦下,百分比事实走阈值式折算) | ConfigDB(EnemyTable/SkillTable/HeroTable) | 无 | | **unit_container**(B2) | hero/enemy 单位实例(hp/atk/实例池:池快照+冷却+摇定动作+保底计数)、行值快照 | spawn / query_alive / rollable_skills / special_skills / check_trigger_unlocks / set_pending_action / pending_action / basic_streak / commit_action / tick_cooldowns / apply_damage / heal / default_target / check_skill_unlocks / despawn_all(query_beat/query_attack/advance 已随行为环退役;rollable_skills/special_skills/check_trigger_unlocks 带 facts 参——情境条件触发器在役,事实缺键=条件假拦下,百分比事实走阈值式折算) | ConfigDB(EnemyTable/SkillTable/HeroTable) | 无 |
| **reward_economy**(B4) | 格面资源身份映射(install 期预分配、Ready 只读、换图映射消亡)、极性路由字典面((类型, 极性)→ 字典行查询;路由执行归 B1 授予段)、F6 当量供给投影;装配期摇号面已拆出掷格件 RewardRoller(roll_board 装配序=守卫→复位→委托→收纳→ready;受理账面留守) | 封闭 API:roll_board / query_identity / query_full_snapshot / grant / grant_clear / retire_mapping / polarity_row / phase(weighted_pick 退役——返行选行算子迁掷格件);另有 is_mapped 静默布尔投影(批量工具用);实测类变量 11 | ConfigDB(RewardTable);BattleFxHost 经注入 Callable `luck_bias_query` 取偏运合计(reward_roll 发射与 bias_rewards 求和移至效果层完成);reward_roll 流(scope = 每次 install 批,取号经掷格件) | 无 | | **reward_economy**(B4) | 格面资源身份映射(install 期预分配、Ready 只读、换图映射消亡)、极性路由字典面((类型, 极性)→ 字典行查询;路由执行归 B1 授予段)、F6 当量供给投影;装配期摇号面已拆出掷格件 RewardRoller(roll_board 装配序=守卫→复位→委托→收纳→ready;受理账面留守) | 封闭 API:roll_board / query_identity / query_full_snapshot / grant / grant_clear / retire_mapping / polarity_row / phase(weighted_pick 退役——返行选行算子迁掷格件);另有 is_mapped 静默布尔投影(批量工具用);实测类变量 11 | ConfigDB(RewardTable);BattleFxHost 经注入 Callable `luck_bias_query` 取偏运合计(reward_roll 发射与 bias_rewards 求和移至效果层完成);reward_roll 流(scope = 每次 install 批,取号经掷格件) | 无 |
| **helper_items**(A5,切片已实装秘宝域) | HelperItemTable、探测显影语义 | (契约规范源:`../../gdd/systems/跨局循环/秘宝.md`——桥接位:A2 查询接口 + A4 counter_item_ids) | A2 / A4 / B4 | 无 | | **helper_items**(A5,切片已实装秘宝域) | HelperItemTable、探测显影语义 | (契约规范源:`../../gdd/systems/跨局循环/秘宝.md`——桥接位:A2 查询接口 + A4 counter_item_ids) | A2 / A4 / B4 | 无 |
@@ -165,27 +165,27 @@
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API | | 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|---|---|---|---|---| |---|---|---|---|---|
| **D1 HUD**(呈现面拆分持续换代:组合根 main.gd + 三屏壳(MenuScreen/CampScreen/AdventureScreen)+ views/ 视图单元(现行承载面见「呈现层装配与会话生命周期」节;早期 9 单元清单与 LevelStripView 已随场景换代退役);营地面=场景根+四子界面功能窗口+Esc 浮窗+顶栏 HUD 栏〔四柜台覆盖层已退役〕) | 全部 Control/CanvasLayer(例外:BoardView 棋盘本体与 BattleStageView 站桩本体 = Control 壳 + SubViewportContainer + SubViewport + Node2D 世界〔BoardWorld/CellUnit;StageWorld/StandeeBody——B 区 slot_row 伴随件留壳层〕,探针契约面不变)、输入→意图翻译(**唯一提交路径 = settle_batch,不直调 A3**)、呈现义务状态记录(A2×6 / B2×4 / B3×4 / B4×5 / B1×3) | 视图单元接口(信号外发、setter 只读注入) | A2 compute_move_path / ActionOutcome;A3 ap/rap;B1 步骤流行协议(数据源);ConfigDB display_name | **MEDIUM**:Control / CanvasLayer / draw_* / InputEvent / RichTextLabel——对照 breaking-changes.md 4.5–4.7 条目(CanvasItem 线条无抗锯齿羽化、设备 ID 常量、RichTextLabel 图片参数两轮变化) | | **D1 HUD**(呈现面拆分持续换代:组合根 main.gd + 三屏壳(MenuScreen/CampScreen/AdventureScreen)+ views/ 视图单元(现行承载面见「呈现层装配与会话生命周期」节;早期 9 单元清单与 LevelStripView 已随场景换代退役)+三画面件内部数据类=宿主画面登记表(关卡地图屏 `_MapState`/战末弹层 `_EndOverlayState`/调试浮窗 `_DebugState` 各 14 字段公开数据成员,文件外零消费者,sweep 断言承载);营地面=场景根+四子界面功能窗口+Esc 浮窗+顶栏 HUD 栏〔四柜台覆盖层已退役〕) | 全部 Control/CanvasLayer(例外:BoardView 棋盘本体与 BattleStageView 站桩本体 = Control 壳 + SubViewportContainer + SubViewport + Node2D 世界〔BoardWorld/CellUnit;StageWorld/StandeeBody——B 区 slot_row 伴随件留壳层〕,探针契约面不变)、输入→意图翻译(**唯一提交路径 = settle_batch,不直调 A3**)、呈现义务状态记录(A2×6 / B2×4 / B3×4 / B4×5 / B1×3) | 视图单元接口(信号外发、setter 只读注入);组合根交接面=公开服务面 18(refresh_presentations/sync_status_entry/fatal_screen/quit_game/begin_session/start_debug_levels/check_board_hints/show_board_fx_for_node/replay_locked_click/sync_settlement_visuals/wire_battle/sync_debug_overlay/open_settings/open_save_select/status_data/gp_summary_text/seed_value/current_master_seed)+句柄读投影/设置口 12(set_treasure_ui/treasure_ui/set_bonus/bonus/set_camp_pres/camp_pres/set_debug/debug/set_tune_sim/tune_sim/set_confirm_consumer/set_confirm_consumer_slot)+on_* 处理器保私有经 Callable 束交付(束参=main_ui_build.build 31 键、main_adventure_flow.wire_adventure 2+6 键);指标例外=main.gd 公开方法 32 落 gdstyle 基线(先例=level_runner 33 在册);UiKit 三工厂(gradient_base/beams_rect/switch_toggle)公开化 | A2 compute_move_path / ActionOutcome;A3 ap/rap;B1 步骤流行协议(数据源);ConfigDB display_name | **MEDIUM**:Control / CanvasLayer / draw_* / InputEvent / RichTextLabel——对照 breaking-changes.md 4.5–4.7 条目(CanvasItem 线条无抗锯齿羽化、设备 ID 常量、RichTextLabel 图片参数两轮变化) |
| **组合根拆件**(呈现侧写口子件:curio_interact_controller / camp_shop_presenter / treasure_interact_controller) | 代组合根执行核心写调用(冒险节点后续推进/营地购买与刷新/道具使用——依赖与回调由 main 构造注入) | 各拆件的写入口(仅组合根装配面可达;视图零直连) | 构造注入的核心写引用(推进/商店/道具各域——详见各拆件头注) | 无 | | **组合根拆件**(呈现侧写口子件:curio_interact_controller / camp_shop_presenter / treasure_interact_controller) | 代组合根执行核心写调用(冒险节点后续推进/营地购买与刷新/道具使用——依赖与回调由 main 构造注入) | 各拆件的写入口(仅组合根装配面可达;视图零直连) | 构造注入的核心写引用(推进/商店/道具各域——详见各拆件头注) | 无 |
| **ui_registry**(`presentation/ui_registry.gd`,界面注册面,已建件) | 呈现层接口面唯一承载:层序合同(LAYER_CONTRACT)迁驻与合同寻址、三域句柄容器 ui_screens(9 屏壳与覆盖层句柄)/ui_battle(5 战区句柄)/ui_modals(模态句柄按域分三子容器——局内冒险域 run/菜单与跨语境域 menu〔两子容器〕/营地域 camp=既有 UiCampModals〔六句柄、两段式寻址 `modals.camp.*`〕,三子容器纯字段、两段式寻址 `modals.run.*`/`modals.menu.*`/`modals.camp.*`)+模态编排件 ModalFlow 直驻本面(自 UiModals 升格 UiRegistry 直持);层序合同营地槽=camp_scene+四子界面+camp_esc_overlay(camp_overlay 已退役);组合根经其一级寻址接线,探针挂载假设迁移为 `main.ui.<域容器>.<句柄>` | 三容器属性+flow+合同寻址口(RefCounted 门面,不挂树、零会话期引用);register_layer 迁驻注册面;四件类变量 UiRegistry 4/UiScreens 9/UiBattle 5/UiModals 3(run/menu/camp 三子容器纯字段——ui_modals 平铺面清零,分域纪律册级化);ModalFlow 随 UiRegistry 构造建立(注册面构造点先于装配) | 构造注入:三屏壳、覆盖层、战区句柄、ModalFlow(main_ui_build 交付随之改型) | 无(RefCounted) | | **ui_registry**(`presentation/ui_registry.gd`,界面注册面,已建件) | 呈现层接口面唯一承载:层序合同(LAYER_CONTRACT)迁驻与合同寻址、三域句柄容器 ui_screens(9 屏壳与覆盖层句柄)/ui_battle(5 战区句柄)/ui_modals(模态句柄按域分三子容器——局内冒险域 run/菜单与跨语境域 menu〔两子容器〕/营地域 camp=既有 UiCampModals〔六句柄、两段式寻址 `modals.camp.*`〕,三子容器纯字段、两段式寻址 `modals.run.*`/`modals.menu.*`/`modals.camp.*`)+模态编排件 ModalFlow 直驻本面(自 UiModals 升格 UiRegistry 直持);层序合同营地槽=camp_scene+四子界面+camp_esc_overlay(camp_overlay 已退役);组合根经其一级寻址接线,探针挂载假设迁移为 `main.ui.<域容器>.<句柄>` | 三容器属性+flow+合同寻址口(RefCounted 门面,不挂树、零会话期引用);register_layer 迁驻注册面;四件类变量 UiRegistry 4/UiScreens 9/UiBattle 5/UiModals 3(run/menu/camp 三子容器纯字段——ui_modals 平铺面清零,分域纪律册级化);ModalFlow 随 UiRegistry 构造建立(注册面构造点先于装配) | 构造注入:三屏壳、覆盖层、战区句柄、ModalFlow(main_ui_build 交付随之改型) | 无(RefCounted) |
| **UiCampModals**(`presentation/ui_camp_modals.gd`,营地域句柄子容器,已建件) | ui_modals 营地域六句柄唯一容器(场景根/四子界面/Esc 浮窗/HUD 栏),句柄寻址两段式 `modals.camp.*`;ui_modals 平铺面已清零(分域纪律册级化) | 子容器属性+六句柄只读投影;main_ui_build 装配交付 | 构造注入(六视图句柄);ui_modals(父容器挂载) | 无(RefCounted) | | **UiCampModals**(`presentation/ui_camp_modals.gd`,营地域句柄子容器,已建件) | ui_modals 营地域六句柄唯一容器(场景根/四子界面/Esc 浮窗/HUD 栏),句柄寻址两段式 `modals.camp.*`;ui_modals 平铺面已清零(分域纪律册级化) | 子容器属性+六句柄只读投影;main_ui_build 装配交付 | 构造注入(六视图句柄);ui_modals(父容器挂载) | 无(RefCounted) |
| **CampSceneView**(`views/camp_scene_view.gd`,营地场景根视图,已建件) | 营地场景图唯一呈现件:十层贴图铺底(层序按 layout 表 z 序;`camp_scene_layout.tres` fail-fast 校验+七命中区几何红线——camp_scene_layout_test 承载)、七物件命中区命中即发 object_pressed(组合根路由大门/篝火/笔记本/四界面)、反参照纪律(场景根零文字按钮)、登记模态初始隐(boot 态不盖菜单) | 构造注入(贴图经 `UiKit.TEX_CAMP_*`、layout 表经 ConfigDB 表现域容器);object_pressed 信号外发;open/close 经营地域子容器寻址 | camp_screen(宿主挂载);ConfigDB;组合根(路由消费) | Control+TextureRect 树 | | **CampSceneView**(`views/camp_scene_view.gd`,营地场景根视图,已建件) | 营地场景图唯一呈现件:十层贴图铺底(层序按 layout 表 z 序;`camp_scene_layout.tres` fail-fast 校验+七命中区几何红线——camp_scene_layout_test 承载)、七物件命中区命中即发 object_pressed(组合根路由大门/篝火/笔记本/四界面)、反参照纪律(场景根零文字按钮)、登记模态初始隐(boot 态不盖菜单) | 构造注入(贴图经 `UiKit.TEX_CAMP_*`、layout 表经 ConfigDB 表现域容器);object_pressed 信号外发;open/close 经营地域子容器寻址 | camp_screen(宿主挂载);ConfigDB;组合根(路由消费) | Control+TextureRect 树 |
| **营地四子界面视图**(`views/camp_sub_view_base.gd`+forge_view/tree_view/treasure_view/codex_view,功能窗口公共壳+四件,已建件) | 营地五功能窗口的四个承载视图(锻造工坊/天赋树/秘宝匣/图鉴)+公共壳(窗口壳/行板/关闭钮;生涯页挂笔记本路由不经此族);模态栈单口 open/close、五窗互斥单开;presenter 承接面零回表(树购买/锻造三意图经既有写口族) | 各 view open/close+意图信号外发;关闭钮 pressed | camp_shop_presenter/MetaProgression 写口(经组合根);CampRefreshBus(刷新广播消费) | Control | | **营地四子界面视图**(`views/camp_sub_view_base.gd`+forge_view/tree_view/treasure_view/codex_view,功能窗口公共壳+四件,已建件) | 营地五功能窗口的四个承载视图(锻造工坊/天赋树/秘宝匣/图鉴)+公共壳(窗口壳/行板/关闭钮;生涯页挂笔记本路由不经此族);模态栈单口 open/close、五窗互斥单开;presenter 承接面零回表(树购买/锻造三意图经既有写口族) | 各 view open/close+意图信号外发;关闭钮 pressed | camp_shop_presenter/MetaProgression 写口(经组合根);CampRefreshBus(刷新广播消费) | Control |
| **camp_esc_overlay+MainEscFlow**(`views/camp_esc_overlay.gd`+`presentation/main_esc_flow.gd`,Esc 浮窗视图+四态路由件,已建件) | Esc 浮窗三钮视图(返回主菜单/设置/退出)+Esc 四态路由静态件(根态唤起/再按关窗/功能窗开着先关最上层窗〔camp.md v2.3 定稿〕/设置开态不误关;菜单语境不唤起);**main._unhandled_input=产品码首个键盘输入入口**(契约 9——事件驱动、禁 Input 轮询、不挂 ui_cancel、pressed 非 echo) | flow.open/close 路由口;三钮 pressed 意图信号(经组合根接线) | 组合根(_unhandled_input 前置与意图消费);模态栈(关窗单口);screen_flow(设置/返回动线) | Control+静态件 | | **camp_esc_overlay+MainEscFlow**(`views/camp_esc_overlay.gd`+`presentation/main_esc_flow.gd`,Esc 浮窗视图+四态路由件,已建件) | Esc 浮窗三钮视图(返回主菜单/设置/退出)+Esc 四态路由静态件(根态唤起/再按关窗/功能窗开着先关最上层窗〔camp.md v2.3 定稿〕/设置开态不误关;菜单语境不唤起);**main._unhandled_input=产品码首个键盘输入入口**(契约 9——事件驱动、禁 Input 轮询、不挂 ui_cancel、pressed 非 echo) | flow.open/close 路由口;三钮 pressed 意图信号(经组合根接线);入口方法公开化(main 转发调用的入口去下划线——on_esc_input/is_camp_context 先前已公开) | 组合根(_unhandled_input 前置与意图消费);模态栈(关窗单口);screen_flow(设置/返回动线) | Control+静态件 |
| **CampHudBand**(`views/camp_hud_band.gd`,营地顶栏 HUD 件,已建件) | 顶栏 48px 全宽窄条:钥石余额 badge 唯一呈现(单口取现值、显式刷新才变);set_hud_band 预留位落座 | badge 文本投影;refresh 时取现值 | CampRefreshBus(挂册广播);MetaProgression 钥石读 | Control | | **CampHudBand**(`views/camp_hud_band.gd`,营地顶栏 HUD 件,已建件) | 顶栏 48px 全宽窄条:钥石余额 badge 唯一呈现(单口取现值、显式刷新才变);set_hud_band 预留位落座 | badge 文本投影;refresh 时取现值 | CampRefreshBus(挂册广播);MetaProgression 钥石读 | Control |
| **CampRefreshBus**(`views/camp_refresh_bus.gd`,营地刷新单口件,已建件) | 营地刷新单口唯一承载:进档尾与营地写口尾触发 refresh 广播(八写口尾改路由),现开界面与 HUD 同步取现值 | 挂册/refresh 广播 | 组合根(触发点接线);四子界面与 CampHudBand(消费) | 无(RefCounted 信号件) | | **CampRefreshBus**(`views/camp_refresh_bus.gd`,营地刷新单口件,已建件) | 营地刷新单口唯一承载:进档尾与营地写口尾触发 refresh 广播(八写口尾改路由),现开界面与 HUD 同步取现值 | 挂册/refresh 广播 | 组合根(触发点接线);四子界面与 CampHudBand(消费) | 无(RefCounted 信号件) |
| **board_hover**(`views/board_hover.gd`,悬停预承诺呈现域件,已建件) | 悬停反馈域唯一承载:三语义光标、目标格边框、BFS 路径预览、chord 双击首遇锚;_r0 出生展开区成员留宿主 | 构造=引用束注入 7 项(cells/minesweeper/diggable 引用+格命中换算/光标写入/hover_forbidden/chord_attempted 四 Callable);三入站口留宿主委托;hover_probe 读面留宿主 | board_view(宿主);输入事件经宿主入站口 | 无(RefCounted) | | **board_hover**(`views/board_hover.gd`,悬停预承诺呈现域件,已建件) | 悬停反馈域唯一承载:三语义光标、目标格边框、BFS 路径预览、chord 双击首遇锚;_r0 出生展开区成员留宿主 | 构造=引用束注入 7 项(cells/minesweeper/diggable 引用+格命中换算/光标写入/hover_forbidden/chord_attempted 四 Callable);三入站口留宿主委托;hover_probe 读面留宿主;公开方法面 7(七口公开化——rebind/reset/refresh_after_paint/hover_at/detect_chord/on_shell_mouse_exited/hover_pos) | board_view(宿主);输入事件经宿主入站口 | 无(RefCounted) |
| **cell_base_layer/cell_mark_overlay**(`views/`,单格两绘制域件,已建件) | 单格绘制域拆分(入参与该层绘制命令同件):基座层(底面/描边/立面/投影/接触带/倒角,12 成员)与标识叠加层(标记/字形/徽章/封印/点迹/高亮/退色,13 成员);宿主 _draw 退为六步时序器,宿主实测类变量 10 | 构造注入;绘制命令由宿主 _draw 按层序调用 | board_cell_unit(宿主);gdstyle 键各文件独立计数(12/13 均 ≤15) | 无(RefCounted) | | **cell_base_layer/cell_mark_overlay**(`views/`,单格两绘制域件,已建件) | 单格绘制域拆分(入参与该层绘制命令同件):基座层(底面/描边/立面/投影/接触带/倒角,12 成员)与标识叠加层(标记/字形/徽章/点迹/高亮/退色,14 成员);徽章遮罩走构造交付 Callable(`_mask_set`);宿主 _draw 退为六步时序器,宿主实测类变量 10 | 构造注入;绘制命令由宿主 _draw 按层序调用 | board_cell_unit(宿主);gdstyle 键各文件独立计数(12/13 均 ≤15) | 无(RefCounted) |
| **standee_vitals/standee_motion**(`views/`,站桩两状态件,已建件) | 站桩状态域拆分:身份命值(hp/atk/状态值族,12 成员)与资产演出(动作/姿态/位移演出族,11 成员);三个演出探针计数器留宿主,宿主实测类变量 10 | 构造注入;st(沿用)/mo 两实例由宿主持有 | standee_body(宿主);battle_stage_view 写入面逐字保持 | 无(RefCounted) | | **standee_vitals/standee_motion**(`views/`,站桩两状态件,已建件) | 站桩状态域拆分:身份命值(hp/atk/状态值族,12 成员)与资产演出(动作/姿态/位移演出族,11 成员);三个演出探针计数器留宿主,宿主实测类变量 10 | 构造注入;st(沿用)/mo 两实例由宿主持有;公开方法面 vitals 14/motion 14(站桩两状态件公开面换代,成员计数零增) | standee_body(宿主);battle_stage_view 写入面逐字保持 | 无(RefCounted) |
| **HudPresenter**(`presentation/hud_presenter.gd`) | 战斗屏**数据投影+文案拼装静态族**——核心状态→呈现文案的全部翻译集中于此(B/C/D 区文案与投影),静态无状态 | `refresh(…)` 全量重查装配(组合根每次动作/结算返回后调用,漏调即陈旧呈现)+只读静态投影族 | 核心读取只走 `settlement.presentation_snapshot()` 成文快照面(禁链式穿透结算内部);ConfigDB display_name | 无(RefCounted 静态) | | **HudPresenter**(`presentation/hud_presenter.gd`) | 战斗屏**数据投影+文案拼装静态族**——核心状态→呈现文案的全部翻译集中于此(B/C/D 区文案与投影),静态无状态 | `refresh(…)` 全量重查装配(组合根每次动作/结算返回后调用,漏调即陈旧呈现)+只读静态投影族 | 核心读取只走 `settlement.presentation_snapshot()` 成文快照面(禁链式穿透结算内部);ConfigDB display_name | 无(RefCounted 静态) |
| **board_resolvers**(`presentation/board_resolvers.gd`) | 棋盘每格渲染数据的只读解析回调四函数(奖励徽章身份——挖掘期 Active 相位内、地形变异数字遮蔽与角标、调试加成生效值)——有态绑定件,与无态静态投影族 HudPresenter 职责互斥 | 构造注入 db、调试浮窗与结算活态取值,产出绑定 Callable 供组合根接线 | ConfigDB / DebugOverlay / 结算活态取值 Callable | 无(纯投影) | | **board_resolvers**(`presentation/board_resolvers.gd`) | 棋盘每格渲染数据的只读解析回调四函数(奖励徽章身份——挖掘期 Active 相位内、地形变异数字遮蔽与角标、调试加成生效值)——有态绑定件,与无态静态投影族 HudPresenter 职责互斥 | 构造注入 db、调试浮窗与结算活态取值,产出绑定 Callable 供组合根接线 | ConfigDB / DebugOverlay / 结算活态取值 Callable | 无(纯投影) |
| **main_ui_build**(`presentation/main_ui_build.gd`) | `_build_ui` 八步拆分件——组合根 UI 装配分步承接(三屏壳实例化、视图句柄接线、覆盖层装配与模态编排注入按步拆开);main 侧留同名薄委托,装配序与 z 序零改动 | 分步静态函数(成员访问经 root 显式传入) | 层序逻辑不在此件——唯一事实源=`ui_registry.LAYER_CONTRACT`+`ui.apply_layer_contract(root)`(已迁驻注册面) | 同 D1(Control 装配面) | | **main_ui_build**(`presentation/main_ui_build.gd`) | `_build_ui` 八步拆分件——组合根 UI 装配分步承接(三屏壳实例化、视图句柄接线、覆盖层装配与模态编排注入按步拆开);main 侧留同名薄委托,装配序与 z 序零改动 | 分步静态函数(成员访问经 root 显式传入);入口方法公开化(main 转发调用的入口去下划线) | 层序逻辑不在此件——唯一事实源=`ui_registry.LAYER_CONTRACT`+`ui.apply_layer_contract(root)`(已迁驻注册面) | 同 D1(Control 装配面) |
| **main_adventure_flow**(`presentation/main_adventure_flow.gd`) | main 冒险流程族——菜单开局/续玩后的冒险编排接线、节点事件分发、终局面与选路屏开合;逐字搬运,main 侧留同名薄委托(探针 `main.X` 路径零迁移) | 流程静态函数(root 显式) | 局态全局住 run_scope 节点——本件零成员态、零新增信号连接(连接语句随原段搬运) | 无 | | **main_adventure_flow**(`presentation/main_adventure_flow.gd`) | main 冒险流程族——菜单开局/续玩后的冒险编排接线、节点事件分发、终局面与选路屏开合;逐字搬运,main 侧留同名薄委托(探针 `main.X` 路径零迁移) | 流程静态函数(root 显式);入口方法公开化(main 转发调用的入口去下划线) | 局态全局住 run_scope 节点——本件零成员态、零新增信号连接(连接语句随原段搬运) | 无 |
| **main_overlay_flow**(`presentation/main_overlay_flow.gd`) | main 浮层流程族——设置/状态面板/生涯页/选档界面/图例/钱包事件的开合与数据投喂;逐字搬运,main 侧留同名薄委托 | 流程静态函数(root 显式) | 全部开合走组合根模态编排口(`root.ui.flow.open/close`——ModalFlow 自 UiModals 升格 UiRegistry 直驻)——本件零成员态 | 同 D1 | | **main_overlay_flow**(`presentation/main_overlay_flow.gd`) | main 浮层流程族——设置/状态面板/生涯页/选档界面/图例/钱包事件的开合与数据投喂;逐字搬运,main 侧留同名薄委托 | 流程静态函数(root 显式);入口方法公开化(main 转发调用的入口去下划线) | 全部开合走组合根模态编排口(`root.ui.flow.open/close`——ModalFlow 自 UiModals 升格 UiRegistry 直驻)——本件零成员态 | 同 D1 |
| **main_debug_flow**(`presentation/main_debug_flow.gd`) | main 调试流程族——调试浮窗开合与上下文同步、批量模拟入口、两层调试对局起手、诊断转储;逐字搬运,main 侧留同名薄委托 | 流程静态函数(root 显式) | 调试会话状态机归 debug_session.gd——本件只接线与出 UI,零成员态 | 同 D1 | | **main_debug_flow**(`presentation/main_debug_flow.gd`) | main 调试流程族——调试浮窗开合与上下文同步、批量模拟入口、两层调试对局起手、诊断转储;逐字搬运,main 侧留同名薄委托 | 流程静态函数(root 显式);入口方法公开化(main 转发调用的入口去下划线) | 调试会话状态机归 debug_session.gd——本件只接线与出 UI,零成员态 | 同 D1 |
| **TilePalette**(`presentation/views/tile_palette.gd`) | 瓦片排版/装载:高墙/地面瓦片整批装载与运行时镜像合成、地板明度归一、数字墨族按板自适应判据、格坐标确定性散列与十六正交情形墙瓦片查表 | 查表族(读件持棋盘引用——棋盘视图 rebuild 经 `bind_board` 同步);装载缓存七成员持于件内(同板型零重载、换板重载时序同源) | 零绘制面、零玩法数据写入(绘制调用面留棋盘视图);纹理路径单点在件内 | Resource 纹理加载——LOW | | **TilePalette**(`presentation/views/tile_palette.gd`) | 瓦片排版/装载:高墙/地面瓦片整批装载与运行时镜像合成、地板明度归一、数字墨族按板自适应判据、格坐标确定性散列与十六正交情形墙瓦片查表 | 查表族(读件持棋盘引用——棋盘视图 rebuild 经 `bind_board` 同步);装载缓存七成员持于件内(同板型零重载、换板重载时序同源) | 零绘制面、零玩法数据写入(绘制调用面留棋盘视图);纹理路径单点在件内 | Resource 纹理加载——LOW |
| **HeroSprite**(`presentation/views/hero_sprite.gd`) | 英雄精灵四态与落位装配(落位与位移演出、撞墙帧闪、挖掘弹跳、脚底锚与持握手位出口) | 由棋盘视图 `_init` 建为子件(注入世界根与壳层容器引用)——精灵本体经世界根 ensure_hero 建于 SubViewport 世界内,本件只驱动其状态 | BoardWorld 世界根;素材缺位=零精灵(棋盘视图字形「人」回退路径在役) | Node2D / create_tween(Tween 系 Node 方法——MEDIUM 域对照 breaking-changes.md) | | **HeroSprite**(`presentation/views/hero_sprite.gd`) | 英雄精灵四态与落位装配(落位与位移演出、撞墙帧闪、挖掘弹跳、脚底锚与持握手位出口) | 由棋盘视图 `_init` 建为子件(注入世界根与壳层容器引用)——精灵本体经世界根 ensure_hero 建于 SubViewport 世界内,本件只驱动其状态 | BoardWorld 世界根;素材缺位=零精灵(棋盘视图字形「人」回退路径在役) | Node2D / create_tween(Tween 系 Node 方法——MEDIUM 域对照 breaking-changes.md) |
| **BoardWorld**(`presentation/views/board_world.gd`) | 棋盘 Node2D 世界根(SubViewport 内 CellUnit 容器):世界级去饱和材质与字体注入挂点、英雄精灵持有位 | 无 class_name——使用方经 preload 引用挂树 | BoardView 壳层(SubViewportContainer + SubViewport 结构不变) | Node2D/SubViewport——同 D1 | | **BoardWorld**(`presentation/views/board_world.gd`) | 棋盘 Node2D 世界根(SubViewport 内 CellUnit 容器):世界级去饱和材质与字体注入挂点、英雄精灵持有位;封印印记=参数化绘制子件 seal_mark_layer(CellUnit 新公开属性 `seal_on`:on 才建/off 撤/edge 重注入/fog_state 联动;棋盘侧 tex_seal 贴图槽退役——`seal_mark.png` 只余战末蜡封贴图专用) | 无 class_name——使用方经 preload 引用挂树 | BoardView 壳层(SubViewportContainer + SubViewport 结构不变) | Node2D/SubViewport——同 D1 |
| **battle_presentation**(B5,垂直切片后) | 结算动画 / 伤害数字 / 战斗舞台 | (契约规范源:`../../gdd/systems/战斗循环/战斗表现.md`——前置「战斗表现美术测试」锁双舞台陷阱) | B1 步骤流(回放脚本源)、D1 | **MEDIUM**:AnimationPlayer(String→StringName 变更)/ Tween | | **battle_presentation**(B5,垂直切片后) | 结算动画 / 伤害数字 / 战斗舞台 | (契约规范源:`../../gdd/systems/战斗循环/战斗表现.md`——前置「战斗表现美术测试」锁双舞台陷阱) | B1 步骤流(回放脚本源)、D1 | **MEDIUM**:AnimationPlayer(String→StringName 变更)/ Tween |
| **audio**(D4,Alpha) | 音频挂点 | (挂点 = B1 明细行类型流;负反馈聚合——单结算至多一次) | B1 流水 | AudioStreamPlayer(4.7 area_mask 默认 1→0 注意) | | **audio**(D4,Alpha) | 音频挂点 | (挂点 = B1 明细行类型流;负反馈聚合——单结算至多一次) | B1 流水 | AudioStreamPlayer(4.7 area_mask 默认 1→0 注意) |
| **tutorial**(D5,Alpha) | 教学条目 | (口径来源:A2/A3/B3/B1 各教学条目) | 各上游 | 无 | | **tutorial**(D5,Alpha) | 教学条目 | (口径来源:A2/A3/B3/B1 各教学条目) | 各上游 | 无 |
-22
View File
@@ -1,22 +0,0 @@
# 迭代 52 代拍板记录(2026-11-05)
> 卡①②③的代拍板事项落实现报告「实现决定记录」各节(三卡的白名单行使均在清单内);本件按卡④ §10 单独成文,记录卡④白名单行使与一件超清单事项呈报。
## 卡④ 白名单行使(全在 §10 清单内)
1. **常量与 uniform 命名拼写**:五常量按 art-bible §8.2 名册逐字(SEAL_ 前缀);着色器 uniform 名按卡面七名逐字(cell_px/ring_frac/wall_frac/arm_frac/halo_frac/halo_alpha/halo_gamma/mark_col)。
2. **探针文件名与抓帧命名**:未新增独立探针——取证段并入 board_shot_probe(卡面两案许其一);抓帧命名 `board_<关名>_seal.png`。
3. **commit 拆分粒度与提交信息措辞**:卡④按 T1–T5 分两次提交(常量+着色器+层件+退役+取证合并推进,代拍板授权粒度自由)。
4. **单元件内断言函数命名**:`_test_param_values`/`_test_shader_uniforms`/`_test_fog_gate`(前两者=卡面 R1–R3 判据直落名,后者=卡面 R4 判据名)。
5. **隔离验证最小场景形态**:三档格边(28/32/46)各一方块+白底+SubViewport 直渲;读数=中心行纯黑像素跨度(环外径)+最外圈 1px 框全白(光圈不出格)。
## 超清单事项呈报(§10「超清单必呈报」)
1. **SEAL_HALO_FRAC 第六常量新立**:卡 §4 列六项定值但 §7-T1 只产五常量、§7-T3 又要求注入七参数(含 halo_frac)——halo_frac 的注入源在卡内无落点。实现立 `SEAL_HALO_FRAC := 0.09`(值=§8.2 条款值逐字,非取值改动),反哺点清单第二条请文档批裁决 §8.2 名册补登。若用户裁「不留第六常量」,替代形态=shader 默认值承载(现默认值已是 §8.2 同值,删除常量与注入行即回退,零其他改动)。
## 零拍板事项核对
- 参数取值:六值全部=art-bible §8.2 逐字,零改动。
- 层挂载层级:CellUnit 之下(卡面定死),零改动。
- 贴图退役范围:三处卡面白名单内(tile_palette/cell_mark_overlay/board_view);`seal_mark.png` 素材与 battle_end_overlay 零触碰。
- 其它格面元素:零触碰。
-33
View File
@@ -1,33 +0,0 @@
# 迭代 52 反哺点清单(2026-11-05)
> 实现批产出——要写进 `design/` 与根流程清单的点逐条列行号与改后内容,由用户裁决后归文档批落文。实现批对 `design/` 与根规则文件只读(批性质禁令)。
## 一、architecture.md(design/engineering/architecture/architecture.md)
1. **:105 附近「A2 行」现状句**(卡①落地后过期):原文「公开方法面 19→21(超阈值贴顶——还债归待办清单 P0 条目…)」→ 改为现行事实:`minesweeper_rules.gd` 公开方法面 20(`safe_remaining` 已私有化为 `_safe_remaining`,唯一生产消费点=同类 `clear_map_cleared`),gdstyle S13 归绿零基线键。
2. **呈现层节(:167 起)各行登记换代**(卡③落地后过期):
- main 组合根行:补「公开服务面 18(refresh_presentations/sync_status_entry/fatal_screen/quit_game/begin_session/start_debug_levels/check_board_hints/show_board_fx_for_node/replay_locked_click/sync_settlement_visuals/wire_battle/sync_debug_overlay/open_settings/open_save_select/status_data/gp_summary_text/seed_value/current_master_seed)+句柄读投影/设置口 12+on_* 处理器保私有经 Callable 束交付(束参=main_ui_build.build 31 键、main_adventure_flow.wire_adventure 2+6 键)」;指标例外=main.gd 公开方法 32 落 gdstyle 基线(先例=level_runner 33 在册)。
- 五分文件各行:入口方法公开化(main 转发调用的方法去下划线;main_esc_flow 的 on_esc_input/is_camp_context 先前已公开)。
- level_map_screen/battle_end_overlay/debug_overlay 行:补「内部数据类(_MapState/_EndOverlayState/_DebugState)=宿主画面登记表,42 字段公开数据成员(文件外零消费者,sweep 断言承载)」。
- ui_kit 行:三工厂公开化(gradient_base/beams_rect/switch_toggle)。
- standee_vitals/standee_motion/board_hover 行:新公开面登记(vitals 14/motion 14/board_hover 7)。
- cell_mark_overlay 行:徽章遮罩走构造交付 Callable(`_mask_set`)。
3. **board_cell_unit 行**(卡④):封印印记改参数化绘制——CellUnit 新公开属性 `seal_on`+子件 `seal_mark_layer`(on 才建/off 撤/edge 重注入/fog_state 联动);棋盘侧 tex_seal 贴图槽退役。
## 二、art-bible.md(design/art/art-bible.md)§8.2
4. **参数单点名册补第六枚**:实现按 §8.2 六项定值落码,其中「环外光圈宽 0.09×格边」在名册五常量(SEAL_RING_FRAC/WALL_FRAC/ARM_FRAC/HALO_ALPHA/HALO_GAMMA)之外——层件注入需要常量源,实现立 `SEAL_HALO_FRAC := 0.09`(值=§8.2 条款值逐字)。请文档批裁决:§8.2「参数单点 = ui_kit.gd 五枚常量」句改「六枚」并补 `SEAL_HALO_FRAC` 名(或另行裁决注入源形态)。改值仍须本节与 §3.2 同批修订的条款不变。
## 三、根流程清单与美术清单
5. **体验验证清单.md 第 4 条判据换代**(卡④):现判据「`seal_mark.png` 三关加载、非字形回退」的贴图对象已退役 → 改「三关封印格呈环+十字+环外压暗光圈、环径 82%±1px(机检读数=board_shot_probe seal_shot 段,实机目检=清单在册)」。
6. **design/art/asset-path-map.md**:`seal_mark.png` 用途行「棋盘封印印记」→「战末金蜡封徽记专用(battle_end_overlay)」;棋盘侧引用已全退役。
7. **术语表**:零新增术语确认行(环/十字/光圈/读投影/引用束/公开数据成员均仓库现行词)。
## 四、工程面(tools/)
8. **`.gitattributes` 建议增补**(环境红根因,工程改动归用户发令):测试 golden 字面量载体(含 `game/tests/**/*.gd`)宜立 `text eol=lf`——Windows 检出 autocrlf=true 把 GOLDEN 三引号字面量内部转 CRLF,与运行期 JSON.stringify 输出(LF)逐位对拍必红(settlement_wiring_snapshot_test 实证;本批以单文件 LF 归位临时处置,任何后续 fresh checkout 会复现)。
## 五、GDD 反哺(game/tests/README.md 零编辑核对结果)
9. 卡④能力行名实核对通过(:122 行两代表用例函数逐字在位)——零回表;卡①②③零新增能力(各自卡面判定)——零编辑。本条为核对结论记录,非落文义务。
-173
View File
@@ -1,173 +0,0 @@
# 迭代 52 实现报告(2026-11-05)
> 迭代 52 四卡:①minesweeper_rules 公开面还债批(验收档中)②孤儿函数清退批(验收档中)③架构审查 presentation 层封装修复批(验收档中)④封印印记法阵化批(验收档中)。工作区 `D:/code/g-plan2-iter52`(分支 iter52,基点 eaf2fe47)。本报告与 `reports/iter52-反哺点-2026-11-05.md`、`reports/iter52-验收审计-2026-11-05.md` 三件为迭代产出物。
## 卡① minesweeper_rules 公开面还债批——完成
- **提交**:755d5576。改动 2 文件 6 行:`game/core/minesweeper_rules.gd:101` 定义+`:110` 内部调用点改名 `_safe_remaining`(函数体逐字不动);测试 4 行调用表达式改锚(:56/:89/:93/:94)。
- **T0 读数**:gdstyle 闸改前读数=`FAIL 新增 game/core/minesweeper_rules.gd|quality/max-public-methods`(NEW 红,21>20);断言基线四组抄录在案(安全格余量等式/fx_reveal 递减两断言等,改锚前后语义与期望值逐字同)。
- **T2 验证**:gdstyle 闸改后=基线外新违规 0(公开方法 20≤20 归绿,零新增基线键);全仓 `\.safe_remaining\(` 零残留;`\._safe_remaining\(` 命中=:110+测试 4 行。
- **实际对照表**:
| # | 需求点 | 改动 | 验收测试+落点 | 结果 |
|---|---|---|---|---|
| 1 | 公开面收敛 21→20(S13 归绿) | minesweeper_rules.gd:101/:110 改名 | gdstyle 闸单件读数(改前 NEW 红→改后零红,落本报告) | 绿 |
| 2 | 行为零变化回归锚 | 同行 1 | `minesweeper_rules_test` 既有断言全数通过——run_all 单测域 80 套件全绿(当轮跑批,见卡② T3 读数) | 绿 |
| 3 | 测试直连改锚(受控例外) | minesweeper_rules_test.gd :56/:89/:93/:94 | 同行 2(改锚后断言当轮跑批执行并通过) | 绿 |
- **卡面计数口径差(L2 备案)**:卡 §3.4 称测试 5 处调用表达式(:93 两处);按行实测=4 行 4 处调用(:93 一处+:94 一处)。改锚完整性与断言语义不受影响。
- **实机目检项**:无(改名零玩家可观测提交面)。
## 卡② 孤儿函数清退批——完成
- **提交**:1145f5a9。判死六件删除(含专属注释行):effect_engine.gd `has_effect_on`、breakpoint_store.gd `_bp_read_int`、adventure_runner.gd `_find_token`、modal_stack.gd `has_open`、camp_scene_view.gd `set_feedback_state`、curio_stop.gd `stop_resolved`。
- **T0 复核**:六件全仓词边界 grep 仅定义命中(has_open 两处/set_feedback_state 一处为注释提及),与卡 §3.2 零调用证据一致。
- **T2 级联留存复核计数**:`bp_read` 6 处在役调用/`_bp_strategy` 1(bp_read)/`curio_deck.find_token` 2(curio_stop:107/:229)/`has_open_excluding_tags` 3/`_apply_state` 8(camp_scene_view 内)/`_resolved` 15/`_triggers` 8/`dispatch` 80——全部 ≥1 在役。
- **新增孤儿扫描**:六文件逐函数引用计数粗扫(CR 剥离后)=零孤儿。
- **T3**:单测域 `run_all.gd` 80 套件全绿(exit 0)。
- **实际对照表**(七行,行 1–6 判据同构):
| # | 需求点 | 改动 | 验收测试+落点 | 结果 |
|---|---|---|---|---|
| 1 | has_effect_on 退役 | effect_engine.gd:203-212 删 | 零残留 grep(六件名全 0)+既有套件全绿(单测域 80 套件+--code 闸 09 静态扫描/00/01 保险) | 绿 |
| 2 | _bp_read_int 退役 | breakpoint_store.gd:211-219 删 | 同行 1 | 绿 |
| 3 | _find_token 退役 | adventure_runner.gd:250-252 删 | 同行 1 | 绿 |
| 4 | has_open 退役 | modal_stack.gd:56-62 删 | 同行 1 | 绿 |
| 5 | set_feedback_state 退役 | camp_scene_view.gd:88-92 删 | 同行 1 | 绿 |
| 6 | stop_resolved 退役 | curio_stop.gd:303-305 删 | 同行 1 | 绿 |
| 7 | 级联零新增 | 六件伴生核 | 上列级联计数+新增孤儿扫描零命中(本节) | 绿 |
- **里程碑出口**:`tools/run_all_gates.sh --code` 全绿(卡①②合并一次跑,回执 commit 1145f5a9,【验收通过】闸况与基线一致无新增红)。
- **实现决定记录(超白名单备案)**:随删修 3 处悬空注释引用——modal_stack.gd:12(TAG_NON_LOCKING 注释中 `has_open 组合` 改「开态计入输入锁的组合」)、modal_stack.gd:67(删「(与 has_open 同形)」括注)、camp_scene_view.gd:5(头注 `禁用态由组合根经 set_feedback_state 推送` 改 `禁用态经 _apply_state 自持基态面呈现`)。悬空引用系删除直接后果,修剪保持文档真实性。
- **实机目检项**:无(死件删除零玩家可观测提交面)。
## 卡③ presentation 层封装修复批——完成(T1–T5)
### T1 基线与底账
- **处置记录核对**:`reports/处置-presentation层封装修复-2026-11-04.md` 在盘,与本卡第 3 节逐条一致(四族裁决/42 字段名单/设计规则六条/S13 预算/连带面;42 字段与三类定义逐字核对)。
- **grep 底账(改前账)**:`grep -rnE '\._[a-zA-Z]' game/presentation --include='*.gd'` 剔纯注释行与 self._ = 443 码行/14 文件,逐文件行数与处置记录表逐行相等(level_map 88/ui_build 70/battle_end 69/standee_body 55/debug 50/main 45/adventure 26/overlay 15/debug_flow 11/board_view 7/settings 2/cell_mark 2/esc 2/assembler 1)。另 5 行为码行尾注释的历史名提及(menu_screen:9/camp_esc_overlay:8/board_view:81/modal_flow:25/adventure_screen:11),非私取面,不计入。
- **探针/测试替换精确清单**:`grep -rnE 'main\._[a-zA-Z]' game/probe game/tests` = 104 处/35 名(处置记录记 36 名,实测 35——按捕获正则差异 ±1,替换判据不受影响);实际替换=「引用名字 ∩ 公开化名字」交集 17 处(open_save_select 7/seed_value 3/open_settings 2/begin_session 2/status_data 1/start_debug_levels 1/gp_summary_text 1)+ui_struct 退出链源码串 2 处(卡面削弱申报补充第 2 条)=19 处;其余探针引用(on_* 处理器/句柄成员名/_is_settling 等探针独占名)零触碰——成员名未改,探针路径契约承载。
- **S13 对账基线(16 触件现场读数)**:gdstyle 二进制直跑——基线在册键=adventure_runner 23 变量/level_runner 33 公开 30 变量/board_view 27 公开 31 变量(贴顶);其余触件均阈值内零消息。改后只降不升核对面见下。
- **零行为变更基线**:冒烟 15/0 PASS+渲染 golden 改前绿(①②里程碑闸 05 渲染闸绿为凭)。
### T2 A1(提交见 git log)
- 三类 42 字段去下划线(level_map_screen `_MapState`/battle_end_overlay `_EndOverlayState`/debug_overlay `_DebugState` 各 14,纯数据登记表零方法),函数体零改动;宿主访问点 280 处改址(python 词边界脚本);ui_struct_probe 3 处 `_map._runner` 交集改址;三件头注补内部数据类定位句。
- sweep V1 组 52 checks 绿+冒烟 15/0。
### T3 A2(e1aa73e3)
- standee_vitals 公开面 14=既有 apply_hp+新增 13(configure_identity/set_max_hp/set_order/set_dead/is_dead/kind/armor/display_name/enemy_id/order/hp_cur/hp_max/play_hp_flash),成员 12 零增(`_hp_flash_tw` 本就在 vitals——归位=新增行为方法复用既有句柄);standee_motion 公开面 14=既有 6+新增 8(show_intent/hide_intent/intent_visible/intent_glyph/intent_col/intent_scale/intent_rot/portrait_sprite),成员 11 零增。
- standee_body 全部子件私取改址(`st._`/`mo._` 零残留);flash_hit 体改调 `st.play_hp_flash()`(tween 归位 vitals 自持,宿主成员零增);头注「外部直访冻结成员」句按新面改写。
- board_hover 七口公开化(rebind/reset/refresh_after_paint/hover_at/detect_chord/on_shell_mouse_exited 更名/hover_pos);board_view 7 处改址(公开方法与成员零净增——贴顶件维持 27/31)。
- sweep V2 组并入(61 checks 绿)+渲染 golden+探针套件串行复跑全绿。
- **实现决定记录**:首次验证将渲染闸与探针闸并行跑,两闸各出一红(shot_probe exit 124 超时/layout_probe exit 1)——串行复跑双闸全绿+layout_probe 直跑 PASS,定性=并行 CPU 互踩假红(坑速查在案形态),非本批行为漂移。
### T4 B 族(7a79fa6b)
- main.gd:18 服务方法去下划线公开化(refresh_presentations/sync_status_entry/fatal_screen/quit_game/begin_session/start_debug_levels/check_board_hints/show_board_fx_for_node/replay_locked_click/sync_settlement_visuals/wire_battle/sync_debug_overlay/open_settings/open_save_select/status_data/gp_summary_text/seed_value/current_master_seed,体逐字);12 句柄读投影/设置口(set_treasure_ui/treasure_ui/set_bonus/bonus/set_camp_pres/camp_pres/set_debug/debug/set_tune_sim/tune_sim/set_confirm_consumer/set_confirm_consumer_slot——成员名零改,BreakpointStore 方法对先例)。公开方法实测 32∈申报区间 28–32(既有 pace_delay_for+build_adventure_params 两公开+18 服务+12 口)。
- 五分文件入口公开化+`root._` 私取清零(193 处脚本+76 处结构);on_* 处理器保私有,接线语句改 Callable 束消费——束参两处:`MainUiBuild.build(root, handlers)` 31 键、`MainAdventureFlow.wire_adventure(root, handlers)` 2 键+`on_adventure_level_started` 6 键(runner 重连带传)。
- 探针/测试 19 处引用迁移(断言内容零改动,清单见 T1)。
- **main.gd 例外键落基线**:键 `game/presentation/main.gd|quality/max-public-methods = 32` 经基线文件人手编辑落账(卡面所写 `gdstyle_gate.py --refresh` 通道不存在——闸件自证「无参数;基线维护=人工手动编辑」;闸件头注即现行口径,卡面引用过时。本批按闸件现行通道执行,例外实体=卡 §14 申报本身=U0 背书面)。
- **实现决定记录**:①卡面「五个接线入口签名各加 handlers 束参」按实况落两处——main_overlay_flow/main_debug_flow/main_esc_flow 三件零连接语句(全部连接住在 ui_build 与 adventure 两件),空束=无效参数不立;②`_tune_sim` 归句柄读投影(处置记录规则 3 例举列含它,但它是成员变量——按规则 4 形态落 `tune_sim()`,公开方法总数仍在申报区间内);③施工中 gdstyle 抓出 u21 构造闭括号少一处(`_build_menu_wiring` 函数长 122 行假超限)——就地修,L1;④consumer 赋值正则把 CRLF 的 \r 捕入行中致 main_overlay_flow 解析错——\r 归位行尾,L1(冒烟/系统测试复跑全绿兜底)。
- sweep V3 组并入(99 checks 绿)+冒烟 15/0+系统测试 69/0+探针闸全绿。
### T5 C 族+批收口
- ui_kit 三工厂公开化(beams_rect/gradient_base/switch_toggle,体逐字);cell_mark_overlay 构造收遮罩下发口(`_mask_set: Callable` 成员 13→14,badge_glyph setter 走 `_mask_set.is_valid()` 守卫);board_cell_unit 构造点交付 `_set_badge_mask` Callable(board_view 零触碰零净增);ui_assembler/settings_overlay/level_map_screen:70 改址 4 处。
- sweep V4 组并入(全四组 105 checks 绿);run_all.gd manifest 登记 sweep 件(expect 0);.uid 收口(--editor --quit 后新测试件 .uid 在位随批提交)。
- 批收口终读数:冒烟 PASS+系统测试 PASS+渲染闸全绿+探针闸全绿(读数:冒烟 15/0;系统测试 69/0;render_gate 全绿;probe_gate 全绿——含首跑 cell_mark `_init` 定义漏改第二参被冒烟脚本错误扫描抓出、就地修后复跑,L1)。
- 实现决定记录:cell_mark `_init` 定义补第二参(首轮只改调用侧漏改定义侧,L1)。
### S13 改前改后对账(16 触件)
| 触件 | 改前 | 改后 | 判定 |
|---|---|---|---|
| main.gd | 1(卡面读数) | 32(基线在册,例外申报) | 申报区间内 ✓ |
| 五分文件 | 各 0 | 3–15 区间内(gdstyle 零新键) | ✓ |
| level_map_screen/battle_end_overlay/debug_overlay | 8/6/19 公开 | 不变(A1 只改字段名) | ✓ |
| standee_body | 20 公开/10 成员(贴顶) | 20/10(零净增) | ✓ |
| standee_vitals/standee_motion | 1/12、6/11 | 14/12、14/11(成员零增) | ✓ |
| board_view | 27/31(基线在册) | 27/31(零净增) | ✓ |
| board_hover | 0/9 | 7/9 | ✓ |
| ui_kit/cell_mark_overlay | 0/0、5/13 | 3/0、5/14 | ✓ |
gdstyle 闸终态:基线 6 键全在册、基线外新违规 0、恶化 0。
### 实际对照表(卡③ §8 七行)
| 需求点 | 改动 | 验收测试+落点 | 结果 |
|---|---|---|---|
| R1 A1·战末弹层 | battle_end_overlay 14 字段+69 处改址 | sweep V1〔pres封装 V1〕;冒烟+战末弹层既有探针回归(fx_probe/ui_probe 当轮探针闸绿) | 绿 |
| R2 A1·调试浮窗 | debug_overlay 14 字段+50 处 | sweep V1;TuneSimController 入口探针(tune_probe/ui_tune_probe 当轮绿) | 绿 |
| R3 A1·关卡画面 | level_map_screen 14 字段+87 处 | sweep V1;选路集成链(system_test 69/0+screen_flow_probe 绿)+冒烟 | 绿 |
| R4 A2·站桩三件 | standee 三件+flash 归位 | sweep V2;渲染 golden 逐像素零转红(render_gate 全绿);fx_probe 既有回归 | 绿 |
| R5 A2·悬停子件 | board_hover 六口+board_view 7 处 | sweep V2;ui_input_probe 既有回归(十八断言全绿) | 绿 |
| R6 B·组合根交接面 | main+五分文件+探针替换 19 处 | sweep V3;14 件替换后当轮真实跑绿(probe_gate 全绿);冒烟+系统测试 | 绿 |
| R7 C·杂项公开面 | ui_kit 三工厂+cell_mark 构造交付+改址 | sweep V4;layout/shot 探针既有回归(render/probe 闸全绿) | 绿 |
- **实机目检项**:无(零行为变更批——渲染 golden 与探针套件改前改后零转红为呈现逐位同证据)。
## 环境红定性(跨卡记录)
1. **settlement golden CRLF 检出伪红(卡①孤立验证发现)**:`settlement_wiring_snapshot_test.gd` 的 GOLDEN 三引号字面量与 `JSON.stringify` 输出逐位对拍——git blob 全 LF,Windows 检出(core.autocrlf=true)把整文件转 CRLF,字面量内部行尾变 CRLF 而运行期输出恒 LF → 对拍必红。主区同文件同为 CRLF(同 checkout 产物)=存量环境红非本批新增;远端 Mac runner(LF 检出)不受影响。本批处置=worktree 内该单文件 LF 归位(sed 剥 \r;git diff 零内容差异,M 旗标纯 EOL 往返态随区消亡),复跑 3 checks 全绿。**建议反哺点**:测试 golden 载体宜立 `.gitattributes eol=lf`(工程改动,归用户裁决)。
2. **并行跑闸 CPU 互踩假红(卡③ T3 发现)**:渲染闸与探针闸并行各自 spawn 多 Godot 进程,shot_probe 超时(exit 124)/layout_probe 退出码 1;串行复跑双闸全绿。跑闸纪律维持「长批串行」。
## 遗留读数义务
- 无(四卡均零 MC/数值触面;卡④读数见下节)。
## 卡④ 封印印记法阵化批——完成(T1–T5)
### 落码面
- **T1**:ui_kit 五常量(SEAL_RING_FRAC 0.82/SEAL_WALL_FRAC 0.11/SEAL_ARM_FRAC 0.156/SEAL_HALO_ALPHA 0.50/SEAL_HALO_GAMMA 1.6,各带 §8.2 来源注)+ `seal_mark_params_test.gd`(现 3 断言函数)+ run_all.gd 注册(expect 0)。
- **T2**:`seal_mark.gdshader`(canvas_item 距离场:环带+十字+环外光圈,半径夹 `min(r, cell_px * 0.5)`;uniform 七枚+mark_col;默认值=§8.2 同值兜底,gd 侧逐次注入;禁动效零呼吸)。隔离验证=三档格边 28/32/46px 方块直跑抓帧:环径比 0.857/0.813/0.826 全落 0.82±1px、最外圈 1px 框全白(光圈不越格),截图落 artwork/(在途不入 git)。
- **T3**:`seal_mark_layer.gd`(仿 cell_type_glow_layer 子件模式:材质独占/全幅 draw_rect/非零 alpha 触发/参数全 ui_kit 注入);board_cell_unit 挂载(`_SEAL_LAYER` preload+`seal_on` 公开属性+`_seal_layer` 成员+`_sync_seal_layer` 单点:on 才建 off 撤 edge 变更重注入;edge/fog_state setter 各一行联动——雾态非 0 整层隐藏=§6.5 随格隐没);board_view :539-541 改 `u.seal_on` 下发。
- **T4**:棋盘侧贴图路径三处退役——cell_mark_overlay 删 tex_seal 成员/setter/:96 绘制块(头注④段改写);tile_palette 删 TILE_SEAL_MARK/:48 seal_tex/:111 装载;board_view 删 :582 缺图字形回退分支。全仓 sweep:`seal_mark.png` 资产引用只余 battle_end_overlay.gd:85(战末蜡封专用)——结构性证据落本报告。
- **T5**:board_shot_probe 增封印格取证段(施印保底走真实 settle_batch 写口;从微光关帧裁剪封印格直算读数)。**三关读数表**:
| 关 | 格边 | 环径读数 | 比值 | 判据(0.82±1px) | 框最暗值 seal/ref | 英雄格中心 r |
|---|---|---|---|---|---|---|
| L1_dungeon | 46 | 38px | 0.8261 | ✓ | 0.169 / 0.169 | 非黑 ✓ |
| L2_underdark | 46 | 38px | 0.8261 | ✓ | 0.016 / 0.016 | 非黑 ✓ |
| L3_deep_underdark | 46 | 38px | 0.8261 | ✓ | 0.008 / 0.094 | 非黑 ✓ |
(37.72px 期望值、读数 38px=覆盖量化;光圈越格判据见下方判据实现注记。)
- **T6**:能力清单核对=`game/tests/README.md:122` 行「棋盘封印印记呈现」代表用例 `seal_mark_params_test.gd:_test_param_values`+`_test_fog_gate` 两函数逐字在位、真实入口与实现一致——零回表。.uid 收口在位。
### 实际对照表(卡④ §8 七行)
| # | 需求点 | 改动 | 验收测试+落点 | 结果 |
|---|---|---|---|---|
| R1 | 环径 82% 格边随格边连续 | shader ring_frac+五常量 | `_test_param_values`〔seal批 V1〕+T5 三关帧量读数 0.8261×3 | 绿 |
| R2 | 壁厚 11%/臂宽 15.6% 环径 | 同上 | `_test_param_values`(V2 两断言)+T5 帧量(壁厚/臂宽由同一参数化着色器承载,环径读数为帧量主证) | 绿 |
| R3 | 光圈只在环外不出格 | shader halo_frac+r 夹取 | `_test_shader_uniforms` 含夹取行断言〔seal批 V3〕+隔离验证三档边框全白+T5 框差读数留档 | 绿 |
| R4 | 迷雾态隐藏 | board_cell_unit fog_state 联动 | `_test_fog_gate`〔seal批 V4〕(fog_state=1 不可见/0 可见/撤即撤) | 绿 |
| R5 | 印记在小人之下 | 子件挂 CellUnit | T5 帧取证:三关英雄格中心像素非黑(读数落 readings json);层树序构造面(hero 精灵后挂天然在上) | 绿 |
| R6 | 蜡封仍用贴图 | battle_end_overlay 不动 | 既有战末弹层探针/单元零转红+`seal_mark.png` sweep 命中数=1 | 绿 |
| R7 | 零新增色 | shader 只用 mark_col | `_test_shader_uniforms`(shader 文本零 Color8/无第二色常量——`grep Color8` 零命中)+渲染闸有效色数闸 | 绿 |
### 判据实现注记(卡面判据的落法差异,实现决定记录)
1. **光圈越格硬判据换代**:卡面「邻格边缘亮度与无封印帧差 ≤1/255」实测被邻格砖纹阴影/微光混色污染(L3 读数 seal 0.008 vs ref 0.094——系纹理内容非光圈;L2/L3 砖瓦本身含近黑斑)。换代判据=①层件 1:1 全幅 draw_rect(越格在构造上不可能)+②隔离验证三档边框扫描全白+③shader 夹取行静态断言;框差读数留档不作硬判。意图(光圈不出格)三面承载。
2. **环径扫描阈值**:印记体 alpha=1 合成结果=纯黑(≤2/255)——首版 0.15 阈值被 L2 砖纹近黑斑混入(读数 42px 假越带),收紧后三关一致 38px。
3. **R2 帧量口径**:壁厚/臂宽由同一参数化着色器按环径比例承载(wall_frac/arm_frac 直接进 SDF),帧量主证=环径;两常量取值由单元断言逐值钉死。
### 实机目检总清单(登记不阻塞)
1. 三关封印格观感(环+十字+压暗光圈,截图=artwork/ 在途 `seal_iso_*.png` 与 seal_shots/ 裁剪帧)。
2. 战末金蜡封徽记观感(贴图路径未动——零预期变化)。
3. 封印格与变异纹带同格观感(两层共存——零代码触面,观感确认项)。
### 遗留读数义务
- 无(零数值改动零 MC)。
## 独立验收审计结论(收尾节)
- 审计报告:`reports/iter52-验收审计-2026-11-05.md`(未参与实现的子代理执行;四卡验收档均中——对照表逐行全量核对+判据绑定面抽查+削弱逐处检查+例外逐条核对,最窄复跑省略以本地闸回执代证、合回后远端 CI 现查为终局执行证据)。
- **总判定:通过**——四卡对照表 24 行全过;测试削弱 8 类逐处全落卡面申报集;直查受控例外 2 条全注记;闸回执八闸 exit 0、dirty_game=false。
- 审计备案两件(零实体影响,随收尾笔处置):①卡④ ui_input_probe case④b 断言换代(tex_seal 退役→seal_on 断言)的申报记录只在提交信息 13d6bfbb,卡面 §8 文本「本批不删改任何既有断言」未覆盖此换代——实体的申报依据=test-conventions §5.5(旧验证约束同生死)+卡面对 board_view:582 的同类「行为退役不属删断言」口径;本节即补记。②board_view.gd:77 头注悬空提及 `_palette.seal_tex`——已随收尾笔修剪。
-131
View File
@@ -1,131 +0,0 @@
# 迭代 52 验收审计报告(2026-11-05)
> 审计对象:分支 iter52 相对 master(53d2a8a2)的全部改动(53 文件;四卡①minesweeper_rules 公开面还债批/②孤儿函数清退批/③架构审查 presentation 层封装修复批/④封印印记法阵化批,四卡验收档均为中)。审计人=未参与实现的独立会话(test-conventions §8.7)。审计深度=四卡全量对照表逐行+判据绑定面抽查(每卡 ≥2 行)+测试削弱逐处+直查例外逐条;最窄测试复跑省略——执行证据=闸回执读数(game/tests/.gates/receipt.json,commit fbf126d1,八闸全 0),**合回后远端 CI 现查为终局执行证据**。全部零命中断言与计数均由审计人自跑 grep 取数,不采信报告转述。
## 总判定:通过
- 四卡对照表逐行核对全部通过(卡① 3 行/卡② 7 行/卡③ 7 行/卡④ 7 行,共 24 行;无缺漏行)。
- 测试削弱检查逐处核毕:测试/探针面被删改既有断言共 5 类 35 行,全部落在申报集内(逐处清单见第三节);无申报外删改。
- 直查受控例外逐条核毕(2 条,见第四节)。
- 两项备案缺漏(均零实体影响,不阻塞合并):④-1 ui_input_probe case④b 断言换代的申报记录未进卡面与实现报告(实体合规,欠账文档级);④-2 board_view.gd:77 悬空注释仍引已删成员 `_palette.seal_tex`。见第五节。
## 一、逐卡审计结论
### 卡① minesweeper_rules 公开面还债批(验收档:中)——通过
| # | 需求点 | 核对结果 | 结论 |
|---|---|---|---|
| 1 | 公开面收敛 21→20(S13 归绿) | diff 实核:`minesweeper_rules.gd:101` 定义改名+`:110` 内部调用点同步,函数体逐字未动(diff 仅两行签改)。审计自数:该文件非下划线 `^func [a-zA-Z]` = 20。`tools/gdstyle_baseline.txt` 零 minesweeper_rules 键(grep 零命中);审计自跑 `python tools/gdstyle_gate.py`:7 命中全在基线、基线外新违规 0、恶化 0 | 通过 |
| 2 | 行为零变化回归锚 | `minesweeper_rules_test.gd` 既有断言除改锚外零改动(diff 实核:断言消息串与期望表达式逐字未动);套件经回执 02 闸(exit 0)当轮执行 | 通过 |
| 3 | 测试直连改锚(受控例外) | 改锚 4 行(:56/:89/:93/:94)diff 逐行实核;审计自跑 `grep -rnE '\.safe_remaining\(' game/`(.gd+.tscn)=零命中;`_safe_remaining` 全仓恰 6 处(:101 定义+:110+测试 4 行)。卡面 §3.4 称「测试 5 处(:93 两处)」实测 4 处——实现报告已 L2 备案(计数差,改锚完整性与断言语义不受影响) | 通过(卡面计数差备案在案) |
- 真实入口核:行 1 判据面(S13 计数)由 gdstyle 闸单件读数承载、改前 NEW 红(21>20)与改后零键均落实现报告 T0/T2,改动点即被测点,无绕过。行 2/3 经 `tests/run_all.gd` 单元套件真实跑(回执 02 exit 0),改锚断言(:56 精确余量等式/:89-94 fx_reveal 递减)在套件内当轮执行。
- 尾缀:本卡零新增测试件,无尾缀义务;既有断言尾缀(〔wr4〕等)零触碰。
### 卡② 孤儿函数清退批(验收档:中)——通过
| # | 需求点 | 核对结果 | 结论 |
|---|---|---|---|
| 1 | has_effect_on 退役 | diff 实核 effect_engine.gd 删 :203-212(`## 订阅查询面` 注释+函数);审计自跑六件名词边界 grep(game/ 全 .gd+.tscn)=六名全零命中 | 通过 |
| 2 | _bp_read_int 退役 | breakpoint_store.gd :211-219 删(注释+函数),diff 实核;grep 零残留 | 通过 |
| 3 | _find_token 退役(死包装) | adventure_runner.gd :250-252 删;grep 零残留;真件 `curio_deck.find_token` 在役(curio_stop.gd:107/:229 实查) | 通过 |
| 4 | has_open 退役 | modal_stack.gd :56-62 删;grep 零残留(`\bhas_open\b` 不误中 `has_open_excluding_tags`);后者 3 处在役调用实查 | 通过 |
| 5 | set_feedback_state 退役 | camp_scene_view.gd :88-92 删(无专属注释块,与卡面一致);grep 零残留 | 通过 |
| 6 | stop_resolved 退役 | curio_stop.gd :303-305 删;grep 零残留 | 通过 |
| 7 | 级联零新增 | 审计自跑级联计数全 ≥1 在役:bp_read 6/_bp_strategy 1/find_token(deck 件)定义+2 在役/has_open_excluding_tags 3/_apply_state 8(camp 件,剥定义)/_resolved 15/_triggers 8/`.dispatch(` 80;与实现报告计数一致。审计自写逐函数引用粗扫(六文件+minesweeper_rules,剥注释、引擎虚函数豁免)=零孤儿 | 通过 |
- 真实入口核:判据=静态零残留 grep+既有套件回归锚。六件名全仓零调用(含测试面零命中)=无测试直连可绕;回归面经回执 00/01/02/09 四闸(全 exit 0)真实执行。判据绑定面=「定义行消失+全仓零残留」为本批特有提交面(死函数无运行期可观测面——卡面已申报观测面局限)。
- 随删 3 处悬空注释修(modal_stack.gd:12/:67、camp_scene_view.gd:5):diff 实核=纯注释行,零断言零行为触面;实现报告「实现决定记录」已备案(超白名单呈报)。通过(备案在案)。
### 卡③ 架构审查 presentation 层封装修复批(验收档:中)——通过
对照表七行(R1–R7)逐行核对:
| # | 需求点 | 核对结果 | 结论 |
|---|---|---|---|
| R1 | A1·战末弹层 | `presentation_encapsulation_sweep_test.gd` V1 组在盘:battle_end_overlay 非空前置+class `_EndOverlayState` 正锚+`st\._` 零命中+14 公开字段逐个正锚+类名文件外零消费者(全 game/ 递归扫描,排除宿主与自件)。审计实读类定义=14 字段无下划线 | 通过 |
| R2 | A1·调试浮窗 | 同 V1 组:debug_overlay 14 字段(`_DebugState` 定义实读)+`st\._` 零命中;TuneSim 入口探针经回执 03 闸绿 | 通过 |
| R3 | A1·关卡画面 | 同 V1 组:level_map_screen `_MapState` 14 字段实读+`_map\._` 零命中;system_test(回执 01 exit 0)+screen_flow_probe 走选路链 | 通过 |
| R4 | A2·站桩三件 | V2 组:standee_body `\bst\._|\bmo\._` 零命中(审计自跑)+`configure_identity/play_hp_flash/show_intent|hide_intent/portrait_sprite` 正锚在文;flash 归位实查(standee_vitals.gd:84 `play_hp_flash`+:22 `_hp_flash_tw` 自持;standee_body.gd:251 改调);渲染 golden 经回执 05 闸绿 | 通过 |
| R5 | A2·悬停子件 | V2 组:board_view `_hover_comp\._` 零命中(审计自跑)+七口正锚(rebind/reset/hover_at/detect_chord/refresh_after_paint/on_shell_mouse_exited/hover_pos——board_hover.gd 实读 7 公开方法,board_view 7 处改址 diff 实核);ui_input_probe 经回执 03 闸绿 | 通过 |
| R6 | B·组合根交接面 | V3 组:六文件 `root\._[a-zA-Z]` 与 `Main(Overlay|Adventure|Debug|Esc)Flow\._[a-zA-Z]` 零命中(审计自跑,前者六文件全零、后者全库唯一命中=camp_esc_overlay.gd:8 注释历史名提及,T1 底账已定性非私取面);main.gd 公开方法实测 32(31 实例+1 静态 build_adventure_params)=基线键 32;五分文件入口公开化实读(on_quit/open_settings/show_debug_levels/wire_adventure 等全公开);Callable 束消费正锚(ui_build `handlers["board_action"]`、adventure `handlers["adventure_finished"]` 实读在文);on_* 处理器保私有(探针 28 处 main._on 引用零改动实查);冒烟/系统测试经回执 00/01 闸绿 | 通过 |
| R7 | C·杂项公开面 | V4 组:`UiKit\._[a-zA-Z]` 全库 .gd 零命中(审计自跑,排除 ui_kit.gd 自身——其内亦零命中);cell_mark `_owner\._` 零命中+`_mask_set.is_valid()` 正锚;三工厂公开正锚(ui_kit.gd:364/:401/:874 实读,diff 证体逐字仅签改);ui_assembler:106/settings_overlay:88/:105/level_map_screen:70 四处改址 diff 实核;cell_mark `_init` 增第二参、board_cell_unit `_set_badge_mask` 交付实读(board_view 零触碰——diff 无 board_view 构造点改动) | 通过 |
- S13 对账(16 触件):审计自跑 `python tools/gdstyle_gate.py` 全绿(7 键全在册、基线外 0、恶化 0);基线键 7 条与实现报告对账表一致——main.gd=32(卡 §14 申报区间 28–32 内)、ui_kit=23(追补提交 00dbd4a7,卡 §3.2 误测 L2 备案+反哺点在案)、board_view 27/31 持平(贴顶零净增——diff 实证 board_view 仅 8 处改址零增面)。
- 探针/测试迁移 19 处逐条实核(ui_struct_probe 6、ui_click_probe 4、ui_tune_probe 3、system_test 3、probe_ui_util 1、screen_flow_probe 1、ui_probe 1、pacing_queue_test 1=18 调用点+退出链源码串 1 行 2 串):断言内容零改动、退出链断言意图不变(`_on_esc_quit` 处理器私名零改动实查);迁移名全仓零残留实查(grep 零命中);未迁移名(on_*/句柄成员/探针独占名)零触碰实查。
- 零行为变更证据链:回执 00/01/03/05/05b 全 exit 0+渲染 golden 零转红(05 闸绿);并行跑闸 CPU 互踩假红已定性(串行复跑双绿,报告 T3 记录)。
- 备注(措辞差,非缺漏):卡面 R6 行「14 件替换后当轮真实跑绿」——实际替换=「引用名字 ∩ 公开化名字」交集 19 处落 8 文件(卡 §4/§5 的替换判据即交集规则,14 件为引用面总体非替换件数);实体合规。
### 卡④ 封印印记法阵化批(验收档:中)——通过(两项备案缺漏见第五节)
| # | 需求点 | 核对结果 | 结论 |
|---|---|---|---|
| R1 | 环径 82% 格边随格边连续 | `seal_mark_params_test.gd:_test_param_values` 在盘(SEAL_RING_FRAC=0.82 断言〔seal批 V1〕);ui_kit.gd:37 实读同值;T5 取证=board_shot_probe `_seal_evidence`(施印保底走真实 `settle_batch` 写口实读在文;环径读数硬判 `absf(ratio-0.82) <= 1.0/edge` 越带即红)——探针闸绿(回执 03)为执行证据;报告三关读数 38/46=0.8261 在带 | 通过 |
| R2 | 壁厚 11%/臂宽 15.6% 环径 | `_test_param_values` 两常量断言在盘〔seal批 V2〕;shader 实读 `wall = wall_frac * 2.0 * ring_r`、`arm = arm_frac * 2.0 * ring_r`(:34-35)——两常量直接进 SDF,帧量主证=环径(口径换代落实现报告「判据实现注记 3」) | 通过(换代已申报) |
| R3 | 光圈只在环外不出格 | `_test_shader_uniforms` 夹取行断言在盘〔seal批 V3〕;shader :45 实读 `float rc = min(r, cell_px * 0.5);`;层件 `seal_mark_layer.gd` 1:1 全幅 draw_rect(越格构造上不可能——:42 实读);隔离验证截图三件在 artwork/(seal_iso_28/32/46.png 实存,在途不入 git 合卡面 T2);框差读数留档不作硬判(换代理由=邻格砖纹噪声实证 L3 0.008 vs 0.094,落「判据实现注记 1」) | 通过(换代已申报) |
| R4 | 迷雾态隐藏 | `_test_fog_gate` 在盘〔seal批 V4〕(fog_state=1 不可见/0 可见/撤 seal_on 即撤);board_cell_unit.gd 实读:fog_state setter 联动 `_sync_seal_layer`+`_sync_seal_layer` 末行 `setup(edge, fog_state == 0)`;run_all.gd manifest 注册(expect 0)经回执 02 闸绿 | 通过 |
| R5 | 印记在小人之下 | 层树构造面实读(子件挂 CellUnit、hero 精灵 BoardView 层后挂);T5 硬判读数在 `_seal_evidence`:英雄格中心像素 ≤0.05 即红(「R5 层序翻失」),探针闸绿兜底;报告三关读数非黑 | 通过 |
| R6 | 蜡封仍用贴图 | 审计自跑 `grep -rn "seal_mark.png" game/ --include='*.gd'`=恰 1 处(battle_end_overlay.gd:85,战末蜡封 `_seal_img` 实读未动) | 通过 |
| R7 | 零新增色 | 审计自跑 shader `grep Color8`=零命中;色源单点实读(layer :33 `mark_col = UiKit.SEAL_BLACK` 注入,光圈只改 alpha——shader :49);色板闸经回执 05b exit 0 | 通过 |
- 贴图退役核(审计动作六自跑取数):`TILE_SEAL_MARK|seal_tex` 全 game/ .gd = 3 处——battle_end_overlay.gd:85-87(局部变量,合法在役)+board_view.gd:77(**注释行**,见第五节缺漏 2);tile_palette 面零残留(TILE_SEAL_MARK 常量、seal_tex 成员与装载 diff 实核已删);board_view :539-541 槽位维护改 `u.seal_on` 下发、:582 字形回退分支退役(diff 实核);cell_mark_overlay tex_seal 成员/setter/绘制块删除+头注改写(diff 实核)。
- 真实入口核:R1-R3/R7 真实入口=`BoardCellUnit.edge → SealMarkLayer.setup() → ShaderMaterial` 参数链(layer :26-33 逐参注入实读);R4 入口=fog_state 属性写面;R5/R1 帧量入口=真实 BoardView 实例化+settle_batch 施印(保底三段实读:novice 驱动在案→邻接施印→免邻接旗标,全拒即 quit(1))——无绕过改动点的直构面。R2/R3 的帧量判据换代与 R7 色数闸均在实现报告申报。
- 能力行核对:game/tests/README.md:122「棋盘封印印记呈现」代表用例 `seal_mark_params_test.gd:_test_param_values`+`_test_fog_gate` 与落地函数逐字一致(实读)——零回表,卡③④能力行其余全「既有」零新增与实现一致。
- 超清单事项合规核:SEAL_HALO_FRAC 第六常量新立=卡 §7-T1/T3 内部矛盾(五常量 vs 七参数注入)的补源,值=§8.2 条款值逐字非改值;代拍板记录「超清单事项呈报」第 1 条+反哺点第 4 条呈报用户裁决——呈报路径在案,合规。
## 二、判据绑定面抽查(每卡 ≥2 行)
- 卡①行 1(S13 计数):断言面=gdstyle 对被改文件读数,改名即被测点——绑定面恰为本批特有提交面;审计自跑闸件复证零键归绿。
- 卡②行 1-7(零残留+级联计数):判据为静态 grep——审计全部自跑取数(六名零残留、级联八组计数、零孤儿粗扫),与实现报告计数逐项一致(_apply_state 报告记 8、审计含定义 9,剥定义后同值)。
- 卡③ R4/R6(V2/V3 正锚+零命中):sweep 断言钉在「源码私取模式零命中+新公开面正锚」——审计自跑同口径 grep 全零;正锚对应真实公开面(方法定义实读在位)。当轮执行证据=回执 02(sweep 件在 manifest 注册实读)。
- 卡④ R1/R5(环径读数+英雄格中心非黑):两判据均硬判落 `_seal_evidence`(越带/读黑即 `_problems.append`→探针退出红),绑定面=封印记数像素与层序像素——本批特有可观测提交面;当轮执行证据=回执 03。
## 三、测试削弱检查(逐处;审计自跑全 diff 删除行清单对申报集)
测试/探针面被删改的既有断言与引用,逐处核对:
| # | 删改处 | 内容 | 申报依据 | 判定 |
|---|---|---|---|---|
| 1 | minesweeper_rules_test.gd :56/:89/:93/:94 | 4 行调用表达式改锚 `_safe_remaining`,断言消息与期望值逐字未动(diff 实核) | 卡① §8 对照表行 3+测试削弱申报节 | 申报内,通过 |
| 2 | 探针/测试 8 件 17 处 `main._x` 引用(open_save_select 7/seed_value 3/open_settings 2/begin_session 2/status_data 1/start_debug_levels 1/gp_summary_text 1) | 引用形态迁移,断言内容零改动(逐文件 diff 实核) | 卡③ §8 削弱申报第 1 条+实现报告 T1 精确清单 | 申报内,通过 |
| 3 | ui_struct_probe.gd :144-146 退出链源码串 2 串("MainEscFlow.on_quit(self)"/"root.quit_game()") | 源码串随公开化换代;同函数 `_on_esc_quit` 私名断言零改动(diff 实核) | 卡③ §8 削弱申报补充(v1.1)第 2 条 | 申报内,通过 |
| 4 | ui_struct_probe.gd :366-370 `ls._map._runner` 3 处 | A1 字段公开化交集改址,断言内容零改动 | 卡③ T2 底账(实现报告)+交集判据 | 申报内,通过 |
| 5 | stage_background_test.gd :164-165/theme_projection_test.gd :626/:651 | `_beams_rect`/`_gradient_base` 旧私名引用随三工厂公开化换代(stage 为源码 contains 断言随名换代,意图不变) | 提交 a8b0b1b2(里程碑闸 02 域抓出,L2 备案「T1 底账漏 enumeration」)+审计任务书申报集 | 申报内(记录载体=提交信息),通过 |
| 6 | ui_input_probe.gd case④b(:264-268 删旧纹理槽双分支断言+注释,换 seal_on 落位单断言) | 旧断言只验证已退役的 tex_seal 机制——test-conventions §5.5 换代批旧验证约束同生死(强制摘除,留即假绿源);新断言同入口(case④b 封印落位)同强度(核心落位硬判) | test-conventions §5.5(法条强制)+提交 13d6bfbb;卡④ §8 削弱申报文本与实现报告未列(欠账,见第五节缺漏 1) | 实体合规;申报记录缺口列缺漏 |
| 7 | board_view.gd :582 字形回退分支、:539-541 槽位维护、tile_palette 两槽、cell_mark 绘制块 | 生产行为退役(回退对象消失),非删断言 | 卡④ §8 削弱申报(明示「行为退役不属删断言」)+§7-T4 | 申报内,通过 |
| 8 | settlement_wiring_snapshot_test.gd | LF 归位处置——审计实核该文件不在 master...HEAD diff(`git diff --name-only | grep settlement` 零命中)=零内容差异,EOL 往返态未进分支;断言零触碰 | 实现报告「环境红定性 1」 | 申报内,通过 |
- 申报外删改清点:全 diff 测试/探针面删除行清单(35 行)已逐行对号(上表 1-8),无第 9 类;run_all.gd 仅增 2 行 manifest 注册(sweep+params 两新件),零删改;.tscn/.tres/data 零改动;新增行零 `randomize()`/自建 RNG(红线实核)。
- 削弱判定总:无断言删除性削弱、无阈值放宽换绿(两处换代的旧判据各有等强度新判据或三面承载,且均系法条/机制强制)、无扫描面缩小(sweep 四组全带非空前置)、无换下层直调(改锚一处为卡①申报的受控例外)。
## 四、内部字段直查受控例外核对(逐条)
| 例外 | 直查行 | 理由注记核对 | 判定 |
|---|---|---|---|
| 卡①对照表行 3(测试改锚精确余量) | minesweeper_rules_test.gd :56/:89/:93-94 `_rules._safe_remaining()` | 对照表行 3 原文含「**受控例外注记**:精确余量无公开可观测面可钉(`clear_map_cleared` 仅 bool),理由随本表申报」——注记在对照表行内 | 通过 |
| 卡④ `_test_fog_gate` 直查 `_seal_layer.visible` | seal_mark_params_test.gd :45/:47/:49/:51(`u._seal_layer` 可见性与空判) | 卡面 §8 R4 判据列自身 prescribe「封印子件 `visible == false`」(fog_state/seal_on 均公开属性,唯一内部面=子件 visible);理由注记落测试件 :40-41 头注(「子件可见性无公开可观测面,卡面 R4 断言即 prescribe」) | 通过(注记位置备注:对照表行本体未带「受控例外」标签,卡面判据列即 prescribe+测试件注记承载) |
## 五、备案缺漏(零实体影响,不阻塞合并;处置建议随条)
1. **卡④ ui_input_probe case④b 断言换代的申报记录缺口**——旧纹理槽双分支断言(有盘纹理在槽/缺盘字形回退)随 tex_seal 机制退役被替换为 seal_on 落位断言。实体面合规:test-conventions §5.5 强制同生死摘除(留即假绿源)、新断言同入口同强度、执行绿(回执 03)。缺口在记录面:卡④ §8 削弱申报文本仍写「本批不删改任何既有断言」,与该换代字面冲突(§3 现状既列贴图退役,该换代为必然后果——卡面文本自身欠严密);实现报告亦未列此换代,申报记录只在提交信息 13d6bfbb。处置建议:本报告进实现报告收尾节(卡④ §13 义务)即为补记;后续同类批卡面削弱申报节应把「换代批旧验证约束同生死」列为预设条款。
2. **board_view.gd:77 悬空注释**——注释仍写「探针直读面零改动:读 `_palette.seal_tex`…」,所指成员已在本批删除,探针引用面亦已随批迁移,注释陈述已失实。卡②同族悬空注释修了 3 处并备案,卡④面这处未清未申报。零行为零断言影响(判据面=资产引用/常量别名/死槽,注释不在其列);grep 级判据不受污染(`TILE_SEAL_MARK|seal_tex` 命中仅此注释+battle_end_overlay 合法局部变量)。处置建议:并入下批最小工程改动或修复批顺手剥(一行注释)。
3. (观察,非缺漏)camp_esc_overlay.gd:8 注释提及 `MainEscFlow._on_return_to_menu` 旧私名——T1 底账已定性「历史名提及非私取面」,与缺漏 2 同族但已在案申报,不再列。
## 六、grep 取数附录(审计自跑取数,命令+结果)
以下均在 D:\code\g-plan2-iter52 执行(grep 含 .gd;另注处含 .tscn):
1. 六孤儿名零残留(.gd+.tscn,`\b名\b` 词边界):`has_effect_on`/`_bp_read_int`/`_find_token`/`has_open`/`set_feedback_state`/`stop_resolved` → 全部零命中。
2. 级联计数:`bp_read(` 剥定义=6;`_bp_strategy` 剥定义=1;`find_token`=curio_deck.gd:51 定义+curio_stop.gd:107/:229;`has_open_excluding_tags(` 剥定义=3;camp_scene_view `_apply_state(`=9 行(含定义);curio_stop `_resolved`=15;effect_engine `_triggers`=8;`.dispatch(`=80;curio_stop `_pending`=42 行。六文件+minesweeper_rules 逐函数引用粗扫(剥注释、引擎虚函数豁免)=零孤儿。
3. safe_remaining:`\.safe_remaining\(`(.gd+.tscn)=0;`_safe_remaining` 全仓=6(:101/:110/:56/:89/:93/:94)。
4. 卡③封装主张:六 B 文件 `root\._[a-zA-Z]`=0;standee_body `\bst\._|\bmo\._`=0;board_view `_hover_comp\._`=0;`UiKit\._[a-zA-Z]`(game/ 全 .gd,排除 ui_kit.gd)=0(ui_kit.gd 内亦 0);A1 三文件 `_map\._[a-zA-Z]`/`\bst\._[a-zA-Z]`=0;game/presentation 全目录 `\._[a-zA-Z]`(剔 self._ 与注释行)=0 行。
5. main.gd 计数:`^func [a-zA-Z]`=31+`static func build_adventure_params`=1,合计 32=基线键 32;ui_kit `^(static )?func [a-zA-Z]`=23=基线键 23。
6. 卡④贴图退役:`seal_mark.png`(game/ .gd)=恰 1(battle_end_overlay.gd:85);`TILE_SEAL_MARK|seal_tex`=3(battle_end_overlay.gd:85-87 局部变量合法在役+board_view.gd:77 注释);shader `Color8`=0;seal_mark 命中文件=7(cell_unit/board_view/seal_mark_layer/battle_end_overlay/cell_mark_overlay/run_all/params_test——前五为改名件与新件本体,后二为测试注册与守门件)。
7. 基线:`grep minesweeper_rules tools/gdstyle_baseline.txt`=0;基线 diff 仅 +2 键(main.gd=32、ui_kit=23);`python tools/gdstyle_gate.py`=「命中 7 条,基线内 7 条,基线外新违规 0 条,较登记值恶化 0 条/ok」。
8. diff 面:`git diff master...HEAD --name-only` 中 .tscn/.tres/data/ 与 settlement 测试件=零命中;53 文件合计;新增行 `randomize(|RandomNumberGenerator.new`=零命中。
## 七、闸回执核对(执行证据)
- 回执:game/tests/.gates/receipt.json——commit=fbf126d1(=分支最后一笔代码+产出物提交)、domain=code、scope=full、dirty_game=false、八闸(冒烟/系统/单元与集成/场景探针/渲染/色板/静态扫描/熵增)exit 全 0、all_green=true、changed_vs_baseline=[]、inherited_red=[]。
- 回执 commit 与分支尖(b4b1ee09=并入 master 的合并提交)差一笔;其间差异经逐文件实核全部为 master 侧内容(AGENTS.md/design 文档/闸名去编号批的 baseline.json 键名与 run_all.gd、system_test.gd、smoke_boot.gd 注释行/tools 脚本措辞)——**零断言面、零生产行为面差异**,回执绿态覆盖分支尖游戏码状态。回执内闸名沿用旧编号命名、合并带来的 baseline.json 已换代无编号键名——命名差属 master 侧闸名批时序,非回执内容问题。
- 中档不复跑最窄测试:本报告执行读数全部引回执;**合回后远端 CI 现查为终局执行证据**(tools/ci_check.sh 现查合回提交,判据=run 落定后的绿终局且跑闸步真跑过;零触发批不作绿证)。
@@ -1,174 +0,0 @@
# 需求卡片:EffectPort 蓄力层删键批
> 来源:待办清单「EffectPort biz_fact 键 charge_layers——无属主数据游离出领域实体的处置」(2026-11-02 登记,来源=审计发现;需求性工程条目,证据指认在条目实况)。**唯一事实源:该条目实况所引证据链+本卡「现状事实」节代码级考证(2026-11-04 全部实查复核)。**
> 裁决沿革:删除方向 2026-11-02 用户裁(总判据「机制数据一律长在所属封装实体的内部属性(表行字段)里,全局常量与无主账本清零」);2026-11-04 本会话全仓考证确认死代码(零内容消费面)后用户发令删除;2026-11-04 grilling 复核四裁(注释口径甲=只清 charge_layers 关联语义/改写族孤儿另立待办/req-card 落盘时点条款落技能/编排意向凑批)。
> 版本:v1.1(2026-11-04)
## 1. 目标与完成定义
把 `charge_layers`(玩家侧蓄力层)这条从未运转的死链整链退役:
- biz_fact 闭面五键收窄为四键(charge_layers/dig_streak/hp_ratio/rider_tier_bonus/rider_tier_crit → 后四键);
- 行动经济侧蓄力层账本、上限常量、转蓄分支、`charge_full` 事件发射全部删除;`finish_round_stop` 签名简化为纯 RAP 转存;
- 效果引擎两词表位(事件 `charge_full`、事实 `charge_layers`)退役;
- 代码注释里引用退役专长名(整备军备/铁壁整备/厚积薄发)与蓄力层的全部残留句清零。
**完成定义**:`game/` 下除 `swap_charge_layers` 计数器域(蓄力周转专长,在役另物)外,「蓄力层」概念零残留(grep 判据见 T1);两套件既有断言全绿+本卡新断言绿;`--code` 域全套闸绿;RAP 转存读数逐位零漂移。
## 2. 设计事实源
需求性工程条目(删死码,无设计线):设计事实源=**证据指认**——待办清单条目实况证据链(`reports/审计-全库架构审查-2026-10-29.md` §3.1 B 类第 2 行+`game/core/effect_port.gd:4`+`game/core/action_economy.gd:14/37/203`)+本卡第 3 节 2026-11-04 代码级复核(file:line 逐条实查)。
## 3. 现状事实(2026-11-04 代码级考证)
死链判据——入口死、出口假想、内容零注册三面同时成立:
1. **入口死**:账本唯一写点=「停手转蓄力」分支(`game/core/action_economy.gd:202-205`),触发条件=效果表有行注册 `grant_ap(mode:transfer)`(`game/core/settlement/grant_segment.gd:281` 经 `has_effect_on` 查询);全仓 `.tres` 零命中(feats.tres 三条 grant_ap 行 :46/:284/:719、treasure_items.tres 两条 :38/:150,全无 transfer)。transfer 形态无执行体——唯一读点就是这条存在性查询(`game/core/effect_engine.gd:203/461/467` 三处注释句为仅余痕迹)。
2. **出口假想**:消费面「厚积薄发/整备军备/铁壁按层缩放」只存在于 `game/core/damage_controller.gd:271/338/352/433` 四处注释;三名词=2026-10-08 退役旧专长(armory_prep/iron_wall/patient_burst,`design/content-archive/道具退役素材库.md:53-55`),GDD 与专长表零行。
3. **满层事件无订阅**:`charge_full` 发射(`action_economy.gd:205`)自注「现无订阅者」(:199);`game/core/effect_engine.gd:14` 事件词表位在册。
4. **transfer=true 分支零测试**:全仓仅 `game/tests/unit/core/treasure_effects_test.gd:132/138/144` 三处调用 `finish_round_stop(false, …)`(RAP 转存态)。
5. **RAP 转存=在役正路**:术语表.md:34-35(RAP 词条与停手/转存率词条)、行动经济.md:80-82(停手整节)、`game/tests/README.md:123`(「停手转存储备与轮内刷新」能力行)。
残留面全清单(13 处+词表注释 3 处,处置见 T 卡):
| # | 文件:行 | 残留 |
|---|---|---|
| 1 | `game/core/action_economy.gd:14` | `CHARGE_LAYER_CAP := 3` 常量 |
| 2 | `game/core/action_economy.gd:35-43` | 蓄力流注释块+`_charge_layers` 账本+`charge_layers` getter |
| 3 | `game/core/action_economy.gd:168` | 「转蓄力层替代 RAP 转存」注释句 |
| 4 | `game/core/action_economy.gd:196-205` | `finish_round_stop` transfer 分支+`charge_full` 发射 |
| 5 | `game/core/effect_port.gd:4-5` | 闭面五键声明 |
| 6 | `game/core/effect_engine.gd:14` | EVENTS 词表 `charge_full` 位 |
| 7 | `game/core/effect_engine.gd:59` | FACTS 词表 `charge_layers` 位 |
| 8 | `game/core/effect_engine.gd:203/461/467` | transfer 订阅查询与族分类注释句三处 |
| 9 | `game/core/battle_fx_host.gd:2/37` | 头注与 facts_inject 注释句 |
| 10 | `game/core/battle_fx_host.gd:92-98/219-223` | charge_layers 应答分支两处(读 `action_economy.charge_layers`) |
| 11 | `game/core/battle_orchestrator.gd:113` | 「charge_layers 归 fx_host 自答」注释句 |
| 12 | `game/core/damage_controller.gd:271/338/352/433` | 退役专长名注释四处 |
| 13 | `game/core/settlement/grant_segment.gd:262/279-282` | 「整备转蓄力」注释+`has_effect_on(…,"transfer")` 判定入参 |
| 14 | `game/core/settlement/combat_segment.gd:35-36` | 蓄力层注释 |
| 15 | `game/tests/unit/battle_settlement/effect_port_test.gd:16/57/103` | 注释把在役蓄力周转计数器误标为「整备军备蓄力层」、把合成对照行说成「现役铁壁」 |
## 4. 设计契约(🔴 违反即 L3 停机呈报)
1. 🔴 **RAP 转存路径逐位零变化**——`finish_round_stop` 的 RAP 分支、`transfer_pct` 通道、`rap_transfer_mult`(储备罐 125=1.25:1)读数逐位不动;`treasure_effects_test` 既有断言期望值零变化(仅调用签名适配,见第 8 节申报)。
2. 🔴 **蓄力周转专长域零触碰**——`feats.tres:1007-1056`(swap_charge_layers 计数器行)、`refresh_feats_test.gd` V8 全组、`game/tests/README.md:126` 能力行、GDD 战斗结算.md:278 与奇物.md:109 行,全部不动。
3. 🔴 **敌方蓄力域零触碰**——empower 增益技(status_effects.tres)、敌方节点级蓄力层(01-核心循环.md:79/88)、音频.md 蓄力拍等 GDD 行,全部不动;术语表**不新增**任何「蓄力」词条。
4. 🔴 **biz_fact 闭面只收窄不扩**——四键为终态,禁顺手加新键;未绑缺省与未知事实回落 null 语义不变(fail-fast 既有机制零回归)。
5. 🔴 **禁保留无效成员**——禁兼容别名、空 getter、词表空位、恒 false 分支、注释式「以后要用」存根;机检键与本卡契约互斥时停卡呈报,禁自造第三条路。
6. 🔴 **实现批禁写 `design/` 整个目录与根规则文件**——architecture.md 两处(:124/:146)走反哺点清单由文档批落文。
7. 🔴 **MC/模拟零跑**——本批无数值改动(死码删除零表值触面)。
8. 🔴 **车道铁律**——实现走独立 worktree,主区只作合并落点。
## 5. 范围边界
**做**:上表 15 处残留一次清完+两处测试适配+1 条新断言。
**不做**:
- `test_charge_layers_consumed_same_round` 函数**不改名**——它是 swap_charge_layers(蓄力周转)测试,函数名属该计数器域;且 README:126 能力行代表用例名锚定此名,实现批禁写 README。
- 蓄力周转、敌方蓄力、RAP/转存率任何面(契约 1–3)。
- 蓄力周转测试面牵连核对结论:`refresh_feats_test` V8 组全部经效果引擎计数器域运行,不触 `action_economy.charge_layers`(全仓 grep 已证)——零牵连,无需同批改动。
- **改写族内容孤儿机制**(grilling 2026-11-04 新发现,另立待办):damage_controller.gd 按序改写族通用机制的 spike/armor_rewrite/discount_shift/trade_* 子分支零内容注册(全仓唯一 modify_ticket 在役行=淬毒刃纹 clamp_bonus,feats.tres:854)+五拍注释退役名叙事层(矿工重锤/专注/猎弱本能)——不持数据键、非本卡对象,已立待办清单专条,处置方向归其自己的设计讨论。
**明示不收件的去向**:无——单链清退一次做完,无拆尾。
## 6. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/engineering/architecture/architecture.md` | :124(BattleFxHost 行「A3 action_economy(queue_ap_delta/charge_layers 读)」依赖句);:146(轴戊 EffectPort 句「闭面五键」与「facts 取值束 dig_streak/charge_layers/rider_tier_*」) | 实现批禁写——逐条登记进 `reports/iter<N>-反哺点-<日期>.md`,由用户裁决后归文档批改四键、删读依赖句 |
| `game/tests/README.md` | :88 能力行「效果发射端口单点」代表用例 `_test_biz_fact_face_closed` | 实现批禁写——计划函数名不变,批末收尾核对名实一致;若实现改名则回表(记反哺点) |
| 待办清单 | 本条目状态(写卡段→已写卡;实现完成→整条删除) | 状态推进由流水线各段承载,实现批不碰 |
| 术语表/GDD 各系统文档 | 零关联(敌方蓄力/蓄力周转/RAP 各行不受影响) | 无同步义务 |
## 7. 任务卡
**卡前文件结构图**(本批零新增文件;改动文件 9+测试 2,全部「非行为改动/行为改动」已标):
| 文件 | 职责与改动 | 行为改动 |
|---|---|---|
| `game/core/action_economy.gd` | 删常量/账本/getter/transfer 分支;`finish_round_stop` 签名简化;注释两处清 | 是(对照表行 2) |
| `game/core/settlement/grant_segment.gd` | 调用简化(删 has_effect_on 入参)+注释清 | 是(对照表行 2) |
| `game/core/effect_engine.gd` | EVENTS/FACTS 删位+注释三处清 | 是(对照表行 3) |
| `game/core/battle_fx_host.gd` | 应答分支两处删+头注/注释清 | 是(对照表行 1) |
| `game/core/effect_port.gd` | 闭面五键句改四键 | 否(注释) |
| `game/core/battle_orchestrator.gd` | 注释句清 | 否(注释) |
| `game/core/settlement/combat_segment.gd` | 注释清 | 否(注释) |
| `game/core/damage_controller.gd` | 退役专长名注释四处清 | 否(注释) |
| `game/tests/unit/battle_settlement/effect_port_test.gd` | 新断言+误标注释三处清 | 是(对照表行 1) |
| `game/tests/unit/core/treasure_effects_test.gd` | 三处调用签名适配(断言值零变化) | 否(适配,申报见第 8 节) |
### T0 契约收窄原子批(≈0.625 工作日)
> 九文件一次改完——`battle_fx_host.gd:98/223` 读 `action_economy.charge_layers`,拆卡必产生不可编译中间态,故同卡原子交付。
- [ ] `action_economy.gd`:删 :14 常量、:35-43 账本块(`_charge_layers`/getter/注释)、:168 句;`finish_round_stop` 改签名 `func finish_round_stop(transfer_pct: int = 100) -> void`,体只留 RAP 转存行 `_rap += _last_stop_ap * maxi(1, transfer_pct) / 100` 与 `_last_stop_ap = 0`;:196-199 注释改写为纯 RAP 转存口径(禁残留 transfer/charge_full 字样)
- [ ] `grant_segment.gd`::281-282 调用改 `oc.action_economy.finish_round_stop(rap_pct if rap_pct > 0 else 100)`;:262 注释删「整备转蓄力」句(保留 round_end 其余语义句)
- [ ] `effect_engine.gd`:EVENTS 删 `"charge_full"` 位(:14)、FACTS 删 `"charge_layers"` 位(:59);:203 句改「发射点缺省行为仲裁用——round_end 走 RAP 转存」、:461/:467 删「grant_ap(mode:transfer)」字样(族分类句同步改写)
- [ ] `battle_fx_host.gd`:删 :92-98 与 :219-223 两处 charge_layers 分支(`biz_fact`/补充事实面走既有「未知事实回落 null」末行);:2 头注「charge_layers 自答,余五事实转宿主」改「余事实转宿主」口径;:37 注释删 charge_layers 句
- [ ] `effect_port.gd`::4-5 闭面句改四键(dig_streak/hp_ratio/rider_tier_bonus/rider_tier_crit)
- [ ] `battle_orchestrator.gd:113`:注释删「charge_layers 归 fx_host 自答」句
- [ ] `combat_segment.gd:35-36`:注释改写(删蓄力层句,保留端口闭面语义句)
- [ ] `effect_port_test.gd`:V3 组 `_test_biz_fact_face_closed` 末尾增断言——经 `begin_battle` 真实装配链取宿主 `biz_fact("charge_layers")`,`Kit.check("V4 闭面收窄:charge_layers 键退役——宿主事实应答 null", orch.fx_host().biz_fact("charge_layers") == null)`(print 标签文案可代拍板)
- [ ] `treasure_effects_test.gd:132/138/144`:三处调用改单参 `finish_round_stop(100)`/`finish_round_stop(125)`/`finish_round_stop(125)`(断言期望值逐字不动)
- [ ] 孤立验证:`…console.exe --script res://tests/run_all.gd` 单测域全绿(重点 effect_port_test/treasure_effects_test/refresh_feats_test 三套件)
### T1 注释清尾与零残留核验(≈0.25 工作日)
- [ ] `damage_controller.gd` 四处只清 charge_layers 关联语义、改机制语言,五拍块其余退役名(矿工重锤/专注/猎弱本能——grilling Q1 甲裁)不动::271 第三拍句删「when charge_layers≥3 在 dispatch 判定——满层持续状态口径」分句与「厚积薄发」点名,spike_ready 机制行为描述保留;:338 删「整备军备」点名,句改「attack_bonus per 计数器层值」机制口径;:352 删「厚积薄发」点名,改「modify_ticket mode=spike 满层口径」;:433 删「铁壁整备」点名,shield 订阅面机制描述保留(禁残留整备军备/铁壁/厚积薄发/charge_layers 字样)
- [ ] `effect_port_test.gd:16/57/103`:三处误标注释改写——:16 改「蓄力周转计数器(feats.tres swap_charge_layers 行)」、:57/:103 删「整备军备/铁壁」字样改现状描述
- [ ] 零残留判据:`grep -rn "charge_layers\|charge_full\|CHARGE_LAYER\|蓄力层\|转蓄力\|厚积薄发\|铁壁\|整备军备" game/ --include="*.gd" --include="*.tres"` 除 `swap_charge_layers` 域(`refresh_feats_test.gd` 函数名 `test_charge_layers_consumed_same_round` 与 `feats.tres` swap 行)外零命中
- [ ] S13 核对:`action_economy.gd` 类变量数较登记值只降不升(删 `_charge_layers` 后预期 10→9);其余触面同判据
- [ ] 里程碑步出口:`tools/run_all_gates.sh --code` 全绿
### T2 产出物落位卡(≈0.125 工作日)
- [ ] `reports/iter<N>-实现报告-<日期>.md`:各卡状态+实现决定记录+测试削弱申报执行情况+实机目检总清单(本批无玩家可观测变化——登记「无实机目检项」并写明死码删除零提交面)
- [ ] `reports/iter<N>-反哺点-<日期>.md`:architecture.md :124/:146 两条逐条落点
- [ ] 待办清单条目整条删除归收尾段(实现批不碰)
## 8. 验证闸(改动—验收对照表)
| # | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| 1 | 事实应答面收窄——charge_layers 键退役 | `battle_fx_host.gd:92-98/219-223` 两分支删 | `effect_port_test.gd` V3 组新增「V4 闭面收窄:charge_layers 键退役——宿主事实应答 null」 | 接口(单元) | `BattleOrchestrator.begin_battle()` 真实装配链(端口接线后取宿主 biz_fact) | 宿主事实应答 null 化=本批特有提交面(键在→返 0,键退役→null) | 既有:效果发射端口单点 |
| 2 | 蓄力层账本与转蓄分支退役、签名简化 | `action_economy.gd:14/35-43/168/196-205`+`grant_segment.gd:262/281` | `treasure_effects_test.gd` 既有断言三处全绿(停手 1:1 与储备罐 1.25:1 两态读数零变) | 单元 | 真实停手路径 `request_stop()`→`round_end`→`finish_round_stop` | RAP 转存既有读数零漂移(行为零变化回归锚) | 既有:停手转存储备与轮内刷新(上限/AP 不重置/刷新图零清图奖励) |
| 3 | 事件/事实两词表位退役 | `effect_engine.gd:14/59` 删位 | 静态判据:T1 零残留 grep 词表零位+`--code` 域全套闸绿 | 静态+单元 | —(词表为常量面) | 静态判据+评审注记:词表位删除无独立运行期提交面(加载期 fail-fast 校验为既有机制,非本批新增) | 既有:效果发射端口单点 |
**测试方式两分法**:本批全部归调试接口验证(单元/接口断言);**无用户目检项**——死码删除零玩家可观测提交面(实现报告登记「无实机目检项」并写明缘由)。
**测试削弱申报**:`treasure_effects_test.gd:132/138/144` 三处调用实参 `(false, 100/125/125)` → `(100/125/125)`——签名适配,断言期望值与检查语义逐字零变化;无断言删除、无阈值放宽、无扫描面缩小。
**独立验收审计**:`reports/iter<N>-验收审计-<日期>.md`,由未参与实现的会话或子代理执行,未过不得合并(test-conventions §8.7)。
**回归措辞**:里程碑步(T1)出口跑一次 `--code` 域全套闸;卡内修复只做出红最小单元的最窄确认;新断言先行孤立验证再并入全套。
## 9. 异常分级
- **L1 自救**:注释改写笔误、grep 白名单笔误、print 标签文案。
- **L2 记录继续**:注释改写措辞超出删除语义的级微调(记录进实现报告「实现决定记录」)。
- **L3 停机呈报**:①删除时发现任何现役表行/效果规格/内容件引用 `charge_layers`/`charge_full`/transfer 订阅(与「零内容件」考证矛盾=上游考证缺陷,停卡退回写卡段);②S13 键上升;③全套闸红不可最小单元收敛;④机检键与本卡契约互斥(含 static_scan 计数文本冲突——禁改闸件豁免);⑤实测发现 `biz_fact("charge_layers")` 在四键终态下不返 null(宿主回落语义与考证不符)。
## 10. 代拍板白名单
1. 注释改写的具体措辞(保持原注释密度与风格,语义=删除后现状)。
2. V4 断言的 print 标签文案。
3. 删除后空行/排版微调。
4. `treasure_effects_test` 三处实参写法跟随文件内既有风格(字面 100/125)。
## 11. 待裁点
零待裁点——删除方向 2026-11-02 用户裁、2026-11-04 死代码确认后发令。开工门=本卡经 grilling 复核+用户裁决+迭代编排(编入迭代批次,注意单卡 ≈1.0 工作日,迭代估时总量 <5 工作日=冻结待凑批)。
## 12. 落位与可复用性预检
- **复用面**:零新增件——验收断言复用 `effect_port_test.gd` V3 闭面组既有结构(同函数内追加,不新增文件/套件);删码批无「不能复用既有件」问题。
- **唯一面**:删除不产生第二落点;grep 同名核查已证 `swap_charge_layers`(在役)与 `charge_layers`(退役)是两个标识符域,删除不触碰前者。
- **分层与交互面**:删除面全在 core/settlement 内部与两测试件;效果端口六 Callable 束契约(bind_port 组装期注入)不变;Core 层零 UI 依赖不因删除面新增绕行;无数值表触面。
## 13. 禁为机检文本保留无效成员
🔴 适用:禁为迎合机检消息文本(含派生计数、S13 键值)保留或新增无效成员/别名/空位;机检键与本卡契约互斥时实现段一律停卡呈报,不得自造第三条路。
## 14. 实现规范预算
零新增文件——三查不适用。存量触面预期:`action_economy.gd` 类变量数只降不升(删 `_charge_layers`,预期 10→9);`battle_fx_host.gd` 分支删除成员数不变;其余触面仅注释行。全部触面 S13 键较登记值只降不升(T1 核对步骤承载)。
## 15. 拆分边界纪律
本卡为删除类(非拆分/收敛类),无拆出单元。红线:禁为凑指标或摊薄审查把同链残留拆多批留尾——15 处残留同链一次清完(T0/T1 的切分是审查门粒度,非范围拆分;T0 九文件原子性由编译依赖承载,见 T0 卡头注)。
@@ -1,192 +0,0 @@
# 需求卡片 · L1 深度 3 改地精+熊地精混编(大地精数据行退役)
来源:待办清单「L1 深度 3 改地精+熊地精混编(大地精数据行退役)」(2026-11-04 登记,文档设计已闭合+已写卡)(唯一事实源:`体验验证清单.md` ⑱「投放内容」段第 (1,3) 行条目——行序、行值取定与静态骰和在该段钉死;机制合法性见 `design/gdd/systems/战斗循环/敌人系统.md` v1.7 核心规则「行集构成纪律」条;投放记录与读数义务见 `design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.3 混编注记段)
日期 2026-11-04 | 第 2 版(v1.1,2026-11-04 双审复核后改写)| 段位=写卡(第三段)| 开工门=用户发令 U0
## 一、目标与完成定义
把敌人表里未经过设计的大地精数据行(`hobgoblin`,坐标 `(1, battle, 3)`)退役,同一坐标改为「熊地精 + 地精」两行混编:一只前排熊地精、一到两只地精。
**覆盖面只说深度 3**:深度带寻址是「取首个 ≥ 深度的带」,L1 的战斗带键只有 0/1/2/3/6(`enemy.tres:10,35,60,84,109`),所以 band 3 只覆盖深度 3;深度 4、5 落 band 6(单行熊地精 1–2 只 hp30/ac4),**本批不碰也不该碰**。
完成定义(五条全中才算完):① 敌人表不再有 `hobgoblin` 数据行,`(1,battle,3)` 是两行混编且行序为「熊地精在前」;② 两行行值逐字段等于既有 `(1,battle,2)` 与 `(1,battle,0)` 行;③ 深度 4/5 的落带结果与改动前一致(仍落 `(1,battle,6)`);④ 全仓非历史面的 `hobgoblin` 残留清零(口径见 R10);⑤ 冒烟与单元闸全绿。
## 二、设计事实源
- **行序 + 行值 + 数量取定**:`体验验证清单.md` ⑱ 投放内容段第 (1,3) 条(「行值整行复用 (1,2) 熊地精(1 只 / hp22 / ac2)与 (1,0) 地精(1–2 只 / hp8 / ac0),零数值新增;静态最坏骰和 1+2=3;行序 = 熊地精在前」)
- **混编合法性三条纪律**:`design/gdd/systems/战斗循环/敌人系统.md` v1.7 核心规则「行集构成纪律」条
- **投放记录与读数义务**:`design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.3 混编注记段(只给机制与义务,不给行序)
- **Alpha 零读数**:`design/engineering/process-conventions.md` §3 第 5 条 Alpha 阶段口径段
- 待办清单条目:`待办清单.md`「L1 深度 3 改地精+熊地精混编(大地精数据行退役)」条
## 三、现状事实(代码级,开工自行复核)
| # | 事实 | 位置 |
|---|---|---|
| 1 | 大地精行在役:`(1,battle,3)`、2–3 只、hp14、池 attack6/charge2/heavy2、light、ac2 | `game/data/tables/enemy.tres:82-105`(行由 `:81` 的 `}, {` 打开、`:106` 的 `}, {` 收尾——删改必须连分隔符一起算) |
| 2 | 前排取用行:熊地精 `(1,battle,2)` 1 只定值(无 `unit_count_max`)、hp22、ac2、池 attack6/charge2/heavy2 | `game/data/tables/enemy.tres:58-80` |
| 3 | 后排取用行:地精 `(1,battle,0)` 1–2 只、hp8、ac0、池 attack9/lunge1/desperate_guard1 | `game/data/tables/enemy.tres:7-31` |
| 4 | 深层熊地精 `(1,battle,6)` 1–2 只、hp30、ac4——深度 4/5 落这里,本批不取用 | `game/data/tables/enemy.tres:107-131` |
| 5 | 行集取首个 ≥ 深度的带 | `game/data/schemas/enemy_table.gd:196-204`;`game/core/config_db_resolver.gd:57-67` |
| 6 | 行集返回序 = 表文件行序 | `game/core/config_db_resolver.gd:92-98` |
| 7 | 默认单体目标取生成序最前;开战叙述取行集首行 | `game/core/unit_container.gd:358-363`;`game/core/battle_narrator.gd:69-78` |
| 8 | 敌人表共 28 行,键序逐行钉死;文件头注释也写「20 行带键行序/hobgoblin 留任」 | `game/tests/unit/data_config/table_structure_guard_test.gd:4`;键序断言 `:212-233`;留任断言 `:234-239` |
| 9 | 全深度 × 12 种子 spawn 扫描**只按行集首行判定数量区间**——单行成立,双行必红 | `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd:295-317`(关键 `:310-317`:`resolve_rowset(...)[0]` 取首行后比较 `[unit_count, unit_count_max]`) |
| 10 | 池模板断言表逐键写死,含 `1_battle_3_hobgoblin`;同函数断言文案写「二十八行九种」 | `round_flow_skill_pool_test.gd:567-578`、`:611`(函数 `_smoke_skill_pool_data`) |
| 11 | 同文件另两处 hobgoblin 前提:注释 `:1108`「L1 depth 3(hobgoblin 行集 2-3 只)」、`:711`/`:722`「D3 大地精,多实例同种」「敌 hp 低(表值 6)」(后者已随表值失真) | `round_flow_skill_pool_test.gd:711,722,1108` |
| 12 | `_smoke_enemy_buff_targets_self` 是**种子搜索型**用例:搜 1..N 号种子找「恰一次 charge 施放」,混编后只有熊地精带 charge | `round_flow_skill_pool_test.gd:1096-1136` |
| 13 | 混编注入段还原后硬编码「表回 28 行」 | `game/tests/unit/core/level_shop_economy_test.gd:727` |
| 14 | 混编定点断言先例(L2)写法可照抄 | `level_shop_economy_test.gd:623-636` |
| 15 | 个体池/个体 AC 对照用例以 depth 3 为「≥2 敌」夹具 | `game/tests/unit/battle_settlement/damage_controller_test.gd:412-440`;`game/tests/unit/presentation/battle_narrator_test.gd:108-121` |
| 16 | 行序/落带夹具用 hobgoblin 作合成行;该夹具**不调 `validate()`**,只注入 resolver | `game/tests/unit/core/config_db_resolver_test.gd:14-28`、`:40-46`、`:56-78` |
| 17 | 行集纪律用例用 hobgoblin 作「不相邻」样本 | `game/tests/unit/data_config/config_db_test.gd:220-230`(`_test_rowset_discipline`) |
| 18 | 表注四处含退役键:`886-891`(2026-09-24 实体名修正批整段)、`906-918`(2026-10-07 混编首批投放批)、`920`(N1 修批括注「改名大地精」)、`929`(hobgoblin 行为缺口行) | `game/data/tables/enemy.tres:886-891,906-918,920,929` |
| 19 | 静态闸按**行号**豁免 `enemy.tres` 三处,其中 `FNR==891` 落在上述 886-891 段内——删段后该豁免指向别的行,必须同步清 | `game/tests/static_scan.sh:145`、豁免执行点 `:194,218,221-222` |
| 20 | 术语审计注释里列了 hobgoblin,但该文件只扫 `.md`/`.yaml`、且跳过 `#;` 注释行,改动零行为影响 | `tools/doc_term_audit.py:144`(匹配与扫描面 `:146-147,166,214-219`) |
## 四、设计契约(🔴 违反=停机呈报)
1. 🔴 **行集构成纪律三条**:行集内 `enemy_id` 唯一;同带键多行必须文件内相邻且行序=声明序=生成序;行集实例总数 ≤ 4、单行数量域 [1,3]。本批静态最坏骰和 = 熊地精 1 + 地精 2 = 3。
2. 🔴 **行值零新增**:两行行值必须整行复制第 2、3 条现状事实里的行,不得改 hp/atk/池权重/ac;改了就是设计变更,停卡退回写卡段。
3. 🔴 **行序固定**:熊地精行在前、地精行在后(依据 §二 第一条)。行序影响默认单体目标与开战叙述首行,不属实现面可调项。
4. 🔴 **不碰深度 4/5**:`(1,battle,6)` 行一字段都不许动;目标句里没有「深度 3–5」这回事。
5. 🔴 **Alpha 零读数**:本批不跑 MC、不采改前改后读数;实现报告注明「未取证」,读数义务归数值统一修正批。
6. 🔴 **禁碰敌种数据面与技能表**:敌种名录表已随工程批退役(`敌人系统.md` 不再维护抄本),`skills.tres` 零改动。
7. 🔴 **禁改美术侧键集**:`tools/standee_asset_check.py` 与 `tools/path_check.py` 的 `ENEMY_KEYS` 与本批无关,禁顺手改。
## 五、范围边界
**做**:敌人表删一行加两行+表注四处;七个测试文件换锚与补断言;`tools/doc_term_audit.py` 注释;`static_scan.sh` 一条失效豁免清理。
**不做**:任何数值调整;敌种表/技能表;深度 4/5 的带位;立绘与美术面;Boss 多行第二批;读数与模拟;`enemy.tres:920` 的 N1 修批括注(见 §十一 T1 第 6 步说明)。
**不收件去向**:数值带位移读数 → 数值统一修正批;实机混编目检 → `体验验证清单.md` ⑱(只登记,不阻塞合并)。
## 六、关联文档同步面(实现批禁写文档)
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.3 | 混编注记段已写 (1,3) 投放记录 | 零动作(文档批已落文,commit 4aaa154e;行序表述由本批前置修复提交更正) |
| `design/gdd/systems/战斗循环/敌人系统.md` v1.7 | 缺口登记已删;敌种名录表已随工程批退役,行数据逐行读表 | 零动作(同上) |
| `体验验证清单.md` ⑱ | L1 节点 3 目检三项 + 读数义务 | 零动作;实现报告抄录目检项 |
| `design/gdd/08-Alpha版本标准.md` v1.26 | 混编行集状态行已补 (1,3) | 零动作 |
| `game/tests/README.md` 能力表 | 本批不改任何用例函数名,只改函数体内断言与夹具 | 零动作;若实现期必须改名,停卡退回写卡段(实现批禁写该文件) |
## 七、文件结构图
| 路径 | 职责 | 改动类型 | 对照表行 |
|---|---|---|---|
| `game/data/tables/enemy.tres` | (1,3) 一行换两行;表注四处处置 | 行为改动 | R1–R4、R9 |
| `game/tests/unit/data_config/table_structure_guard_test.gd` | 29 行键序、混编构成断言、骰和与行值复用断言、零残留断言、文件头注 | 行为改动(测试面) | R1–R5、R10 |
| `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | 全域扫描口径改逐行求和;池模板两键;四处注释与文案 | 行为改动(测试面) | R6、R7、R10 |
| `game/tests/unit/core/level_shop_economy_test.gd` | 混编注入段还原行数 28→29 | 行为改动(测试面) | R8 |
| `game/tests/unit/core/config_db_resolver_test.gd` | 合成行换 `giant_spider`(不换 bugbear,避免与 band 0 同名) | 非行为改动(夹具) | R7 |
| `game/tests/unit/data_config/config_db_test.gd` | 「不相邻」样本换 `giant_spider` | 非行为改动(夹具) | R7 |
| `game/tests/unit/battle_settlement/damage_controller_test.gd` | depth 3 夹具注释改述 | 非行为改动(注释) | — |
| `game/tests/unit/presentation/battle_narrator_test.gd` | 同上 | 非行为改动(注释) | — |
| `game/tests/static_scan.sh` | 删失效的 `FNR==891` 豁免条目(对象已随表注删除) | 非行为改动(闸件豁免维护) | — |
| `tools/doc_term_audit.py` | 注释里的敌种枚举 | 非行为改动(注释) | — |
无新增文件、类、公开方法。
## 八、落位与可复用性预检
- **复用面**:零新增文件/函数/数据件。两条新表行沿用既有字段集,整行复制既有行,不引入新字段或新默认值。
- **唯一面**:混编构成的事实只在两处——表行序与钉住它的断言;行值不在测试里复写(R4 比对两行相等,不写 22/8/权重字面量)。全域扫描的数量判据改为「逐行求和」,与 `unit_container.gd:86-92` 的 spawn 守卫同口径,不另立第二套口径。
- **分层与交互面**:零新增调用路径。运行时仍走 `ConfigDb` → `EnemyTable.resolve_rowset()` → `ConfigDbResolver.resolve_enemy_rowset()` → `UnitContainer.spawn()`(`game/core/unit_container.gd:46`),Core 零 UI、数值只读表、随机只在结算层(`game/core/battle_orchestrator.gd:293-324`)三条红线不变。
## 九、实现规范预算
零新增文件与新增成员,`gdstyle` 阈值不适用;本批触碰的测试文件不新增成员变量与公开方法。存量触面一查:`static_scan.sh` 只删一条豁免、不改扫描规则;S13 键在三处测试文件内均只降不升(只改断言文本,不增函数)。
## 十、拆分边界纪律
本卡不是拆分/收敛/重构类卡,条款不适用。
## 十一、任务卡
### T1 · 敌人表换行与表注(估时 0.5 日)
取用:无(首卡)。产出:`(1,battle,3)` 两行 + 清理后的表注,供 R1–R5、R9 读取。
- [ ] 把 `enemy.tres:81-106` 整段(`}, {` + 大地精字段块 + `}, {`)替换为:`}, {` + 熊地精字段块 + `}, {` + 地精字段块 + `}, {`
- [ ] 熊地精块字段:`level_index: 1`/`row_kind: "battle"`/`depth_band: 3`/`enemy_id: "bugbear"`/`display_name: "熊地精"`/`unit_count: 1`/(不写 `unit_count_max`)/`hp: 22`/`atk: 1`/`atk_min: 0`/`atk_max: 2`/`pool: [attack 6, charge 2, heavy 2]`/`attack_type: "normal"`/`armor_type: "light"`/`armor_class: 2`
- [ ] 地精块字段:`depth_band: 3`/`enemy_id: "goblin"`/`display_name: "地精"`/`unit_count: 1`/`unit_count_max: 2`/`hp: 8`/`atk: 1`/`atk_min: 0`/`atk_max: 2`/`pool: [attack 9, lunge 1, desperate_guard 1]`/`attack_type: "normal"`/`armor_type: "light"`/`armor_class: 0`
- [ ] 删表注段「实体名修正批(2026-09-24…)」整段(按文本锚点定位,不按行号)——该段全篇在讲大地精改名沿革,内容 git log 可考
- [ ] 删表注句「hobgoblin 行为缺口行:无立绘、不在敌种表——留任在役,补齐三件套…」整句
- [ ] 在下一行追加新注(`;` 顶格):「; (1,3) 大地精行 2026-11-04 用户裁退役,改地精+熊地精混编(行序熊地精在前、行值整行复用 (1,2)/(1,0)、静态骰和 3);沿革见 git 提交史」
- [ ] 在「混编遭遇首批投放批(2026-10-07…)」段尾追加一行(不改原文):「; 2026-11-04 追加第二行:(1,3) 地精+熊地精(行序熊地精在前)」
- [ ] 保留 `:920` 的 N1 修批括注原文(属带日期的历史裁决记录,且只含中文「大地精」、不含 `hobgoblin` 字面;R10 口径不覆盖它)
- [ ] 回读:`grep -n "hobgoblin" game/data/tables/enemy.tres` 输出为空
### T2 · 测试面换锚与补断言(估时 1.5 日)
取用:T1 的两行。产出:R1–R10 全绿。
- [ ] `table_structure_guard_test.gd:212-233`:`expect_keys` 里 `"1|battle|3|hobgoblin"` 换成相邻两键 `"1|battle|3|bugbear", "1|battle|3|goblin"`;行数 28→29(断言与文案同步)
- [ ] `table_structure_guard_test.gd:234-239`:删「hobgoblin 留任随迁」断言块,替换为混编构成断言(R1–R4)
- [ ] `table_structure_guard_test.gd:4`:文件头注「enemy 敌人表(20 行带键行序/hobgoblin 留任/三 Boss 行)」改为「(29 行带键行序/混编行集/三 Boss 行)」
- [ ] `round_flow_skill_pool_test.gd:310-317`:把「`resolve_rowset(...)[0]` 取首行 + 比较 `[unit_count, unit_count_max]`」改为**逐行求和**:`lo = Σ unit_count`、`hi = Σ unit_count_max`,判 `n ∈ [lo, hi]` 且 `n ≥ 1`(与 `unit_container.gd:86-92` 守卫同口径)
- [ ] `round_flow_skill_pool_test.gd:567-578`:`"1_battle_3_hobgoblin": {"attack": 6, "charge": 2, "heavy": 2}` 换成 `"1_battle_3_bugbear": {"attack": 6, "charge": 2, "heavy": 2}` + `"1_battle_3_goblin": {"attack": 9, "lunge": 1, "desperate_guard": 1}`(顺序按表行序)
- [ ] `round_flow_skill_pool_test.gd:611`:断言文案「二十八行九种池模板」改「二十九行十种池模板」,其余描述不动
- [ ] `round_flow_skill_pool_test.gd:711,722,1108`:注释改述为「depth 3 = 混编行集(熊地精 1 + 地精 1–2)」,删掉「多实例同种」「表值 6」两处已失真描述
- [ ] `level_shop_economy_test.gd:727`:断言 28→29,文案「基线 20 行+覆盖 8 行」改「基线 21 行+覆盖 8 行」
- [ ] `config_db_resolver_test.gd:40-46`:合成行 `"hobgoblin"` 换 `"giant_spider"`;`:56-78` 三条断言的期望串同步(不改成 `bugbear`——该合成表 band 0 已有 bugbear,同名会削弱「按敌种可辨」的可读性)
- [ ] `config_db_test.gd:220-230`:`_test_rowset_discipline()` 的「不相邻」样本 `"hobgoblin"` 换 `"giant_spider"`
- [ ] `damage_controller_test.gd:413` 与 `battle_narrator_test.gd:114`:注释改「depth 3 = 混编行集(熊地精 1 + 地精 1–2,最少 2 只)」,断言零改动
- [ ] `static_scan.sh:145`:删掉豁免条目里的 `enemy.tres:891`(该行已随表注删除;留着会误放别的行)
- [ ] `tools/doc_term_audit.py:144`:注释里的敌种枚举去掉 hobgoblin
- [ ] 回读:`grep -rn "hobgoblin" game/data game/core game/presentation game/probe game/sim game/tests tools --include=*.gd --include=*.tres --include=*.py --include=*.sh` 输出为空(不含 `game/override.cfg`,该文件是 worktree 派生的 gitignored 文件,路径里带本区目录名)
- [ ] 跑 `_smoke_enemy_buff_targets_self`:种子搜索面随池构成变化,若 1..N 无命中 → 按 §十三 L3 呈报,禁放宽判据
### T3 · 产出物落位(估时 0.5 日)
取用:T2 全绿。产出:两份报告。
- [ ] 写 `reports/iter<N>-实现报告-<日期>.md`:各卡状态;实机目检总清单(抄 `体验验证清单.md` ⑱ 的 L1 节点 3 三项);**实际对照表**(R1–R10 逐行写测试文件:行+结果,`process-conventions` §3 第 14 条);遗留读数义务(Alpha 零读数、归数值统一修正批);实现决定记录
- [ ] 写 `reports/iter<N>-反哺点-<日期>.md`:按 §六 逐条落点(预计零条,也写「零条」)
- [ ] 核对 `game/tests/README.md` 能力表:用例函数名未变则零动作;若实现期不得不改名,停卡退回写卡段
估时合计 2.5 个工作日。
## 十二、验证闸(改动—验收对照表)
| 行 | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| R1 | 行数与键序 | `enemy.tres:81-106` 一行换两行 | `table_structure_guard_test.gd:_smoke_enemy_bands`「敌人表 29 行且键序 = 覆盖表序((1,3) 两行相邻、熊地精在前)」〔L1混编 v1〕 | 单元 | `ConfigDb.load_tables()` → `EnemyTable.rows` | 遍历 rows 拼「关卡、行类、深度带、敌种」四段串逐行比对期望串 | 既有:表结构守卫:域校验/行序键/跨字段互锁/配额锚 |
| R2 | 混编构成与行序 | 同上 | 同函数「(1,3) 行集恰两行、enemy_id 序列 == [bugbear, goblin]、首行即默认目标」〔L1混编 v2〕 | 单元 | `EnemyTable.resolve_rowset(1,3,"battle")` → `ConfigDbResolver.resolve_enemy_rowset(1,3,"battle")` | 返回数组长度与逐项 enemy_id 序列 | 既有:行集寻址、行序保序与难度乘数 clamp |
| R3 | 静态最坏骰和 | 同上 | 同函数「(1,3) Σ(unit_count_max,固定行缺省 unit_count) == 3」〔L1混编 v3〕 | 单元 | 同上 | 求和值与 4 比较(等于 3,不用 ≤) | 既有:表结构守卫:域校验/行序键/跨字段互锁/配额锚 |
| R4 | 行值整行复用 | 同上 | 同函数「(1,3) 两行逐字段 == (1,2) 与 (1,0) 行(hp/atk 区间/pool/ac/armor_type/attack_type)」〔L1混编 v4〕 | 单元 | `EnemyTable.rows` | 两行字段逐项比对,不写死数值字面量 | 既有:表结构守卫:域校验/行序键/跨字段互锁/配额锚 |
| R5 | 零残留(数据与代码面) | 表与七文件 | 同函数「表内 enemy_id 集合不含 hobgoblin」〔L1混编 v5〕+ T2 回读命令 | 单元 | `EnemyTable.rows` 遍历 | 集合不含该字符串 | 既有:表结构守卫:域校验/行序键/跨字段互锁/配额锚 |
| R6 | 混编下 spawn 数量全域内 | `round_flow_skill_pool_test.gd:310-317` 口径改造 | `round_flow_skill_pool_test.gd:_smoke_encounter_roll`(全深度×种子扫描段)「全深度 × 12 种子 spawn 数量 ∈ [Σunit_count, Σunit_count_max] 且 ≥1」 | 单元 | `BattleOrchestrator.begin_battle({"level_index":1,"node_depth":d})` → `presentation_snapshot().enemies.size()` | 逐场数量与逐行求和区间比较 | 既有:行集寻址、行序保序与难度乘数 clamp |
| R7 | 双池各自独立 | 表两行 | `round_flow_skill_pool_test.gd:_smoke_skill_pool_data`「(1,3) 两行池模板 == 熊地精池 attack6/charge2/heavy2 与地精池 attack9/lunge1/desperate_guard1」 | 单元 | 同上 | 断言表的键与权重逐项 | 既有:技能池数据面与回放独立 |
| R8 | 注入段还原行数 | `level_shop_economy_test.gd:727` | `level_shop_economy_test.gd:_smoke_level_graph`「混编断言段注入行全量还原(表回 29 行)」 | 单元 | 同套件既有注入/还原流程 | `rows.size()` 与期望值比较 | 既有:关卡表消费侧校验与关卡推进 |
| R9 | 深度 4/5 落带不变 | 表(不应改变) | `table_structure_guard_test.gd` 补「(1,4) 与 (1,5) 的 battle 行集 == 单行 bugbear(band 6)」〔L1混编 v6〕 | 单元 | `EnemyTable.resolve_rowset(1,4/5,"battle")` | 返回数组长度与 enemy_id 序列、band 归属 | 既有:行集寻址、行序保序与难度乘数 clamp |
| R10 | 深度 3 最少 2 敌(回归护栏) | 两处夹具注释 | `damage_controller_test.gd:_test_pool_consumption_per_unit` 与 `battle_narrator_test.gd:_test_snapshot_effects_per_unit` 在混编行集下仍绿 | 单元 | `UnitContainer.spawn({"level_index":1,"node_depth":3})` | 生成后 `all_enemies().size() ≥ 2` | 既有:敌方增益自体落点与乘区池按个体 |
**测试削弱申报**:①`table_structure_guard_test.gd:234-239` 删除「hobgoblin 留任随迁」断言——钉的是已退役事实;②`round_flow_skill_pool_test.gd:310-317` 由「首行区间」改为「逐行求和区间」——原口径在双行行集下必红,新口径与 spawn 守卫同口径,不是放宽;③`round_flow_skill_pool_test.gd:611` 只改文案不改判据;④`static_scan.sh` 删一条针对已不存在行的豁免。除此外不删断言、不放宽阈值、不缩小扫描面。
**判据绑定面说明**:全部判据绑在表数据与解析返回序列上(数据改动的可观测提交面);R1–R4 的期望值从同表既有行推导,不写死字面量;不做注入破坏或回退取证(`process-conventions` §3 第 14 条口径)。
**独立验收审计**:入口=未参与本卡实现的会话或子代理,按上表逐行复核(判据是否绑在被改动的表数据与解析序列上、真实入口是否绕过改动点);报告文件 `reports/iter<N>-验收审计-<日期>.md`;未过不得合并。
**闸口径**:本批改动含 `game/` 下行为载体,按域选档由闸脚本判定(卡内不列闸件名单)。里程碑出口跑一次全套;波内修复只做出红最小单元的最窄确认。
## 十三、异常分级
- L1 自救:缩进/格式/语法类错误,直接改到绿。
- L2 记录继续:断言写法等价改写(如求和改用循环)、注释措辞微调,记入实现报告「实现决定记录」。
- L3 停机呈报:① spawn 抛行集越域警告;② 需要改数值才能过闸;③ 出现卡外第九个引用点;④ `_smoke_enemy_buff_targets_self` 种子搜索落空;⑤ 需要改 `game/tests/README.md` 或任何 `design/` 文件;⑥ 机检预算互斥(本批零新增件,出现即判上游缺陷,停卡退回写卡段)。
## 十四、代拍板白名单
1. 断言函数内的循环写法、局部变量命名、断言文案措辞。
2. 注释改述的字面(不改语义)。
3. `expect_keys` 与 `expect_pools` 数组的换行排版。
4. 新表注的措辞(须含日期 2026-11-04 与「用户裁」字样)。
超清单必呈报。
## 十五、待裁点
**零待裁点**,开工门=用户发令 U0。已裁记录:① 数量、行值、行序(用户 2026-11-04 委托取定,落在 `体验验证清单.md` ⑱);② L1 首见混编可接受(用户 2026-11-04 判「无阻碍」);③ Alpha 零读数(用户 2026-11-04 裁,已落 `process-conventions` §3 第 5 条);④ 表注 886-891 整段删除(用户 2026-11-04 指令「文档与代码中的大地精描述要去掉」,与静态闸「历史原文不改」惯例冲突时以用户指令为准,代价=一条命名沿革注进 git log);⑤ 深度 4/5 不纳入本批(本次双审后订正目标句,不带设计增量)。
@@ -1,179 +0,0 @@
# 需求卡片:minesweeper_rules 公开面还债批
> 来源:待办清单「minesweeper_rules 公开面还债——S13 超标键撤销后的清偿」(2026-11-04 登记,来源=批次移交,优先级=P0;需求性工程条目,证据指认在条目实况)。**唯一事实源:该条目实况证据链+本卡第 3 节 2026-11-04 代码级考证(21 公开方法全量调用方盘点,逐方法实查)。**
> 裁决沿革:登记方向=「settle_batch/fx_reveal 族收敛或搬迁」(批次移交在册);2026-11-04 本会话全量盘点后按证据收窄——两族受架构在册边界与职责轴保护不可作收敛点(§3.2),收敛点唯一化=`safe_remaining`(无生产消费方公开面收回,§3.3),待用户批卡背书。
> 验收档:中
> 版本:v1.0(2026-11-04)
## 1. 目标与完成定义
把 S13 红键清偿为绿:
- `game/core/minesweeper_rules.gd` 公开方法 21→20:`safe_remaining` 公开→私有 `_safe_remaining`(函数体逐字不动);
- gdstyle 闸(S13=`quality/max-public-methods`,默认上限 20)该文件归绿,**零新增基线键**;
- 游戏行为零变化:私有化=改名,无任何运行期可观测面变化;4 处测试直连点改锚私有面,断言消息与期望值逐字不变。
**完成定义**:gdstyle 单件读数公开方法 20≤20 且零红键;`minesweeper_rules_test` 既有断言全数通过;全仓 `\.safe_remaining\(` 调用形态零残留;`--code` 域全套闸绿。
## 2. 设计事实源
需求性工程条目(重构/还债,无设计线):设计事实源=**证据指认**——待办清单条目实况证据链(`tools/gdstyle_baseline.txt` 该文件零在册键=S13 键 2026-11-04 用户裁撤销后为活红;git 提交 7f512aa8 归位两法在案)+本卡第 3 节 2026-11-04 代码级复核(file:line 逐条实查)。
## 3. 现状事实(2026-11-04 代码级考证)
### 3.1 红键本体
- gdstyle S13 规则=`quality/max-public-methods`,默认上限 20(`tools/gdstyle.toml` 头注:阈值取 gdstyle 默认值)。
- `game/core/minesweeper_rules.gd` 非下划线公开方法实数 21(`_init` 豁免,与 S9 R3 同口径)::52/:58/:70/:81/:85/:89/:93/:97/:101/:109/:116/:129/:134/:146/:175/:180/:239/:379/:397/:487/:554。
- `tools/gdstyle_baseline.txt` 该文件零在册键(grep 零命中)——S13 键经用户裁撤销后,红为 NEW 形态活红。
### 3.2 登记方向考证——settle_batch/fx_reveal 两族为何不可作收敛点
1. **settle_batch**(:239)=架构在册**唯一提交入口**(architecture.md:105「A2 行」);生产调用方=组合根 `main.gd:574`/:603 两处。搬迁=改架构在册 API 边界;收敛(合并/缩签名)=改唯一提交口契约,零职责收益。
2. **fx_reveal**(:379)=**棋盘状态本体写口**:函数体改已开集 `_revealed`、发 `cell_revealed`(:380-392);消费方=core 件 `battle_fx_host.gd:185`、`reward_grant.gd:176`。按职责轴(code-conventions §1.1 拆分判据①)是本类本职——搬出=状态暴露或连锁闭包复制(违唯一面)。
### 3.3 21 公开方法全量调用方盘点(2026-11-04)
排查语料=`game/` 全部 .gd 与 .tscn 非注释行;下表「生产调用方实证」=调用形态实查(接收者为 minesweeper 实例)。
| # | 方法(定义行) | 生产调用方实证 | 测量/测试面 | 处置 |
|---|---|---|---|---|
| 1 | current_board(:52) | main.gd:375/:582、board_resolvers.gd:30/:44、battle_orchestrator.gd:701 | sim:7 probe:16 test:52 | 保留 |
| 2 | harmful_variants(:58) | grant_segment.gd:110 | — | 保留 |
| 3 | harmful_adjacent(:70) | grant_segment.gd:359 | — | 保留 |
| 4 | reveal_record(:81) | board_view.gd:494/:564 | sim:1 probe:1 test:1 | 保留 |
| 5 | hero_pos(:85) | main.gd:588 | sim:6 probe:19 test:45 | 保留 |
| 6 | is_revealed(:89) | board_view.gd:303/:475/:490/:535、battle_fx_host.gd:177 | sim:10 probe:23 test:22 | 保留 |
| 7 | has_seal(:93) | reward_grant.gd:174 | sim:7 probe:11 test:7 | 保留 |
| 8 | revealed_cells(:97) | battle_orchestrator.gd:507/:700 | sim:3 probe:1 test:16 | 保留 |
| 9 | **safe_remaining(:101)** | **生产外部零调用**——唯一生产调用=同类 clear_map_cleared(:110) | test:4 | **收敛点:公开→私有** |
| 10 | clear_map_cleared(:109) | main.gd:582 | test:1 | 保留 |
| 11 | remove_mines_in(:116) | reward_grant.gd:187、grant_segment.gd:400 | — | 保留 |
| 12 | is_removed(:129) | board_view.gd:303/:537 | test:3 | 保留 |
| 13 | has_unrevealed(:134) | treasure_interact_controller.gd:123 | test:1 | 保留 |
| 14 | install_board(:146) | board_installer.gd:50 | test:6 | 保留 |
| 15 | seal_count(:175) | battle_orchestrator.gd:508/:701 | test:9 | 保留 |
| 16 | retire_board(:180) | battle_orchestrator.gd:534、battle_refresh_flow.gd:69 | — | 保留 |
| 17 | settle_batch(:239) | main.gd:574/:603 | sim:3 probe:8 test:134 | 保留(§3.2-1) |
| 18 | fx_reveal(:379) | battle_fx_host.gd:185、reward_grant.gd:176 | test:13 | 保留(§3.2-2) |
| 19 | preview_reveal(:397) | 生产零调用——**架构在册 sim 信息面出口**(architecture.md:105;sim/auto_player.gd:155 消费) | test:6 | 保留(改它必破坏 MC 自动玩家读数连续性) |
| 20 | compute_move_path(:487) | board_hover.gd:122+同类 _do_move(:479) | sim:3 probe:1 test:5 | 保留 |
| 21 | mine_total(:554) | battle_orchestrator.gd:384 | test:2 | 保留 |
**结论**:20 个公开方法有生产调用方(全数保留);`preview_reveal` 生产零调用但为架构在册 sim 出口(保留);`safe_remaining` 生产外部零调用(唯一外部消费面=测试直连)——公开面收回的唯一合法收敛点。
### 3.4 safe_remaining 本体
- 函数体(:101-106):数未揭示安全格(遍历 `_board.safe_cells()` 对 `_revealed` 求余量)。
- 消费面:同类 `clear_map_cleared`(:110 `return safe_remaining() == 0`)+测试直连 4 组断言 5 处调用表达式(`minesweeper_rules_test.gd` :56/:89/:93 两处/:94——精确余量断言,无公开可观测面承载精确计数:`clear_map_cleared` 仅 bool)。
- 在案观察(不收件):`_classify`(:276-280)有一段内联余量计数,与 `safe_remaining` 形态重复——合并无职责依据,不动。
## 4. 设计契约(🔴 违反即 L3 停机呈报)
1. 🔴 **游戏行为零变化**——私有化=改名,函数体逐字不动;零 RNG/信号/存档/表值触面。
2. 🔴 **收敛动机纪律**——本批收敛对象=「无生产消费方的公开面」收回(职责依据,与死码清退同族);禁以阈值数字为动机合并/收拢/搬迁任何有消费方的公开面(code-conventions §1.1 拆分判据③);禁动 settle_batch/fx_reveal/preview_reveal(§3.2/§3.3 在册理由)。
3. 🔴 **禁保留无效成员**——私有化后禁留公开别名/转发壳/空 getter(code-conventions §1.1 拆分判据⑤)。
4. 🔴 **测试断言零削弱**——4 组断言改锚后检查语义与期望值逐字不变;改锚=内部面直查**受控例外**(test-conventions §8.2:精确余量计数无公开可观测面可钉),对照表该行注明理由。
5. 🔴 **MC/模拟零跑**——无数值改动;sim/auto_player 零触碰。
6. 🔴 **实现批禁写 `design/` 整个目录与根规则文件**——architecture.md:105 走反哺点清单由文档批落文。
7. 🔴 **车道铁律**——实现走独立 worktree,主区只作合并落点。
## 5. 范围边界
**做**:`safe_remaining`→`_safe_remaining` 改名(1 处定义+1 处内部调用点+测试 5 处调用表达式改锚)。
**不做**:
- 其余 20 公开方法零触碰(§3.3 盘点表逐行在册理由);
- `tools/gdstyle_baseline.txt` 零编辑(不加键不改键——21→20 低于默认上限自然归绿;基线维护归人工修订经用户批准,本批无需);
- `_classify` 内联计数与 `safe_remaining` 的形态重复不并(§3.4 在案观察);
- sim/probe 零触碰。
**明示不收件的去向**:无。
## 6. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/engineering/architecture/architecture.md` | :105「A2 行」句「公开方法面 19→21(超阈值贴顶——还债归待办清单 P0 条目…)」本批落地后过期 | 实现批禁写——登记进反哺点清单(改现状句:公开方法面 20,safe_remaining 私有化,S13 归绿),用户裁决后归文档批落文 |
| `game/tests/README.md` | :118-121 排雷玩法四能力行——代表用例均为 `_test_*` 函数名,本批零改名 | 实现批禁写——批末收尾核对名实一致(零回表预期) |
| 术语表/GDD 各系统文档 | 零关联(纯代码面收敛) | 无同步义务 |
| 待办清单 | 本条目状态推进(已写卡→已编迭代→完成删除) | 流水线各段承载,实现批不碰 |
## 7. 任务卡
**卡前文件结构图**(零新增文件):
| 文件 | 职责与改动 | 行为改动 |
|---|---|---|
| `game/core/minesweeper_rules.gd` | :101 定义改名+:110 调用点同步(函数体逐字不动) | 否(非行为改动——对照表行 1) |
| `game/tests/unit/core/minesweeper_rules_test.gd` | 5 处调用表达式改锚(断言消息与期望值逐字不动) | 否(适配——申报见第 8 节) |
### T0 基点读数(≈0.1 工作日)
- [ ] gdstyle 单件读数固化:`python tools/gdstyle_gate.py` 按闸件用法跑 `game/core/minesweeper_rules.gd`——记录红键原文(NEW:公开方法 21)与公开方法计数
- [ ] 测试断言基线固化:`minesweeper_rules_test.gd` :55-56/:89-94 四组断言现文抄录进实现报告(改锚前后逐字比对锚)
### T1 私有化与测试改锚(≈0.25 工作日)
- [ ] `minesweeper_rules.gd:101`:`func safe_remaining() -> int:` → `func _safe_remaining() -> int:`(:102-106 函数体逐字不动)
- [ ] `minesweeper_rules.gd:110`:`return safe_remaining() == 0` → `return _safe_remaining() == 0`
- [ ] `minesweeper_rules_test.gd`::56/:89/:93(两处)/:94 调用目标 `_rules.safe_remaining()` → `_rules._safe_remaining()`——断言消息串与期望表达式逐字不动
- [ ] 孤立验证:`…console.exe --script res://tests/run_all.gd` 单测域全绿(重点 minesweeper_rules_test)
### T2 验证与落位(≈0.15 工作日)
- [ ] gdstyle 单件绿:公开方法 20≤20,该文件零红键
- [ ] 零残留 grep:全仓 `\.safe_remaining\(` 零命中;`\._safe_remaining\(` 恰 6 处(:110+测试 5 处)
- [ ] 里程碑步出口:`tools/run_all_gates.sh --code` 全绿
- [ ] 产出物落位:`reports/iter<N>-实现报告-<日期>.md`(各卡状态+受控例外注记+实现决定记录;无实机目检项——改名零玩家可观测提交面)+`reports/iter<N>-反哺点-<日期>.md`(architecture.md:105 一条)
**估时**:合计中值 ≈0.5 个工作日(区间 0.4–0.6)。
## 8. 验证闸(改动—验收对照表)
| # | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| 1 | 公开面收敛 21→20(S13 归绿) | `minesweeper_rules.gd:101/:110` 改名 | gdstyle S13 读数:该文件 NEW 红→零红(20≤20)——落实现报告 | 静态闸 | gdstyle 闸单件直跑 | S13 公开方法计数 21→20=本批特有提交面 | 既有:装板与开局免费展开(封锁格无资源、计入清图) |
| 2 | 行为零变化回归锚 | 同行 1(改名) | `minesweeper_rules_test.gd` 既有断言全数通过(_test_install_invariants/_test_reveal_advances 等,当轮跑批执行) | 单元 | `tests/run_all.gd` 单元套件 | 断言期望值零变化(改名后同值同断言)=零行为漂移证据 | 既有:装板与开局免费展开(封锁格无资源、计入清图) |
| 3 | 测试直连改锚(受控例外) | `minesweeper_rules_test.gd` :56/:89/:93/:94 | 同行 2(改锚后断言在当轮真实跑批执行并通过) | 单元 | 同行 2 | 精确余量计数断言——**受控例外注记**:精确余量无公开可观测面可钉(`clear_map_cleared` 仅 bool),理由随本表申报 | 既有:装板与开局免费展开(封锁格无资源、计入清图) |
- **能力行覆盖说明**:本批测试函数名零变化——README:118-121 四能力行(装板与开局免费展开/挖/封印合法性与可辨拒绝/棋盘揭示预览只读口/封印不可逆与挖开封印格放行)的用例全部照旧运行;对照表三行选「装板与开局免费展开」为锚(其代表用例 `_test_install_invariants` 直含改锚断言 :56),其余三行由同套件当轮跑批兜底。
- **非行为改动行**:私有化改名=非行为改动(判断依据:函数体逐字不动+行 2 断言全绿)。
- **测试方式两分法**:本批全部归调试接口验证(单元断言+静态闸读数);**无用户目检项**(零玩家可观测提交面)。
- **测试削弱申报**:测试调用点 5 处改锚——断言期望值与检查语义逐字零变化;无断言删除、无阈值放宽、无扫描面缩小。
- **独立验收审计**:`reports/iter<N>-验收审计-<日期>.md`,未参与实现的会话或子代理执行,未过不得合并(test-conventions §8.7;验收档中=对照表全量核对+判据绑定面抽查+复跑以远端 CI 现查读数代证)。
- **回归措辞**:里程碑步(T2)出口跑一次 `--code` 域全套闸;卡内修复只做出红最小单元的最窄确认。
## 9. 异常分级
- **L1 自救**:断言消息占位符顺序微调、空行排版。
- **L2 记录继续**:措辞级微调(记录进实现报告「实现决定记录」)。
- **L3 停机呈报**:①改名后 S13 仍红(计数口径与本卡考证不符=上游缺陷,停卡退回写卡段);②发现 `safe_remaining` 生产外部调用方(与 §3.3 盘点矛盾);③机检键与本卡契约互斥(禁改闸件豁免、禁自造第三条路);④全套闸红不可最小单元收敛。
## 10. 代拍板白名单
1. 断言消息串中随改名联动的参数占位写法(保持文案语义)。
2. 删除/空行排版微调。
## 11. 待裁点
零待裁点——收敛点按 §3.3 盘点证据唯一化(safe_remaining);登记方向(settle_batch/fx_reveal 族)的排除分析在册(§3.2);用户批卡即对收窄方向背书。开工门=grilling 复核+用户裁决+迭代编排(编入迭代后估时总量 <5 工作日=冻结待凑批)。
## 12. 落位与可复用性预检
- **复用面**:零新增件——纯改名;禁新增任何转发壳(契约 3)。
- **唯一面**:`_safe_remaining` 唯一落点仍在 `minesweeper_rules.gd`(数剩余安全格=棋盘状态本职,不迁移);grep 同名核查已证 `safe_remaining`(被私有化)与 `safe_cells`(BoardData 方法,另一标识符域)无混淆。
- **分层与交互面**:零跨层变化——生产调用方只有同类内部一点(:110);测试直连走受控例外(契约 4);Core 零 UI 依赖不因改名新增绕行;零表值触面。
## 13. 禁为机检文本保留无效成员
🔴 适用——禁为迎合 S13 消息文本(含计数)保留或新增无效成员/别名/转发壳;改名与机检键互斥时实现段一律停卡呈报,不得自造第三条路。
## 14. 实现规范预算
零新增文件——三查不适用。存量触面:`minesweeper_rules.gd` 基线零在册键(grep 已证)——S13 预期 NEW 红→消失(21→20);改名不改函数长/分支/返回数(gdstyle 函数级规则零漂移);测试文件不在 S13 扫描面(产品码三目录外,code-conventions §4.13)。全部触面 S13 键较登记值只降不升(T0/T2 读数步骤承载)。
## 15. 拆分边界纪律
本卡为收敛类(公开面收回)——**无拆出单元**(私有化非拆分,无新件)。红线:收敛动机=职责依据(无生产消费方公开面,§3.3 盘点表为证),非阈值数字;禁为凑 20 合并/收拢任何有消费方的公开面;禁把本卡与卡②清退面混装(两卡两事项,编排段可凑批)。
@@ -1,251 +0,0 @@
# 需求卡片:孤儿函数清退批
> 来源:待办清单「EffectEngine 死函数与全仓孤儿函数清退」(2026-11-04 登记,来源=会话提及,优先级=P0;需求性工程条目,证据指认在条目实况)。**唯一事实源:该条目实况证据链+本卡第 3 节 2026-11-04 全仓排查考证(排查总体/口径/判死清单逐件实查)。**
> 裁决沿革:删除方向 2026-11-04 用户裁(删 `has_effect_on` 并全仓排查生产码零调用死函数一并清退);排查口径按登记(生产码为排查总体;测试直连与受控例外面不判死)。
> 验收档:中
> 版本:v1.0(2026-11-04)
## 1. 目标与完成定义
产品码三目录孤儿函数清零:
- 判死清单六件(§3.2)零调用方死函数删除(含各自专属文档注释行);
- 删除后级联零新增孤儿(关联在役成员逐件留存复核);
- 游戏行为零变化(六件全为无调用方死件,删除无运行期可观测面)。
**完成定义**:六件定义行消失且全仓(.gd+.tscn)零残留;级联留存复核通过(§3.2 级联核列);既有套件全绿;`--code` 域全套闸绿。
## 2. 设计事实源
需求性工程条目(死码清退,无设计线):设计事实源=**证据指认**——待办清单条目实况(`game/core/effect_engine.gd:204` `has_effect_on` 全仓零调用方,登记证据;2026-11-04 用户裁删并全仓排查)+本卡第 3 节 2026-11-04 全仓排查复核(file:line 逐件实查)。
## 3. 现状事实(2026-11-04 全仓排查考证)
### 3.1 排查口径与方法(可复现)
- **排查总体**=`game/core`+`game/data`+`game/presentation` 全部 `func` 定义(code-conventions §4.13 产品码三目录口径;`game/` 根目录无散落 .gd——find 已证)。
- **语料**=`game/` 下全部 .gd 与 .tscn 的非注释行(.tscn 覆盖信号接线 `method=` 形态)。
- **判死**=全仓零调用方——测试/sim/probe 直连不判死(登记口径);引擎虚函数(`_init`/`_ready`/`_process` 等)除外。
- **方法**:逐函数名全仓标识符检索(词边界)→ 剥注释 → 定义行外零出现=死函数候选 → 逐件人工复核调用形态(排除字符串标签/跨类同名噪声;同名多定义清单已核,六件名均无跨类同名定义)。
### 3.2 判死清单(六件)
| # | 件 | 定义(含注释) | 职责 | 零调用证据 | 级联核(保留面) |
|---|---|---|---|---|---|
| 1 | `has_effect_on` | effect_engine.gd:203-212 | 订阅查询面(发射点缺省行为仲裁——round_end 走 RAP 转存后成死件) | 登记证据+本次全仓 grep 仅定义命中 | `_triggers`/`dispatch`(:218)在役不受影响 |
| 2 | `_bp_read_int` | breakpoint_store.gd:211-219 | 数值类读侧 helper(clamp/params_fallback 策略分支) | 全仓零调用;生产读侧=`bp_read`(:197,消费 keep_on_null/plain) | `_bp_strategy`(:207)由 `bp_read` 共用——保留;`BREAKPOINT_FIELDS` 的 clamp/params_fallback 策略标签保留(文档标签;其机械消费面缺失在案观察,见 §3.3 注④) |
| 3 | `_find_token` | adventure_runner.gd:250-252 | 死包装——转发 `_curio.find_token`,而 curio_stop 无此方法(若被调用即运行期错误);真件=`curio_deck.find_token`(curio_deck.gd:51,curio_stop.gd:107/:229 在役消费) | 全仓零调用 | `curio_deck.find_token` 保留(活) |
| 4 | `has_open` | modal_stack.gd:56-62 | 开态查询(组合根输入锁判据位) | 全仓零调用——组合根实际消费 `has_open_excluding_tags`(空标签集=全计,同形;:65-67 注释自证) | 独立谓词,零级联 |
| 5 | `set_feedback_state` | camp_scene_view.gd:88-92 | 持久基态外部设置口 | 全仓零调用——视图内 `_handle_motion` 族自持(`_apply_state` :113/:116/:118/:127/:133 在役) | `_apply_state`/`_base_state`/`_base_states` 保留 |
| 6 | `stop_resolved` | curio_stop.gd:303-305 | 放行谓词(宿主关序受理) | 全仓零调用 | `_resolved` 多读写在役(:207/:215/:216/:343/:360/:394/:401/:413);`_pending` 由 `curio_stop_pending`(:300)消费——均保留 |
### 3.3 B 段清单——生产码零调用、仅 sim/probe/tests 出现(登记口径保留,不判死)
排查另得 69 件(附表全列)+ `_init`/`_ready` 引擎虚函数面(排除)。重点注记:
- **注①**:`config_db.gd:170` `_validate_skill_pool_links`——被**跨表校验件取代的旧实现**:生产真身=`config_db_cross_validator.gd:197-213`(同判定类别 dangling_skill/pool_composition,检查面更全);旧件生产零调用、测试直连 5 处(round_flow_skill_pool_test.gd:869/871/876/893/905)——测试锚在被取代实现。**去向=新立待办条目**(写卡段同批登记),不在本卡收件。
- **注②**:`gp_wallet.gd:10` `gain_gp`——生产零调用、测试造数面(hero_ledger_test.gd:105)——保留。
- **注③**:`main.gd:106` `_start_adventure_from_menu`——**在册中间态**(代码注释自证:探针直调位点 mn10 逐个登记,卡④到位后由大门两分支换代)——非孤儿发现,保留。
- **注④**:`breakpoint_store.gd` 的 BREAKPOINT_FIELDS 策略标签 `clamp`/`params_fallback`(:19/:20/:39/:40/:41)机械消费面随 `_bp_read_int` 死亡——标签保留为文档语义,是否补消费面或清标签归后续裁决(本卡不动)。
- 其余 B 段件=探针取证面(`*_probe`/`press_*_for_probe`)、调试面(debug_overlay 族)、测量面(playtest_logger/sim 消费)与测试造数面——按登记口径全部保留。
**B 段附表(69 件全列)**:
| 定义处 | 函数名 | 保留面调用计数 |
|---|---|---|
| presentation/main.gd:106 | _start_adventure_from_menu | probe:11, test:6 |
| core/config_db.gd:170 | _validate_skill_pool_links | test:5 |
| core/slot_store.gd:48 | active_slot | probe:5, test:11 |
| presentation/views/hero_info_panel_view.gd:156 | armor_text | probe:2 |
| core/slot_store.gd:24 | attach_path | probe:3, test:9 |
| core/slot_store.gd:34 | attach_slot_template | probe:4, test:15 |
| presentation/views/hero_info_panel_view.gd:152 | attack_text | probe:3 |
| core/battle_orchestrator.gd:152 | attune_has | test:8 |
| core/level_runner.gd:482 | awaiting_choice | probe:5, sim:1, test:19 |
| presentation/views/level_map_screen.gd:589 | canvas_probe | probe:3, test:1 |
| presentation/views/board_view.gd:442 | cell_center_local | probe:1 |
| presentation/views/board_view.gd:845 | cell_rect_probe | probe:3 |
| presentation/views/board_view.gd:817 | cells_probe | probe:25 |
| presentation/views/board_view.gd:419 | click_cell | probe:7 |
| presentation/views/ap_bar_view.gd:197 | confirm_visible | probe:1 |
| presentation/views/standee_body.gd:355 | content_rect | probe:1 |
| data/schemas/adventure_table.gd:165 | deck_total | test:2 |
| core/config_db.gd:86 | diagnostics | sim:1, test:17 |
| presentation/views/board_view.gd:822 | diggable_probe | probe:8 |
| presentation/views/level_map_screen.gd:595 | display_probe | probe:2, test:1 |
| presentation/views/debug_overlay.gd:69 | effect_text | probe:2 |
| presentation/views/battle_stage_view.gd:262 | enemy_body_at | probe:2 |
| presentation/views/board_view.gd:832 | fog_params_probe | probe:5 |
| presentation/views/battle_end_overlay.gd:382 | fx_probe | probe:10, test:1 |
| presentation/views/standee_body.gd:217 | fx_probe | probe:10, test:1 |
| core/gp_wallet.gd:10 | gain_gp | test:1 |
| presentation/views/camp_scene_view.gd:83 | get_hotspot_rect | probe:1 |
| core/slot_store.gd:53 | has_write_target | test:9 |
| presentation/views/standee_body.gd:304 | hero_state_probe | probe:4 |
| presentation/views/board_view.gd:827 | hover_probe | probe:2 |
| presentation/views/standee_body.gd:57 | intent_probe | probe:4 |
| core/reward_economy.gd:74 | is_mapped | sim:1 |
| presentation/views/level_map_screen.gd:584 | layout_probe | probe:7, test:5 |
| presentation/playtest_logger.gd:45 | log_path | sim:11, test:2 |
| presentation/playtest_logger.gd:118 | log_run | sim:2 |
| presentation/views/standee_body.gd:64 | name_line_probe | probe:1, test:3 |
| core/level_runner.gd:400 | next_candidates | sim:1, test:2 |
| presentation/views/debug_overlay.gd:121 | output_text | probe:1 |
| presentation/views/battle_log_view.gd:102 | parsed_text | probe:2, test:6 |
| presentation/views/standee_body.gd:283 | portrait_probe | probe:2, test:3 |
| presentation/views/debug_overlay.gd:127 | press_apply_for_probe | probe:2 |
| presentation/views/level_map_screen.gd:402 | press_candidate | probe:8, test:1 |
| presentation/views/curio_pick_overlay.gd:157 | press_card | probe:3, test:2 |
| presentation/views/curio_pick_overlay.gd:163 | press_confirm | probe:3, test:1 |
| presentation/views/ap_bar_view.gd:201 | press_confirm_for_probe | probe:1 |
| presentation/views/curio_pick_overlay.gd:167 | press_continue | probe:7, test:1 |
| presentation/views/node_overlay.gd:33 | press_continue | probe:7, test:1 |
| presentation/views/curio_pick_overlay.gd:172 | press_refresh | test:2 |
| presentation/views/ap_bar_view.gd:193 | press_refresh_for_probe | probe:1 |
| presentation/views/debug_overlay.gd:131 | press_reset_for_probe | probe:1 |
| presentation/views/debug_overlay.gd:135 | press_simulate_for_probe | probe:1 |
| core/minesweeper_rules.gd:397 | preview_reveal | sim:1, test:6 |
| core/treasure_items.gd:236 | probe | probe:24, test:51 |
| presentation/views/settlement_fx_view.gd:73 | probe_banners | probe:3 |
| presentation/views/settlement_fx_view.gd:78 | probe_settlement_marks | probe:1 |
| presentation/views/ap_bar_view.gd:206 | refresh_remaining_text | probe:3 |
| core/refresh_bank.gd:38 | refresh_y | sim:2, test:10 |
| core/config_db.gd:180 | reload | probe:2, test:4 |
| core/config_db.gd:81 | reset_diagnostics | test:3 |
| presentation/views/settings_overlay.gd:26 | retarget | probe:1 |
| presentation/views/debug_overlay.gd:101 | run_data_probe | probe:1 |
| presentation/views/board_view.gd:163 | set_fog_enabled | probe:2 |
| presentation/views/debug_overlay.gd:73 | set_sim_count | probe:1 |
| presentation/views/debug_overlay.gd:58 | set_sliders | probe:4 |
| presentation/views/board_view.gd:345 | set_type_glow_enabled | probe:4, test:5 |
| core/level_runner.gd:144 | start_level | probe:2, sim:2, test:11 |
| presentation/debug_session.gd:31 | start_single | probe:1 |
| presentation/views/board_view.gd:837 | type_glow_probe | probe:13, test:11 |
| presentation/views/battle_end_overlay.gd:204 | verdict_text | probe:2 |
## 4. 设计契约(🔴 违反即 L3 停机呈报)
1. 🔴 **游戏行为零变化**——六件全为零调用方死件,删除零运行期可观测面;零 RNG/信号/存档/表值触面。
2. 🔴 **级联零新增**——删除后全仓不得出现新孤儿函数(§3.2 级联核列逐件留存复核,T2 判据)。
3. 🔴 **范围纪律**——只删 §3.2 六件;B 段一律不收(注①去向=新立待办);禁顺手清 tests/sim/probe 面(非生产码)。
4. 🔴 **禁保留无效成员**——删函数禁留空壳/别名/注释存根(code-conventions §1.1 拆分判据⑤)。
5. 🔴 **断言零削弱**——六件无测试直连(grep 已证),测试文件零触碰、零断言改判。
6. 🔴 **实现批禁写 `design/` 整个目录与根规则文件**(architecture.md 六件名 grep 零命中,无反哺点——已核)。
7. 🔴 **MC/模拟零跑**——无数值改动。 8. 🔴 **车道铁律**——实现走独立 worktree。
## 5. 范围边界
**做**:§3.2 六件删除(含各自专属文档注释行;六件行段见 §7 文件结构图)。
**不做**:
- B 段全部 69 件(§3.3;注①去向=新立待办条目,注④归后续裁决);
- 六件级联核保留面(§3.2 末列);
- tests/sim/probe 面的孤儿排查(非生产码,不在登记范围)。
**明示不收件的去向**:待办清单新立条目「config_db._validate_skill_pool_links 旧校验件清退与测试改锚」(写卡段同批登记)。
## 6. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/engineering/architecture/architecture.md` | 六件名 grep 零命中(has_effect_on/bp_read_int/find_token/has_open/set_feedback_state/stop_resolved 全零——已核) | 无同步义务(零反哺点) |
| `game/tests/README.md` | 六件名零命中能力清单(已核);六件所属套件能力行不受影响 | 实现批禁写——批末收尾核对名实一致(零回表预期) |
| 术语表/GDD 各系统文档 | 零关联(纯代码面清退) | 无同步义务 |
| 待办清单 | 本条目状态推进+新立注①条目 | 状态推进归流水线各段,实现批不碰 |
## 7. 任务卡
**卡前文件结构图**(零新增文件;六件全为非行为改动):
| 文件 | 改动 | 行为改动 |
|---|---|---|
| `game/core/effect_engine.gd` | 删 :203-212(文档注释+函数) | 否(对照表行 1) |
| `game/core/breakpoint_store.gd` | 删 :211-219(注释+函数) | 否(行 2) |
| `game/core/adventure_runner.gd` | 删 :250-252(注释+函数) | 否(行 3) |
| `game/presentation/modal_stack.gd` | 删 :56-62(注释+函数) | 否(行 4) |
| `game/presentation/views/camp_scene_view.gd` | 删 :88-92(函数;无专属注释块) | 否(行 5) |
| `game/core/curio_stop.gd` | 删 :303-305(注释+函数) | 否(行 6) |
### T0 基点读数(≈0.2 工作日)
- [ ] 六件定义处行号与所在文件基线键读数固化(`adventure_runner.gd` max-class-variables=23 在册,其余五文件 grep 基线键记录)——落实现报告(删除后只降不升核对面)
- [ ] 六件零调用方证据复核:逐件全仓 grep(.gd+.tscn,词边界)仅定义命中——与 §3.2 一致;不一致即停卡(L3-①)
### T1 六件删除(≈0.3 工作日)
- [ ] `effect_engine.gd`:删 :203-212(`## 订阅查询面…` 注释+`has_effect_on` 函数体)
- [ ] `breakpoint_store.gd`:删 :211-219(`# 数值类读侧…` 注释+`_bp_read_int` 函数体)
- [ ] `adventure_runner.gd`:删 :250-252(`# 候选令牌匹配…` 注释+`_find_token` 转发行)
- [ ] `modal_stack.gd`:删 :56-62(`# 开态查询…` 注释+`has_open` 函数体)
- [ ] `camp_scene_view.gd`:删 :88-92(`set_feedback_state` 函数体)
- [ ] `curio_stop.gd`:删 :303-305(`# 放行谓词…` 注释+`stop_resolved` 函数体)
- [ ] 各删除点相邻空行规范化(两空行分隔惯例保持)
### T2 级联与零残留复查(≈0.15 工作日)
- [ ] 六件名全仓 grep(.gd+.tscn,词边界)零残留
- [ ] 级联留存复核(grep 计数落实现报告):`_bp_strategy`/`bp_read`、`curio_deck.find_token`、`has_open_excluding_tags`、`_apply_state` 族、`_resolved`/`_pending`、`_triggers`/`dispatch` 各 ≥1 在役调用方
- [ ] 新增孤儿扫描:按 §3.1 口径复查六文件——删除不产生新零调用函数
### T3 验证闸(≈0.15 工作日)
- [ ] 孤立验证:`…console.exe --script res://tests/run_all.gd` 单测域全绿(重点 effect_port/breakpoint/curio/modal/camp/adventure 关联套件)
- [ ] 里程碑步出口:`tools/run_all_gates.sh --code` 全绿
### T4 产出物落位卡(≈0.1 工作日)
- [ ] `reports/iter<N>-实现报告-<日期>.md`:各卡状态+实现决定记录+级联留存复核计数+实机目检总清单(登记「无实机目检项」——死件删除零玩家可观测提交面)
- [ ] `reports/iter<N>-反哺点-<日期>.md`:零条(§6 已核;文件仍须落,写明「零反哺点」)
**估时**:合计中值 ≈0.9 个工作日(区间 0.75–1.25)。
## 8. 验证闸(改动—验收对照表)
| # | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| 1 | has_effect_on 退役(登记原件) | `effect_engine.gd:203-212` 删 | 静态判据:T2 零残留 grep+既有套件全绿(effect_port_test 等当轮跑批执行) | 静态+单元 | `tools/run_all_gates.sh --code`(09 静态扫描+00/01 保险) | 定义行消失+全仓零残留+回归绿三面(死函数无运行期提交面——静态判据+评审注记申报观测面局限) | 既有:效果发射端口单点 |
| 2 | _bp_read_int 退役 | `breakpoint_store.gd:211-219` 删 | 同行 1(断点关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:断点片段往返与续玩幂等 |
| 3 | _find_token 退役(死包装) | `adventure_runner.gd:250-252` 删 | 同行 1(adventure 关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:冒险生命周期:开局受理/三关序列/败北线 |
| 4 | has_open 退役 | `modal_stack.gd:56-62` 删 | 同行 1(modal 关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:模态覆盖层编排与输入锁 |
| 5 | set_feedback_state 退役 | `camp_scene_view.gd:88-92` 删 | 同行 1(camp 关联套件/探针为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 6 | stop_resolved 退役 | `curio_stop.gd:303-305` 删 | 同行 1(curio 关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:奖励三选一候选/刷新付费/呈现 |
| 7 | 级联零新增(完成定义判据) | 六件删除的伴生核(无新增代码改动) | T2 级联留存复核:§3.2 末列六组保留面 grep 计数各 ≥1 在役调用方+新增孤儿扫描(按 §3.1 口径复查六文件零新孤儿)——计数落实现报告 | 静态 | 同行 1 | 保留面调用计数与新孤儿扫描零命中=本批级联判据特有提交面 | 既有:效果发射端口单点 |
- **非行为改动行**:六行全部为非行为改动(判断依据:被删函数全仓零调用方〔§3.2 证据〕=无运行期提交面;既有套件全绿兜底)。
- **测试方式两分法**:本批全部归静态判据+套件回归锚;**无用户目检项**(零玩家可观测提交面)。
- **测试削弱申报**:无——测试文件零触碰(六件无测试直连,grep 已证)。
- **独立验收审计**:`reports/iter<N>-验收审计-<日期>.md`,未参与实现的会话或子代理执行,未过不得合并(test-conventions §8.7;验收档中=对照表全量核对+判据绑定面抽查+复跑以远端 CI 现查读数代证)。
- **回归措辞**:里程碑步(T3)出口跑一次 `--code` 域全套闸;卡内修复只做出红最小单元的最窄确认。
## 9. 异常分级
- **L1 自救**:空行规范化笔误、grep 白名单笔误。
- **L2 记录继续**:级联留存复核的计数呈现形态(记录进实现报告)。
- **L3 停机呈报**:①T0 复核发现任一件实有调用方(字符串派发/动态接线漏判=上游考证缺陷,停卡退回写卡段);②级联复查发现新孤儿(误判级联);③机检键与本卡契约互斥(禁改闸件豁免);④全套闸红不可最小单元收敛。
## 10. 代拍板白名单
1. 删除点相邻空行规范化。
2. T2 复核计数落实现报告的表格形态。
## 11. 待裁点
零待裁点——删除方向 2026-11-04 用户裁;排查口径按登记(生产码总体+测试直连不判死);B 段保留与注①去向新立待办=登记口径的执行。开工门=grilling 复核+用户裁决+迭代编排(编入迭代后估时总量 <5 工作日=冻结待凑批)。
## 12. 落位与可复用性预检
- **复用面**:零新增件——纯删除。
- **唯一面**:删除不产生第二落点;三组同名体已核辨——`curio_deck.find_token`(在役真件)与被删 `_find_token`(死包装)是两个标识符域;`has_open` 与 `has_open_excluding_tags`(在役)同理;`stop_resolved` 与信号 `curio_resolved`(在役)同理。
- **分层与交互面**:零跨层变化——六件均无调用方,删除不改变任何调用路径;Core 零 UI 依赖不因删除新增绕行;零表值触面。
## 13. 禁为机检文本保留无效成员
🔴 适用(删除侧反向)——禁为保机检键/计数留空壳、别名、注释存根;删除与机检键互斥时实现段一律停卡呈报,不得自造第三条路。
## 14. 实现规范预算
零新增文件——三查不适用。存量触面六文件:函数删除不改类变量数(`adventure_runner.gd` max-class-variables=23 在册,读数不变);gdstyle 函数级键(若有)只降不升;S13 公开方法数只降不升(六件中 `has_effect_on`/`has_open`/`set_feedback_state`/`stop_resolved` 为公开方法——四文件 S13 计数各 −1,T0 读数承载)。全部触面 S13 键较登记值只降不升。
## 15. 拆分边界纪律
本卡为删除类(非拆分/收敛类),无拆出单元。红线:禁为凑指标或摊薄审查把六件拆多批留尾——六件一次清完(T1 六个复选框是施工粒度,非范围拆分);禁把 B 段任何件搭车收进本批(§4 契约 3)。
@@ -1,194 +0,0 @@
# 需求卡片:封印印记法阵化批(2026-11-04)
来源:待办清单「棋盘封印印记图形换代——现件仍是扫雷旗形,改法阵或锁链待设计」条目(**唯一事实源**:`design/art/art-bible.md` v3.41 §3.2「封印印记」条+§8.2「封印印记参数表」;设计闭合凭据=art-bible v3.41 落文+2026-11-04 用户点头 82% 档样张)。验收档:**中**(纯呈现层——零持久状态、零 RNG、零数值;做错的后果=棋盘观感错,玩家可见但不损存档)。状态:已写卡(v1.0,2026-11-04)。改动面:游戏代码(含随逻辑改的测试代码)。
## 1. 目标与完成定义
**这批做什么**:把棋盘侧封印印记从「32×32 贴图铺满整格」改为「着色器按格边参数化绘制」——环+十字+环外一圈压暗光,环径 82% 格宽,随格边 26–46px 连续缩放;贴图件仅战末金蜡封徽记继续使用。
| 面 | 现状 | 终态 |
|---|---|---|
| 绘制手段 | `draw_texture_rect(tex_seal, rect)` 铺满整格(28 格缩 0.875、46 格放 1.4375,均非整数) | 着色器按格边实时画(无缩放、任意格边清晰) |
| 形 | 环+十字(32px 贴图) | 环+十字(参数化:环径 82% 格宽/壁厚 11% 环径/臂宽 15.6% 环径) |
| 底光 | 无 | 环外一圈压暗光(宽 9% 格边、峰值 α0.50、衰减 1.6、不出格) |
| 贴图 | 棋盘与战末蜡封共用 `seal_mark.png` | 棋盘侧不再引用;蜡封继续用该贴图(`battle_end_overlay.gd:84`) |
**什么状态算完**:五枚参数常量落 `ui_kit` 且有单元断言守门;着色器与层件落码并被 CellUnit 按格挂载;棋盘侧贴图引用路径全部退役且全仓零残留;三关渲染取证帧量出环径 82%±1px、光圈不越格边;迷雾态隐藏与小人层级两条不断;既有套件零转红;代码域闸全绿;`reports/` 三份产出物写齐。
## 2. 设计事实源
- **唯一事实源**:`design/art/art-bible.md` v3.41 §3.2「封印印记」条(形/画法/光圈/层序纪律)+ §8.2「封印印记参数表」(五枚定值+衰减+参数单点声明)。
- **格边口径**:`design/gdd/ux/battle.md:137-143`「棋盘格尺寸公式」——`clampi(..., 26, 46)`,基座档 14×14=28px、小板最大 46px。
- 该文件与待办清单条目状态里的闭合凭据一致(美术设计已闭合=art-bible v3.41+样张过审);T1 首步复核两者一致,冲突即 L3 停卡。
## 3. 现状事实(2026-11-04 worktree seal-shader 实查,基点 7b5308c1,开工自行复核)
- `game/presentation/views/board_view.gd:539-541` 封印槽维护——`u.face.tex_seal = _palette.seal_tex if (seal and not revealed and _palette.seal_tex != null) else null`;`:542-545` 移除格清槽;`:70 var _cell := 46.0`;`:582` 缺图回落 `glyph = "封"`。
- `game/presentation/views/cell_mark_overlay.gd:33` `var tex_seal: Texture2D`;`:95-96` `canvas.draw_texture_rect(tex_seal, rect, false)`——整格铺满,非整数缩放根源在此。
- `game/presentation/views/tile_palette.gd:19` `const TILE_SEAL_MARK := "res://assets/art/board/seal_mark.png"`;`:111` `seal_tex = UiKit.load_tex(TILE_SEAL_MARK)`。
- `game/presentation/views/board_cell_unit.gd:10` preload 微光层件;`:46 var _glow_layer`;`:58-63 _draw` 六步时序(`_draw_fog_layer` 在 `:69`,退色层在 `:64` 之后);`:90-100 _sync_glow_layer()` 是子件生命周期样板。
- `game/presentation/views/cell_type_glow_layer.gd` 全件——子件模板:材质独占、`draw_rect` 全幅、`Color(1,1,1,1.0/255.0)` 非零 alpha 触发着色器、参数全取 ui_kit。
- `game/presentation/views/ui_kit.gd:33` `SEAL_BLACK`;`:90-93` `TYPE_GLOW_ALPHA/BAND_FRAC/SOFT/CORNER`(参数单点先例)。
- 取证面:`tools/render_gate.sh:107-114` 已挂 `board_shot_probe` L1–L3 棋盘抓帧;`game/probe/type_glow_shot_probe.gd` 是同类「单要素呈现」取证先例。
- `game/presentation/views/battle_end_overlay.gd:84` 战末金蜡封印记直接读 `res://assets/art/board/seal_mark.png`(不走 `tile_palette` 常量)——本批不动它。
## 4. 设计契约(违反即返工红线)
- 🔴 **参数五值**:环外径 `0.82`×格边、壁厚 `0.11`×环径、臂宽 `0.156`×环径、光圈宽 `0.09`×格边、光圈峰值 alpha `0.50`、衰减指数 `1.6`;单点=`ui_kit.gd` 五枚常量,着色器只读注入,代码内禁第二处字面值。
- 🔴 **光圈不出格**:着色器内半径上限夹到 `cell_px/2`,禁越界到邻格。
- 🔴 **色只用一枚**:印记与光圈都取 `SEAL_BLACK`(光圈只改 alpha);禁新增色、禁 ui_kit 之外裸 `Color8`(既有守卫)。
- 🔴 **层序**:印记层挂 CellUnit 之下(低于 BoardView 层的小人精灵),且 `fog_state != 0`(区外全黑/记忆态)时整层隐藏——§6.5「封印随格隐没」。
- 🔴 **禁动效**:不呼吸、不脉冲(§2.1 挖掘期唯一在动=接触带微光)。
- 🔴 **贴图退役面**:棋盘侧三处引用(`tile_palette.gd:19/:111`、`cell_mark_overlay.gd:33/:95-96`、`board_view.gd:539-541/:582`)全部退役后,`game/` 内 `seal_mark` 只剩 `battle_end_overlay.gd:84` 一处引用,链上禁留旧常量别名或死槽。
- 🔴 **测试纪律**:禁变异类测试、禁撤销类取证、禁删断言换绿(第 8 节申报之外零删改)。
## 5. 范围边界
**收件**:着色器文件、层件、CellUnit 挂载与生命周期、BoardView 下发、棋盘侧贴图三处退役、五枚常量、参数与雾门控断言、三关渲染取证。
**不收件**(去向已指认):
- 施印瞬间特效(清单 §4 两件中的第一件)——未实装,另立演出类条目时再做;本批只做常显形态。
- 战末金蜡封徽记形制——继续用现有贴图,零改动。
- 色板、其它格面元素(数字/徽章/变异纹带/类型微光)——零触碰。
- `game/tests/README.md` 能力行——**新增一行「棋盘封印印记呈现(参数化绘制)」**(写卡段已随卡落,代表用例 `seal_mark_params_test.gd` 两函数;实现批禁写该文件)。
- 数值表、MC、模拟——零跑(零数值改动)。
## 6. 关联文档同步面
实现批禁写 `design/` 与根规则文件;下表每条落文义务进 `reports/iter<N>-反哺点-<日期>.md`,由用户裁决后归文档批落文:
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务(反哺点清单逐条承载) |
|---|---|---|
| design/art/art-bible.md §3.2/§8.2 | 已随美术设计闭合批落文(v3.41,条款即本批规格) | 实现期只核不改;若要改值=文档批,不在实现批 |
| 体验验证清单.md 第 4 条 | 判据现为「`seal_mark.png` 三关加载、非字形回退」,贴图退役后该判据失去对象 | 反哺点列改判据:「三关封印格呈环+十字、环径 82%±1px」 |
| design/art/asset-path-map.md | `seal_mark.png` 用途由「棋盘封印印记」改为「战末蜡封徽记专用」 | 反哺点列行号与改后表述 |
| game/tests/README.md | 能力行已由写卡段新增「棋盘封印印记呈现(参数化绘制)」一行 | 批末核对代表用例名与实现落地函数逐字一致(不一致则反哺点提出) |
| 术语表 | 零新增术语(环/十字/光圈均为现有词或本次条款已释义) | 确认行「零新增术语」 |
(机检口径:本表同步义务格无一条写「随批」。)
## 7. 任务卡 T1..T6
### 卡前·文件结构图
```
新增
game/presentation/views/seal_mark.gdshader 【行为改动 R1/R2/R3】环+十字+环外光圈,参数只读注入
game/presentation/views/seal_mark_layer.gd 【行为改动 R1/R3/R4】子件承载(仿 cell_type_glow_layer)
game/tests/unit/presentation/seal_mark_params_test.gd 【非行为·新增】五常量与注入面断言
改动
game/presentation/views/ui_kit.gd 【非行为 R1】+五常量(值同 art-bible §8.2)
game/presentation/views/board_cell_unit.gd 【行为改动 R1/R4/R5】+封印子件挂载/生命周期/雾门控/edge 联动
game/presentation/views/board_view.gd 【行为改动 R4】:539-541 槽位维护改下发封印层;:582 回退分支退役
game/presentation/views/cell_mark_overlay.gd 【行为改动 R6】删 tex_seal 成员与 :95-96 绘制、头注改写
game/presentation/views/tile_palette.gd 【行为改动 R6】删 TILE_SEAL_MARK 与 seal_tex
game/tests/run_all.gd 【非行为】注册新单元件
game/probe/board_shot_probe.gd 或新增探针 【行为改动 R1/R3/R5】三关封印格取证帧
不动
game/presentation/views/battle_end_overlay.gd:84 战末蜡封继续读同一张 PNG
game/assets/art/board/seal_mark.png 素材在库保留(蜡封专用)
```
### T1 常量与参数断言(估时 0.25 工作日;区间 0.25–0.5)
取用:无。产出:`UiKit.SEAL_RING_FRAC/SEAL_WALL_FRAC/SEAL_ARM_FRAC/SEAL_HALO_ALPHA/SEAL_HALO_GAMMA`(float 常量)+`seal_mark_params_test.gd`。
- [ ] 复核 art-bible v3.41 §8.2 参数表与本卡第 4 节五值逐字一致(不一致=L3 停卡)
- [ ] `ui_kit.gd` 邻近 `SEAL_BLACK`(:33) 处新增五常量,值 = `0.82 / 0.11 / 0.156 / 0.50 / 1.6`,各带一行来源注(引 §8.2)
- [ ] 新增 `tests/unit/presentation/seal_mark_params_test.gd`:断言五常量取值;断言 `seal_mark.gdshader` 文件存在且文本含 `cell_px/ring_frac/wall_frac/arm_frac/halo_frac/halo_alpha/halo_gamma/mark_col` 七个 uniform 名
- [ ] `tests/run_all.gd` 注册该件(仿既有 `{"path": ..., "expect": 0}` 行)
### T2 着色器本体(估时 1.0 工作日;区间 0.75–1.5)
取用:T1 五常量。产出:`seal_mark.gdshader`(`shader_type canvas_item`),uniform 名单见 T1。
- [ ] 写 `seal_mark.gdshader`:以格中心为原点算半径 `r`;环体 = `ring_r-wall/2 ≤ r ≤ ring_r`(`ring_r = 0.5*cell_px*ring_frac`,`wall = 0.11*2*ring_r`);十字 = `(|dx| < arm/2 或 |dy| < arm/2) 且 r < ring_r`(`arm = arm_frac*2*ring_r`);光圈 = `r > ring_r` 区间按 `(1 - t)^halo_gamma * halo_alpha` 混黑,`t = (r-ring_r)/halo_w`,`halo_w = 0.5*cell_px*halo_frac`,并夹 `r ≤ 0.5*cell_px`
- [ ] 隔离验证:最小场景(单 32px/46px/28px 三个方块)直跑抓帧,确认三档格边下环径比例一致、光圈不越格(截图落 `artwork/` 在途目录,不入 git)
- [ ] 参数默认值仅作兜底(与 §8.2 同值),实际由 gd 侧逐次注入;代码内注释写明「禁在此改值」
### T3 层件与接入(估时 1.0 工作日;区间 0.75–1.5)
取用:T1 常量、T2 着色器。产出:`seal_mark_layer.gd`+`BoardCellUnit` 挂载接口。
- [ ] 新增 `seal_mark_layer.gd`:`extends Node2D`;`setup(edge: float, on: bool) -> void` 内建 `ShaderMaterial` 并注入七参数(`mark_col = UiKit.SEAL_BLACK`);`_draw()` 用 `draw_rect(Rect2(Vector2.ZERO, Vector2(edge, edge)), Color(1,1,1,1.0/255.0))`(同微光层非零 alpha 手法)
- [ ] `board_cell_unit.gd`:`const _SEAL_LAYER := preload(...)`;`var _seal_layer: Node2D`;`func _sync_seal_layer() -> void`(on 才建、off 撤、edge 变更重注入);`edge` setter 与 `fog_state` setter 各追加一行联动
- [ ] `board_view.gd:539-541` 改为写 CellUnit 的新公开属性 `seal_on: bool`(替代 `u.face.tex_seal` 赋值),`:542-545` 移除格同置 false
- [ ] 断言:单元件内新增 `_test_fog_gate`——造 CellUnit、置 `seal_on = true`、置 `fog_state = 1` → 断言封印子件不可见;`fog_state = 0` → 可见
### T4 棋盘侧贴图路径退役(估时 0.5 工作日;区间 0.25–0.75)
取用:T3 接入完成(封印不再依赖贴图)。产出:三处引用清零。
- [ ] `cell_mark_overlay.gd`:删 `:33 tex_seal` 成员与其 setter、删 `:95-96` 绘制块、头注「④ 封印」段改写为「封印由 seal_mark_layer 子件绘制」
- [ ] `tile_palette.gd`:删 `:19 TILE_SEAL_MARK` 与 `:111 seal_tex` 赋载;确认无第二消费者(`grep -rn "TILE_SEAL_MARK\|seal_tex" game/`)
- [ ] `board_view.gd`:删 `:539-541` 槽位维护语句与 `:582` 缺图回退分支,注释改写;确认 `battle_end_overlay.gd:84` 仍以字面路径读图(不受影响)
- [ ] 全仓 sweep:`grep -rn "seal_mark" game/ --include=*.gd` 只余 `battle_end_overlay.gd:84` 一处;把该 grep 结果写进实现报告作结构性证据
### T5 渲染取证与回归(估时 0.75 工作日;区间 0.5–1.0)
取用:T3/T4 完成态。产出:三关封印格取证帧与读数表。
- [ ] 在 `board_shot_probe.gd` 增「封印格抓帧」分支(或新增 `seal_mark_shot_probe`):每关放一枚封印后抓整板帧,落盘带关名标签
- [ ] 读数脚本(放 `tools/` 或探针内直算):从帧里量环外径像素 ÷ 格边长,输出三关读数
- [ ] 判据落读数表:环径落 82%±1px;光圈外缘不超过格边(邻格边缘亮度与无封印帧一致)
- [ ] 回归:既有冒烟/单元/探针/渲染套件零转红(改前改后各一次,记录读数)
### T6 产出物落位(估时 0.25 工作日;区间 0.25–0.5)
- [ ] `reports/iter<N>-实现报告-<日期>.md`:各卡状态+实机目检总清单(三关封印格观感、蜡封观感、封印格与变异纹带同格观感)+变异验证记录表(T1–T5 各条:变异点 file:行、跑的闸、红输出、还原结论)+遗留读数义务
- [ ] `reports/iter<N>-反哺点-<日期>.md`:第 6 节四条同步面逐条落(体验验证清单第 4 条改判据、asset-path-map 用途改述、能力清单零新增确认、术语零新增确认)
- [ ] `reports/iter<N>-代拍板-<日期>.md`:按第 10 节白名单记录,全按卡执行则写「零拍板」
- [ ] 轻闸全绿后、合并前复核三份齐备
**估时汇总**:0.25+1.0+1.0+0.5+0.75+0.25=**3.75 工作日**(区间 2.75–5.75)。低于 5 个工作日冻结线——编入迭代时按冻结制处理(凑批后转待开工)。
## 8. 验证闸(改动—验收对照表)
| # | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| R1 | 环径 = 82% 格边,随格边连续 | `seal_mark.gdshader`(ring_frac 算环半径)+`ui_kit.gd` 五常量 | `seal_mark_params_test.gd:_test_param_values`(unit/presentation,尾缀 `_test`)+T5 三关帧量读数 | 单元+探针 | `BoardCellUnit.edge` → 层件 `setup()` → ShaderMaterial 参数 | 常量值逐项相等;三关帧读数「环外径像素 ÷ 格边」落 0.82±0.01 | 新增:棋盘封印印记呈现 |
| R2 | 壁厚 11% 环径、臂宽 15.6% 环径 | 同上 shader | `seal_mark_params_test.gd:_test_shape_ratios`+T5 帧量 | 单元+探针 | 同 R1 | 两常量逐值相等;帧上「环壁像素宽 ÷ 环外径」落 0.11±0.02 | 新增:棋盘封印印记呈现 |
| R3 | 光圈只在环外、不出格 | shader `halo_frac` 与 `r ≤ cell/2` 夹取 | `seal_mark_params_test.gd:_test_halo_clamp_present`+T5 邻格边缘亮度比对 | 单元+探针 | 同 R1 | shader 文本含夹取行;封印帧邻格边缘亮度与无封印帧差 ≤1/255 | 新增:棋盘封印印记呈现 |
| R4 | 迷雾态隐藏 | `board_cell_unit.gd` `fog_state` setter 联动 | `seal_mark_params_test.gd:_test_fog_gate` | 单元 | `BoardCellUnit.fog_state` 属性写入面 | `fog_state=1` 时封印子件 `visible == false`;`=0` 时 `true` | 新增:棋盘封印印记呈现 |
| R5 | 印记在小人之下 | 子件挂 CellUnit(BoardView 层 hero 精灵天然在上) | T5 帧取证 | 探针 | `board_view._place_hero` | 小人格中心像素 = 小人体色(非封印黑) | 新增:棋盘封印印记呈现 |
| R6 | 蜡封仍用贴图 | `battle_end_overlay.gd:84` 不动 | 既有战末弹层探针/单元零转红+`grep` sweep | 单元+sweep | 战末结算弹层构建 | `grep -rn "seal_mark" game/ --include=*.gd` 命中数 = 1 | 新增:棋盘封印印记呈现 |
| R7 | 零新增色 | shader 只用 `SEAL_BLACK`+alpha | `seal_mark_params_test.gd:_test_single_color`+渲染闸有效色数 | 单元+闸 | 材质注入点 | shader 文本零 `Color8` 且无第二色常量;该屏有效色数不超既有读数 | 新增:棋盘封印印记呈现 |
**测试削弱申报**:本批不删改任何既有断言。`board_view.gd:582` 的缺图回退分支是**行为退役**(回退对象消失),不属「删断言」。
## 9. 异常分级
- **L1 自救**:着色器编译报错、参数注入拼写错、探针抓帧目录缺失——就地修,重跑最小单元。
- **L2 记录继续**:取证帧读数轻微偏离(≤2px)且目检无感——记入实现报告「读数偏差」节,继续推进。
- **L3 停机呈报**:参数与本卡第 4 节冲突、layer 挂载位置被迫改动、贴图退役引发图外消费者(白名单外)、渲染闸对新增着色器报红且无法定性。
## 10. 代拍板白名单
1. 常量与 uniform 的命名拼写(须含 `SEAL_` 前缀)、注释措辞。
2. 探针文件名与抓帧文件命名(T5)。
3. commit 拆分粒度与提交信息措辞。
4. 单元件内断言函数命名与内部辅助函数拆分。
5. 隔离验证用的最小场景形态(方块数、摆放)。
**超清单必呈报**:任何参数取值改动、层挂载层级改动、贴图退役范围扩大(例如顺手删 `seal_mark.png`)、动 `battle_end_overlay`、动其它格面元素。
## 11. 待裁点
**零待裁点**。开工门=U0(用户指定迭代号发令)。设计权归用户;本卡内所有取值均来自 art-bible v3.41 §8.2,实现期禁自改。
## 12. 落位与可复用性预检
| 新增件 | 复用面(盘上是否已有同类) | 唯一面 | 分层与交互 |
|---|---|---|---|
| `seal_mark.gdshader` | 复用 `cell_type_glow.gdshader` 的 canvas_item+距离场写法与「参数全由 gd 注入」纪律;不新建框架 | 只此一件承担封印图形;不与微光着色器合并(两者生命周期与挂载面不同:微光按组、封印按格态) | presentation 层;无 core 依赖;不读写存档/RNG |
| `seal_mark_layer.gd` | 复用 `cell_type_glow_layer.gd` 的子件模式(材质独占、全幅 draw_rect、非零 alpha 触发);不复制其函数体 | 只此一件承载封印子件;微光层件零改动 | 挂 `BoardCellUnit` 之下;受 `edge`/`seal_on`/`fog_state` 三输入驱动 |
| 五枚常量 | 复用 `ui_kit.gd` 既有常量区与 `TYPE_GLOW_*` 命名先例 | 全仓唯一定义点,着色器只读注入;代码内禁第二处字面值 | 参数单点,与 art-bible §8.2 对照 |
| `seal_mark_params_test.gd` | 复用 `tests/unit/presentation/` 目录约定与 `run_all.gd` 注册表 | 只此一件守封印参数与门控 | 单元层,不触渲染 |
**无新增 core 件、无新增数据表、无新增场景**;`game/tests/README.md` 判定零新增(理由见第 5 节)。
## 13. 独立验收审计
- **入口**:`reports/iter<N>-验收审计-<日期>.md`;由未参与实现的会话或子代理执行(test-conventions §9.7)。
- **审计面**:第 8 节七行逐行核「真实入口是否绕过改动点」+代码域闸真跑回执+第 5 节退役面 sweep 结果。
- **未过不得合并**;审计结论进实现报告收尾节。
@@ -1,291 +0,0 @@
# 需求卡片:架构审查 5.1 封装修复批(2026-11-03)
来源:待办清单「架构审查优化讨论——全库架构审计读数的逐项裁决与整改分批(2026-10-29 登记,来源=审计发现)」条目 5.1 部分(**唯一事实源**:reports/处置-架构审查5.1封装修复-2026-11-03.md——处置记录与本卡并行成文,本卡开工时该件尚未落盘;T1 首步核其已落盘且与本卡第 3 节逐条一致,冲突即 L3 停卡。设计闭合凭据=2026-11-03 设计讨论会话裁决+审计报告 §5.1+architecture.md:119/:124/:137-146)。
状态:已写卡(v1.1,2026-11-03 修订——godot-master 终审两中等发现与四低项折入+SlotStore→SaveManagerCore 反向私取终审补查并入 T3;处置记录已落盘并与本卡第 3 节核过一致)。改动面:游戏代码(含随逻辑写/改的测试代码)。
## 1. 目标与完成定义
**这批做什么**:把 2026-11-03 设计讨论裁决的五处跨对象私有访问修复方案全部落码——封装收口、零行为变更:
| # | 处置对象 | 现状 | 终态 |
|---|---|---|---|
| 1 | settlement 七段 → 编排器 | 七文件对编排器 `oc._` 私取 105 行/107 处/19 符号(本卡第 3 节 grep 实核) | 段类构造收引用束(六子对象+编排器公开协作件引用)+七个编排器方法回调(Callable 交付)+公开读数注入;段类对编排器引用归零 |
| 2 | 编排器五个放错位置的方法 | `_hero_atk`/`_feat_yield_adjust`/`_harmful_variants`/`_harmful_adjacent`/`_hits_of` 留宿主、段类经宿主引用直调(architecture.md:145「现状形态」) | 各归领域宿主(伤害域/奖励域/地形棋盘域),宿主原方法删除禁留壳 |
| 3 | adventure_runner → BreakpointStore | `_bp_store._` 直读写 37 处(32 行;adventure_runner.gd:37 注释自述「宿主读写经件」未落实) | BreakpointStore 公开方法面承接,宿主私取清零 |
| 4 | save_manager ↔ SlotStore | save_manager→SlotStore:`slots._path` ×8+`slots._migrate_legacy_save` 私有方法调用 ×1(save_manager.gd:51/66/69/105/111/118-119/285-286);SlotStore→SaveManagerCore 反向私取约 13 处(slot_store.gd:26-28/38-39/61-76/92-97/119/129/134/159-162——直用 `_save._read_only`/`_reset_to_default`/`_data`/`_rename_overwrite`/`_peek_summary_at`,godot-master 终审补查) | save_manager 侧=SlotStore 公开读投影 `active_path()`+迁移方法公开化承接;SlotStore 侧=SaveManagerCore 补公开方法面承接(T3 定死) |
| 5 | grant_segment → BattleFxHost;config_db → 三表容器 | grant 直写 `fx_host._fx_new_resource_types`(:82/:84)与 `fx_host._fx_bonus_delta`(:169-170/:378-379)共 6 行;config_db.gd:157-159 三行装配直写三表 `_resolver` | BattleFxHost 两个公开累积方法;三表 schema 各加公开挂载方法 `bind_resolver` |
**什么状态算完**:五处的每一条改动都落码、都有第 8 节对照表配对的验收断言在当轮真实跑批中通过;主证=同种子逐项比对(改前改后动作序列快照逐位同,T1 固化、全程保持绿)+battle_settlement 套件全绿;结构性证据=core 五处跨对象私取 grep 恒零(扫描面非空前置+零命中);代码域闸全绿(冒烟+单元+探针+渲染/静态);两份 reports/ 产出物(实现报告+反哺点清单)写齐。
**排序义务**:本卡实现排队在 reports/需求卡片-架构审查3.1+3.2整改批-2026-11-02.md 之后(已编迭代 50,未开工)——combat_segment.gd 同文件避让(该卡甲案删 attack_segments 分支 :59-70,本卡第 3 节 combat 行号在其合回后漂移,T1 复核以 grep 符号锚定位)。
## 2. 设计事实源
- **处置记录(输入合同,逐条一致)**:`reports/处置-架构审查5.1封装修复-2026-11-03.md`——五处裁决方案、段类终态、出卡边界。本卡第 3 节现状实查与第 4/7 节签名设计是其机械承载;T1 复核两件一致(冲突=上游缺陷,L3 停卡)。**口径注**:处置记录「公开读数一并改注入」=形态族措辞,涵盖本卡第 4 节「调用参数现值交付」(round_index/battle_result 两变值标量构造期注入必陈旧——现值交付即注入的形态之一),T1 核对不按字面机械比对、按此口径核。
- **审计背景**:`reports/审计-全库架构审查-2026-10-29.md` §5.1(settlement 五段类直读写编排器私有成员 20+ 处;行号已漂移,以本卡第 3 节实查为准)。
- **架构登记**:`design/engineering/architecture/architecture.md`——:119(battle_orchestrator 保留面与 B1 域文件集)、:124(BoardInstaller 引用束注入先例——「构造=引用束注入(……防 _init max-parameters 新键)」)、:137-146(战斗编排域拆件定稿::140 轴丙、:141 编排器保留面登记、:143 跨件单向接线、:145 段类随动现状句)。
## 3. 现状事实(2026-11-03 worktree arch51-card 实查,基点 6261b36e;开工自行复核)
### 3.1 五处私取面盘点
**处 1·settlement 七段 → 编排器**(game/core/settlement/):`grep -c 'oc\._'` 逐文件=grant_segment 54/combat_segment 23/round_cycle 10/verdict_segment 9/battle_refresh_flow 5/aura_segment 2/decay_segment 2,合计 **105 行**;`grep -o "oc\._[a-z_]*" | wc -l`=**107 处**(grant:131 与 grant:424 两行各含 2 处);符号 19 种=`_facts`×24、`_enemy_system`×22、`_damage`×18、`_emit_row`×16、`_reward_economy`×5、`_hits_of`×5、`_status_effects`×2、`_feat_yield_adjust`×2、`_emit_composition_effects`×2、`_battle_over`×2、`_rounds`×1(:42 `oc._rounds._grant_seg` 跨两层)、`_install_and_reset`×1、`_hero_atk`×1、`_harmful_variants`×1、`_harmful_adjacent`×1、`_fx_host`×1、`_fatal`×1、`_exit_distribution`×1、`_emit_settlement_snapshot`×1。另有对编排器**公开**成员访问:action_economy×11、db×7、minesweeper×6、round_index×3、fx_host()×3、battle_result×2、rng×2、attune_param_sum()×1(grant:280)、perfect_sweep_earned()×1(grant:284)。
**处 2·搬家五方法**(均在 battle_orchestrator.gd,仅段类与编排器自用):
| 方法 | 现址 | 调用面 |
|---|---|---|
| `_hero_atk() -> int` | battle_orchestrator.gd:70-71(读 `_facts.encounter` hero_atk 键、缺省 db.combat.hero.atk——E4 派生读,禁快照成员) | combat_segment:55;编排器 spawn 消费点 :282;测试 roll_multiplier_test.gd:45-59 经真实链路覆盖(零直调) |
| `_feat_yield_adjust(snap, positive, pos_m, neg_m)` | :452-461(读 `_reward_economy.polarity_row`) | grant_segment:99/:140 |
| `_harmful_variants(vids)` | :466-473(读 db.combat.variation) | grant_segment:87;_harmful_adjacent 内部 :484 |
| `_harmful_adjacent(cell)` | :478-485(读 minesweeper.current_board) | grant_segment:339 |
| `_hits_of(hits, kind)` | :489-494(纯过滤) | grant_segment:110/:115/:138/:356、combat_segment:62(该行随 3.1+3.2 批甲案删除)、测试 adventure_feats_test.gd:671/:691/:727 |
**处 3·adventure_runner → BreakpointStore**:`grep -o "_bp_store\._[a-z_]*" | wc -l`=**37 处**(32 行)=`_resume_bp`×8、`_pending_next_level`×7、`_save_manager`×6、`_bp_read`×5、`_loadout_seeded`×5、`_last_level_payload`×4、`_last_treasure_cleared`×2。分布:adventure_runner.gd:107/:115/:157/:168/:180/:185/:189/:191/:201/:220/:235/:241/:300-302/:325-326/:376-378/:388/:412/:421/:430/:438/:456/:464/:467-468/:474-476。BreakpointStore(breakpoint_store.gd)类变量 15(:48-63——**贴顶禁再增**,architecture.md:113 同款登记);公开方法现 5(snapshot/restore_ledger/restore_curio_state/apply_resume_params/restore_stop_bank_fragments);`_bp_read`(:196-202)内部消费点 :160。测试面:feat_vouchers_test.gd 与 meta_progression_forge_test.gd 等 12 处 `orch._rounds._grant_seg._judge_seal(...)` 直调与 `orch._rounds.mines_hits` 7 处——`_grant_seg`/`mines_hits` 成员名与归属不变,零波及。
**处 4·save_manager ↔ SlotStore(双向)**:save_manager→SlotStore=save_manager.gd:51(`slots._migrate_legacy_save(LEGACY_SAVE_PATH, slots.slot_path(1), ...)`)+:66/:69/:105/:111/:118/:119/:285/:286(`slots._path` ×8)。SlotStore→SaveManagerCore 反向私取(godot-master 终审补查,2026-11-03 本会话 grep 精确实数)=**21 处/21 行**:`_save._read_only`×8(:26/:38/:65/:69/:74/:87/:91/:96)、`_save._reset_to_default`×5(:28/:39/:70/:92/:119)、`_save._data`×4(:66/:75/:88/:97)、`_save._peek_summary_at`×2(:129/:134)、`_save._rename_overwrite`×2(:159/:162)。SlotStore(slot_store.gd)`_path` :9;`_migrate_legacy_save` :150-163(唯一外部调用方=save_manager:51;件内零调用);公开读投影先例=`has_write_target()` :53-54(`_path != ""`)。SlotStore 类变量 4、公开方法 10。SaveManagerCore 私有被用面五成员=`_read_only` :23、`_data` :24、`_reset_to_default` :279、`_peek_summary_at` :217(save_manager 件内调用方 :217 定义、slot_store 两处外部)、`_rename_overwrite` :317(件内调用方 :118/:286);公开方法现 7、类变量 5。
**处 5·grant_segment → BattleFxHost+config_db → 三表容器**:grant_segment.gd:82-84(`fx_host._fx_new_resource_types.has(ctype)` 读+`[ctype] = true` 写——空串短路边界在 :82)与 :169-170、:378-379(`fx_host._fx_bonus_delta.has(axis)` 守卫+`[axis] += delta`)。BattleFxHost 类变量 15(battle_fx_host.gd:23-37——**贴顶禁再增**,头注 :10-16 自封)、公开方法 16、两私 members 无成员外读者(grep 全库仅 grant 四处)。config_db.gd:157-159 三行 `combat.board_gen._resolver = _resolver`/`combat.enemy._resolver = _resolver`/`run.difficulty._resolver = _resolver`;三表 `_resolver` 声明=board_gen_table.gd:113、enemy_table.gd:212、difficulty_table.gd:33(均无类型注解;消费点 :118/:217/:38)。表实例经 `load()` 出 .tres、无法带构造参,装配期注入是唯一时点(config_db.gd:131-159 `_assign_loaded`)。
### 3.2 写 T 卡依据的其他现状
- **段类现状形态**:五段构造=grant/combat 三参(host/fx_host_ref/reward_grant_ref)、aura/decay/verdict 单参(host);RoundCycle 三参直构(host/fx_host_ref/reward_grant_ref,round_cycle.gd:22-29);battle_refresh_flow 全 static(can_refresh/execute 收 `oc` 入参,:15-43)。编排器 `_init`(battle_orchestrator.gd:211-237)建件序=facts(218)→reward_economy(219)→damage(221)→fx_host(223)→reward_grant(225)→RoundCycle(237);类变量 15(38→15 后贴顶)。
- **编排器回调宿主方法现签名**:`_emit_row(head, ri, display, value, extra)` :750;`_fatal(msg)` :791;`_install_and_reset(during_round := false) -> bool` :392;`_battle_over(result)` :610;`_exit_distribution()` :575(内含 :593 `_rounds.roll_round_actions()`);`_emit_settlement_snapshot(verdict)` :534;`_emit_composition_effects(side, ri)` :524;公开读投影先例=`_attune_safe_seen_read` :139(RewardGrant attune_safe_seen_cb)、`_pool_effective` :513(pool_effective_cb)——**读投影 Callable 交付是既有形态**(architecture.md:121)。
- **编排器三调用点**:`can_refresh()`/`player_request_refresh()` 单行转发(:598-607);`_on_round_end` → `_rounds.settle_if_due()`(:445-447);begin_battle → `_rounds.roll_round_actions()`(:262)。facade 公开签名零参(presentation 路径)。
- **测试连带面**:settle_segments_test.gd:20-24 五段 `new(oc, ...)` 直构断言、:28-34 宿主回指断言(`oc._rounds._grant_seg.oc == oc` 等 6 条)——随束形态换代改写;adventure_feats_test.gd:671/:691/:727 `orch._hits_of` 直调——随搬家改指。其余 orch._ 访问(`_facts`×6、`_rounds`×13、`_emit_row`×2)所涉宿主成员全保留,零波及。round_flow_skill_pool_test/seal_polarity_test/refresh_feats_test/effect_port_test 等走公开入口,零改写。
- **gdstyle 基线**:tools/gdstyle_baseline.txt 仅 5 键(adventure_runner 类变量 23、level_runner 两键、board_view 两键)——本卡触件均无登记值,T1 现场读数即对账基线。S13 默认阈值:公开方法 ≤20/类变量 ≤15/单函数分支 ≤8/返回 ≤6。
- **静态闸**:S7_B1_SET 与 S8_FILES(game/tests/static_scan.sh:317/:361)已含七段文件——本批零闸件改动。S9 R1A 判据=`var x: Dictionary|Array` 裸注解(tools/audit_type_hints.py:22)——新增成员一律具体类名或参数化泛型。
- **能力清单**:game/tests/README.md 在役(本卡判据引用行=:59/:63/:86/:89/:92/:124/:174,能力名见第 8 节对照表)。
## 4. 设计契约(违反即返工红线)
- 🔴 **逐条一致**:本卡一切内容与处置记录逐条一致;实现段发现卡面与处置记录冲突=上游缺陷,停卡退回写卡段(L3)。
- 🔴 **零行为变更**:同种子同输入下动作序列、明细行流、结算快照、信号顺序逐位一致(T1 golden 主证全程保持绿);RNG 消费序零漂移(behavior_roll/encounter/fx_reveal/gp_drop 四封闭流的流名、开流时点、取号序逐字);明细行协议词表零触碰。
- 🔴 **段类对编排器引用归零**:七个 settlement 文件(grant/combat/round_cycle/verdict/battle_refresh_flow/aura/decay)全文 `\boc\b` 标识符零命中(含头注与行内注释——随改写一并清除)。
- 🔴 **编排器保留面零增减**:architecture.md:141 登记原样——战斗状态机与生命周期、行发射基建(_emit_row/_assert_row_source/_fatal)、呈现投影、刷新面、nest_preview_count。七回调的宿主方法体零改动(Callback 交付不搬家:_emit_row/_fatal/_install_and_reset/_battle_over/_exit_distribution/_emit_settlement_snapshot/_emit_composition_effects 全部留宿主)。
- 🔴 **搬家五方法禁留壳**:宿主原方法删除,禁兼容别名、禁转发壳、禁注释化残段(第 13 节全款适用)。
- 🔴 **束形态(引用束注入,BoardInstaller 先例 architecture.md:124)**:
- **编排器束**(`_init` 组装一个 `Dictionary`,封闭 20 键):`facts`/`units`/`damage`/`status_effects`/`reward_economy`/`reward_grant`/`fx_host`/`minesweeper`/`db`/`action_economy`/`rng` + `emit_row_cb`/`fatal_cb`/`install_cb`/`battle_over_cb`/`exit_distribution_cb`/`emit_snapshot_cb`/`emit_composition_cb` + `attune_param_sum_cb`/`perfect_sweep_cb`。前 11 键=六子对象(BattleFacts/UnitContainer/DamageController/RewardEconomy/StatusContainer/BattleFxHost)+四个既有公开协作件引用(minesweeper/rng/reward_grant——段类现役消费面所需)+两公开读数引用(db/action_economy);后 9 键=七个编排器方法回调(Callable 绑宿主对应方法)+两个公开读投影回调(`attune_param_sum(kind) -> int`/`perfect_sweep_earned() -> bool`——RewardGrant attune_safe_seen_cb/pool_effective_cb 同款先例)。
- **接收方各取所需**:RoundCycle 收全束并分发五段(各段构造收同一束);RoundCycle 解包自用七键(facts/units/fx_host/db/action_economy/rng/emit_row_cb);各段断言各自必需键在束(BattleFxHost :41-42 assert 缺键先例)。必需键分配=grant 12(facts/units/damage/reward_economy/fx_host/minesweeper/db/action_economy/reward_grant/emit_row_cb/attune_param_sum_cb/perfect_sweep_cb)、combat 10(facts/units/damage/status_effects/fx_host/minesweeper/db/emit_row_cb/fatal_cb/reward_grant)、aura 1(emit_composition_cb)、decay 2(status_effects/emit_row_cb)、verdict 5(units/emit_row_cb/emit_snapshot_cb/battle_over_cb/exit_distribution_cb)。
- **换图刷新流程件同批同形**:BattleRefreshFlow 由 static(oc 入参)改实例——`_init(bundle: Dictionary)` 收 8 键(facts/db/action_economy/fx_host/reward_economy/minesweeper/install_cb/grant_seg);can_refresh/execute 两入口的 `oc` 入参改依赖交付,编排器两公开方法单行转发形态不变(architecture.md:123)。grant_seg 键=段间引用(RoundCycle 构造五段后写入副本束再建本件——授予段引用直接交换图流程件,`oc._rounds._grant_seg` 跨两层私取随之消灭)。
- **公开读数注入**:db/action_economy=引用注入(构造期稳定);round_index/battle_result=**调用参数现值交付**(两标量每拍变值,构造期值注入必陈旧)——`settle_if_due(battle_result: String, ri: int)`、`roll_round_actions(ri: int)`、`can_refresh(battle_result: String)`、`execute(battle_result: String, round_index: int)`,编排器调用点传现值(:262/:447/:593/:598-607 四处),facade 零参签名不变。
- 🔴 **跨件单向接线**:段类↔编排器只经束注入(引用+Callable),禁双向强引用;注入 Callable 亦属接线面、禁为省参数改持对象引用(architecture.md:143 同款;段类/编排器均 RefCounted,环引用随每战新建泄漏)。
- 🔴 **读投影消费形态**:Callable.call 返回 Variant,消费一律 `int(...)`/`bool(...)` 包裹(battle_fx_host.gd:128 facts_cb.call 消费先例)。
- 🔴 **S9 参数化形态**:本批全部新增成员声明与函数注解——具体类名(`var facts: BattleFacts`)或参数化泛型(`Dictionary[Variant, Variant]`);裸 `Dictionary`/`Array` var 注解=S9 R1A 红。迁移函数(五方法)注解逐字保持原形(原签名已过 S9)。
- 🔴 **fail-fast**:束缺键 assert 致命;零软回退。Core 零 UI 依赖不破(全套件 `--headless --script` 可跑通)。
- 🔴 **测试纪律**:禁变异类测试、禁撤销类取证;禁删断言/放宽阈值换绿(第 8 节申报清单之外零删改)。
## 5. 范围边界
**收件**=第 1 节表五行全部(settlement 七段解耦+搬家五方法+breakpoint_store 公开面+存档双向公开面〔save_manager↔SlotStore 两方向〕+battle_fx_host 两累积方法+三 schema 挂载方法,及各自的调用点改址与测试适配)。
**不收件**(去向已指认):
- presentation 层约 227 行私取面——**另开设计讨论**(本卡裁决范围外;去向=待办清单本条目实况,非本批)。
- sim/probe/tests 的测量面直构惯例与测试受控例外——零清扫(orch._facts/orch._rounds/orch._emit_row 等测试直连维持现状)。
- 段类→协作件残余私取一处:grant_segment.gd:197 `oc._damage._emit_hero_damage_taken(...)` 随本批改经 `damage.emit_hero_damage_taken(...)`(DamageController 该方法去下划线公开化,见 T2)——除此之外段类对 damage/fx_host/reward_grant 公开成员的直读(counters_ctx/engine/facts_inject/defer)零触碰。
- 职责归属零改动(除搬家五方法——已裁的五处归位);编排器七回调宿主方法体零改动;架构七段结构零改动(五段段序、SettlementTable.segment_order、RoundCycle/BattleRefreshFlow/五段段类的文件与职责登记全部在案不动)。
- 闸件(static_scan.sh)零改动;MC/模拟零跑(无数值改动);`tools/gdstyle_baseline.txt` 零改动(本批无键恶化,见第 14 节)。
## 6. 关联文档同步面
实现批禁写 `design/` 整个目录、两份根流程清单与 `game/tests/README.md`;下表每条的落文义务全部进 `reports/iter<N>-反哺点-<日期>.md`(N=编排段定),由用户裁决后归文档批落文:
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务(反哺点清单逐条承载) |
|---|---|---|
| design/engineering/architecture/architecture.md | :125 RoundCycle 行「三参直构(host/fx_host_ref/reward_grant_ref——五段构造透传不落成员)」→ 束注入+持有 BattleRefreshFlow+公开方法 3→4+类变量 8→15(贴顶);:123 BattleRefreshFlow 行 static 两入口收 oc → 实例束注入、宿主改经 RoundCycle 交接 grant_seg、类变量 0→8;:127 settlement/ 五段段类行构造形态句 → 束注入、对编排器零引用;:122 damage_controller 行实测类变量 12→13+公开面净增(hero_atk/hits_of/emit_hero_damage_taken);:121 RewardGrant 行 +feat_yield_adjust;:120 BattleFxHost 行 +两累积方法(类变量 15 不变);核心层表 A2 minesweeper_rules 行公开面 18→20(贴顶);核心层表 breakpoint_store 行公开方法面 5→18;核心层表 save_manager 行公开面 7→14(+5 承接方法+peek_summary_at/rename_overwrite 两更名公开化)+slot_store 行「双向公开面」(21 处反向私取清零) | 反哺点清单逐条列行号与改后登记内容——**机械面文档禁直改** |
| design/gdd/systems/战斗循环/战斗结算.md | 无陈述变化(明细流水词表、五段段序、段边界全部零触碰——零行为变更批) | 反哺点清单写「零反哺」确认行 |
| 术语表 | 无新术语(引用束注入/读投影/公开方法面均仓库现行词) | 确认行「零新增术语」 |
(机检口径:本表同步义务格无一条写「随批」。)
## 7. 任务卡 T1..T5
### 卡前·文件结构图
全部行为面=非行为改动(零行为变更批),行标【非行为】+对照表 R 行号;测试件全部为随逻辑写/改的测试代码。一起改的按职责放一起——段类七文件同卡(T2)、存档断点两对同卡(T3)。
```
core 层(编排域)
game/core/battle_orchestrator.gd 【非行为 R1/R2】_init 束组装(20 键);:70-71/:452-461/:466-473/:478-485/:489-494 五方法删除;:282 hero_atk 改指 _damage.hero_atk();:262/:447/:593 三调用点传参;:598-607 facade 改经 _rounds.refresh_flow()
game/core/settlement/round_cycle.gd 【非行为 R1】束注入(15 成员贴顶)+持有/构建 BattleRefreshFlow+settle_if_due/roll_round_actions 签名扩展+refresh_flow() 读出口
game/core/settlement/grant_segment.gd 【非行为 R1/R2/R3】束解包 12 成员+54 处改址+:82-84/:169-170/:378-379 改公开累积方法+头注改写
game/core/settlement/combat_segment.gd 【非行为 R1/R2】束解包 10 成员+23 处改址+hero_atk 改指
game/core/settlement/aura_segment.gd 【非行为 R1】单回调成员+头注改写
game/core/settlement/decay_segment.gd 【非行为 R1】两成员+改址
game/core/settlement/verdict_segment.gd 【非行为 R1】束解包 5 成员+四回调改址
game/core/settlement/battle_refresh_flow.gd 【非行为 R1】static 改实例+束注入 8 成员+grant_seg 段间引用
game/core/damage_controller.gd 【非行为 R2】+facts 成员(12→13)+hero_atk()+static hits_of()+_emit_hero_damage_taken 公开化(:449/:561 内部调用点随改)
game/core/reward_grant.gd 【非行为 R2】+feat_yield_adjust()
game/core/minesweeper_rules.gd 【非行为 R2】+harmful_variants()/harmful_adjacent()(公开 18→20 贴顶)
game/core/battle_fx_host.gd 【非行为 R3】+mark_new_resource_type()/+add_bonus_delta()(成员 15 不变)
core 层(冒险/存档域)
game/core/breakpoint_store.gd 【非行为 R4】+13 公开读写方法面(成员 15 不变;_bp_read 更名 bp_read 公开化——:160 内部调用点随改)
game/core/adventure_runner.gd 【非行为 R4】37 处改址(:107..:476 逐处)
game/core/save_manager.gd 【非行为 R5】+5 公开方法(set_read_only/read_only/reset_to_default/data_snapshot/restore_data)+_peek_summary_at/_rename_overwrite 更名公开化(件内调用点随改);:51/:66/:69/:105/:111/:118-119/:285-286 九行改址
game/core/slot_store.gd 【非行为 R5】+active_path();_migrate_legacy_save 更名 migrate_legacy_save 公开化;反向私取 21 处改址(_save._ → save_manager 公开面)
game/core/config_db.gd 【非行为 R6】:157-159 三行改经 bind_resolver()
game/data/schemas/board_gen_table.gd 【非行为 R6】+bind_resolver(resolver: ConfigDbResolver)
game/data/schemas/enemy_table.gd 【非行为 R6】同上
game/data/schemas/difficulty_table.gd 【非行为 R6】同上
测试件(随逻辑写/改)
tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd 【非行为 R1·新增】同种子逐项 golden 对拍(主证)
tests/unit/core/encapsulation_sweep_test.gd 【非行为 R1–R6·新增】五处结构性零命中扫描(非空前置+正锚)
tests/unit/core/settle_segments_test.gd 【非行为 R1】:20-34 束构造与同一性断言适配
tests/unit/core/adventure_feats_test.gd 【非行为 R2】:671/:691/:727 hits_of 改指 DamageController.hits_of
tests/run_all.gd 【非行为】manifest +2 行(snapshot/sweep)
文档件
game/tests/README.md 写卡段判断=零编辑(第 8 节能力行判断依据)——实现批禁写,批末只核对表上能力名与对照表引用一致
```
---
**T1 基线固化与主证落盘**(估时 0.25 工作日;区间 0.25–0.5)
取用:无(本卡起点)。产出:golden 基线(改前读数冻结)+S13 对账基线+grep 底账;本卡实现排序核对。
- [ ] 核对实现排序在案:3.1+3.2 卡(迭代 50)未合回则本批不开工(第 1 节排序义务);combat_segment.gd 现址复核(甲案 :59-70 分支已删则以 grep 符号锚定位,行号漂移即记录进实现报告,禁改判据)
- [ ] 核对处置记录 `reports/处置-架构审查5.1封装修复-2026-11-03.md` 已落盘且与本卡第 3 节逐条一致(冲突=L3 停卡)
- [ ] 新增 tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd(extends SceneTree+Kit.check 主通道,全类型标注):手搭驱动=`ConfigDbScript.new()`+`load_tables("res://data/tables", true)`→`RngServiceCore` set_master_seed(4242)→`BattleOrchestrator.new(db, rng)`;捕获面=`step_row` 全量行数组+`settlement_snapshot` 全量载荷数组+`battle_finished` 载荷+收束时 `presentation_snapshot()` 关键键(round/battle_result/hero.hp/enemies.size())。驱动序(逐字定死):①`begin_battle({"level_index": 1, "node_depth": 1, "hero_hp": int(db.combat.hero.max_hp), "voucher_rap": 20})`;②轮 1:`AutoPlayer.choose_dig(minesweeper)` 返 `{dig_cell, hero_cell}` 非空则 `settle_batch([{"action": "move", "cell": hero_cell}])`→`settle_batch([{"action": "dig", "cell": dig_cell}])`→对首个未揭示且与主角相邻的格 c `settle_batch([{"action": "seal_place", "cell": c}])`(封印已揭示格在棋盘面必拒〔target_revealed〕——封印子链 _judge_seal_hit/_seal_hit_effects/_judge_seal_miss 及封印匠/示警烟火/完美保险扩展行必须真实进入 golden 行流;「封已揭示安全格」的拒绝路径由 seal_polarity_test 既有回归兜底,不入 golden 主证)→`settle_batch([{"action": "stop"}])`;③轮 1 结算后 `player_request_refresh()`(voucher_rap=20 保证 RAP 抵折后价——覆盖换图刷新链:can_refresh/execute/install_cb/grant_seg 成功事实);④轮 2:choose_dig 一挖一停;⑤轮 3:径直 `settle_batch([{"action": "stop"}])`。断言=捕获序列与 `const GOLDEN`(行字典逐位含 type/source_class/origin_cell/round_index/display_name/value/其余载荷键)逐位相等〔封装5.1 V1〕
- [ ] **改前取数**:本步骤在任何生产码改动之前执行——先写测试与空跑转储通道(GOLDEN 为空时打印捕获序列 JSON 后按预期码退出),在未改树上跑出 golden、填入 GOLDEN 常量、复跑全绿;golden 即改前基线读数(不构成验收,验收=改后全程保持绿)
- [ ] S13 对账基线:对本卡全部 core/data 存量触件(第 14 节清单 15 件)现场跑 gdstyle 记读数为基线(既有登记仅 adventure_runner 类变量 23 一件照登对账);跑 `python tools/run_smoke.py` 冒烟基线全绿读数落实现报告
- [ ] grep 底账五件落实现报告:`oc\._`(settlement 七文件)、`_bp_store\._`(adventure_runner)、`slots\._`(save_manager)、`_save\._`(slot_store——反向私取 21 处)、`_fx_new_resource_types|_fx_bonus_delta`(grant)与 `\._resolver =`(config_db)——命中行号清单=T5 sweep 的改前底账
**T2 settlement 七段解耦+搬家五方法**(估时 1.25 工作日;区间 1–1.5)
取用:T1 golden 基线。产出:处 1+处 2 清零——段类对编排器引用归零、五方法归位。
- [ ] battle_orchestrator.gd `_init`(:211-237):RoundCycle 构造改 `RoundCycle.new(束)`——束 20 键逐字(第 4 节束形态表;Callable 键绑自对应方法:`"emit_row_cb": _emit_row`、`"fatal_cb": _fatal`、`"install_cb": _install_and_reset`、`"battle_over_cb": _battle_over`、`"exit_distribution_cb": _exit_distribution`、`"emit_snapshot_cb": _emit_settlement_snapshot`、`"emit_composition_cb": _emit_composition_effects`、`"attune_param_sum_cb": attune_param_sum`、`"perfect_sweep_cb": perfect_sweep_earned`)
- [ ] 搬家五方法落位(宿主体逐字迁移、注解逐字保持):
- damage_controller.gd:`_init` 加第五参 `facts_ref`(成员 `var facts: BattleFacts`,:49 构造体加行);新增 `func hero_atk() -> int`(体=battle_orchestrator.gd:70-71 逐字,`_facts`→`facts`);新增 `static func hits_of(hits: Array, kind: String) -> Array`(体=:489-494 逐字);`_emit_hero_damage_taken` 更名 `emit_hero_damage_taken` 公开化(体逐字;内部调用点 :449/:561 随改)
- reward_grant.gd:新增 `func feat_yield_adjust(snap: Dictionary, positive: bool, pos_m: int, neg_m: int) -> Dictionary`(体=:452-461 逐字——reward_economy 为本件既有成员 :22)
- minesweeper_rules.gd:新增 `func harmful_variants(vids: Array) -> Array` 与 `func harmful_adjacent(cell: Vector2i) -> Array`(体=:466-473/:478-485 逐字——db 为本件构造参、current_board() 自有;**:484 内部自呼 `_harmful_variants(board.variant_ids(n))` 随更名改 `harmful_variants(board.variant_ids(n))`,禁留旧名**)
- battle_orchestrator.gd:五方法整段删除(:70-71/:452-461/:466-473/:478-485/:489-494);:282 `hero_atk_override: _hero_atk()` → `_damage.hero_atk()`
- [ ] round_cycle.gd 重写:`_init(bundle: Dictionary)`——断言 7 必需键(facts/units/fx_host/db/action_economy/rng/emit_row_cb)后解包为同名成员;五段构造改 `XxxSegment.new(bundle)`;复制束写入 `"grant_seg": _grant_seg` 后构建 `BattleRefreshFlow.new(束副本)`;`settle_if_due(battle_result: String, ri: int)`(:35→参数、:40 删、段驱动用 ri);`roll_round_actions(ri: int)`(:67/:80 用 ri);新增 `func refresh_flow() -> BattleRefreshFlow`;全文 `oc.` 改址(映射表=`oc._facts`→`facts`、`oc._enemy_system`→`units`、`oc._emit_row`→`emit_row_cb.call`、`oc._fx_host`→`fx_host`、`oc.db`→`db`、`oc.action_economy`→`action_economy`、`oc.rng`→`rng`);头注「耦合边界」段改写(束注入+签名扩展+随编排器每战新建同灭语义不变)
- [ ] grant_segment.gd 重写:`_init(bundle: Dictionary)` 断言 12 键解包 12 成员(第 4 节分配表);54 处改址——除上表映射外加:`oc._reward_economy`→`reward_economy`、`oc.minesweeper`→`minesweeper`、`oc._hero_atk()`→(无此调用)、`oc._feat_yield_adjust(...)`→`reward_grant.feat_yield_adjust(...)`(:99/:140)、`oc._harmful_variants`→`minesweeper.harmful_variants`(:87)、`oc._harmful_adjacent`→`minesweeper.harmful_adjacent`(:339)、`oc._hits_of`→`DamageController.hits_of`(:110/:115/:138/:356)、`oc.attune_param_sum("rap_transfer_mult")`→`int(attune_param_sum_cb.call("rap_transfer_mult"))`(:280)、`oc.perfect_sweep_earned()`→`bool(perfect_sweep_cb.call())`(:284)、`oc._damage._emit_hero_damage_taken(...)`→`damage.emit_hero_damage_taken(...)`(:197);:82-84 改 `var is_new_type := fx_host.mark_new_resource_type(ctype)`;:169-170 与 :378-379 改 `fx_host.add_bonus_delta(String(h.get("axis", "")), int(h.get("delta", 0)))`;头注改写
- [ ] battle_fx_host.gd 新增两公开累积方法(成员零增,头注类变量封闭面句不动):`func mark_new_resource_type(ctype: String) -> bool`——`if ctype == "": return false`;`if _fx_new_resource_types.has(ctype): return false`;置位后 `return true`(空串短路边界=原 :82 形态逐位等价)。`func add_bonus_delta(axis: String, delta: int) -> void`——`if _fx_bonus_delta.has(axis): _fx_bonus_delta[axis] += delta`
- [ ] combat_segment.gd 重写:`_init(bundle)` 断言 10 键解包;23 处改址(映射同上+`oc._fatal`→`fatal_cb.call`、`oc._status_effects`→`status_effects`、`oc._hero_atk()`→`damage.hero_atk()`);`oc._hits_of` 行随 3.1+3.2 批已删——复核以 grep 为准;头注改写
- [ ] aura_segment.gd(成员 `var emit_composition_cb: Callable`,:15-16 改 `emit_composition_cb.call("hero", ri)`/`("enemy", ri)`)、decay_segment.gd(成员 status_effects+emit_row_cb)、verdict_segment.gd(成员 units+四回调,:18/:20 `units.hero_unit()`/`units.query_alive("enemy")`、:22 `emit_snapshot_cb.call(verdict)`、:25/:29 `battle_over_cb.call(...)`、:32 `exit_distribution_cb.call()`)三件重写+头注改写
- [ ] battle_refresh_flow.gd 重写:去 static——`_init(bundle: Dictionary)` 断言 8 键(facts/db/action_economy/fx_host/reward_economy/minesweeper/install_cb/grant_seg)解包;`_effective_refresh_cost()` 无参实例方法(:15-20 体逐字,`oc.db`→`db`、`oc.fx_host().fx_emit`→`fx_host.fx_emit`);`can_refresh(battle_result: String) -> bool`(:24-28 体逐字,`oc.battle_result`→参数、`oc._facts.refresh_used`→`facts.refresh_used`);`execute(battle_result: String, round_index: int) -> bool`(:32-43 体逐字——`oc._facts.refresh_used += 1`→`facts.refresh_used += 1`、`oc._reward_economy.retire_mapping()`→`reward_economy.retire_mapping()`、`oc.minesweeper.retire_board(true)`→`minesweeper.retire_board(true)`、`oc._install_and_reset(true)`→`bool(install_cb.call(true))`、`oc._rounds._grant_seg.apply_board_refreshed(oc.round_index)`→`grant_seg.apply_board_refreshed(round_index)`);头注「调用路径」句改写(编排器单行转发形态不变)
- [ ] battle_orchestrator.gd 收口::598-599 `return BattleRefreshFlow.can_refresh(self)`→`return _rounds.refresh_flow().can_refresh(battle_result)`;:606-607 →`return _rounds.refresh_flow().execute(battle_result, round_index)`;:262 `roll_round_actions()`→`roll_round_actions(round_index)`;:447 `settle_if_due()`→`settle_if_due(battle_result, round_index)`;:593 →`roll_round_actions(round_index)`;`can_refresh`/`player_request_refresh`/`_on_round_end`/`begin_battle`/`_exit_distribution` 五处体注释同步+:280-281 注释(「`_hero_atk` 派生读=受理后不变量」句引用将删除的方法名)随 :282 改指一并改写
- [ ] 测试适配:settle_segments_test.gd :20-24 五段直构断言改束形态(以真实编排器协作件组装束逐段 `new(bundle)` 成功断言);:28-34 宿主回指断言 6 条改同一性断言(`oc._rounds._grant_seg.facts == oc._facts`、`oc._rounds._combat_seg.fx_host == oc.fx_host()` 等——同一性强度对应回指,削减弱化申报 1);adventure_feats_test.gd :671/:691/:727 `orch._hits_of(...)` → `DamageController.hits_of(...)`(削减弱化申报 2)
- [ ] 孤立验证新增段 → 出红只跑红件最小单元 → 并入全套(回归措辞:里程碑卡出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认);本卡出口=golden 快照绿+battle_settlement 套件全绿+冒烟全绿
**T3 断点与存档公开面**(估时 0.625 工作日;区间 0.5–0.75)
取用:T1 底账。产出:处 3+处 4 双向清零。
- [ ] breakpoint_store.gd 新增公开方法面(13 个,成员零增——类变量 15 贴顶):`func bind_save_manager(sm: SaveManagerCore) -> void`、`func save_manager() -> Variant`(读投影,可 null)、`func set_pending_next_level(v: bool) -> void`/`func pending_next_level() -> bool`、`func set_loadout_seeded(v: bool) -> void`/`func loadout_seeded() -> bool`、`func set_resume_bp(bp: Dictionary) -> void`/`func clear_resume_bp() -> void`/`func resume_bp() -> Dictionary`(返引用零拷贝——宿主读侧只读)、`func bp_read(key: String, bp: Dictionary, fallback: Variant = null) -> Variant`(=_bp_read 更名公开化,:160 内部调用点随改)、`func set_last_level_payload(payload: Dictionary) -> void`/`func last_level_payload() -> Dictionary`、`func set_last_treasure_cleared(v: int) -> void`/`func last_treasure_cleared() -> int`(方法体一律一行转发自有成员,零逻辑增量)
- [ ] adventure_runner.gd 37 处改址(逐处)::107/:157/:180/:185/:241/:438 → `set_pending_next_level(...)`;:235 → `pending_next_level()`;:115/:191/:201 → `set_loadout_seeded(false)`;:300-301 → `loadout_seeded()`/`set_loadout_seeded(true)`;:189 → `set_resume_bp(bp.duplicate(true))`;:388 → `clear_resume_bp()`;:302/:376/:377/:378 → `resume_bp()`(读侧零拷贝语义不变);:168/:302/:377/:378/:412 `_bp_read` → `bp_read`;:220 → `bind_save_manager(sm)`;:325-326 → `var sm = _bp_store.save_manager()` 后 `if sm != null: first = not sm.meta_state.career_state()...`;:421 → `set_last_level_payload(payload.duplicate(true))`;:464/:467-468 → `last_level_payload()`;:430 → `set_last_treasure_cleared(...)`;:456 → `last_treasure_cleared()`;:474-476 → `var sm = _bp_store.save_manager()` 后 `sm.clear_breakpoint()`/`sm.write_to_disk()`;:37 头注自述句核改(「宿主读写经件」落实后注释与实态一致)
- [ ] slot_store.gd:新增 `func active_path() -> String: return _path`(读投影——has_write_target :53 同族);`_migrate_legacy_save` 更名 `migrate_legacy_save` 公开化(:150 体逐字;禁留旧名壳);**反向私取 21 处改址**(第 3.1 节处 4 清单):`_save._read_only` 写 4 处(:26/:38/:69/:91)→ `_save.set_read_only(false)`、读 2 处(:65/:87)→ `var prev_ro: bool = _save.read_only()`、恢复写 2 处(:74/:96)→ `_save.set_read_only(prev_ro)`;`_save._reset_to_default` ×5(:28/:39/:70/:92/:119)→ `_save.reset_to_default()`;`_save._data` 读 2 处(:66/:88)→ `var prev_data = _save.data_snapshot()`、恢复写 2 处(:75/:97)→ `_save.restore_data(prev_data)`(引用零拷贝语义不变——snapshot 返 `_data` 本引用);`_save._peek_summary_at` ×2(:129/:134)→ `_save.peek_summary_at(...)`;`_save._rename_overwrite` ×2(:159/:162)→ `_save.rename_overwrite(...)`
- [ ] save_manager.gd 新增公开方法面承接 SlotStore 反向私取(类变量零增;公开 7→14):`func set_read_only(v: bool) -> void`/`func read_only() -> bool`(体一行转发 `_read_only`)、`func reset_to_default() -> void`(体=:279 逐字公开化——件内调用点零改,同名);`func data_snapshot() -> Dictionary[String, Variant]: return _data`/`func restore_data(data: Dictionary[String, Variant]) -> void: _data = data`(零拷贝——还原引用);`_peek_summary_at` 更名 `peek_summary_at` 公开化(:217 体逐字;**件内调用点复核**——slot_store :129/:134 为外部消费,件内若另有调用随改);`_rename_overwrite` 更名 `rename_overwrite` 公开化(:317 体逐字;件内调用点 :118/:286 随改)
- [ ] save_manager.gd 九行改址::51 → `slots.migrate_legacy_save(...)`;:66/:69/:105/:111/:118/:119/:285/:286 `slots._path` → `slots.active_path()`(:118-119 两处同名调用间 `_path` 无变更窗口——单线程同步段,逐位等价)
**T4 效果宿主累积面与配置挂载面**(估时 0.375 工作日;区间 0.25–0.5)
取用:T2(grant 已改指)。产出:处 5 清零(本卡 T2 已落 grant 改址与 battle_fx_host 两方法——本卡复核其孤立验证读数)。
- [ ] 复核 T2 步骤中 battle_fx_host.gd 两方法与 grant_segment.gd 四处改址已落(T2 内联实装——本卡不重复列);孤立验证:grant_segment 相关套件(seal_polarity/round_flow)出红最小单元
- [ ] board_gen_table.gd / enemy_table.gd / difficulty_table.gd 各新增 `func bind_resolver(resolver: ConfigDbResolver) -> void`(体一行 `_resolver = resolver`;三件注解同型)
- [ ] config_db.gd:157-159 三行改 `combat.board_gen.bind_resolver(_resolver)` / `combat.enemy.bind_resolver(_resolver)` / `run.difficulty.bind_resolver(_resolver)`(_assign_loaded 装配序零变化)
- [ ] **三 schema 解析冒烟(类型环验证义务)**:bind_resolver 引入 schema→ConfigDbResolver 参数类型注解,与 resolver 既有反向引用(config_db_resolver.gd:41/:61 引 EnemyTable.ROW_KINDS/band_of——:3-8 头注「类型环断根」先例)构成类型引用环——孤立验证必含 config_db_resolver_test 全套当轮真实跑(三 schema 经 `load()` 实例化+resolver 注入+resolve_row/resolve_rowset/resolve_modifiers 真实解析,类型环若引入解析失败当轮即炸);出红即 L3 停卡(禁改走 type-hint: ignore 通道——保 schema 类型注解完整)
**T5 结构性扫描与批收口**(估时 0.375 工作日;区间 0.25–0.5)
取用:全部前卡。产出:五处结构性恒零证据+批收口两件。
- [ ] 新增 tests/unit/core/encapsulation_sweep_test.gd(extends SceneTree+Kit.check,全类型标注;源读取手法沿 player_copy_sweep_test 源 token 扫描先例)——七段断言组,全部带「扫描面非空前置+正锚」:
①七段文件集(settlement/ 七 .gd)逐件:文件存在且非空+含对应 `class_name` 正锚+`\boc\b` 全文零命中〔封装5.1 V2〕
②battle_orchestrator.gd:非空+`func _hero_atk|func _feat_yield_adjust|func _harmful_variants|func _harmful_adjacent|func _hits_of` 零命中(五方法零残留)〔封装5.1 V3〕
③adventure_runner.gd:非空+`_bp_store\._` 零命中+`_bp_store.bp_read(` 正锚(新面在用)〔封装5.1 V4〕
④save_manager.gd:非空+`slots\._` 零命中+`slots.active_path()` 正锚;slot_store.gd:非空+`_save\._` 零命中+`_save\.(set_read_only|read_only|reset_to_default|data_snapshot|restore_data|peek_summary_at|rename_overwrite)` 正锚〔封装5.1 V5〕
⑤grant_segment.gd:非空+`_fx_new_resource_types|_fx_bonus_delta` 零命中+`mark_new_resource_type(` 正锚〔封装5.1 V6〕
⑥config_db.gd:非空+`\._resolver\s*=` 零命中+`bind_resolver(_resolver)` 正锚〔封装5.1 V7〕
- [ ] run_all.gd manifest 追加 2 行:settlement_wiring_snapshot_test(expect 0,注记「R1 同种子逐项 golden 对拍主证〔封装5.1〕」)+encapsulation_sweep_test(expect 0,注记「R1–R6 结构性零命中扫描〔封装5.1〕」)
- [ ] **实现报告** `reports/iter<N>-实现报告-<日期>.md`:各卡状态+S13 键改前改后对账表(T1 基线逐件核)+golden 改前改后对拍读数+实现决定记录(代拍板白名单逐条回填)
- [ ] **反哺点清单** `reports/iter<N>-反哺点-<日期>.md`:第 6 节同步面表逐条落点(architecture.md 八行登记内容、GDD/术语确认行)
- [ ] 批末核对:game/tests/README.md 能力名与对照表引用一致(本卡零编辑);独立验收审计(第 8 节末)未过不合并;.uid 收口=`--editor --quit` 一次后确认 2 件新测试件 .uid 已生成随批提交
### 估时汇总
T1 0.25|T2 1.25|T3 0.625|T4 0.375|T5 0.375。
区间合计 2.25–3.75 工作日;**精确汇总 2.875 工作日**(切分预案:若 T2 超 1.5 工日,把 T3 切出为独立半日卡顺延,其余不动;合计超 3 工作日=超卡面估时域,须用户确认后方可续批)。
## 8. 验证闸(改动—验收对照表)
测试方式两分法:下表全部走**调试接口验证**(单元/集成套直构夹具与真实入口调用);**正常流程体验验证**=零项(零行为变更批,无目检点——实机观感逐位同改前)。判据全部绑被测改动特有的可观测提交面(同种子行流逐位/束引用同一性/源码零命中带非空前置与正锚)。
| 需求点 | 改动(文件:行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| R1 七段解耦+束交付 | settlement 七文件重写+battle_orchestrator 束组装与三调用点+RoundCycle/BattleRefreshFlow 形态换代 | settlement_wiring_snapshot_test.gd:_init 主对拍〔封装5.1 V1〕;settle_segments_test.gd 束构造与同一性断言;round_flow_skill_pool_test/seal_polarity_test/refresh_feats_test 既有全套回归 | 单元+集成 | `BattleOrchestrator.begin_battle()`→`MinesweeperRules.settle_batch()`→`player_request_refresh()`(全程公开入口) | 同种子行流与快照逐位同 golden(改前固化);段持注入引用==编排器实例同一性;`\boc\b` 七文件零命中 | 既有:轮内流与结算五段全序 |
| R2 搬家五方法归位 | damage_controller +hero_atk/hits_of/emit_hero_damage_taken 公开化+facts 成员;reward_grant +feat_yield_adjust;minesweeper_rules +harmful_variants/harmful_adjacent;编排器五方法删除+:282 改指 | settlement_wiring_snapshot_test〔封装5.1 V1〕(五方法消费路径全在行流内——主角攻击 base_value/奖励乘区/terrain_kind 事实/奥术矢开单);roll_multiplier_test.gd:_smoke_hero_atk_derived 既有回归;adventure_feats_test hits_of 面回归;encapsulation_sweep_test 编排器五方法定义零命中〔封装5.1 V3〕 | 单元 | `begin_battle()`(enc hero_atk override→spawn→攻击单)/授予段真实结算链 | 攻击单基值随 enc override 走(派生读贯通);行流逐位同;五方法宿主定义唯一(编排器零残留) | 既有:伤害公式与掷点乘区 |
| R3 grant→BattleFxHost 累积方法 | battle_fx_host +mark_new_resource_type/+add_bonus_delta;grant :82-84/:169-170/:378-379 改址 | seal_polarity_test/round_flow_skill_pool_test 既有全套回归(血税 bonus_delta 与地质学家 new_resource_type 两订阅行行为面);encapsulation_sweep_test grant 私键零命中+正锚〔封装5.1 V6〕 | 单元 | 授予段真实结算链(mine_hit/seal_hit fx 发射→施加面) | bonus_delta 轴累积值与 new_resource_type 首见判定逐位同;grant 源零私键直写 | 既有:封印与极性路由/不可逆 |
| R4 adventure_runner→BreakpointStore | breakpoint_store +13 公开方法面(_bp_read 更名 bp_read);adventure_runner 37 处改址 | save_rng_roundtrip_test.gd:_test_old_version_save_migrates_and_resumes+:_test_disk_roundtrip_preserves_breakpoint 既有回归(断点组装/回放/续玩全链真实入口);encapsulation_sweep_test `_bp_store\._` 零命中〔封装5.1 V4〕 | 单元+集成 | `AdventureRunner.resume_adventure()`/`start_adventure()`→`write_to_disk()`/`load_from_disk()` | 断点续玩逐位同(27 键冻结);adventure_runner 源零 `_bp_store._` 直读写 | 既有:旧档迁移链与断点续玩零跳号(集成) |
| R5 save_manager↔SlotStore 双向公开面 | save_manager→SlotStore=slot_store +active_path/_migrate 更名公开化+save_manager 九行改址;SlotStore→SaveManagerCore=save_manager +5 公开方法/2 更名公开化+slot_store 21 处改址 | save_manager_domain_test.gd:_smoke_save+save_slot_isolation_test 既有回归;encapsulation_sweep_test `slots\._` 与 `_save\._` 双向零命中+双正锚〔封装5.1 V5〕 | 单元 | `SaveManagerCore.write_to_disk()`/`load_from_disk()`/`_ready()` 迁移口/`SlotStore.activate_slot()`(三态恢复路径——read_only/data 快照还原)/`peek_slot_summary()`(窥视委托) | 写盘/读回/迁移/激活-恢复/窥视路径逐位同(tmp+rename 原子序、零拷贝还原语义不变);save_manager 源零 `slots._`+slot_store 源零 `_save._` | 既有:存档写盘⇄读回往返保真 |
| R6 config_db→三表挂载 | 三 schema +bind_resolver;config_db :157-159 改址 | config_db_resolver_test.gd 既有全套回归(_test_rowset_order_preserved/_test_row_kind_routing/_test_difficulty_clamp——resolver 注入后解析面逐位同);encapsulation_sweep_test `\._resolver =` 零命中+正锚〔封装5.1 V7〕 | 单元 | `ConfigDB.load_tables()`(装配段)→`ConfigDbResolver.resolve_*()` | 行集解析/难度 clamp 逐位同;config_db 源零 `_resolver` 直写 | 既有:行集寻址、行序保序与难度乘数 clamp |
**零行为改动面的证据义务**:本卡全部六行均为非行为改动(零行为变更批)——不设「行为改动」行;每行的零变更证明=T1 golden 同种子逐项比对(改前固化、改后全程绿)+既有套件零转红+结构性 sweep 恒零。能力行全部「既有」、零新增——判断依据:本批零行为变更=玩家可观测能力面零变化,无新能力可登记;受影响存量行的真实入口与代表用例名零变化(settle_segments_test/adventure_feats_test 文件名与其在册引用不变),故能力清单零编辑(批末核对义务在 T5)。**覆盖登记(test-conventions §8.3 新增 core 件覆盖登记义务,2026-11-04 并 master 后适配)**:本批触碰且曾被审计点名的三件按「经宿主链覆盖」申报——breakpoint_store=R4 行 `AdventureRunner.resume_adventure()/start_adventure()`→`write_to_disk()/load_from_disk()` 链+新增 sweep 源扫描;slot_store=R5 行 `SaveManagerCore.write_to_disk()/load_from_disk()/_ready()` 迁移口链;battle_fx_host=R1/R3 行 `begin_battle()` 全结算链;三件申报面之外零新增点名义务,meta_state_store 本卡零触碰。
**闸口径**:重闸=`tools/run_all_gates.sh` 按本批改动域选档(改动含 game/ 下非 .md 行为载体 → `--code`);所选域全绿才合并。卡内不写死闸件名单。回归措辞:里程碑卡(T 段)出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**测试削弱申报**(允许改/删的旧断言全清单;未申报的删改由独立验收审计判红):
1. settle_segments_test.gd:20-24 五段直构断言——构造签名换代(host 三参/单参 → 束单参),断言对象从构造签名改束构造成功;段类可独立实例化的断言意图保持,强度不减(R1)。
2. settle_segments_test.gd:28-34 宿主回指断言 6 条(`.oc == oc`)——段类对编排器引用归零后回指对象消失;改注入引用同一性断言(段持 facts/fx_host==编排器实例),装配面断言意图保持,强度不减(R1)。
3. adventure_feats_test.gd:671/:691/:727 `orch._hits_of(...)` → `DamageController.hits_of(...)`——方法搬家改址,断言内容(attack_bonus 命中过滤)零改动(R2)。
以上 3 条均为「随被测改动同步的引用形态迁移」,无一条删除断言或放宽阈值。
**独立验收审计**:入口=批末 T5 后、合并前;报告=`reports/iter<N>-验收审计-<日期>.md`;由没参与实现的会话或子代理执行,核对:对照表逐行断言真实存在且在当轮跑批通过、golden 改前改后对拍读数在案、测试削弱申报 3 条之外零删改、第 13 节无效成员零残留、S13 键只降不升对账。未过不合并。
## 9. 异常分级
- **L1 自救**:测试断言笔误、束键名拼写、注释错字、改址遗漏一处编译级报错的就地修复——就地改,记录进实现报告。
- **L2 记录继续**:行号 ±5 行内的漂移(以 grep 符号锚定位后继续);测试失败经排查属既有缺陷且与本批改动无因果——登记跳过并报用户。
- **L3 停机写报告等用户**:①卡面与处置记录冲突、或处置记录未落盘/与本卡第 3 节不一致(上游缺陷,退写卡段);②golden 改后读数与改前基线出现任何非预期漂移(零行为变更契约被破=上游缺陷停卡,禁就地调和);③束形态与 S13 预算互斥——任一触件成员数超第 14 节预算(RoundCycle 15/BattleFxHost 15/BreakpointStore 15/orchestrator 15 四贴顶件禁再增成员)=上游缺陷停卡退写卡段,禁实现段自行拆件或砍面;④实现中发现第 4 节未登记的第五处编排器私取消费面或搬家方法第 4 个调用方(行为语义不明,禁代裁);⑤机检键与卡片契约互斥(含 schema 校验/静态闸判据冲突)=一律停卡呈报,不得自造第三条路。
## 10. 代拍板白名单
- 测试内部夹具命名与组织(束组装辅助函数名、golden 序列化键序、sweep 正则的具体写法——判据面不变)。
- 注释与断言消息中文措辞微调(尾缀〔封装5.1 Vn〕与判别词保留)。
- 段类/编排器头注的改写措辞(模块介绍职责不变)。
- 束 assert 缺键报错文案(「引用束缺键」判别词保留)。
- 逐卡内「孤立验证→出红最小单元→并入全套」的执行顺序细节。
- T1 golden 转储通道的实现方式(打印格式/临时旗标,用后即删)。
超清单的决断记入实现报告「实现决定记录」节。
## 11. 待裁点
**零待裁点,开工门=U0**——五处修复方案、段类终态(六子对象+七回调+段间引用+公开读数注入+对编排器零引用)、搬家五方法宿主、出卡边界、排序义务均已在 2026-11-03 设计讨论会话由用户裁决;束键分配、回调精确签名、T 卡分解、验收断言由本卡写卡期实查定死(第 3/4/7 节)。本卡未新增任何备选案。
## 12. 落位与可复用性预检
**新增文件(2 件,全部测试件)**:
- tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd——为什么不能复用:同种子逐项 golden 对拍需冻结改前全行流为常量基线,既有套件(round_flow_skill_pool 等)断言的是段内序与行为面、无整流 golden;battle_settlement 目录落点(夹具对象=战斗结算全链);grep 同名零命中。驱动夹具复用既有件:ConfigDBScript 显式构造+AutoPlayer.choose_dig(roll_multiplier_test.gd:14-16 同款装配先例,引用不复制)。
- tests/unit/core/encapsulation_sweep_test.gd——为什么不能复用:五处结构性零命中是本批特有扫描面(七文件集+五方法残留+四处私取模式),player_copy_sweep_test 扫的是 presentation 文案面——**复用其源 token 扫描手法但不并件**(并件会让两批扫描面与尾缀语义混乱)。唯一落点 tests/unit/core;grep 同名零命中。
**新增函数/成员(逐条唯一性核查,grep 同名全库实核)**:
- `DamageController.hero_atk`/`hits_of`/`emit_hero_damage_taken`——编排器 `_hero_atk`/`_hits_of` 改名迁移非并存(禁别名);`_emit_hero_damage_taken` 去下划线公开化非新增体;`facts` 成员为该件第 13 个类变量(预算内)。grep `func hero_atk`/`func hits_of` 全库零第二处。
- `RewardGrant.feat_yield_adjust`——`_feat_yield_adjust` 改名迁移;RewardGrant 持 reward_economy 引用(:22 既有)故体零改动可行。grep 唯一。
- `MinesweeperRules.harmful_variants`/`harmful_adjacent`——改名迁移;db 为构造参(:44 既有)。grep 唯一。
- `BattleFxHost.mark_new_resource_type`/`add_bonus_delta`——新方法旧账面(成员零增);grep 同名零命中,命名与既有 apply_ac_bonus/counter_add 动词族同型。
- `SlotStore.active_path`——grep 全库零同名;has_write_target 同族读投影。
- SaveManagerCore 五公开面(承接 slot_store 反向私取)——`set_read_only`/`read_only`/`reset_to_default`/`data_snapshot`/`restore_data` grep 作方法名全库零第二处(现仅为成员名或私有方法);`peek_summary_at`/`rename_overwrite` 为私有方法更名公开化非并存(禁别名,第 13 节适用);`reset_to_default` 件内既有调用点同名零改。
- `BreakpointStore` 13 方法——grep `pending_next_level|loadout_seeded|resume_bp|last_level_payload|last_treasure_cleared|bp_read|bind_save_manager` 作为**方法名**全库零命中(现仅为成员名);成员到方法一一对应,无第二落点。
- 三 schema `bind_resolver`——grep 零同名;参数类型 ConfigDbResolver 与 config_db.gd:43 既有协作类同一实例。
- `RoundCycle.refresh_flow`——grep 零同名;读出口与 stats()/wallet() 组件出口先例同型(adventure_runner.gd:60-82)。
**复用既有(不新增)**:束注入形态=BoardInstaller/BattleFxHost/RewardGrant/BreakpointStore 四先例;读投影 Callable=attune_safe_seen_cb/pool_effective_cb/facts_cb 三先例;源扫描测试=player_copy_sweep_test 手法;manifest 登记=run_all.gd 既有条目族。零新增生产文件(全部落在既有件——架构七段结构零改动的直接后果)。
**分层与交互面**:段类→六子对象/协作件=既有 B1 域内调用关系(architecture.md:119 B2/B3/B4 全调用面唯一调用方=B1 域文件集——S7_B1_SET 已含七段,零新增跨域路径);段类→编排器=单向 Callable(禁双向强引用);三 schema bind_resolver=既有 config_db→schema 装配方向(:131-159 同向,禁反向);RngService 红线零触碰(本批零新增随机源);Core 零 UI 红线零触碰(全套件 --headless 可跑);数值单一事实源零触碰(零表改动)。
## 13. 禁为机检文本保留无效成员
本卡为重构类卡,全卡适用以下条款(code-conventions §1.1 ⑤同款):禁止为迎合机检消息文本(含计数、sweep 正则、grep 面)而保留或新增无效成员/别名/转发壳;搬家五方法宿主原方法删除后禁留同名或别名转发壳;`_migrate_legacy_save` 更名后禁留旧名壳;`_bp_read` 更名后禁留旧名壳;`_emit_hero_damage_taken` 公开化后禁留私有旧名;BreakpointStore 新方法面禁在成员外另立镜像账本。机检键与卡片契约互斥时(如 S13 贴顶件、sweep 正则与签名冲突),实现段一律停卡呈报,不得自造第三条路。
## 14. 实现规范预算
新增 .gd 文件仅 2 个测试件(SceneTree 测试脚本,全类型标注、零公开生产面——接口块预算余量充足)。生产代码全部落既有件,按「存量触面一查」逐件对账(S13 默认阈值:公开方法 ≤20/类变量 ≤15/分支 ≤8/返回 ≤6):
- **贴顶四件(禁再增成员,T1 读数锁定)**:battle_orchestrator.gd 15(本批成员零净增——五方法删除不涉成员);round_cycle.gd 8→15(束解包 7+_refresh_flow 1+既有 7——贴顶,头注记「贴顶禁再增」);battle_fx_host.gd 15(零增,方法-only);breakpoint_store.gd 15(零增,方法-only)。
- **类变量净增件**:grant_segment 3→12、combat_segment 3→10、verdict 1→5、aura 1→1、decay 1→2(两件现各持 oc 一员——aura 换单回调成员 1→1、decay 换两成员 1→2)、battle_refresh_flow 0→8、damage_controller 12→13——全部 ≤15。
- **公开方法净增件**:minesweeper_rules 18→**20 贴顶**(+2)、damage_controller 9→12(+hero_atk/hits_of+emit_hero_damage_taken 公开化——2026-11-03 终审实核现值 9)、reward_grant 9→10、battle_fx_host 16→18、slot_store 10→11、breakpoint_store 5→18、save_manager 7→14(+5 承接方法+peek_summary_at/rename_overwrite 两更名公开化)、RoundCycle 3→4、三 schema 各 +1——全部 ≤20。
- **迁移函数对账**:搬家五方法+`_migrate_legacy_save`+`_bp_read`+`_emit_hero_damage_taken`+`_peek_summary_at`+`_rename_overwrite` 逐个查 `tools/gdstyle_baseline.txt` 源键——基线无此 10 键(默认阈值内),迁移即原体;若 T1 读数发现任一源函数 branches/returns 超默认登记值,迁移即拆函数(拆分不改语义,不算迎合机检——与第 13 节区分)。
- **存量触面 S13 预期**:本卡触件 15 件(第 3.2 节清单)S13 键较 T1 现场基线**只降不升**(净删为主:五方法约 45 行迁出、107 处 oc._ 改址不增行数;净增面=两累积方法+13 bp 方法面+束解包成员行);adventure_runner 既有登记键(类变量 23)照登对账零变化。降不达即检查是否夹带超预算成员,L3 ③兜底。
- **指标例外申报**:无(零新件、零超默认阈值新增面;若实现中发现例外,走本卡异常分级 L3 ③停卡,禁就地豁免)。
## 15. 拆分边界纪律
见第 4 节红线(结构类卡必填条款,判据权威=code-conventions §1.1):本卡零新拆件——段类七件、RoundCycle、BattleRefreshFlow、DamageController、RewardGrant、MinesweeperRules、BattleFxHost、BreakpointStore、SlotStore 全部架构在册既有件,本批只做接线形态换代与五方法归位。逐件职责语句不变:五段段类=B1 每轮结算序列的分段逻辑件(architecture.md:127)、RoundCycle=轮结算周期推进结构单点(:125)、BattleRefreshFlow=换图刷新流程唯一承载(:123)、五方法归位=各领域宿主既有职责面内的原语归位(伤害基值派生读归伤害管线、奖励乘区调整归授予管线、地形伤害型变异过滤归棋盘状态域、效果命中过滤归伤害域)。单一变化原因=封装边界(跨对象私取清零),非阈值驱动。禁凑计数袋:段类成员束解包以消费面为准(第 4 节分配表逐段列明),无「剩下的成员」式打包。先例=迭代 41 两卡 v1.2(核心数据面契约 7/呈现层契约 9)。
@@ -1,151 +0,0 @@
# 需求卡片:架构审查 P2 代码面批(2026-11-03)
来源:待办清单「架构审查优化讨论——全库架构审计读数的逐条裁决与整改分批(2026-10-29 登记,来源=审计发现)」条目 P2 部分(**唯一事实源**:reports/审计-全库架构审查-2026-10-29.md §5.3 NODE_TYPES 项+2026-11-03 设计讨论会话用户授权〔实现层事项按代码规则与架构文档决策〕;热重载侧经用户裁决撤卡——规格保留原状、死开关代码保留为将来实装骨架,实装去向=用户另立待办条目+后续实装卡〔他会话写卡〕)。
状态:已写卡(v1.1,2026-11-03 修订——原 R1〔EC8 热重载代码链退役〕经用户裁决撤下,本卡收敛为仅 NODE_TYPES 词表单点化)。改动面:游戏代码(含随逻辑写/改的测试代码)。
## 1. 目标与完成定义
**这批做什么**:一处零行为变更的词表单点化——审计 §5.3 的 P2 代码遗留:
| # | 对象 | 现状 | 终态 |
|---|---|---|---|
| R1 | NODE_TYPES 词表双份 | `node_map_generator.gd:10` 与 `level_table.gd:11` 各持一份(内容同、序不同);生成器 :136 校验自产节点、schema :78 校验表行——校验双活、词表双写 | 词表单点归 schema(`LevelTable.NODE_TYPES`),生成器删本地副本改 class_name 直引;两处校验语义零变化(`.has()` 只判成员、序无关) |
**不收件(热重载侧,2026-11-03 用户裁决)**:`config_db.gd` 门标志与两方法、`battle_orchestrator.gd` 两行开门点**原样保留**——热重载规格已在设计文档保留原状(arch51-docs 提交 e614773a 撤回本批一度摘除),代码为将来实装骨架;实装需求卡片由用户另立待办条目后于他会话编写,本卡零触碰。
**什么状态算完**:词表改指落码、第 8 节对照表配对的验收断言在当轮真实跑批中通过;零行为变更证明=既有套件零转红(node_map_determinism/关卡表校验链/冒烟)+结构性 sweep 恒零(第 8 节 V1/V2);代码域闸全绿;两份 reports/ 产出物(实现报告+反哺点清单)写齐。
**排序义务**:本卡实现排队在 reports/需求卡片-架构审查5.1封装修复批-2026-11-03.md 之后——battle_orchestrator.gd 虽不再被本卡触碰,排序惯例照旧(同批架构审查卡顺次实现)。
## 2. 设计事实源
- **审计读数**:`reports/审计-全库架构审查-2026-10-29.md` §5.3(NODE_TYPES 词表双份)。
- **裁决凭据**:2026-11-03 设计讨论会话用户授权(实现层事项按代码规则与架构文档决策)+热重载侧撤卡裁决(规格保留、代码保留、实装另卡)。
- **架构登记**:`design/engineering/architecture/architecture.md`——:119 行「NODE_TYPES 词表双份」表述随本卡单点化由反哺点订正。
## 3. 现状事实(2026-11-03 master 工作区实查,基点 ab5d75a2;开工自行复核)
- **热重载侧(不收件,保留原状)**:config_db.gd:45(`_reload_gate`)+:174-186(`set_reload_gate`/`reload`)+battle_orchestrator.gd:272/:633(两行开门点)——零触碰;实装排期归用户另立待办条目+后续实装卡。
- **NODE_TYPES 双份**:`core/node_map_generator.gd:10`(`["battle", "boss", "reward", "rest", "shop"]`)与 `data/schemas/level_table.gd:11`(`["battle", "reward", "rest", "boss", "shop"]`+注释「关卡节点地图 v2.1」);消费点=node_map_generator.gd:136(`NODE_TYPES.has(String(n["type"]))`——生成器自产节点枚举校验)与 level_table.gd:78(表行加载校验)。全库第三处引用零命中(grep 实核——tests/sim/probe 全零)。两处消费均为 `.has()` 成员判定,词表序不参与行为(内容集相同)。
- **闸面现状**:S3(core 禁表加载)对 schema class_name 直引是豁免面(warning 级人工复核口径,static_scan.sh S3 注释「schema class_name 直引豁免」)——生成器改引 `LevelTable.NODE_TYPES` 落在既有豁免形态内(同款先例=config_db 持 BoardGenTable 等四域容器);零闸件改动。
- **S13 预算**:node_map_generator 公开面与类变量零变化(删常量不涉成员账)。gdstyle 基线(tools/gdstyle_baseline.txt)对本卡触件零登记键。
## 4. 设计契约(违反即返工红线)
- 🔴 **零行为变更**:词表 `.has()` 判定集相同——零变更证明=既有套件零转红+同种子确定链零漂移(node_map_determinism 全绿)。RNG 封闭流、明细行协议、诊断状态机、存档与断点链零触碰。
- 🔴 **R1 单点方向**:词表唯一落点=`data/schemas/level_table.gd`(表行校验 owner);生成器删本地 `const NODE_TYPES`,:136 改 `LevelTable.NODE_TYPES.has(String(n["type"]))`——core→data/schemas 前向边,schema class_name 直引(S3 豁免面在案形态);禁反向(schema 引 core);禁把词表搬进第三处(词表唯一落点不可迁)。
- 🔴 **fail-fast 不破**:改动不引入任何软回退;配置加载校验路径零改动。
- 🔴 **测试纪律**:禁变异类测试、禁撤销类取证;禁删断言/放宽阈值(第 8 节申报清单之外零删改)。
## 5. 范围边界
**收件**=R1 词表单点化+一件新 sweep 测试+既有套件回归确认。
**不收件**(去向已指认):
- 热重载全侧(config_db 门与 reload、编排器两行开门点、GDD 规格)——原样保留,实装去向=用户另立待办条目+后续实装卡;本卡零触碰。
- architecture.md :119 行「NODE_TYPES 词表双份」表述——反哺点清单承载(实现批禁写 design/,第 6 节)。
- 闸面缺口(S1/S2/S9/S13 扫描面扩 sim/probe/tests、S8 目录域)与 S13 三处豁免存废——审计 P1 项,**不在本卡**(待办清单条目未闭合余项,后续讨论段)。
## 6. 关联文档同步面
实现批禁写 `design/` 整个目录与根规则文件;下表每条的落文义务全部进 `reports/iter<N>-反哺点-<日期>.md`(N=编排段定),由用户裁决后归文档批落文:
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务(反哺点清单逐条承载) |
|---|---|---|
| design/engineering/architecture/architecture.md | :119 行「各持一份 NODE_TYPES 词表(内容同、顺序不同)」表述随单点化删句、改「词表单点归 LevelTable」 | 反哺点清单逐条列行号与改后登记内容——**机械面文档禁直改** |
| design/gdd/systems/表现与支撑/数据配置.md | 无陈述变化(热重载规格保留原状——零反哺确认行) | 反哺点清单写「零反哺」确认行 |
| 术语表 | 无新术语 | 确认行「零新增术语」 |
(机检口径:本表同步义务格无一条写「随批」。)
## 7. 任务卡 T1..T2
### 卡前·文件结构图
全部行为面=非行为改动(零行为变更批),行标【非行为】+对照表 R 行号;测试件为随逻辑写/改的测试代码。
```
core 层
game/core/node_map_generator.gd 【非行为 R1】:10 本地词表删+:136 改 LevelTable.NODE_TYPES.has(...)
测试件(随逻辑写/改)
tests/unit/core/encapsulation_p2_sweep_test.gd 【非行为 R1·新增】结构性零命中扫描(非空前置+正锚)
tests/run_all.gd 【非行为】manifest +1 行(sweep)
文档件
game/tests/README.md 写卡段判断=零编辑(第 8 节能力行判断依据)——实现批禁写,批末只核对能力名引用一致
```
---
**T1 NODE_TYPES 单点化+批收口**(估时 0.25 工作日;区间 0.25–0.5)
取用:无(本卡起点)。产出:R1 清零+sweep 绿+批收口两件。
- [ ] 核对实现排序在案:5.1 卡(含 battle_orchestrator 触面)未合回则本批不开工
- [ ] node_map_generator.gd::10 本地 `const NODE_TYPES` 删;:136 改 `if not LevelTable.NODE_TYPES.has(String(n["type"])):`——头注如有词表自述随改
- [ ] 新增 tests/unit/core/encapsulation_p2_sweep_test.gd(extends SceneTree+Kit.check 主通道,全类型标注;源 token 扫描手法沿 encapsulation_sweep_test.gd〔5.1 卡新增件〕先例)断言组:①node_map_generator.gd 非空+`^const NODE_TYPES` 零命中+`LevelTable.NODE_TYPES.has(` 正锚〔架构P2 V1〕;②全仓 .gd 生产面(core/data/presentation)`NODE_TYPES :=` 定义恰好 1 处且落 data/schemas/level_table.gd〔架构P2 V2〕——两组均带扫描面非空前置
- [ ] 孤立验证:新 sweep 单件先跑绿;node_map_determinism_test 全套绿(生成链同种子逐位——R1 零行为变更主证)+关卡表加载路径(level_table 校验活检查)经既有套件覆盖零转红+冒烟零转红
- [ ] run_all.gd manifest 追加 1 行:encapsulation_p2_sweep_test(expect 0,注记「R1 结构性零命中扫描〔架构P2〕」)
- [ ] **实现报告** `reports/iter<N>-实现报告-<日期>.md`:各卡状态+S13 键改前改后对账(node_map_generator 现场读数)+实现决定记录
- [ ] **反哺点清单** `reports/iter<N>-反哺点-<日期>.md`:第 6 节同步面逐条落点(architecture.md :119 一处、GDD/术语确认行)
- [ ] 批末核对:README 能力名引用一致(本卡零编辑);独立验收审计(第 8 节末)未过不合并;.uid 收口=`--editor --quit` 一次后确认新测试件 .uid 随批提交
### 估时汇总
T1 0.25。区间合计 0.25–0.5 工作日;**精确汇总 0.25 工作日**(超 0.5 工作日=超卡面估时域,须用户确认后方可续批)。
## 8. 验证闸(改动—验收对照表)
测试方式两分法:下表全部走**调试接口验证**;**正常流程体验验证**=零项(零行为变更批)。判据绑被测改动特有的可观测提交面(源码零命中带非空前置与正锚/确定链同种子逐位)。
| 需求点 | 改动(文件:行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| R1 NODE_TYPES 单点化 | node_map_generator :10 删+:136 改指 | encapsulation_p2_sweep_test〔架构P2 V1/V2〕;node_map_determinism_test 既有全套(同种子同参数必产同图逐位) | 单元+集成 | `LevelRunner` 关卡推进→节点图生成真实入口;`LevelTable` 表行加载校验 | 词表定义唯一落点(正锚计数=1);生成链同种子逐位同 | 既有:节点图生成合法性与同种子复现;既有:起关/选路/断点重生成同图(集成) |
**零行为改动面的证据义务**:本卡一行均为非行为改动——零变更证明=既有套件零转红+sweep 恒零+确定性链逐位。能力行全部「既有」、零新增——判断依据:零行为变更=玩家可观测能力面零变化;能力清单零编辑(批末核对义务在 T1)。
**闸口径**:重闸=`tools/run_all_gates.sh` 按本批改动域选档(改动含 game/ 下非 .md 行为载体 → `--code`);所选域全绿才合并。卡内不写死闸件名单。回归措辞:里程碑卡出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**测试削弱申报**:零条——本批零删改既有断言(grep 实核:tests 对 NODE_TYPES 零引用,无断言需要迁移)。
**独立验收审计**:入口=批末 T1 后、合并前;报告=`reports/iter<N>-验收审计-<日期>.md`;由没参与实现的会话或子代理执行,核对:对照表逐行断言真实存在且当轮通过、sweep 非空前置在案、零删改核对、S13 键只降不升对账。未过不合并。
## 9. 异常分级
- **L1 自救**:改指行错位、sweep 正则笔误、注释错字——就地改,记录进实现报告。
- **L2 记录继续**:行号 ±5 行内漂移(grep 符号锚定位后继续)。
- **L3 停机写报告等用户**:①实现中发现 `NODE_TYPES` 出现卡面未登记的第三处消费面(现状事实失实=上游缺陷,禁代裁);②改指后任一既有套件转红(零行为变更契约被破=停卡,禁就地调和);③机检键与卡片契约互斥=停卡呈报,禁自造第三条路。
## 10. 代拍板白名单
- sweep 正则具体写法与断言消息措辞(尾缀〔架构P2 Vn〕与判别词保留)。
- 逐卡内「孤立验证→出红最小单元→并入全套」执行顺序细节。
超清单的决断记入实现报告「实现决定记录」节。
## 11. 待裁点
**零待裁点,开工门=U0**——词表单点化方向由审计读数+2026-11-03 会话授权导出;热重载侧经用户裁决撤卡(规格保留、代码保留为实装骨架、实装另卡)。单点落点、T 卡分解、验收断言由写卡期实查定死(第 3/7 节)。本卡未新增备选案。
## 12. 落位与可复用性预检
**新增文件(1 件,测试件)**:
- tests/unit/core/encapsulation_p2_sweep_test.gd——为什么不能复用 5.1 卡的 encapsulation_sweep_test.gd:两卡独立 worktree 独立实现批(合回顺序未定,并件会让扫描面归属与尾缀语义跨批纠缠);本卡 sweep 仅两组四处、体量小;扫描手法同源(源 token 扫描先例),合回后如需并件归后续纯测试维护批裁决。grep 同名零命中。
**新增函数/成员**:零(纯删除+一处改指——无任何新增生产函数/成员/数据件)。
**复用既有**:源 token 扫描手法=encapsulation_sweep_test/player_copy_sweep_test 先例;manifest 登记=run_all.gd 既有条目族;schema class_name 直引形态=config_db 域容器四先例。
**分层与交互面**:R1 前向边 core→data/schemas=S3 豁免面在案形态(同 config_db 持表容器方向);零新增跨域路径、零新依赖;RngService 红线零触碰;Core 零 UI 红线零触碰;数值单一事实源零触碰(零表改动)。
## 13. 禁为机检文本保留无效成员
本卡为收敛类卡:词表删除后生成器禁留本地副本或镜像常量。机检键与卡片契约互斥时实现段一律停卡呈报,不得自造第三条路。
## 14. 实现规范预算
新增 .gd 仅 1 个测试件(SceneTree 脚本,全类型标注、零公开生产面)。生产代码全部落既有件,按「存量触面一查」对账(S13 默认阈值):
- **零成员变化件**:node_map_generator 公开面与类变量零变化(常量删+一处改指)。
- **存量触面 S13 预期**:触件一件 S13 键较现场基线只降不升;gdstyle 基线零登记键,T1 现场读数即对账基线。
- **指标例外申报**:无。
## 15. 拆分边界纪律
本卡零新拆件——触件全部架构在册既有件,只做词表单点化;逐件职责语句不变(node_map_generator=关卡节点图生成域唯一承载〔词表消费方身份不变、定义权归 schema owner〕)。单一变化原因=单一事实源(词表归一),非阈值驱动。禁凑计数袋:本卡无成员打包面。
@@ -1,240 +0,0 @@
# 需求卡片:架构审查 presentation 层封装修复批(2026-11-04)
来源:待办清单「架构审查余项——闸面缺口、豁免存废、零测试点名与架构文档漂移」条目 presentation 层私取面部分(**唯一事实源**:reports/处置-presentation层封装修复-2026-11-04.md——处置记录与本卡并行成文,本卡开工时 T1 首步核其已落盘且与本卡第 3 节逐条一致,冲突即 L3 停卡。设计闭合凭据=2026-11-04 设计讨论会话用户逐项裁决〔改法A=三个内部数据类字段公开化;方案一=四族一批做完〕+审计报告 presentation 普查+code-conventions §1.6)。验收档:**中**(零行为变更批——做错的后果玩家可见但不损持久状态:存档/RNG/结算/数值零触碰)。状态:已写卡(v1.1,2026-11-04 grilling 复核折入——T2/T5 时序修正+main.gd 例外区间实数化+flash 归位形态修正+T3 签名定稿+削弱申报追加)。改动面:游戏代码(含随逻辑改的测试代码)。
## 1. 目标与完成定义
**这批做什么**:把 presentation 层 14 文件 443 行跨对象下划线私取按四族修法全部落码——封装收口、零行为变更:
| 族 | 处置对象 | 现状 | 终态 |
|---|---|---|---|
| A1 | 三个内部数据类(level_map_screen `_MapState`/battle_end_overlay `_EndOverlayState`/debug_overlay `_DebugState`) | 宿主直读写内类私有字段 206 行/42 字段 | 42 字段去下划线转公开数据成员,宿主访问点随改;文件外零消费者落 sweep 断言 |
| A2 | 拆件子件(standee_vitals/standee_motion/board_hover)及其宿主(standee_body/board_view) | 宿主直读写子件私有成员 62 行 | 身份数据构造/配置期一次交付;行为归位子件公开方法;读走公开读法;board_hover 6 成员公开化 |
| B | 组合根 main ↔ 五个分文件 | 双向私取 169 行/80 名字(成对单行转发梯) | 分文件入口公开化;接线改收 Callable 束;main 服务方法公开化+句柄读投影/设置口;main on_* 处理器保私有(探针零波及);main.gd 指标例外申报 |
| C | UiKit 私有工厂被外调;cell_mark_overlay 摸宿主 _glow_layer | 6 行 | UiKit 三方法公开化;cell_mark 走构造交付(board_view 零净增) |
**什么状态算完**:四族每处改动落码、都有第 8 节对照表配对的验收断言当轮真实跑批通过;结构性证据=presentation 私取 sweep 恒零(扫描面非空前置+新公开面正锚);零行为变更证据=探针套件与渲染 golden 全程零转红+冒烟/单元既有套件零转红+探针/测试替换后当轮真实跑绿;代码域闸全绿(冒烟+单元+探针+渲染/静态);两份 reports/ 产出物(实现报告+反哺点清单)写齐。
## 2. 设计事实源
- **处置记录(输入合同,逐条一致)**:`reports/处置-presentation层封装修复-2026-11-04.md`——四族裁决、字段/名字清单、设计规则六条、S13 预算核查、探针连带面。本卡第 3 节现状与第 7 节落法是其机械承载;T1 复核两件一致(冲突=上游缺陷,L3 停卡)。
- **审计背景**:`reports/审计-全库架构审查-2026-10-29.md` §5.1 扩面普查(presentation 私取面;行号已换代,以本卡第 3 节实查为准)。
- **法律**:`design/engineering/code-conventions.md` §1.6(拆分交接定义+封装边界——本批修复依据)。
- **架构锚点**:`design/engineering/architecture/architecture.md` 呈现层节(:167 起——main 组合根、五分文件、ui_registry、views 各行);:124(BoardInstaller 引用束注入先例——B 族 Callable 接线束依据)。
## 3. 现状事实(2026-11-04 worktree archpres-card 实查,基点 61995733,开工自行复核)
### 3.1 私取面盘点
口径=`grep -rnE '\._[a-zA-Z]' game/presentation --include='*.gd'` 剔除注释行与 `self._`:**443 行/14 文件**(T1 以同 grep 重跑落底账)。逐文件行数与归族、A1 三类 42 字段名单、A2 逐字段归属、B 族 80 名处置规则、C 族 4 名——**全部以处置记录第二、三节为准**(逐条一致义务,本节不复制)。关键锚点:
- A1:level_map_screen.gd:37(内类)/ :59(实例)/ :100(`_map._level_label = …` 形态样例);battle_end_overlay.gd:15/:32;debug_overlay.gd:16/:33。
- A2:standee_body.gd:39-40(生成期直写)/ :82-85(配置直写)/ :173/:262(_dead 直写)/ :254-258(_hp_flash_tw 宿主 tween 误放子件)/ :419(_hp_cur 只读);board_view.gd:146/:249/:260/:309/:464/:479/:828(hover 六成员)。
- B:main_adventure_flow.gd:12(`connect(root._on_adventure_finished)`)↔ main.gd:234(一行转发 `MainAdventureFlow._on_adventure_finished(self, summary)`)——成对转发梯样例;main_ui_build.gd:64(`root._treasure_ui = …` 直写句柄);main.gd:180-495(45 行转发面)。
- C:level_map_screen.gd:69+ui_assembler.gd:106+settings_overlay.gd:88/:105(UiKit 私有工厂);cell_mark_overlay.gd:13-14(`_owner._glow_layer`)。
### 3.2 写 T 卡依据的其他现状
- **S13 现值(2026-11-04 实测)**:main.gd 公开方法 1/成员 15(默认顶);五分文件公开 0;standee_body 公开 20(顶)/成员 10;board_view 公开 27/成员 31(两键在册基线,**贴顶禁再增**);standee_vitals 1/12;standee_motion 6/11;board_hover 0/9;ui_kit 0/0;cell_mark_overlay 5/13;三 A1 宿主 8-7/6-5/19-4。基线在册 5 键见 tools/gdstyle_baseline.txt。
- **探针/测试连带**:`main._` 引用 104 处/36 名/14 文件(ui_probe、system_test.gd、ui_input_probe、shot_probe、layout_probe、ui_tune_probe、ui_struct_probe、screen_flow_probe、t17_defer_probe、ui_click_probe、fx_shot_probe、probe_ui_util、unit/presentation/pacing_queue_test、unit/core/breakpoint_resume_test)。规则 B2 保 on_* 处理器名 → 替换面=「引用名字 ∩ 公开化名字」,T1 落精确清单。
- **mo 既有公开方法先例**:standee_body.gd:300 `mo.apply_hero_state(state, …)` 在役——A2 归位沿同型。
## 4. 设计契约(违反即返工红线)
- 🔴 **逐条一致**:本卡与处置记录逐条一致;冲突=上游缺陷停卡退写卡段(L3)。
- 🔴 **零行为变更**:呈现逐位同(渲染 golden 零转红)、RNG 消费序零触碰、数值表零触碰、信号顺序逐位同;玩家可观测面零变化。
- 🔴 **公开形态三规则**(用户的「先判该不该、再定形态」框架落法):①公开**数据成员**仅限 A1 三类 42 名(登记表定位);②A2 子件字段保持私有,一律走构造/配置交付、行为方法、读投影;③main 句柄成员保持私有,走读投影/设置方法对——**任何族禁「顺手把字段改公开」替代设计**。
- 🔴 **main on_* 处理器保私有**:探针/测试 104 处引用面零改名;分文件经 Callable 束取得处理器。
- 🔴 **禁留壳**:去下划线公开化后禁留旧私有名别名/转发壳;main 侧既有单行转发层**保留**(非新增——探针 main.X 路径契约承载,反哺点登记进架构)。
- 🔴 **贴顶件零净增**:board_view(27/31 基线在册)公开方法与成员零净增;standee_body 公开方法零增(成员 10→11 仅 _hp_flash_tw 归位);main.gd 成员零增。
- 🔴 **S13/S9**:全部新增公开方法签名注解完整(S9 R3);main.gd 例外键按第 14 节申报落基线,实现段禁自行豁免。
- 🔴 **测试纪律**:禁变异类测试、禁撤销类取证;禁删断言/放宽阈值换绿(第 8 节申报清单之外零删改)。
## 5. 范围边界
**收件**=第 1 节表四族全部(含调用点改址、探针/测试交集名字替换、新增 sweep 测试件、main.gd 例外键落基线)。
**不收件**(去向已指认):
- core 层五处封装修复——reports/需求卡片-架构审查5.1封装修复批-2026-11-03.md(另批,文件面零交叠无避让义务)。
- 探针/测试的测量面直构惯例与受控例外——零清扫(仅「引用名字 ∩ 公开化名字」交集随批替换)。
- 架构结构零改动:组合根与五分文件的职责划分、信号接线所有权(连接语句留在分文件)、三数据类的内类形态全部不动;ui_registry/ModalFlow 零触碰。
- 闸件(static_scan.sh 等)零改动;MC/模拟零跑(无数值改动);`game/tests/README.md` 零编辑(零行为变更=能力清单零新增)。
## 6. 关联文档同步面
实现批禁写 `design/` 整个目录与根规则文件;下表每条落文义务进 `reports/iter<N>-反哺点-<日期>.md`,由用户裁决后归文档批落文:
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务(反哺点清单逐条承载) |
|---|---|---|
| design/engineering/architecture/architecture.md | 呈现层节:main 组合根行+公开服务/句柄面新增登记;五分文件行+公开入口面;level_map_screen/battle_end_overlay/debug_overlay 行+内部数据类定位句(字段公开的登记表);ui_kit 行+三工厂公开化;standee_vitals/standee_motion/board_hover 行+新公开面 | 反哺点清单逐条列行号与改后登记内容——**机械面文档禁直改** |
| 术语表 | 无新术语(读投影/引用束/公开数据成员均仓库现行词) | 确认行「零新增术语」 |
| game/tests/README.md | 零行为变更=能力清单零新增(判断依据见第 8 节) | 批末核对「表上名字与对照表引用一致」,零编辑 |
(机检口径:本表同步义务格无一条写「随批」。)
## 7. 任务卡 T1..T5
### 卡前·文件结构图
全部行为面=非行为改动(零行为变更批),行标【非行为】+对照表 R 行号;测试件为随逻辑改的测试代码。
```
A1 三件
game/presentation/views/level_map_screen.gd 【非行为 R1】_MapState 14 字段公开化+87 处改址+:69 UiKit 公开名+头注
game/presentation/views/battle_end_overlay.gd 【非行为 R1】_EndOverlayState 14 字段公开化+69 处改址+头注
game/presentation/views/debug_overlay.gd 【非行为 R1】_DebugState 14 字段公开化+50 处改址+头注
A2 五件
game/presentation/views/standee_vitals.gd 【非行为 R2】构造/配置交付口+死亡/复位行为方法+读投影(成员 12 零增)
game/presentation/views/standee_motion.gd 【非行为 R2】意图显示/隐藏/复位行为方法+绘制状态读口+挂载口(成员 11 零增)
game/presentation/views/standee_body.gd 【非行为 R2】55 处改址+头注(成员零增——flash 行为归位 vitals 自持 tween)
game/presentation/views/board_hover.gd 【非行为 R2】+6 公开面(重绑口/复位/刷新/悬停/chord/连接目标/读口)
game/presentation/views/board_view.gd 【非行为 R2】7 处改址(公开方法与成员零净增——贴顶件)
B 七件
game/presentation/main.gd 【非行为 R3】45 行转发改调公开入口+接线调用点交付 Callable 束+服务公开化+句柄读投影/设置口(例外键申报见第 14 节)
game/presentation/main_ui_build.gd 【非行为 R3】70 处改址(服务/句柄走 main 公开口)
game/presentation/main_adventure_flow.gd 【非行为 R3】入口公开化+29 处改址+接线语句消费 Callable 束
game/presentation/main_overlay_flow.gd 【非行为 R3】入口公开化+15 处改址
game/presentation/main_debug_flow.gd 【非行为 R3】入口公开化+11 处改址
game/presentation/main_esc_flow.gd 【非行为 R3】入口公开化+2 处改址
C 四件
game/presentation/views/ui_kit.gd 【非行为 R4】_gradient_base/_beams_rect/_switch_toggle 公开化(体逐字)
game/presentation/views/cell_mark_overlay.gd 【非行为 R4】构造收遮罩下发口(成员 13→14)+2 处改址
game/presentation/ui_assembler.gd 【非行为 R4】1 处改址
game/presentation/views/settings_overlay.gd 【非行为 R4】2 处改址
测试件(随逻辑改)
tests/unit/presentation/presentation_encapsulation_sweep_test.gd 【非行为 R1–R4·新增】四族结构性扫描(非空前置+零命中+正锚)
game/probe 12 件+game/tests 2 件引用替换 【非行为 R3】main._ 交集名字随批替换(当轮真实跑绿)
文档件
game/tests/README.md 写卡段判断=零编辑(第 8 节判断依据)
```
**T1 基线与底账**(估时 0.25 工作日;区间 0.25–0.5)
取用:无。产出:四族 grep 底账+探针替换精确清单+S13 对账基线+零行为变更基线读数。
- [ ] 核对处置记录 `reports/处置-presentation层封装修复-2026-11-04.md` 已落盘且与本卡第 3 节逐条一致(冲突=L3 停卡)
- [ ] grep 底账落实现报告(改前账,T5 sweep 的对照面):第 3.1 节同口径 grep 全量命中行清单(14 文件逐文件行号)
- [ ] 探针/测试替换精确清单:`grep -rnE 'main\._[a-zA-Z]' game/probe game/tests` 104 处逐条标注「替换/保留」(判据=名字 ∈ 公开化名单),清单落实现报告
- [ ] S13 对账基线:第 3.2 节 16 触件现场读数登记;main.gd 例外键实数(规则 3+4 名单逐一数出)核与第 14 节申报区间一致
- [ ] 零行为变更基线:冒烟 `python tools/run_smoke.py` 全绿读数+渲染 golden 现值(改前即基线)落实现报告
**T2 A1 三类字段公开化**(估时 0.5 工作日;区间 0.25–0.75)
取用:T1 底账。产出:A1 族 206 行清零。
- [ ] level_map_screen.gd:处置记录 §三 A1 表 14 字段去下划线(体零改动),87 处 `_map._x` → `_map.x`;头注补一句内部数据类定位(:69 UiKit 调用改址随 T5 同批生效)
- [ ] battle_end_overlay.gd:同型 14 字段+69 处;debug_overlay.gd:同型 14 字段+50 处
- [ ] sweep 测试件骨架与 A1 断言组先行落盘(presentation_encapsulation_sweep_test.gd:三文件非空+class 正锚+`_map\._|st\._` 模式零命中+公开字段正锚+`_MapState|_EndOverlayState|_DebugState` 文件外零消费者断言〔pres封装 V1〕)
- [ ] 孤立验证:sweep A1 组+冒烟——出红只跑红件最小单元
**T3 A2 standee 与 board_hover**(估时 1.0 工作日;区间 0.75–1.5)
取用:T1 底账、处置记录 §三 A2 逐字段归属表。产出:A2 族 62 行清零。
- [ ] standee_vitals.gd 公开面 14(既有 apply_hp+新增 13,成员 12 零增):`configure_identity(kind: String, display_name: String, enemy_id: String, armor: String)`、`set_max_hp(v: float)`、`set_order(i: int)`、`set_dead(v: bool)`、读投影 `is_dead()/kind()/armor()/display_name()/enemy_id()/order()/hp_cur()/hp_max()`——宿主 :39/:82-85/:96/:131/:173/:262 写点与 :48/:53/:66-69/:91/:98/:138/:171/:246-248/:277/:340-342/:419/:465-482 读点逐一对口
- [ ] standee_motion.gd 公开面 14(既有 6+新增 8,成员 11 零增):`show_intent(glyph: String, col: Color)`、`hide_intent()`(:140/:145/:181 三处同型归位);绘制路径读投影逐个 getter `intent_visible()/intent_glyph()/intent_col()/intent_scale()/intent_rot()/portrait_sprite()`(_draw 每帧调用,免逐帧字典分配——性能预算依据);_hero_state 生成期走既有 apply_hero_state;非绘制路径沿用现役 state_probe() 字典形态
- [ ] standee_body.gd:55 处改址(逐字段按归属表;flash_hit() 体改调 `st.play_hp_flash()`,tween 逻辑整体归位 vitals——宿主成员零增);头注「外部直访冻结成员」句按新面改写
- [ ] board_hover.gd:+6 公开面(rebind(minesweeper)/reset()/refresh_after_paint()/hover_at(pos)/detect_chord(c)/on_shell_mouse_exited 更名公开化/hover_pos() 读口——七处消费逐一对口);board_view.gd 7 处改址
- [ ] sweep A2 断言组(standee_body `\bst\._|\bmo\._` 零命中+board_view `_hover_comp\._` 零命中+新公开面正锚〔pres封装 V2〕)
- [ ] 孤立验证:sweep A2 组+渲染 golden+战斗探针——出红只跑红件最小单元
**T4 B 族正式交接面**(估时 2.0 工作日;区间 1.5–2.5)
取用:T1 探针替换清单、处置记录 §三 B 设计规则六条与 80 名清单。产出:B 族 169 行清零+探针替换跑绿。
- [ ] 五分文件入口公开化(main 转发调用的方法去下划线,名表=处置记录 80 名清单分文件侧;体逐字);main.gd 45 行转发改调公开入口
- [ ] 接线语句改 Callable 束:五个接线入口签名各加 handlers 束参(键=用途名),main 调用点自建束传入(`"adventure_finished": _on_adventure_finished` 型,main 内自引);分文件 connect 语句消费束值——`root._on_xxx` 引用清零
- [ ] main.gd 服务方法公开化(处置记录 §三 B 规则 3 名单,体逐字);句柄成员补公开读投影/设置方法对(规则 4 名单,方法体一行转发,成员零增)
- [ ] 五分文件 124 处 root._ 改址(服务走公开方法、句柄走读投影/设置口、处理器经束)
- [ ] 探针/测试替换:按 T1 精确清单逐条替换(引用形态迁移,断言内容零改动)
- [ ] main.gd 例外键实数核 对与第 14 节申报一致;S13 键对账
- [ ] sweep B 断言组(六文件 `root\._|main\._|MainOverlayFlow\._|MainAdventureFlow\._|MainDebugFlow\._|MainEscFlow\._` 零命中+新公开面正锚〔pres封装 V3〕)
- [ ] 孤立验证:sweep B 组+探针替换件当轮真实跑+冒烟+系统测试——出红只跑红件最小单元
**T5 C 族+批收口**(估时 0.375 工作日;区间 0.25–0.5)
取用:全部前卡。产出:C 族清零+结构性恒零证据+批收口两件。
- [ ] ui_kit.gd 三工厂公开化(体逐字);cell_mark_overlay 构造收遮罩下发口(board_view 构造点随改,board_view 面零净增)+2 处改址;ui_assembler/settings_overlay 改址;level_map_screen :69 `UiKit.gradient_base` 改址(与本步 ui_kit 公开化同批生效)
- [ ] sweep C 断言组(ui_kit 私有工厂全库零外调+cell_mark `_owner\._` 零命中+正锚〔pres封装 V4〕);run_all.gd manifest 追加 1 行(sweep,expect 0)
- [ ] 全量 sweep 复核+冒烟+渲染 golden+探针套件终读数(零行为变更证据链闭合)
- [ ] **实现报告** `reports/iter<N>-实现报告-<日期>.md`:各卡状态+S13 键改前改后对账(T1 基线逐件核+main.gd 例外键落基线记录)+探针替换清单执行账+实现决定记录
- [ ] **反哺点清单** `reports/iter<N>-反哺点-<日期>.md`:第 6 节同步面逐条落点(architecture.md 呈现层各行登记内容、术语确认行)
- [ ] 批末核对:game/tests/README.md 零编辑核对;独立验收审计(第 8 节末)未过不合并;.uid 收口=`--editor --quit` 一次后确认新测试件 .uid 随批提交
### 估时汇总
T1 0.25|T2 0.5|T3 1.0|T4 2.0|T5 0.375。区间合计 3.5–5.25 工作日;**精确汇总 4.125 工作日**(切分预案:若 T4 超 2.5 工日,把 T5 切出为独立半日卡顺延,其余不动)。
## 8. 验证闸(改动—验收对照表)
测试方式两分法:下表全部走**调试接口验证**(sweep 源扫描+既有套件+探针真实跑);**正常流程体验验证**=零项(零行为变更批,实机观感逐位同改前)。判据绑被测改动特有的可观测提交面(源码私取模式零命中带非空前置与正锚/探针可见性与信号面零漂移)。
| 需求点 | 改动(文件:行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| R1 A1·战末弹层 | battle_end_overlay 14 字段+69 处改址 | sweep A1 组〔pres封装 V1〕;冒烟+战末弹层既有探针回归 | 探针 | `BattleEndOverlay.open_victory()`(战末弹层真实开合链) | 私取模式零命中+公开字段正锚+文件外零消费者;弹层可见性与载荷零漂移 | 既有:站桩敌人呈现与结算演出落点 |
| R2 A1·调试浮窗 | debug_overlay 14 字段+50 处改址 | sweep A1 组〔pres封装 V1〕;调参相关探针既有回归 | 探针 | `TuneSimController.run()`(调试浮窗批量模拟入口) | 同 R1 判据面;浮窗呈现与批量模拟读数零漂移 | 既有:调参测速批量模拟(逐帧步进与统计读数) |
| R3 A1·关卡画面 | level_map_screen 14 字段+87 处改址 | sweep A1 组〔pres封装 V1〕;冒烟+选路集成既有回归 | 集成+探针 | 选路集成链(起关→选路→断点重生成)+冒烟全链 | 私取模式零命中+公开字段正锚;选路链零漂移 | 既有:起关/选路/断点重生成同图(集成) |
| R4 A2·站桩三件 | standee 三件改址+_hp_flash_tw 归位 | sweep A2 组〔pres封装 V2〕;渲染 golden 逐像素零转红;站桩探针既有回归 | 探针+golden | `BattleStageView` 真实实例化(站桩渲染链) | 站桩呈现逐位同;子件私取模式零命中+新公开面正锚 | 既有:站桩敌人呈现与结算演出落点 |
| R5 A2·悬停子件 | board_hover 六公开面+board_view 7 处改址 | sweep A2 组〔pres封装 V2〕;ui_input_probe 既有回归 | 探针 | `ui_input_probe` 合成鼠标事件→`BoardView._gui_input()` | 悬停三语义零漂移;子件私取零命中+六公开面正锚 | 既有:棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) |
| R6 B·组合根交接面 | main+五分文件+探针/测试替换 | sweep B 组〔pres封装 V3〕;14 件替换后当轮真实跑绿;冒烟+系统测试 | 集成+探针 | `ui_click_probe` 大门两分支段(main 处理器→分文件→营地态全链)+探针套件其余件 | 六文件私取模式零命中+新公开面正锚;探针断言零删改引用改址后全绿 | 既有:营地大门两分支确认与断点续玩接线 |
| R7 C·杂项公开面 | ui_kit 三工厂+level_map :69+cell_mark 构造交付+改址 | sweep C 组〔pres封装 V4〕;layout/shot 探针既有回归 | 单元+探针 | 界面装配真实链(ui_kit 工厂消费面) | 私有工厂零外调+cell_mark 私取零命中+呈现零漂移 | 既有:站桩呈现定值与素材绑定 |
**零行为改动面的证据义务**:本卡全部行为面为非行为改动(零行为变更批)——不设「行为改动」行;每行零变更证明=渲染 golden 零转红+探针套件零转红+冒烟/单元零转红+sweep 恒零。能力行全部「既有」、零新增——判断依据:玩家可观测能力面零变化,无新能力可登记,`game/tests/README.md` 零编辑(批末核对义务在 T5)。
**闸口径**:重闸=`tools/run_all_gates.sh` 按本批改动域选档(改动含 game/ 下非 .md 行为载体 → `--code`);所选域全绿才合并。卡内不写死闸件名单。回归措辞:里程碑卡(T 段)出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**测试削弱申报**(允许改/删的旧断言全清单;未申报的删改由独立验收审计判红):
1. 探针/测试 14 件中与公开化名字交集的 `main._x` 引用 → 改公开名(清单=T1 精确清单)——随被测改动同步的引用形态迁移,断言内容零改动,无一条删除断言或放宽阈值。
**测试削弱申报补充(v1.1)**:2. ui_struct_probe.gd:144-146 退出调用链源码串断言两处("MainEscFlow._on_quit(self)"→"MainEscFlow.on_quit(self)"、"root._quit_game()"→"root.quit_game()")——随公开化改址的引用形态迁移,断言意图(调用链完整)不变;同函数 :141 `get_method() == "_on_esc_quit"` 断言零改动(处理器保私有)。
**独立验收审计**:入口=批末 T5 后、合并前;报告=`reports/iter<N>-验收审计-<日期>.md`;由没参与实现的会话或子代理执行,核对:对照表逐行断言真实存在且当轮跑批通过、零行为变更证据链在案(golden/探针/冒烟改前改后零转红读数)、测试削弱申报 1 条之外零删改、第 13 节无效成员零残留、S13 键对账(含 main.gd 例外键申报一致)。未过不合并。
## 9. 异常分级
- **L1 自救**:改址遗漏一处编译级报错、字段名笔误、注释错字——就地改,记录进实现报告。
- **L2 记录继续**:行号 ±5 行内漂移(grep 符号锚定位后继续);探针失败经排查属既有缺陷且与本批无因果——登记跳过并报用户。
- **L3 停机写报告等用户**:①卡面与处置记录冲突、或处置记录未落盘/与本卡第 3 节不一致(上游缺陷,退写卡段);②零行为变更契约被破(golden/探针/套件任何非预期漂移=停卡,禁就地调和);③S13 预算互斥——任一触件实测键超第 14 节预期(含 main.gd 实数超申报区间、board_view/standee_body 贴顶件需增面)=上游缺陷停卡退写卡段,禁实现段自拆或砍面;④实现中发现处置记录 80 名清单之外的第 81 个私取名字或未登记消费面(语义不明,禁代裁);⑤机检键与卡片契约互斥=停卡呈报,不得自造第三条路。
## 10. 代拍板白名单
- 测试内部夹具命名与组织(sweep 正则具体写法、断言消息措辞——判据面不变,尾缀〔pres封装 Vn〕保留)。
- 注释与头注改写措辞(模块介绍职责不变)。
- A2 读投影/行为方法的命名风格(`xxx()` 读投影与 `apply_xxx` 动词族内一致化——签名面按第 7 节 T3 定死的职责句,不改归属)。
- Callable 束的键名(用途名)与断言/报错文案。
- 逐卡内「孤立验证→出红最小单元→并入全套」的执行顺序细节。
超清单的决断记入实现报告「实现决定记录」节。
## 11. 待裁点
**零待裁点,开工门=U0**——四族修法、三个内部数据类定位(改法A)、一批做完(方案一)、B 族设计规则六条、main.gd 指标例外申报方向均已在 2026-11-04 设计讨论会话由用户裁决;字段/名字清单、方法签名、T 卡分解、验收断言由本卡写卡期实查定死(第 3/7 节)。本卡未新增任何备选案。
## 12. 落位与可复用性预检
**新增文件(1 件,测试件)**:
- tests/unit/presentation/presentation_encapsulation_sweep_test.gd——为什么不能复用 core 的 encapsulation_sweep_test:四族结构性零命中是本批特有扫描面(A1 三类+A2 子件+B 六文件+C 杂项,与 5.1 卡的 core 七文件集完全不同面);player_copy_sweep_test 扫 presentation 文案面——**复用其源 token 扫描手法但不并件**(并件让两批扫描面与尾缀语义混乱——5.1 卡 :257 同款论证)。落点 tests/unit/presentation(被扫对象全在 presentation);grep 同名零命中。
**新增函数/成员(逐条唯一性核查义务,grep 同名全库实核)**:
- A1:仅字段改名公开化,零新增函数/成员(grep 确认公开名与既有成员名无冲突)。
- A2:standee_vitals/motion 新公开方法(构造交付口/行为方法/读投影)——grep 方法名全库零第二处;命名与既有动词族同型(apply_hero_state/mo 现役方法族先例);board_hover 六公开面 grep 唯一;`_hp_flash_tw` 归位 standee_body(成员迁移非新增语义)。
- B:main.gd 服务公开化为既有方法去下划线(禁别名);句柄读投影/设置方法对命名 grep 零同名(BreakpointStore set_/get 同族先例);Callable 束键名 grep 零冲突。
- C:ui_kit 三方法去下划线公开化(体逐字,禁留旧名);cell_mark 构造参数(成员 13→14)。
**复用既有(不新增)**:Callable 束交付形态=BoardInstaller/5.1 卡束先例;读投影形态=has_write_target/active_path 先例;句柄方法对=BreakpointStore 13 方法先例;源扫描测试=player_copy_sweep_test 手法;manifest 登记=run_all.gd 既有条目族。零新增生产文件(全部落既有件)。
**分层与交互面**:本批零跨层新增路径——presentation 内部往来改公开面,对 core/data 的调用面零触碰(settle_batch 等组合根写口现役形态不变);Core 零 UI 红线零触碰;数值单一事实源零触碰;RngService 红线零触碰(零新增随机源)。
## 13. 禁为机检文本保留无效成员
本卡为重构类卡,全卡适用(code-conventions §1.1 ⑤同款):禁止为迎合机检消息文本(含计数、sweep 正则、grep 面)保留或新增无效成员/别名/转发壳;A1 字段公开化后禁留私有旧名;B 族去下划线后禁留旧私有名;main 侧既有单行转发层为登记的探针契约承载(非无效成员,反哺点登记),除此之外禁新立转发层;sweep 正则与签名冲突时停卡呈报,不得自造第三条路。
## 14. 实现规范预算
新增 .gd 仅 1 个测试件(SceneTree 测试脚本,全类型标注、零公开生产面)。生产代码全落既有件,按「存量触面一查」对账(S13 默认阈值:公开方法 ≤20/类变量 ≤15/分支 ≤8/返回 ≤6):
- **指标例外申报(main.gd)**:键=`game/presentation/main.gd|quality/max-public-methods`,现值 1,预期 28–32(构成=既有 1+服务公开化 17+句柄读写口 12;T1 实数核);理由=组合根服务面(分文件消费的公开口集中于此),架构先例=level_runner.gd 公开方法 33 在册基线、adventure_runner.gd 类变量 23 在册基线;落法=实现批 `python tools/gdstyle_gate.py --refresh`(人工专用通道,随批重生成)。
- **贴顶件约束**:board_view 27/31(基线在册)**零净增**(本批对 board_view 的全部动作=7 处改址+构造点传参);standee_body 公开方法 20 贴顶零增(成员零增——flash 归位 vitals 自持);debug_overlay 公开方法 19——A1 只改字段名不动方法,零变化。
- **类变量净增件**:cell_mark_overlay 13→14(构造交付的遮罩口引用);其余触件零增(A1 改名不增数;vitals/motion 成员零增)。
- **公开方法净增件**:五分文件 0→3–15;board_hover 0→6;standee_vitals 1→预算内、standee_motion 6→预算内(均 ≤20);ui_kit 0→3;main.gd 见例外申报。
- **迁移函数对账**:本批公开化方法全部「体逐字去下划线」,无跨文件迁移体;唯一迁移=_hp_flash_tw 归位(standee_body 内自用逻辑随迁,非跨件函数迁移);若 T1 读数发现源函数 branches/returns 超默认登记值,随迁即拆函数(拆分不改语义,与第 13 节区分)。
- **存量触面 S13 预期**:16 触件 S13 键较 T1 现场基线**只降不升**(board_view 两基线键持平为达标);降不达=检查是否夹带超预算面,L3 ③兜底。
## 15. 拆分边界纪律
见第 4 节红线(判据权威=code-conventions §1.1):本批**零新拆件**——全部落架构在册既有件(组合根 main、五分文件、三数据类、standee 三件、board_hover/board_view、ui_kit、cell_mark),只做往来形态换代。逐件职责语句不变:A1 三类=宿主画面文件的登记表(数据类定位,用户裁);A2 子件=各自职责域件(身份命值态/资产演出态/悬停呈现域件——architecture.md 在册),行为归位=误放宿主的操作回归所有者;B 族=组合根委托层公开契约化(接线所有权不动);C 族=公用设施身份归位。单一变化原因=封装边界(跨对象私取清零),非阈值驱动。禁凑计数袋。
+3 -3
View File
@@ -5,8 +5,8 @@
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照) ## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。 - **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
- **迭代位**:迭代 1–51 全部已完成;各迭代收口与批后收尾沿革查 git 提交信息与 `reports/`。 - **迭代位**:迭代 1–52 全部已完成;各迭代收口与批后收尾沿革查 git 提交信息与 `reports/`。
- **下一步**:迭代 52 已编入待开工(四卡 ≈9.275 个工作日——P0 还债+P0 孤儿清退+presentation 封装修复+封印印记法阵化,`/iter 52` 发令;gdstyle S13 活红归还债卡落批追绿)。待编池:config_db 旧校验件(待写卡、处置方向待裁)、改写族孤儿(待处置方向裁决)、二三关棋盘观感(待设计+待美术)、EC8 热重载实装(待用户另立条目)。 - **下一步**:无已编迭代在飞——待编池:改写族孤儿(待处置方向裁决)、二三关棋盘观感(待设计+待美术)、EC8 热重载实装(待用户另立条目);测试面真输入化分期与存量断言逐条精锚(待执行,归下批编排)。
## 里程碑时间线 ## 里程碑时间线
@@ -85,7 +85,7 @@
| 迭代 49 | 已完成(2026-11-02) | 已退役(git 历史可考) | 2026-11-02 | ≈7.25 个工作日 | 已退役(git 历史可考) | | 迭代 49 | 已完成(2026-11-02) | 已退役(git 历史可考) | 2026-11-02 | ≈7.25 个工作日 | 已退役(git 历史可考) |
| 迭代 50 | 已完成(2026-11-03) | 已退役(git 历史可考) | 2026-11-03 | ≈12.875 个工作日〔用户特批 2026-11-03 超 10 个工作日〕 | 已退役(git 历史可考) | | 迭代 50 | 已完成(2026-11-03) | 已退役(git 历史可考) | 2026-11-03 | ≈12.875 个工作日〔用户特批 2026-11-03 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 51 | 已完成(2026-11-04) | 已退役(git 历史可考) | 2026-11-04 | ≈6.625 个工作日 | 已退役(git 历史可考) | | 迭代 51 | 已完成(2026-11-04) | 已退役(git 历史可考) | 2026-11-04 | ≈6.625 个工作日 | 已退役(git 历史可考) |
| 迭代 52 | 待开工 | reports/需求卡片-minesweeper_rules公开面还债批-2026-11-04.md<br>reports/需求卡片-孤儿函数清退批-2026-11-04.md<br>reports/需求卡片-架构审查presentation层封装修复批-2026-11-04.md<br>reports/需求卡片-封印印记法阵化批-2026-11-04.md | 2026-11-04 | ≈9.275 个工作日 | — | | 迭代 52 | 已完成(2026-11-05) | 已退役(git 历史可考) | 2026-11-04 | ≈9.275 个工作日 | 已退役(git 历史可考) |
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。 - 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
- 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。 - 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。
+13 -1
View File
@@ -204,7 +204,7 @@
| 1 | 商店货币显示 | 商店界面货币显示「GP」,不再出现「金币」 | | 1 | 商店货币显示 | 商店界面货币显示「GP」,不再出现「金币」 |
| 2 | 图例/HUD 封印文案 | 图例与 HUD 显示「封印/封印印记」,不再出现「插旗/旗」;板面单字字形现为「封」 | | 2 | 图例/HUD 封印文案 | 图例与 HUD 显示「封印/封印印记」,不再出现「插旗/旗」;板面单字字形现为「封」 |
| 3 | 结算明细来源 | 结算明细来源显示「封印命中/封印未中」 | | 3 | 结算明细来源 | 结算明细来源显示「封印命中/封印未中」 |
| 4 | 封印印记贴图三关加载 | `seal_mark.png` 在 L1/L2/L3 三关均正常加载,非字形回退态 | | 4 | 封印印记法阵呈现 | 三关封印格呈环+十字+环外压暗光圈、环径 82%±1px(机检读数=board_shot_probe seal_shot 段承载;实机目检见 51 节) |
| 5 | 完美保险卡面文案 | 专长卡面文案读作「本场首次封印落空,不计入完美封印判定」,零「雷」字 | | 5 | 完美保险卡面文案 | 专长卡面文案读作「本场首次封印落空,不计入完美封印判定」,零「雷」字 |
| 6 | 稀有档三选一 | 三选一带不再出现同调电池/完美保险;稀有档仅剩 ap/rap/time_sand 三种 | | 6 | 稀有档三选一 | 三选一带不再出现同调电池/完美保险;稀有档仅剩 ap/rap/time_sand 三种 |
| 7 | 豁免后的完美第二份 | 带完美保险专长时,首次标错后清图仍能拿到「完美第二份」(订阅式豁免的实际观感) | | 7 | 豁免后的完美第二份 | 带完美保险专长时,首次标错后清图仍能拿到「完美第二份」(订阅式豁免的实际观感) |
@@ -496,3 +496,15 @@
- **红灯信号**:图标全体同现、增益技全体受益、toast 数字与表值不符、折后价未生效即报缺陷。 - **红灯信号**:图标全体同现、增益技全体受益、toast 数字与表值不符、折后价未生效即报缺陷。
- **结论回流**:呈现缺陷归待办清单登记新条目。 - **结论回流**:呈现缺陷归待办清单登记新条目。
---
## 51 封印印记法阵化批——实机目检
> 封印印记改参数化绘制(着色器环+十字+环外光圈,迭代 52 卡④)后,像素级判据已由机检读数承载(board_shot_probe seal_shot 段:三关环径 0.826 全落 82%±1px、英雄格中心非黑),观感复核面仍要人眼。登记不阻塞(2026-10-12 真人检测立规)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 三关封印格观感 | 环+十字+环外压暗光圈呈形正确、与格底可辨;像素判据已在机检承载,本项为观感复核 |
| 2 | 战末金蜡封徽记观感 | 贴图路径未动(零预期变化)——观感确认项 |
| 3 | 封印格与变异纹带同格观感 | 两层共存可辨、不脏面(零代码触面——观感确认项) |
+1 -41
View File
@@ -172,14 +172,6 @@
**状态**:待美术设计(备选) **状态**:待美术设计(备选)
#### 棋盘封印印记图形换代——现件仍是扫雷旗形,改法阵或锁链待设计(2026-10-30 登记,来源=会话提及)
**实况**:2026-11-04 定案——形=环+十字法阵;色=封印黑 `#000000`(光圈只加 alpha,不加色相);**画法改参数化绘制**:格边 26–46px 连续可变,贴图必非整数缩放,故由着色器按格边画环+十字。定值:环外径 82% 格宽、壁厚 11% 环径、臂宽 15.6% 环径、环外光圈宽 9% 格边(峰值 α0.50、不外溢邻格)。条款落 [美术圣经](design/art/art-bible.md) v3.41 §3.2 与 §8.2「封印印记参数表」,样张过审=2026-11-04 用户点头 82% 档。贴图 `seal_mark.png`(现为环+十字)退为战末金蜡封徽记专用;棋盘侧贴图绘制路径待实现批退役(`tile_palette.gd:19`、`cell_mark_overlay.gd:95-96`、`board_view.gd:541`)。[美术资源依赖清单](design/art/art-assets-checklist.md) §3.3/§4 与 [美术素材状态清单](design/art/art-status-checklist.md) 两行同步。需求卡片 reports/需求卡片-封印印记法阵化批-2026-11-04.md(实现批输入合同,3.75 工作日)。
**改动面**:文档+美术素材+游戏代码
**状态**:美术设计已闭合+已写卡+已编迭代 52
#### 教学形态未定(2026-10-04 登记,来源=审计发现) #### 教学形态未定(2026-10-04 登记,来源=审计发现)
**实况**:教学的具体形态未定:线性开局教程,还是全部走情景触发式提示?来源=待设计问题清单第 1 条。2026-10-04 用户拍板本节整体改排 Beta(Alpha 不做教学);同日五问讨论初裁=丙1 混合(见本节头注记),定稿归 Beta 批。 **实况**:教学的具体形态未定:线性开局教程,还是全部走情景触发式提示?来源=待设计问题清单第 1 条。2026-10-04 用户拍板本节整体改排 Beta(Alpha 不做教学);同日五问讨论初裁=丙1 混合(见本节头注记),定稿归 Beta 批。
@@ -247,7 +239,7 @@
#### damage_controller 按序改写族——内容孤儿机制与退役名注释层(2026-11-04 登记,来源=会话提及) #### damage_controller 按序改写族——内容孤儿机制与退役名注释层(2026-11-04 登记,来源=会话提及)
**实况**:damage_controller.gd 按序改写族通用机制(trade_hit/trade_atk 交换、armor_rewrite 免掷、spike 满层必中与倍乘、discount_shift 轻甲改善——注释叙事 :266-273、改写执行 :283-309、spike 倍乘 :350-353)现役内容面仅淬毒刃纹一行 modify_ticket(mode=clamp_bonus,feats.tres:854):其余子分支零表行注册(全仓 grep 证,含天赋树 tree_rules 面零 spike)——「框架先行、内容未接」同族债,与 charge_layers 同形态但不持数据键。五拍注释全部以旧 27 专长名叙事(矿工重锤/专注/厚积薄发/猎弱本能,道具退役素材库.md:43-47 退役在案);其中 charge_layers 关联四处已归 EffectPort 蓄力层删键批卡处理,其余退役名注释不在该卡范围。证据:reports/需求卡片-EffectPort蓄力层删键批-2026-11-04.md 范围边界节。 **实况**:damage_controller.gd 按序改写族通用机制(trade_hit/trade_atk 交换、armor_rewrite 免掷、spike 满层必中与倍乘、discount_shift 轻甲改善——注释叙事 :266-273、改写执行 :283-309、spike 倍乘 :350-353)现役内容面仅淬毒刃纹一行 modify_ticket(mode=clamp_bonus,feats.tres:854):其余子分支零表行注册(全仓 grep 证,含天赋树 tree_rules 面零 spike)——「框架先行、内容未接」同族债,与 charge_layers 同形态但不持数据键。五拍注释全部以旧 27 专长名叙事(矿工重锤/专注/厚积薄发/猎弱本能,道具退役素材库.md:43-47 退役在案);其中 charge_layers 关联四处已归 EffectPort 蓄力层删键批卡处理,其余退役名注释不在该卡范围。证据:写卡收口提交 0e26168a(卡 v1.1 四裁记录)与实现提交 ace15701(charge_layers 十五处残留清零)。
**缺口**:还差处置方向裁决——删孤儿分支(零内容面顺带清退)vs 留机制待内容(专长池扩充时接),裁后写卡;注释叙事层是否与处置批一并改机制语言同裁。 **缺口**:还差处置方向裁决——删孤儿分支(零内容面顺带清退)vs 留机制待内容(专长池扩充时接),裁后写卡;注释叙事层是否与处置批一并改机制语言同裁。
@@ -255,38 +247,6 @@
**状态**:待文档设计 **状态**:待文档设计
#### minesweeper_rules 公开面还债——S13 超标键撤销后的清偿(2026-11-04 登记,来源=批次移交,优先级=P0)
**实况**:证据=tools/gdstyle_baseline.txt(本批撤销无凭证键后,gdstyle 闸红单键:game/core/minesweeper_rules.gd 公开方法 21>上限 20);+2 搬家方法 harmful_variants/harmful_adjacent 为 R2「五方法归位」裁决的直接后果,还债方向经 21 公开方法全量盘点收窄=safe_remaining 私有化(其余 20 个有生产调用方;preview_reveal=架构在册 sim 出口;settle_batch/fx_reveal 受架构在册边界与职责轴保护)——需求卡片 reports/需求卡片-minesweeper_rules公开面还债批-2026-11-04.md(实现批输入合同,0.5 工作日)。
**改动面**:游戏代码
**状态**:已写卡+已编迭代 52
#### EffectEngine 死函数与全仓孤儿函数清退(2026-11-04 登记,来源=会话提及,优先级=P0)
**实况**:证据=game/core/effect_engine.gd:204 has_effect_on 全仓零调用方(唯一调用方已删后成死码,grep 仅定义命中;2026-11-04 用户裁=删并全仓排查)。排查已于写卡段完成:判死六件(has_effect_on/bp_read_int/find_token/has_open/set_feedback_state/stop_resolved,级联零牵连),B 段 69 件生产零调用仅测量面按登记口径保留——需求卡片 reports/需求卡片-孤儿函数清退批-2026-11-04.md(实现批输入合同,0.9 工作日)。
**改动面**:游戏代码
**状态**:已写卡+已编迭代 52
#### config_db._validate_skill_pool_links 旧校验件清退与测试改锚(2026-11-04 登记,来源=审计发现)
**实况**:config_db.gd:170 _validate_skill_pool_links 生产零调用——技能池链接校验生产真身已迁 config_db_cross_validator.gd:197-213(同判定类别 dangling_skill/pool_composition,检查面更全);旧件测试直连 5 处(round_flow_skill_pool_test.gd:869/871/876/893/905),测试锚在被取代实现。处置方向待裁(删旧件+测试改锚跨表校验件〔推荐〕vs 留旧件作测试对照件)。证据=孤儿函数清退批写卡段全仓排查(reports/需求卡片-孤儿函数清退批-2026-11-04.md §3.3 注①)。
**改动面**:游戏代码
**状态**:待写卡
#### 架构审查 presentation 层封装修复——已写卡待编迭代(2026-11-04 登记,来源=批次移交)
**实况**:需求卡片 reports/需求卡片-架构审查presentation层封装修复批-2026-11-04.md v1.1(4.125 工作日;grilling 六项复核折入=git 提交 5fc9a131;用户两裁=三内部数据类字段公开化+四族一批;凭据=reports/处置-presentation层封装修复-2026-11-04.md)。443 行/14 文件四族(A1 数据类/A2 拆件子件/B 组合根成对转发梯/C 杂项)。自「架构审查余项」条目迁出(该条随迭代51完成整条删除,本卡未编迭代 51,由此条承接)。
**改动面**:游戏代码
**状态**:文档设计已闭合+已写卡+已编迭代 52
#### 测试面真输入化分期与存量断言逐条精锚(2026-11-05 登记,来源=批次移交) #### 测试面真输入化分期与存量断言逐条精锚(2026-11-05 登记,来源=批次移交)
**实况**:证据=test-conventions §8.3「判据出处行锚」「真实入口判定口径」两条文(本批落);链式锚机检已在闸(capability_audit 链断 0,80 套件全承接)。剩余面=①营地七物件段等 ~40 处 emit 站点仍为接线验证(大门/进档链已于本批真输入化,能力行 :158 残险在案)②存量 996 条断言的判据出处逐条精锚(链式锚已保可核,精锚提升出处粒度)。 **实况**:证据=test-conventions §8.3「判据出处行锚」「真实入口判定口径」两条文(本批落);链式锚机检已在闸(capability_audit 链断 0,80 套件全承接)。剩余面=①营地七物件段等 ~40 处 emit 站点仍为接线验证(大门/进档链已于本批真输入化,能力行 :158 残险在案)②存量 996 条断言的判据出处逐条精锚(链式锚已保可核,精锚提升出处粒度)。