Files
gplan-2/reports/iter52-验收审计-2026-11-05.md
T

24 KiB
Raw Blame History

迭代 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
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
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 落定后的绿终局且跑闸步真跑过;零触发批不作绿证)。