21 KiB
21 KiB
迭代 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.gdhas_open、camp_scene_view.gdset_feedback_state、curio_stop.gdstop_resolved。 - T0 复核:六件全仓词边界 grep 仅定义命中(has_open 两处/set_feedback_state 一处为注释提及),与卡 §3.2 零调用证据一致。
- T2 级联留存复核计数:
bp_read6 处在役调用/_bp_strategy1(bp_read)/curio_deck.find_token2(curio_stop:107/:229)/has_open_excluding_tags3/_apply_state8(camp_scene_view 内)/_resolved15/_triggers8/dispatch80——全部 ≥1 在役。 - 新增孤儿扫描:六文件逐函数引用计数粗扫(CR 剥离后)=零孤儿。
- T3:单测域
run_all.gd80 套件全绿(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_started6 键(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_maskCallable(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 与探针套件改前改后零转红为呈现逐位同证据)。
环境红定性(跨卡记录)
- 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(工程改动,归用户裁决)。 - 并行跑闸 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_LAYERpreload+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/255」实测被邻格砖纹阴影/微光混色污染(L3 读数 seal 0.008 vs ref 0.094——系纹理内容非光圈;L2/L3 砖瓦本身含近黑斑)。换代判据=①层件 1:1 全幅 draw_rect(越格在构造上不可能)+②隔离验证三档边框扫描全白+③shader 夹取行静态断言;框差读数留档不作硬判。意图(光圈不出格)三面承载。
- 环径扫描阈值:印记体 alpha=1 合成结果=纯黑(≤2/255)——首版 0.15 阈值被 L2 砖纹近黑斑混入(读数 42px 假越带),收紧后三关一致 38px。
- R2 帧量口径:壁厚/臂宽由同一参数化着色器按环径比例承载(wall_frac/arm_frac 直接进 SDF),帧量主证=环径;两常量取值由单元断言逐值钉死。
实机目检总清单(登记不阻塞)
- 三关封印格观感(环+十字+压暗光圈,截图=artwork/ 在途
seal_iso_*.png与 seal_shots/ 裁剪帧)。 - 战末金蜡封徽记观感(贴图路径未动——零预期变化)。
- 封印格与变异纹带同格观感(两层共存——零代码触面,观感确认项)。
遗留读数义务
- 无(零数值改动零 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——已随收尾笔修剪。