From 5358880072cb7298a89d4ff96c30d033424a9e35 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sat, 7 Nov 2026 03:16:59 +0800 Subject: [PATCH] =?UTF-8?q?iter54=20=E7=8B=AC=E7=AB=8B=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E6=8A=A5=E5=91=8A:=20=E6=9C=AA=E5=8F=82?= =?UTF-8?q?=E4=B8=8E=E5=AE=9E=E7=8E=B0=E5=AD=90=E4=BB=A3=E7=90=86=E5=85=A8?= =?UTF-8?q?=E9=87=8F=E5=AE=A1=E8=AE=A1=E2=80=94=E2=80=94=E5=8D=A11=20?= =?UTF-8?q?=E4=B8=AD=E6=A1=A3=20R1-R9=20=E9=80=90=E8=A1=8C=E9=80=9A?= =?UTF-8?q?=E8=BF=87(=E6=AD=BB=E6=8E=A5=E7=BC=9D=E5=8F=8C=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=20grep=20=E5=AE=A1=E8=AE=A1=E8=87=AA=E8=B7=91?= =?UTF-8?q?=E5=8F=8C=E9=9B=B6+41=20=E5=A4=84=E5=85=A8=E7=BB=8F=20ProbeUiUt?= =?UTF-8?q?il=20=E6=97=A0=E7=AC=AC=E4=BA=8C=E4=BB=BD=E5=90=88=E6=88=90?= =?UTF-8?q?=E4=BB=B6+=E5=88=A0=E9=99=A4=E6=96=AD=E8=A8=80=200=20=E6=9D=A1)?= =?UTF-8?q?/=E5=8D=A12=20=E4=B8=AD=E6=A1=A3=20R1-R8=20=E9=80=90=E8=A1=8C?= =?UTF-8?q?=E9=80=9A=E8=BF=87(=E5=85=81=E8=AE=B8=E6=94=B9=E5=8A=A8=200=20?= =?UTF-8?q?=E6=9D=A1=E6=88=90=E7=AB=8B+to=5Fhtml=20=E5=BD=A2=E6=80=81?= =?UTF-8?q?=E5=90=88=E8=A7=84+=E5=87=BA=E5=8F=A3=E5=8D=95=E5=BD=A2?= =?UTF-8?q?=E5=8F=82+13=20=E5=A4=84=E7=A6=81=E6=94=B9=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E7=82=B9=E5=9C=A8=E4=BD=8D)/=E5=8D=A13=20=E9=AB=98=E6=A1=A3?= =?UTF-8?q?=E5=85=A8=E9=87=8F(=E7=AA=84=E5=A4=8D=E8=B7=91=E8=87=AA?= =?UTF-8?q?=E8=B7=91=20elite=5Frow=5Ftest=2027/27=20PASS+config=5Fdb=5Ftes?= =?UTF-8?q?t=2029=20checks=20green+4=20=E6=9D=A1=E7=94=B3=E6=8A=A5?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=E4=B8=8E=20diff=20=E9=80=90=E6=9D=A1?= =?UTF-8?q?=E7=9B=B8=E7=AC=A6+=E5=A5=91=E7=BA=A6=E5=9B=9B=E6=9D=A1?= =?UTF-8?q?=E5=85=A8=E8=BF=87+oracle=20=E6=8A=BD=E6=9F=A5=205=20=E6=9D=A1?= =?UTF-8?q?=E9=9D=9E=E9=95=9C=E5=83=8F)=E2=80=94=E2=80=94=E6=80=BB?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=E9=80=9A=E8=BF=87;=20=E6=9C=AA=E9=98=BB?= =?UTF-8?q?=E5=A1=9E=E8=A7=82=E5=AF=9F=E4=B8=A4=E6=9D=A1=E5=9C=A8=E6=A1=88?= =?UTF-8?q?(=E5=8D=A12=20T2=20=E5=BC=95=E7=94=A8=E5=93=88=E5=B8=8C?= =?UTF-8?q?=E7=AC=94=E8=AF=AF/=E8=A6=86=E7=9B=96=E7=99=BB=E8=AE=B0?= =?UTF-8?q?=E4=BB=B6=20BaseButton-only=20=E7=BB=93=E6=9E=84=E5=B1=80?= =?UTF-8?q?=E9=99=90=E5=BD=92=20B5=20=E6=97=A2=E6=9C=89=E6=9D=A1=E7=9B=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reports/iter54-验收审计-2026-11-07.md | 169 ++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 reports/iter54-验收审计-2026-11-07.md diff --git a/reports/iter54-验收审计-2026-11-07.md b/reports/iter54-验收审计-2026-11-07.md new file mode 100644 index 00000000..0b5de566 --- /dev/null +++ b/reports/iter54-验收审计-2026-11-07.md @@ -0,0 +1,169 @@ +# 迭代 54 独立验收审计报告(2026-11-07) + +> **审计者身份**:独立验收审计子代理——未参与本批实现的只读会话,全量凭据自取(diff 逐笔自读、grep 自跑、窄复跑自跑),未采信任何报告自述的「已全绿」。 +> **对象**:分支 `iter54`(工作区 `D:\code\g-plan2-iter54`),基底=master `a2e500a4`,三笔卡提交:`96123978`=卡 1(QA 缺陷收口批)、`4c424af3`=卡 2(营地交互修复批)、`f9c9caf5`=卡 3(精英专属池)。原史(逐 T 步提交与当轮跑批读数)在 `backup/iter54-20261107-030512` 与 `iter54-premerge-backup` 两分支在案。 +> **审计输入**:三张需求卡片(reports/需求卡片-QA缺陷收口批-2026-11-06.md/需求卡片-营地交互修复批-2026-11-05.md/需求卡片-精英专属池-2026-11-06.md)+实现报告+反哺点+三笔提交完整 diff。 +> **执行证据口径(申报在案)**:卡 1/卡 2 为中档审计,最窄复跑省略——执行证据=逐 T 步提交信息内的当轮跑批读数(`iter54-premerge-backup` 在案,T1–T7 每步读数齐全)+合回后远端 CI 现查(合回落地后按 process-conventions §1 第 3 条现查)。卡 3 为高档审计,窄复跑由审计者本机自跑(§3.5 原样读数)。 + +--- + +## 卡 1|QA harness 缺陷与覆盖遗漏收口批——判定:通过 + +### 1.0 申报验收档与实际执行深度 + +卡面申报验收档=中。实际执行:对照表 R1–R9 全量逐行核对+测试削弱检查(diff 删除行全扫)+内部字段直查受控例外核对逐条+死接缝删除判据(双模式 grep)审计者自跑。窄复跑按中档口径省略(证据口径见头部申报)。 + +### 1.1 对照表逐行核对(R1–R9) + +| 行 | 核对结论 | 证据 | +|---|---|---| +| R1 终局结算框关闭动线零引擎报错 | 通过 | close() 与 _play_celebrate() 两处均改 `has_meta` 前置判断(battle_end_overlay.gd,diff 确认 :191–198/:329–336 两处,语义=有则必杀、无则跳过);验收形态按卡面自陈=grep 读数(「该缺陷唯一提交面=报错打印本体」),当轮读数〔T1 提交 57f3cc75〕=fx_probe/screen_flow_probe 各 exit=0、SCRIPT ERROR 0、celebrate_tw 0 | +| R2 停手钮真输入命中与落效 | 通过 | `_stoptest_tick`+`_stoptest_assert_hit` 在案(ui_click_probe.gd:1172–1236),断言①停手键命中登记、②相位离开 Active、120 帧超时红、终局竞态静默弃测守卫,尾缀〔QA收口 V2〕grep 命中 2 处;驱动=`_click_stop()`(`ap_bar._btn_stop` 真钮 push_input);当轮读数〔T2 提交 816aaae5〕=ui_click_probe exit=0、问题=0、停手键命中 1 次 | +| R3 journey 停手+方法口清零 | 通过(候选键一项按申报例外记) | journey_player 停手行为(每战至多一次,Active+停手钮使能+本轮已挖 ≥1+盘面有挖)+8 处方法口转换逐处核对在 diff(:380→node_overlay._btn 真点、:441→candidate_rect(0) 矩形中心、:449/:451/:452/:454/:455/:457→curio 真钮/bcard 矩形中心);头注「方法口已清零」换代在案。当轮读数〔T3 提交 67f16cc2〕=fatal 0、停手键命中 6 次、停点键在场、屏到达 16 类含战斗/终局、exit=1 为已知缺陷 A1 基线态(卡 1 §5 明示不收件,卡 2 承接)。「候选键在场」未产出——登记件登记通道=BaseButton pressed+营地自绘物件两源,地图画布与 BCard 非 BaseButton(结构性不可产出),实现报告决定记录 5 申报为观测面局限;效力承载面=屏到达 16 类+段间推进(当轮在跑批执行)。审计认定:判据字面一项偏差已申报且有替代效力证据,不构成缺漏 | +| R4 停点链真输入化(16 处) | 通过 | 逐处清点 diff:候选 2(:426/:536→push_click_at(candidate_rect))+节点继续 2(:448/:656→push_click(node_overlay._btn))+三选一 10(:473/:475/:476/:478/:479/:481/:649/:651/:652/:654→bcard 矩形中心/真钮)+弃图刷新链 2(:972→`_btn_refresh`、:975→`_confirm_row` 内 Button 子件)=16,全部经 ProbeUiUtil;既有落点断言删除行全扫=0 条。当轮读数〔T4 提交 2067461f〕=exit=0、问题=0、覆盖 43 命中/30 控件较改前 39/28 不回退、新增停点链键。弃图确认链四种子未触发(is_refresh_ready RAP≥8 门槛,改前同不可达)——申报在案,效力由 journey 真点链承载 | +| R5 到达型候选+停点(7 探针 11 处) | 通过 | 7 件 diff 逐件核对:fx_shot_probe:47/layout_probe:32/shot_probe:147/ui_probe:83/t17_defer_probe:39/ui_tune_probe:143(原 :109 行号就地校正)→ push_click_at(candidate_rect(0).get_center());ui_struct_probe:275(原 :257)→ push_click(node_overlay._btn);shot_probe:9 头注同步。当轮读数〔T5 提交 46493f73〕=headless 五件 exit=0+SCRIPT ERROR 0,窗口化两件 exit=0 | +| R6 调试浮窗面(4 处) | 通过 | ui_tune_probe:③应用→find_button 真点、④重置→find_button 真点、⑤模拟→`_sim_btn` 真点(折叠区滚轮滚入通道=test-conventions §2 现役条文,12 档上限+失败 problem 上报正面效力自检)、⑧应用→前置重开+真点=4 处全转真输入。当轮读数〔T5〕=ui_tune PASS 全链路(含 N=10 模拟输出与种子三分断言) | +| R7 系统测试宿主候选真输入化 | 通过 | system_test.gd:440(原 :433)→ push_click_at(candidate_rect(0).get_center()),`const ProbeUiUtil := preload("res://probe/probe_ui_util.gd")` 复用单点;当轮读数〔T6 提交 97d6b0a5〕=69 检查 0 失败三闸过(V3c 阶段真实选路提交在跑批中执行) | +| R8 三选一覆盖层单元真输入化(5 处) | 通过 | reward_overlay_test.gd 刷新/首卡/次卡/确认/继续 5 处真输入(bcard 矩形中心+真钮),断言语义逐位保持(diff 确认仅驱动行与消息文案换代,判定表达式零改);经 preload 复用 ProbeUiUtil。当轮读数〔T6〕=82 套件 all green、exit=0、0 FAIL | +| R9 死接缝同批清理(5 文件 11 方法) | 通过 | diff 确认删除:ap_bar_view 2+curio_pick_overlay 4+node_overlay 1+debug_overlay 3+level_map_screen 1=11。**审计者自跑双模式 grep**:定义清 `func press_(candidate\|continue\|card\|confirm\|refresh\|apply\|reset\|simulate)` 与调用清 `\.press_(…)`(--include=*.gd,全仓)双双零命中 | + +尾缀 grep 口径说明:〔QA收口 V2〕在码 2 处(T2 新断言的唯一在码尾缀);V1(grep 读数)、V3(journey 跑批读数)、V9(grep 判据)按卡面对照表自陈为读数型判据、无在码断言载体;V4–V8 验收载体=既有断言保持+当轮直跑读数(卡面未为转换行立新尾缀)。与卡面 §11 白名单「尾缀编号分配」一致,无缺漏。 + +### 1.2 测试削弱检查 + +- 三笔提交 diff 删除行全扫(`^-` 行筛 `_problems.append`/`Kit.check`/`check(`):卡 1 删除断言行=**0 条**。 +- 允许删除面(只验证被删 press_* 死接缝的护栏):实际无此类护栏被删——死接缝方法体内无断言。 +- 驱动行替换未触判定表达式;reward_overlay_test 仅消息文案「press_refresh 未外发」→「真点刷新未外发」换代,判定 `refreshed.size() == 1` 原样。 +- ui_click_probe 主循环冻结条件由 `_locktest_state != 1` 扩为 `_locktest_state != 1 and _stoptest_state != 1`——新增冻结窗,非弱化。 +- 判据不放宽面核对:无阈值改动、无断言删除、无跳过逻辑新增。 + +### 1.3 例外核对(内部字段直查受控例外逐条) + +- 产品码私取新增=0(A2 为视图内部容错;candidate_rect 为卡面 §13 申报的唯一新公开面,命中面与 `_candidate_at` 同源——审计比对 level_map_screen.gd:452 与 :478 的半宽常量 `NODE_HALF + Vector2(HIT_PAD, HIT_PAD)` 逐字节一致)。 +- 探针/测试面私有直读逐条:`ap_bar._btn_stop`/`_btn_refresh`/`_confirm_row`、`node_overlay._btn`、curio `_bcards`/`_confirm_btn`/`_continue_btn`、`debug_overlay._sim_btn`、登记件 `_recorder._node_keys`/`_hits`(决定记录 6 申报)——全部属探针族现役惯例(ui_click_probe 既有 `ap_bar._btn_stop` 同型先例),封装扫描件射程不含探针(presentation_encapsulation_sweep_test 只套五个 flow 件)。 +- tests 面合成输入件检查:game/tests 全目录 grep `InputEvent`=**零命中**;system_test 与 reward_overlay_test 均经 preload 复用 ProbeUiUtil(禁第二份合成输入件契约成立)。probe/sim 面持 push_input 的文件(ui_input_probe、screen_flow_probe 等)全部为改前既有件,本批零新增。 +- 改动面越界检查:卡 1 提交触面 17 文件=卡面 §7 结构图逐项+产出物 2 件,零越申报面。 + +--- + +## 卡 2|营地交互修复批——判定:通过 + +### 2.0 申报验收档与实际执行深度 + +卡面申报验收档=中。实际执行:对照表 R1–R8 全量逐行核对+测试削弱检查+允许改动 0 条既有断言核对+判据形态核对+UiKit 出口形参核对。窄复跑按中档口径省略(证据口径见头部申报)。 + +### 2.1 对照表逐行核对(R1–R8) + +| 行 | 核对结论 | 证据 | +|---|---|---| +| R1 大门无断点按「是」后开始层不可见 | 通过 | `_start_adventure()` 首句加 `ui.screens.start_overlay.visible = false`(main.gd:293,在 `ui.flow.close` 之前——契约 1 落点);`_start_adventure_from_menu()` 冗余句删除(:194 注释换代)。探针 R1 断言〔营地交互批 V1〕在案(ui_click_probe 大门段),真实入口=大门命中区真点→R4 推进钮真点→同链断言。当轮读数〔T1 提交 bf8d30c1〕=探针 exit=0、问题=0(修复前该句恒红判据零命中) | +| R2 开局落节点图选路停点 | 通过 | R2 断言〔营地交互批 V2〕(level_screen.visible)与既有 is_adventure 断言同批在案;await 1 帧→3 帧帧口径落实(T1 提交信息记「停点成形最小帧数实测=3 帧内成形」)。判据绑定面按卡面 R2 自陈=开局终态在位断言,特有提交面由 R1 承载——两行同批缺一即红结构保持 | +| R3 两/三钮形态位次=推进→次→维持 | 通过 | confirm_dialog.gd 三句 `add_child` 次序镜像为 确认→次→取消,对象创建、三句 connect、成员声明、open()/open_three() 签名零改动(diff 确认,契约 3);新套 confirm_dialog_test.gd=7 断言(双钮 3+三钮 4),判据=公开子节点序+Button 公开 text,零私有直读,双钮形态 child(2) 非 child(1) 硬知识与非空前置(子节点数=3)在案;入册 run_all.gd(+1 行)。当轮读数〔T2 提交 af127b15〕=直跑 exit=0 七断言全 PASS | +| R4 左位真点即推进 | 通过 | 探针 R4〔营地交互批 V3〕:真点前 `_confirm_consumer == "gate_new"` 前置读(探针既有直读先例)、按钮行 child(0) 全局矩形中心 push_click_at(非行矩形左位——卡面轮次 4 硬伤修正的落法)、真点后 is_adventure 翻转+consumer 清零。T2.3「前置重开」→「原位 R4」重构=实现报告决定记录 8 申报(主证绑定翻转才有判别力),既有确认断言原样保留。当轮读数〔T2〕=R4 在跑批执行且通过 | +| R5 顶栏栏体几何与徽章落座 | 通过 | `_smoke_camp_hud_band()` 接进 `_split_tail()` await 链(system_test.gd:47,非 _initialize——卡面 T3.4 硬伤修正落法);五钉:①`to_html(true) == "6e4526cc"`(禁浮点分量直等判据形态成立,全文件无 `.a == 0.80` 型断言)②铺满(栏体矩形对顶栏矩形等值+高 48)③IGNORE④栏体为第一子件⑤徽章顶格(y 对齐栏顶)+右位(end.x=栏右缘−12),几何容差 0.51。T3.0 前置读数=徽章 min 高实测 48.0(L3 第 5 条未触发,决定记录 10)。当轮读数〔T3 提交 8f2eab7c〕=76 检查 0 失败 | +| R6 栏体对落位带底色对比 ≥3:1 | 通过 | `_test_hud_band_contrast_over_bg()`:规格侧算式——测试内写死 `#6E4526`/α0.80(Color(0x6e/255.0, …) 字面构造),**未把视图件 color 喂进算式**(oracle 镜像禁令成立);带高取 `camp_scene_layout_table.gd` 数据出口;双层全像素扫描+扫描面非空前置;WCAG ≥3.0。当轮读数〔T3〕=实测 4.29:1,与卡面复核推算一致 | +| R7 回归·件 1 未动三条动线 | 通过 | 既有大门两分支段与篝火段断言零改写(diff 确认无删除行);三处未改动隐藏点核在位:`_resume_from_menu()`(main.gd:246)、boot 默认(:137)、其余 11 处自管点全部原样(grep 全列与卡面 13 处清单一致)。当轮读数〔T1〕=既有断言原样通过 | +| R8 回归·件 2 路由与件数断言 | 通过 | 探针次钮隐藏断言(ui_click_probe.gd:739,〔营地图批 V3〕原文原样)与 system_test 三钮计数断言(:193–201,V2d 三钮在位+渲染面可见钮计数==3)均未被本批触碰(两笔 diff 删除行全扫=0)。位次改动后二者仍绿=契约 3 未被违。当轮读数=探针问题=0、系统测试 76/0 | + +### 2.2 测试削弱检查 + +- diff 删除断言行=**0 条**(三笔提交中卡 2 段全扫)。 +- camp_scene_layout_test 入口重构(单 quit 迁至 `_run_all` 统一收尾):断言集零增删,早退路径从 quit 改 return 后仍会被 `_run_all` 收尾 quit 接住,无静默跳过——非削弱。 +- 允许改动 0 条既有断言:成立。 + +### 2.3 例外与申报面核对 + +- 契约 1:开局隐藏点唯一(`_start_adventure()`),续玩唯一(`_resume_from_menu()`),禁改的 13 处自管点逐一 grep 在位,`camp_shop_presenter.gd:85` 语义句未动(契约 2)。 +- 契约 4:`camp_hud_band_surface(host)` 形参只有 host——色值、α、铺满、IGNORE、挂载、返回句柄六事全在体内(ui_kit.gd:666–676 审读);无 color/pass_input 形参(开了即违——未开);盘上三处同形铺面(ui_assembler.gd overlay_bg、ui_kit `_modal_dim`、page_shell 底板)零触碰(不在 diff 文件清单)。 +- 契约 5:IGNORE 在出口内写死;camp_hud_band.gd 内右对齐容器自身 IGNORE 同批落(漏一处即顶排点不动的双点纪律成立);本文件内 `ColorRect.new()` grep=零命中。 +- S13 基线修订:ui_kit max-public-methods 23→24——卡 2 §13 预申报的例外(「本条即申报与请求」+U0 批卡),diff 仅此一行;非越权改基线。 +- 改动面越界检查:提交触面=卡面 §7 结构图 9 件+run_all 入册+gdstyle_baseline+产出物 2 件,零越申报面;design/ 与两份根流程清单零触碰(契约 6)。 +- 能力行名实核对:README:158/:159 两行与实际落地(confirm_dialog_test 两函数、`_smoke_camp_hud_band`、`_test_hud_band_contrast_over_bg`)逐字相符。 + +--- + +## 卡 3|精英专属池——判定:通过(高档全量) + +### 3.0 申报验收档与实际执行深度 + +卡面申报验收档=高。实际执行:①对照表 R1–R7 逐行核对;②判据绑定面抽查;③测试削弱检查(含 4 条申报测试改动逐条 diff 核对);④直查例外核对+契约核四条;⑤窄复跑抽查——审计者自跑两件;⑥oracle 出处核对抽查 5 条。 + +### 3.1 对照表逐行核对(R1–R7) + +| 行 | 核对结论 | 证据 | +|---|---|---| +| R1 elite 行类合法与字段互锁、引用校验 | 通过 | elite_row_test `_test_elite_validation_rejects`=合法夹具零错+11 个违例夹具(①删 base_ref ②同名 ③pool_extra 空 ④删键 ⑤带 pool ⑥battle 带 base_ref ⑦battle 带 pool_extra ⑧悬空 ⑨指向 elite ⑩重叠 ⑪权重 0)各「含」预期类别,与卡面 T1.11 逐条对应;`_validate_elite_fields`/`_validate_elite_refs`/`dangling_base` 实装与 T1.7/T1.9 一致。config_db_test fv7 样本 miniboss 换代在 diff(申报第 1 条) | +| R2 有效池=基础池+附加技、基础池取深度带最小行 | 通过 | `_test_effective_pool_merge`:夹具深带行(band 3, attack5/charge2)在前、浅带行(band 0, attack9/lunge1)在后——取首行的错误实现必红;期望 {attack9,lunge1,heavy2}+size 3;battle 行读法等价面 {attack9,lunge1}。实装 `_min_band_row`(遍历取 band 最小)与 `effective_pool`(基础池条目+pool_extra 条目,均 duplicate)与 T1.3/T1.4 一致 | +| R3 继承不复制 | 通过 | `_test_base_pool_change_propagates`:基础行 attack 改 7 后再查=7(按需现算);改写首次返回数组条目为 99 后表内行仍=7(duplicate 隔离)。enemy_table.gd 类变量 grep=仍仅 `rows`+`_resolver` 两个,**零新增类变量**(契约 1) | +| R4 合并池过池构成纪律 | 通过 | `_test_merged_pool_composition`:合规精英 pool_composition=0;附加第二普攻/第二增益两夹具各=1 且 message 含 goblin_elite。boss 行补合规池=决定记录 11 申报(夹具 mechanics,`_mk_row` 默认单普攻池自身违纪律会误红);跨表件 `:194` 改读 `enemy_table.effective_pool(row)` 单行 diff(T2.1) | +| R5 暂不接线 | 通过 | `_test_elite_unreachable_by_encounter`:夹具 resolver 敌行回调返回含 elite 行的三行行集;①`resolve_enemy_rowset(1, 0, "elite")` 返回空+诊断含 fatal/request_oob——判据绑行类门改动(只改枚举不改为门时该请求会返回 goblin_elite);②battle/boss 查询合计>0 且零 elite 行(非空前置内嵌判据)。resolver :41 改读 `ENCOUNTER_ROW_KINDS`、文案保持「row_kind 域 {battle, boss}」逐字(T2.2);该常量全仓 grep 仅 resolver 一处消费(卡面 §12 单点申报成立);`unit_container.gd`/`battle_orchestrator.gd`/`level_runner.gd`/`level_table.gd` 零触碰(契约 2) | +| R6 地精精英落表且全表加载零错 | 通过 | `_test_production_goblin_elite`:生产表 load_tables(true) 后 error 级诊断=0;行恰 1 条;12 字段逐位断言表+无 unit_count_max/无 pool 键+有效池四键精确。enemy.tres diff:行插 (1,boss,6,ogre_chief) 之后、(2,battle,0,bugbear) 之前(T3.1),15 键中 12 判据字段与卡面 §2 表逐值一致(hp 20/atk 2/1/3/armor 2/light/unit 1/base_ref goblin/pool_extra heavy 2),attack_type normal 由 roll_multiplier_test 既有「全行 normal」断言覆盖 | +| R7 存量冒烟随新行同步、判据不放宽 | 通过 | 逐条核对见 3.3——行数 29→30 精确等、键序逐位插行、池模板精确键集比对、曲线护栏阈 ≤2.5 未动、注入还原改相对基数(加强);五件存量套件当轮读数〔T3 提交 75a4afe2〕=exit=0 零 SCRIPT ERROR | + +### 3.2 判据绑定面抽查 + +- V5 绑定改动特有面:判据①在「只做 T1.1 不做 T2.2」的反事实下必红(elite 请求会返回行而非空)——断言钉在行类门改动本身,非改动前后双绿的常真断言。审计按卡面反事实推演复核成立。 +- V2 绑定取带语义:夹具行序(深带在前)使「取首行」实现必红——钉在 `_min_band_row` 的取最小带逻辑,非常真。 +- V3 绑定零缓存:改表后再查+改写返回不回灌,两钉分别排除缓存实现与引用泄漏——绑契约 1。 +- V4 绑定合并池:单看基础行或单看附加技都不违规,唯合并后违规——钉在「纪律校验对象=合并池」。 + +### 3.3 测试改动申报 4 条逐条 diff 核对(无越面改判) + +| 申报条 | diff 实况 | 结论 | +|---|---|---| +| 1. config_db_test fv7 样本 elite→miniboss+文案 {battle, boss, elite} | 恰两处(样本行+断言消息),判定逻辑(domain+含 "row_kind")零改 | 相符 | +| 2. round_flow 七处 row.pool→effective_pool+expect_pools 增键+文案 | diff 恰 7 处读法换代(:530/:541/:560/:621/:627/:642/:657 区段)+expect_pools 增 `"1_elite_0_goblin_elite"` 键+文案「二十九行十种」→「三十行十一种」(十种→十一种为决定记录 13 申报的完成形态,池模板计数同句失真一并换代);期望字典判定 `got != expect_pools[rk]` 零改 | 相符 | +| 3. guard 行数 30+键序插行+l1_totals skip elite | 行数断言 `== 30` 精确等(未放宽为 ≥);expect_keys 在 `"1|boss|6|ogre_chief"` 后恰插 `"1|elite|0|goblin_elite"`;`:389` 循环首加 elite 跳过(两行);头注与 print 文案同步 | 相符 | +| 4. level_shop 还原断言改相对基数 | 注入前记 `base_n`,断言 `== base_n`,文案去写死数——卡面自陈「属加强」 | 相符(加强) | + +三笔提交删除断言行全扫:恰上述 4 条申报改判的旧行,无第 5 条。**无越面改判。** + +### 3.4 契约核(四条全过)与例外核对 + +- 契约 1 继承不复制:enemy_table.gd 类变量 grep=2 个(rows/_resolver),零新增;effective_pool 每次现算、返回条目 duplicate、零缓存零写回(V3 断言实证)。 +- 契约 3 算法唯一落点:合并算法 grep `pool_extra` 全仓仅 enemy_table.gd/elite_row_test/round_flow/compendium_dump 四处(后三处为消费/测试/导出面,非第二份算法);权重上限 9999 在 schemas 面仅 enemy_table.gd:171 一处(meta_tree 的 9999 为价格域既有件,非池权重)。 +- 契约 4 既有文案逐字不变:`_validate_row_pool` 四条报错文案经 field 参数化后对 field="pool" 渲染逐字节等值(「%s pool 条目非字典」「%s pool 条目 skill_id 空」「%s pool 内 skill_id 重复」「%s pool 权重越域 (0,9999]」——diff 左右对比确认);既有错误类别零改名,新增类别仅 dangling_base;`:88` row_kind 文案域换代=卡面 T1.1 申报项。 +- 直查例外:产品码零私取新增(新增公开面=effective_pool+ENCOUNTER_ROW_KINDS,均卡面 §12 申报);elite_row_test 全部经公开入口(validate/effective_pool/validate_skill_pool_links/resolve_enemy_rowset/load_tables)进出,零私有直读。 +- 残留读法豁免核:round_flow 残留 `row.pool` 恰 3 处(:574 种带过滤 row_kind=="battle"、:795 species 名单 ["goblin","bugbear","ogre_chief"] 精确等值不含 goblin_elite、:846 resolver battle 查询结构性不可达)——与卡面 §3.4+决定记录 12 一致,豁免成立。 +- 改动面越界检查:提交触面=卡面 §7 结构图 12 件+产出物,零越申报面;design/ 零触碰。 + +### 3.5 窄复跑读数(审计者本机自跑,2026-11-07) + +`Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://tests/unit/data_config/elite_row_test.gd`: + +- 退出码=**0**;`[PASS]` 计数=**27/27**(V1 合法夹具+①–⑪ 共 12、V2×2、V3×2、V4×3、V5×2、V6×6);`[FAIL]` 与 `SCRIPT ERROR` 扫描=零行。原样尾行: + `[elite_row_test] PASS — 精英行校验/有效池/继承不复制/合并池纪律/暂不接线/生产表落行 全过` + V6 关键 PASS 行原样:`生产表加载 error 级诊断计数=0(实得 0)〔精英批 V6〕`/`行值 12 字段逐位相等(失配项 无)〔精英批 V6〕`/`有效池字典={attack9,lunge1,desperate_guard1,heavy2}(实得 { "attack": 9, "lunge": 1, "desperate_guard": 1, "heavy": 2 })〔精英批 V6〕` +- 同目录 `config_db_test.gd` 抽跑:退出码=**0**,尾行 `[config_db_test] all green (29 checks)`(fv7 换代样本所在套件全绿)。 +- (退出时 ObjectDB 泄漏警告为引擎常规退出清场噪音,与本套件断言面无关,headless 直跑既有形态。) + +### 3.6 oracle 出处核对抽查(5 条,均非 oracle 镜像) + +| 断言 | oracle 注记指向 | 独立推导核对 | +|---|---|---| +| V1 十一违例 | 敌人系统.md:325 拒绝清单 | :325 逐句可独立推出 11 个违例面:缺基础引用/缺附加技/悬空/指向 elite/同名/附加重复/合并池违纪/elite 写池/非 elite 带两键——①–⑦⑨⑩ 与之一一对应;⑪ 权重 0 由 :283「weight ∈ (0, 9999]」推出。**可独立写出,通过** | +| V2 合并池 | 敌人系统.md:149 | :149「基础池取自同关、战斗行类、该基础敌种深度带最小的那一行的池模板」——期望值 {attack9,lunge1,heavy2}=band 0 行池+附加,规格句独立可推;夹具反事实(取首行必红)为审计加验。**通过** | +| V3 传到精英 | 敌人系统.md:149「继承不复制:基础池调参自动传到精英」 | 改权重 7 期望读 7 直由该句推出。**通过** | +| V4 合并池纪律 | 敌人系统.md:150「校验的对象是合并后的池」 | 「附加第二普攻→违规」唯在合并口径下成立(基础行单独合规、附加技单独合法),规格句独立可推。**通过** | +| V6 十二字段 | 敌人系统.md:147+卡 3 §2 表 | :147 出「精英=敌人表行类为 elite 的独立一行」的结构面;行值出处=卡面 §2(2026-11-06 用户点头草案 v0,GDD 明示不登记行值)——12 字段值(hp 20/atk 2/1/3/armor_class 2/armor_type light/unit_count 1/base_ref goblin/display_name「精英·地精」等)与卡 §2 表逐值一致,预期值独立于实现存在(需求合同面)。**通过,非镜像** | + +抽查结论:5 条抽查均能由注记指向的规格句(或卡面用户已裁行值表)独立写出预期值,未发现「预期值只在实现里有的」oracle 镜像。 + +### 3.7 报告引用瑕疵(不阻塞项) + +实现报告卡 3 T3 摘要引用提交 `e538e2cb`/`f4865ad8`、卡 1 各 T 摘要引用 57f3cc75 等 10 个哈希均于 `iter54-premerge-backup` 分支在案可解;唯卡 2 T2 摘要引用「提交 46287043 区段」全库(含 reflog 与 dangling)不可解——该步实际提交=af127b15(premerge-backup),已折叠进重塑提交 4c424af3。属报告引用笔误,改动本身已由本审计在 diff 与跑批读数双面核实,不影响判定。 + +--- + +## 总判定:通过(三卡全过) + +| 卡 | 申报档 | 判定 | 关键依据 | +|---|---|---|---| +| 卡 1 QA 缺陷收口批 | 中 | 通过 | R1–R9 全量核对通过;死接缝双模式 grep 审计自跑双零;削弱检查零删除断言;41 处转换全经 ProbeUiUtil 单点;候选键观测面局限已申报且效力有替代承载 | +| 卡 2 营地交互修复批 | 中 | 通过 | R1–R8 全量核对通过;允许改动 0 条既有断言成立(次钮隐藏/三钮计数原样且绿);to_html 判据形态合规;出口形参仅 host;S13 基线修订在预申报通道内 | +| 卡 3 精英专属池 | 高 | 通过 | R1–R7 全量核对通过;窄复跑自跑 27/27 PASS+config_db_test all green;4 条申报测试改动与 diff 逐条相符无越面;四条契约全过;oracle 抽查 5 条均非镜像 | + +- 测试削弱总核:三笔提交删除断言行合计恰卡 3 申报 4 条,其余零削弱;禁变异类测试与撤销类取证——三笔 diff 内未发现人为制造红或回退取证的形态。 +- 最窄复跑省略(中档卡)的执行证据口径=批内逐 T 提交读数(`iter54-premerge-backup` 每步在案)+合回后远端 CI 现查;卡 3 高档窄复跑由审计者自跑实证。 +- 遗留义务核对:真人目检两项(覆盖面板下钻/顶栏观感)已登记实现报告(登记即了结义务);「开战快照拿到合并后池」半句与精英 EV 重锚的移交去向(待办清单「战斗节点遭遇编排方式」/难度曲线与Boss)在卡 3 §5 与实现报告遗留义务节闭合;反哺点三条(architecture CampHudBand 行/体验验证清单一行/03-内容规模.md:66)落点明确待用户裁决。 +- 未阻塞观察两条(供后续批次参考,不构成本批缺漏):①上节 3.7 报告哈希引用笔误一处;②卡 1 R3/R4 覆盖登记件对非 BaseButton 控件(地图画布、bcard)无命中键为登记件结构性局限——若日后需要该面命中证据,归「控件级零命中缺口」B5 既有条目处置,非本批义务。