审计补差(迭代47): 独立验收审计报告落档+缺漏处置——V5退出接线断言落码+尾缀覆盖9处+V7守卫+反哺点#12订正;处置后结论=通过
- 审计报告(未参与实现子代理): 对照表42行全查(✅33/⚠️8/❌1)+判据绑定面四项全过+削弱授权6件在案未授权零+直查例外5处+自跑六条全绿;总结论=不通过(限项)缺漏1+轻微1 - 缺漏1处置: 卡⑤V5退出项静态接线断言落码(ui_struct:quit_requested连接表目标=_on_esc_quit+调用链_on_esc_quit→_on_quit→_quit_game源扫描)——审计处方最窄单元 - 缺漏2处置: 尾缀覆盖9处(V4购买出账/持久+V6图鉴锁文+V7显式二次确认断言screen_flow回退段+B1大门confirmed+B2 HUD+B3返回/设置——forge_workbench部分按审计处方记豁免:断言零改申报约束) - 记档处置: V7长度非空守卫一行;反哺点#12订正(CAMP_HEADER_BAND消费面仅剩keystone_badge工厂——审计记档2);实现报告§4 B1行补_secondary_btn直查申报;V9扫面注记(直接子层) - 孤跑复验: ui_struct/screen_flow 双绿(含新增V5断言与V7守卫) - 合回前置余项: shot_checker A/B裁决(用户)→--code闸重跑追绿→主区合回
This commit is contained in:
1 parent
65b2a57449
commit
c538536265
6 files changed
+164
-13
No files matched your search
@@ -123,7 +123,9 @@ func _step_camp_back_to_menu() -> void:
|
||||
return
|
||||
main.ui.modals.camp.scene.object_pressed.emit(&"campfire")
|
||||
await _frames()
|
||||
main.ui.modals.confirm_dialog.confirmed.emit() # 二次确认离场(回主菜单——卡④ T4)
|
||||
if not main.ui.modals.confirm_dialog.visible:
|
||||
_problems.append("③篝火:二次确认弹窗未现(camp.md v2.2 必须先确认)〔营地图批 V7〕")
|
||||
main.ui.modals.confirm_dialog.confirmed.emit() # 二次确认离场(confirmed 先于关层——卡④ T4)
|
||||
await _frames()
|
||||
_expect_exclusive("③营地→菜单(回退)", "菜单")
|
||||
|
||||
@@ -242,7 +244,7 @@ func _step_camp_esc_and_hud() -> void:
|
||||
_push_esc()
|
||||
await _frames()
|
||||
if not main.ui.modals.camp.esc_overlay.visible:
|
||||
_problems.append("[esc] 营地根态 Esc 未唤起浮窗(契约 9③)〔ESC批 V1〕")
|
||||
_problems.append("[esc] 营地根态 Esc 未唤起浮窗(契约 9③)〔ESC批 V1〕〔ESC批 B1〕")
|
||||
_push_esc()
|
||||
await _frames()
|
||||
if main.ui.modals.camp.esc_overlay.visible:
|
||||
@@ -264,7 +266,7 @@ func _step_camp_esc_and_hud() -> void:
|
||||
main._camp_pres.views.refresh_bus.refresh(main._camp_data()) # 显式触发刷新单口
|
||||
var band: Control = main.ui.modals.camp.scene.get_node("HudBandSlot").get_child(0)
|
||||
if not String(band._badge.value_label.text).begins_with("钥石 9999"):
|
||||
_problems.append("[esc] HUD 余额读数≠存档单口现值(直写+显式触发未变)〔ESC批 V6〕")
|
||||
_problems.append("[esc] HUD 余额读数≠存档单口现值(直写+显式触发未变)〔ESC批 V6〕〔ESC批 B2〕")
|
||||
# 设置开在浮窗之上→Esc 无反馈且浮窗不误关(契约 9①);关设置回浮窗不回主菜单(契约 3 语境分支)
|
||||
_push_esc()
|
||||
await _frames()
|
||||
@@ -279,12 +281,12 @@ func _step_camp_esc_and_hud() -> void:
|
||||
main._on_settings_closed()
|
||||
await _frames()
|
||||
if not main.ui.modals.camp.esc_overlay.visible or main.ui.screens.start_overlay.visible:
|
||||
_problems.append("[esc] 关设置后未回浮窗或回弹主菜单(契约 3 语境分支失守)〔ESC批 V4〕")
|
||||
_problems.append("[esc] 关设置后未回浮窗或回弹主菜单(契约 3 语境分支失守)〔ESC批 V4〕〔ESC批 B3〕")
|
||||
# 返回主菜单动线(契约 4——浮窗自收+营地隐+选档收+菜单显)
|
||||
main.ui.modals.camp.esc_overlay.return_requested.emit()
|
||||
await _frames()
|
||||
if main.ui.modals.camp.esc_overlay.visible or main.ui.modals.camp.scene.visible or main.ui.modals.save_select_overlay.visible or not main.ui.screens.start_overlay.visible:
|
||||
_problems.append("[esc] 返回主菜单动线失守(浮窗自收/营地隐/选档收/菜单显)〔ESC批 V3〕")
|
||||
_problems.append("[esc] 返回主菜单动线失守(浮窗自收/营地隐/选档收/菜单显)〔ESC批 V3〕〔ESC批 B3〕")
|
||||
# 非营地语境(boot 菜单)Esc→无响应(契约 9④ 回归面)
|
||||
_push_esc()
|
||||
await _frames()
|
||||
|
||||
@@ -88,11 +88,11 @@ func _ready() -> void:
|
||||
buy_btn.pressed.emit() # 合成购买点击 → _on_camp_tree_buy → meta.tree_buy(写调用唯一归组合根)
|
||||
await get_tree().process_frame
|
||||
if int(iso_c.meta_state.keystone_balance()) != bal_before - price:
|
||||
_problems.append("营地树购买未出账(%d→%d 应 −%d)〔句柄子容器批 V1〕" % [bal_before, iso_c.meta_state.keystone_balance(), price])
|
||||
_problems.append("营地树购买未出账(%d→%d 应 −%d)〔句柄子容器批 V1〕〔营地图批 V4〕" % [bal_before, iso_c.meta_state.keystone_balance(), price])
|
||||
var iso_chk = load("res://core/save_manager.gd").new("user://smoke_click_probe_camp_slot_1.json")
|
||||
iso_chk.load_from_disk()
|
||||
if int(iso_chk.meta_state.tree_state().nodes.get("sp_hp", 0)) != 1:
|
||||
_problems.append("营地树购买未持久(reload 后级 != 1)〔句柄子容器批 V1〕")
|
||||
_problems.append("营地树购买未持久(reload 后级 != 1)〔句柄子容器批 V1〕〔营地图批 V4〕")
|
||||
# Fork 双态切换点击路径(V20——购=解锁默认 A,钮切 B;前置=同调位 1,先点亮)
|
||||
var socket_btn: Button = null
|
||||
for card in main.ui.modals.camp.tree._tree_buy_btns:
|
||||
@@ -177,10 +177,10 @@ func _ready() -> void:
|
||||
_collect_labels_by_text(main.ui.modals.camp.codex, codex_labels)
|
||||
var atlas_locks := _labels_with_text(codex_labels, "结构位预留")
|
||||
if atlas_locks.is_empty():
|
||||
_problems.append("营地灰字:图鉴锁文 label 未找到(wc4 定位锚失守——锚随形态订正去『柜台』)〔句柄子容器批 V1〕")
|
||||
_problems.append("营地灰字:图鉴锁文 label 未找到(wc4 定位锚失守——锚随形态订正去『柜台』)〔句柄子容器批 V1〕〔营地图批 V6〕")
|
||||
for l in atlas_locks:
|
||||
if l.get_theme_color("font_color") != UiKit.STONE_DEEP:
|
||||
_problems.append("营地灰字:图鉴锁文未用 STONE_DEEP(wc4 :167)〔句柄子容器批 V1〕")
|
||||
_problems.append("营地灰字:图鉴锁文未用 STONE_DEEP(wc4 :167)〔句柄子容器批 V1〕〔营地图批 V6〕")
|
||||
main.ui.modals.camp.codex.closed.emit()
|
||||
await get_tree().process_frame
|
||||
main._on_camp_closed() # 关层收闭(营地与选档层同收+开始层恢复——卡④ T3)
|
||||
@@ -702,7 +702,7 @@ func _ready() -> void:
|
||||
main.ui.modals.confirm_dialog.confirmed.emit() # 「是」→开始新冒险
|
||||
await get_tree().process_frame
|
||||
if not main.run_scope.is_adventure or main.ui.modals.camp.scene.visible:
|
||||
_problems.append("大门确认:冒险未发起或营地场景屏未隐藏〔营地图批 V3〕")
|
||||
_problems.append("大门确认:冒险未发起或营地场景屏未隐藏〔营地图批 V3〕〔营地图批 B1〕")
|
||||
# 有断点三出口(选路停点形注入——同开场行③ set_breakpoint 先例)
|
||||
main.save_manager.set_breakpoint({
|
||||
"master_seed": 42, "rng_counter": 0, "hero_hp": 30, "gp": 10, "keystone": 0,
|
||||
|
||||
@@ -130,6 +130,19 @@ func _ready() -> void:
|
||||
var esc_anim := _count_animplayers(main.ui.modals.camp.esc_overlay)
|
||||
if esc_anim != 0:
|
||||
problems.append("[esc] 浮窗子树 AnimationPlayer 非零(契约 6 零动效)〔ESC批 V7〕")
|
||||
var esc_src := FileAccess.get_file_as_string("res://presentation/views/camp_esc_overlay.gd") + FileAccess.get_file_as_string("res://presentation/main_esc_flow.gd")
|
||||
if esc_src.is_empty():
|
||||
problems.append("[esc] 零动效扫描面为空(源文件读失败——非空前置失守)〔ESC批 V7〕")
|
||||
# 退出项接线断言(卡⑤ V5——绑信号连接与调用链;headless 不可真退=静态判据+观测面局限申报)
|
||||
var quit_wired := false
|
||||
for c in main.ui.modals.camp.esc_overlay.quit_requested.get_connections():
|
||||
if c.callable.get_method() == "_on_esc_quit":
|
||||
quit_wired = true
|
||||
if not quit_wired:
|
||||
problems.append("[esc] 退出钮接线断链(quit_requested 连接目标≠_on_esc_quit)〔ESC批 V5〕")
|
||||
var quit_chain := FileAccess.get_file_as_string("res://presentation/main.gd") + FileAccess.get_file_as_string("res://presentation/main_esc_flow.gd")
|
||||
if not quit_chain.contains("MainEscFlow._on_quit(self)") or not quit_chain.contains("root._quit_game()"):
|
||||
problems.append("[esc] 退出调用链断裂(_on_esc_quit→_on_quit→_quit_game)〔ESC批 V5〕")
|
||||
if main.ui.screens.debug_badge.visible:
|
||||
problems.append("[esc] 浮窗开态 debug_badge 可见(发布态恒隐——float 类不注册 ModalStack 应零波及)〔ESC批 V8〕")
|
||||
push_esc.call()
|
||||
|
||||
@@ -16,4 +16,4 @@
|
||||
| 9 | roadmap.md | 迭代 47 行+当前位 | 状态「待开工」 | 行换代(三卡实现报告列+状态)+当前位三行换代 | 迭代收口 |
|
||||
| 10 | shot_checker 色数判据 | tools/shot_checker.py A 段 | camp 屏唯一色数 ≥64 | L3 呈报在案(读法 A/B 待裁)——裁决后判据修正随批+待办清单登记条 | 停机呈报 2026-11-01 |
|
||||
| 11 | asset-path-map.md §3 / art-assets-checklist.md §3.5 | 营地 10 张路径行 | 登记超前注记 | 实装入库确认(scene_camp_* 十件在役+TEX_CAMP_* 十键消费)+终稿置换待用户游戏内终审注记 | 卡④ T1 |
|
||||
| 12 | ui_kit CAMP_HEADER_BAND 令牌 | ui_kit.gd :178 邻域+ui_contrast 表 | 令牌在役(新界面零消费) | 令牌退役评估(现役消费面=ui_contrast 表已注销四行后零消费——随令牌批处置,非本批强删) | 卡④ T5 核签 |
|
||||
| 12 | ui_kit CAMP_HEADER_BAND 令牌 | ui_kit.gd :178 邻域+ui_contrast 表 | 令牌在役(营地域柜台头带消费随形态退役) | 令牌退役评估(消费面仅剩 keystone_badge 工厂与关卡屏/商店——营地域测点对已注销;随令牌批处置,非本批强删;审计记档 2 订正) | 卡④ T5 核签+审计记档 |
|
||||
@@ -55,7 +55,7 @@
|
||||
| V8 层序与遮挡 | contract 第六槽+node() | system_test V1c 复跑+ui_struct badge 段 | 系统+探针 | 合同表单一事实源 | 树序链含新槽逐对保序;badge 零波及 | 绿 |
|
||||
| V9 目检登记 | 实机目检总清单 | 件核对(§6) | 目检 | 用户实机 | 登记即义务了结 | 已登记(§6) |
|
||||
| V10 反哺点清单 | §5 同步面 | 件核对 | 件核对 | 反哺点文档 | 每条有落点 | 绿 |
|
||||
| B1 Esc 接线与浮窗 | 输入入口/薄委托/视图/新槽 | screen_flow+ui_struct | 集成 | 合成 Esc→路由→flow.open/close | 四态路由绑现开集合与调用记录 | 绿 |
|
||||
| B1 Esc 接线与浮窗 | 输入入口/薄委托/视图/新槽 | screen_flow+ui_struct | 集成 | 合成 Esc→路由→flow.open/close | 四态路由绑现开集合与调用记录(ui_struct 大门段 confirm_dialog._secondary_btn 直查申报:三钮化即被测改动本体、两/三出口形态唯一直观观测面、无公开访问器——审计 ⚠️ 项补注) | 绿 |
|
||||
| B2 HUD 落位与刷新 | band 新建/set_hud_band/bus 挂册 | screen_flow HUD 段+ui_struct 顶栏段 | 集成 | bus.refresh→band.refresh_camp→badge | badge=单口取值;顶栏位结构在座 | 绿 |
|
||||
| B3 设置语境分支与三出口 | _on_settings_closed 分支+三出口动线 | screen_flow 设置段+返回段 | 集成 | 三钮 pressed→MainEscFlow | 关设置回浮窗禁弹主菜单(反向断言);退出连接链 | 绿 |
|
||||
|
||||
@@ -114,4 +114,12 @@
|
||||
|
||||
## 10. 独立验收审计结论
|
||||
|
||||
(独立审计报告=reports/iter47-验收审计-2026-11-01.md——结论待审计回填:通过/缺漏/例外及依据。)
|
||||
独立审计报告=reports/iter47-验收审计-2026-11-01.md(未参与实现子代理执行;六条自跑抽查全绿:system_test 69/0、V14 11 项、forge_workbench 12 项、screen_flow 含 Esc 段、static_scan S13 零新增、ui_contrast 36 对)。
|
||||
|
||||
- 审计算术:对照表 42 行全查(✅33/⚠️8/❌1);判据绑定面重点四项全过;测试削弱=授权 6 件在案、未授权零;直查例外 5 处全有据(1 处补注记)。
|
||||
- 缺漏处置回执(实现方,审计处方最窄单元):
|
||||
1. 卡⑤ V5 退出项断言缺位→ui_struct Esc 段补静态接线断言(quit_requested 连接表目标=_on_esc_quit+调用链 _on_esc_quit→_on_quit→_quit_game 源扫描)+〔ESC批 V5〕尾缀——孤跑复验绿。
|
||||
2. 尾缀覆盖缺口→V4(购买出账/持久两行)/V6(图鉴锁文两行)补〔营地图批 V4/V6〕;V7 补显式二次确认断言(screen_flow 回退段)+〔营地图批 V7〕;B1/B3 补〔ESC批 B1/B3〕、B2 补〔ESC批 B2〕;卡④ B1/B2 各补一行。V4 的 forge_workbench 部分按审计处方记豁免(断言零改申报约束——补尾缀即违零改)。
|
||||
3. 记档项处置:V7 长度非空守卫已补一行;反哺点 #12 订正(CAMP_HEADER_BAND 消费面仅剩 keystone_badge 工厂等);V9 扫面注记(直接子层非递归——本段更正);confirm_dialog._secondary_btn 直查补申报(三钮化即被测改动本体、两/三出口形态唯一直观观测面、无公开访问器)。
|
||||
- 处置后结论:**通过**(缺漏 1 补齐+轻微尾缀补齐+记档 4 项处置;孤跑复验回执见下)。
|
||||
- 孤跑复验:ui_struct_probe 退出码 0(含 V5 新断言与 V7 守卫);screen_flow_probe 退出码 0(含 V7 显式断言与 B 尾缀段)。
|
||||
@@ -0,0 +1,128 @@
|
||||
# 迭代 47 独立验收审计(卡⑥ 营地模态句柄子容器批+卡④ 营地场景图新建批+卡⑤ Esc 浮窗与营地顶栏批)
|
||||
|
||||
- 接收方:`reports/iter47-实现报告-2026-11-01.md` §10(独立验收审计结论回填行)
|
||||
- 审计身份:未参与实现的独立审计方——只读三张需求卡、实际对照表、diff、测试件与实现报告,自跑最窄测试抽查,不采信报告「已全绿」
|
||||
- 审计对象:worktree `D:\code\g-plan2-iter47`(分支 iter47);diff 范围=基线 5ad72f44..HEAD(65b2a574),重塑后提交=469d856f 卡⑥/2ce70ac7 卡④/399ed3ad 卡⑤/65b2a574 文档收尾(原史在 backup/iter47-20261101-185917,审计只对 master..iter47 净 diff 负责)
|
||||
- 审计口径:test-conventions §8.7 四件事+卡④ §7/卡⑤ §7「独立验收审计」条;对照表逐行核对(三表全行,非抽样下限)、判据绑定面重点四项、削弱逐处核对、直查例外逐行核对
|
||||
- 本审计唯一写入件=本报告(reports/);产品码/测试码零改动
|
||||
|
||||
## 1. 对照表逐行抽查(实现报告 §2/§3/§4——三表全行)
|
||||
|
||||
判定标记:✅=通过(测试在役+尾缀可 grep+真实入口未绕改动点)/⚠️=通过但附注记/❌=缺漏。
|
||||
|
||||
### 1.1 卡⑥ §2(3 行全查)
|
||||
|
||||
| 行 | 判定 | 依据 |
|
||||
|---|---|---|
|
||||
| V1 句柄迁移零行为漂移 | ✅ | 尾缀〔句柄子容器批 V1〕grep 34 处(六文件逐处);改指面实测 8 文件 43 处 `modals.camp_overlay` 删除位逐一有 `modals.camp.*` 替换行(main_ui_build 10/ui_click 16/ui_probe 8/screen_flow 3/shot_probe 2/system_test 2/ui_struct 1/ui_registry 1——与 F4 清单全等);全仓 grep `camp.overlay` 零命中(探针残留清零核实);句柄同一性链 system_test :109(camp.scene==camp_screen.camp_scene)在役且当轮跑过;ui_camp_modals 六枚实件零空占位(契约 4);camp_overlay_view.gd 整件删除零悬挂 |
|
||||
| V2 层序合同零漂移 | ✅ | system_test :106 V1c 合同树序链带〔句柄子容器批 V2〕尾缀;ui_registry LAYER_CONTRACT key 平铺(camp_scene/forge_view/…/camp_esc_overlay)+node() 全部经 `modals.camp.*` 二层返回、`camp_overlay` 分支已删;ui_struct `_modal_registry_contract` 登记册逐点名含新槽 |
|
||||
| V3 S13 读数 | ✅ | `grep -c '^var '` ui_modals.gd=14(审计人工复核与报告留痕一致);ui_camp_modals.gd=6;static_scan gdstyle 闸绿(基线外新违规 0)——卡面「观测面局限申报」(闸对 14/15 同零命中)如实 |
|
||||
|
||||
### 1.2 卡④ §3(16 行全查)
|
||||
|
||||
| 行 | 判定 | 依据 |
|
||||
|---|---|---|
|
||||
| V1 场景图形态 | ✅ | ui_struct :58-70 层序段(子节点序==layout 表 z 序逐层+各层贴图矩形逐值)带〔营地图批 V1〕;shot_probe camp 段截图改场景图+收闭改篝火动线(真实入口=进存档→选档→进档) |
|
||||
| V2 七物件可达+叠层退避 | ⚠️ | 七件逐一驱动核实:forge(ui_struct :71-74)/dummy→tree(ui_probe)/chest→treasure(ui_probe)/notebook(ui_struct :95-98)/board→codex(ui_click :174)/gate(ui_click :688)/campfire(screen_flow :124)——驱动形态全为 `object_pressed.emit()` 信号发射(卡面 V2 判据绑定面明文「绑 object_pressed 信号发射面」,信号即视图公开提交面,合规);注记:`_gui_input` 命中判定段(topmost/press-release 同区/禁用过滤)无合成鼠标点击断言面——新件内部路径无旧断言被绕,判据按卡面钉信号面成立 |
|
||||
| V3 大门两分支+开局收闭 | ✅ | ui_click :679-722 大门两分支段七断言全带〔营地图批 V3〕——真实路由(object_pressed gate→组合根分派→ConfirmDialog);无断点两出口(次钮隐藏);cancelled 恒无变更(余额读数恒等+营地根 visible+is_adventure 恒假=写口零调用);confirmed 后 is_adventure 翻转+营地隐;有断点三出口(次钮现形)+secondary_confirmed 出口 |
|
||||
| V4 五界面功能+写口零回归 | ⚠️ | forge_workbench_test 承载类同迁(diff 逐 hunk 核实:仅 load 目标 camp_overlay_view→forge_view+`_forge.` 前缀扁平化,断言判据零改)实跑 12 项绿;ui_click 树购买链(出账/持久/Fork 切态持久)在役;注记:无〔营地图批 V4〕尾缀(见 §6 缺漏 2)——tree/fork 链断言带〔句柄子容器批 V1〕尾缀(卡⑥ 波先行改指所留) |
|
||||
| V5 生涯只读契约 | ✅ | ui_struct :89-106 笔记本真实路由(object_pressed notebook→_open_career)+三契约(只读巡检/零动效/零跳转)复跑+营地语境关生涯不回开始层双向断言;〔营地图批 V5〕尾缀两处在位 |
|
||||
| V6 图鉴挂起态 | ⚠️ | ui_click :174-183 布告板→codex 开+锁文「结构位预留」锚定+STONE_DEEP 取色——在役实跑;注记:无〔营地图批 V6〕尾缀(尾缀=〔句柄子容器批 V1〕);「零激活禁行+非禁用态」判据中非禁用态由 codex 可开承载、零激活无独立断言面(占位壳本无内容可钉——新断言绑不上属卡面「静态判据+注记申报」情形,报告未单列注记) |
|
||||
| V7 篝火动线 | ⚠️ | screen_flow :117-127 回退段(object_pressed campfire→confirmed→屏级互斥复归菜单)+shot_probe 收闭改接同动线——在役实跑;注记:无〔营地图批 V7〕尾缀(=〔句柄子容器批 V1〕,同 V4 成因) |
|
||||
| V8 顶栏位+刷新单口 | ✅ | ui_struct :75-77 HudBandSlot 结构断言(48px)带〔营地图批 V8〕;camp_refresh_bus 新件+presenter 八写口尾全改路由(diff 逐处核实 8 处 refresh_bus.refresh);on_camp_attune_toggle 口尾保持只刷不调 _refresh_presentations(契约 4「禁顺手统一」核实);bus 目标册=四子界面+HUD 栏(main_ui_build 装配) |
|
||||
| V9 反参照纪律 | ⚠️ | ui_struct :78-83 场景根零 Button 断言带〔营地图批 V9〕;注记:扫面=get_children 直接子层非递归(报告称「子树」)——HudBandSlot 在扫面内,嵌套 Button 不计(新断言范围注记,见 §6 记档 4) |
|
||||
| V10 美术约束 | ✅(如实「部分」) | ui_contrast 令牌段审计自跑绿(36 对测点全绿,与报告读数一致);A 段色数判据互斥红=L3 呈报在案(§6 记档 1)——报告「部分」判定诚实 |
|
||||
| V11 目检登记 | ✅ | 实现报告 §6 五条目检清单在案(登记不阻塞) |
|
||||
| V12 探针迁移留痕 | ✅ | 报告 §8 迁移表与 diff 逐位点对上(审计抽样七个位点全核实) |
|
||||
| V13 反哺点清单 | ✅ | reports/iter47-反哺点-2026-11-01.md 12 条逐条有落点(注:#12 事实性偏差见 §6 记档 2) |
|
||||
| V14 layout 数据件校验 | ✅ | camp_scene_layout_test.gd 11 断言实跑全绿(详见 §2);manifest 已登记 run_all.gd(+1 行) |
|
||||
| B1 组合根接线总改造 | ⚠️ | main.gd/main_overlay_flow/confirm_dialog 三钮编排与篝火动线 diff 全核实(gate/gate_new/campfire_leave 三消费方+cancelled 零写口);判据承载=V3 断言+screen_flow 回退段;注记:无〔营地图批 B1〕尾缀 |
|
||||
| B2 CampOverlay 退役+四界面抽出 | ✅ | camp_overlay_view.gd 整件删除(655 行)+四 view+camp_sub_view_base 抽出、全仓零残留(S12 旧件零残留闸绿+grep 核实);承载迁移断言零改实跑绿 |
|
||||
|
||||
### 1.3 卡⑤ §4(13 行全查)
|
||||
|
||||
| 行 | 判定 | 依据 |
|
||||
|---|---|---|
|
||||
| V1 Esc 唤起四态 | ✅ | screen_flow `_step_camp_esc_and_hud` 十断言全带〔ESC批 V1〕——push_input 真实键盘合成路径(非直呼 on_esc_input)、根态唤起/再按关窗/echo 零响应/子界面开态无反馈/设置开态不误关/关设置回浮窗/boot 菜单不唤起;ui_struct Esc 结构段另证唤起与再按关窗 |
|
||||
| V2 浮窗三项 | ✅ | ui_struct :124-126 `_buttons` 递归计数恰三带〔ESC批 V2〕;camp_esc_overlay 三钮+danger_button 源码核实 |
|
||||
| V3 返回主菜单 | ✅ | screen_flow :284-287 return_requested 真实信号→四可见性断言(浮窗自收/营地隐/选档收/菜单显)带〔ESC批 V3〕 |
|
||||
| V4 设置双路径 | ✅ | screen_flow :270-283 设置开→浮窗恒 visible(遮挡非属性隐藏)+关→回浮窗+start_overlay 恒假反向断言带〔ESC批 V4〕;语境分支谓词=camp_esc_overlay.visible(main_overlay_flow diff 核实,与契约 3 一致) |
|
||||
| V5 退出项 | ❌ | **缺漏 1(详见 §6)**——卡面验收测试=「ui_struct_probe 退出钮接线结构断言〔ESC批 V5〕」,全仓 grep 零该断言;报告改称「连接链断言(main_ui_build 接线在位)/静态判据」但静态断言未落码 |
|
||||
| V6 HUD 余额 | ✅ | screen_flow :263-267 隔离档直写 _add_keystone(9999)→显式触发 refresh_bus.refresh→badge 文本「钥石 9999」带〔ESC批 V6〕——单口取值+显式触发才变(契约 5 时机③) |
|
||||
| V7 零动效 | ⚠️ | ui_struct :127-132 双件源码令牌扫描+子树 AnimationPlayer 计数带〔ESC批 V7〕;注记:源码扫描无长度非空守卫(报告称「扫描面>0 非空前置」名实差——见 §6 记档 3) |
|
||||
| V8 层序与遮挡 | ✅ | 登记册逐点名(_modal_registry_contract)+system_test V1c 树序链含 camp_esc_overlay 新槽+badge 零波及断言带〔ESC批 V8〕;LAYER_CONTRACT 槽位=codex_view 与 settings_overlay 之间(契约 3 栈语义正解核实) |
|
||||
| V9 目检登记 | ✅ | 实现报告 §6 第 4 条在案 |
|
||||
| V10 反哺点清单 | ✅ | 反哺点清单 #6/#8/#1 在案有落点 |
|
||||
| B1 Esc 接线与浮窗 | ⚠️ | main._unhandled_input(KEY_ESCAPE+physical+pressed 非 echo)→MainEscFlow 四态路由 diff 全核实、判据单点=登记册现开集合;判据承载=V1/V2/V7/V8 断言;注记:无〔ESC批 B1〕尾缀 |
|
||||
| B2 HUD 落位与刷新 | ⚠️ | camp_hud_band 新件/set_hud_band 填值/bus 挂册 diff 全核实;判据承载=V6 断言;注记:无〔ESC批 B2〕尾缀 |
|
||||
| B3 设置语境分支与三出口 | ⚠️ | main_esc_flow 三出口+main_overlay_flow 语境分支 diff 全核实;判据承载=V3/V4 断言;注记:无〔ESC批 B3〕尾缀 |
|
||||
|
||||
## 2. 判据绑定面抽查(重点四项+一般项)
|
||||
|
||||
| 抽查项 | 判定 | 核实内容 |
|
||||
|---|---|---|
|
||||
| 卡④ V14(11 断言) | ✅ | 实跑 11 项全 PASS;断言全部为表内关系谓词——两两不相交(Rect2.intersects)、不越画面/不侵顶栏(y≥hud_band_h 表字段)、篝火只取下半(命中贴贴图底且严格小于贴图)、门扇对齐 gate_gap 表字段、布告板挂围墙带(与 wall 贴图带关系谓词)、层数=10+bg/wall 占 z0/z1、ConfigDB 装载链(load_tables fail-fast 钩子+is_ready);**零坐标字面量**核实(唯一常量=七键名与层数 10,非坐标;(520,760) 等值全部取自表字段输出) |
|
||||
| 卡④ V3(大门两分支段) | ✅ | 七断言从真实路由进入(object_pressed gate 信号=卡面钉定发射面);cancelled 写口零调用以「余额读数恒等+营地根 visible+is_adventure 恒假」三重可观测面钉死;confirmed 后 is_adventure 翻转+营地隐;三出口经 set_breakpoint 注入(同开场行③先例,非伪造红——注入的是前置数据非破坏断言) |
|
||||
| 卡⑤ V1(Esc 步) | ✅ | push_input(ev, true) 真实键盘合成路径(不更新 Input 单例动作态——与契约 9 禁轮询互证);echo=true 合成零响应;设置开态再按 Esc 浮窗不误关(契约 9① 先于②的分支序);关设置回浮窗+禁弹主菜单反向断言;boot 菜单语境不唤起(契约 9④) |
|
||||
| 卡⑥ V3(计数=14) | ✅ | 审计人工 grep 计数=14 与报告留痕一致;闸面(gdstyle 零 NEW)自跑绿;卡面观测面局限申报如实 |
|
||||
| 一般:V2 七物件分布 | ✅ | 六探针分散驱动逐一核实(§1.2 V2 行) |
|
||||
| 一般:卡⑤ V2/V7/V8 | ✅/⚠️ | 三钮恰三/零动效/登记序——V7 非空前置注记(§6 记档 3) |
|
||||
| 加跑:ui_contrast 探针 | ✅ | 审计自跑 PASS「36 对测点全绿」——与报告 V10「令牌 36 对绿」读数一致 |
|
||||
|
||||
## 3. 测试削弱核对(diff 全量删改断言逐处对卡)
|
||||
|
||||
**授权项清单(卡面在案,核对通过)**:
|
||||
|
||||
| # | 削弱处 | 授权依据 | 核实 |
|
||||
|---|---|---|---|
|
||||
| 1 | theme_projection_test 等高源码断言 3 条注销(min 高 336/SIZE_FILL×4/SHRINK_CENTER≥3) | 卡④ §7 削弱申报表行 1+F8 位点(:710-717,CampOverlay 四柜台形态退役断言失去对象) | ✅ |
|
||||
| 2 | theme_projection_test `_camp_recent_projection` 最近冒险投影段注销 | 卡④ §10 Q4=甲(2026-10-18 用户裁:最近冒险条带随四柜台拆解撤下)+F13——申报表未单列成行,报告 §8 迁移表已归并申报(「卡面削弱申报授权」句);授权链=卡面用户裁定,认 | ✅(注记:申报落点在 Q4+§8,非削弱表独立行) |
|
||||
| 3 | ui_contrast 四行注销(头带两行/铭牌副题/最近冒险行,43→39 对) | 卡④ §7 削弱申报表行 2「核签后段留或随注销」——核签事实:CAMP_HEADER_BAND 新营地域界面零消费(grep 核实,新界面只消费 ROW_PLATE/PANEL_DATA)、最近冒险行随 Q4 撤 | ✅ |
|
||||
| 4 | ui_click 断点确认段改走大门(卡② 移交接收) | 申报表行 3 | ✅(V3 落位) |
|
||||
| 5 | ui_probe 深员改指/screen_flow 营地键与回退段改指/shot_probe 收闭段改篝火/生涯段驱动改接 | 申报表行 4/5/6/7 | ✅(diff 逐处核实为改指非删除) |
|
||||
| 6 | forge_workbench_test 承载类同迁 | 申报表行 8「断言零改只换承载类」 | ✅(12 项判据逐字未动,仅 `_forge.` 前缀与 load 目标) |
|
||||
|
||||
**未授权项清单:零。** 全 diff 删除断言行 31 处逐条核对均有同判据替换行(探针断言计数 56 增:31 删;shot_probe 21=21、system_test 51=51、ui_contrast 结构断言 7=7、forge_workbench 12=12);无放宽阈值、无缩小在役扫描面、无真实入口换下层直调(object_pressed 信号发射面=卡面 V2 明文钉定,不属直调削弱)。卡⑤「零削弱申报」成立。
|
||||
|
||||
## 4. 内部字段直查受控例外核对
|
||||
|
||||
| 直查行 | 依据 | 判定 |
|
||||
|---|---|---|
|
||||
| ui_probe camp.tree._balance_label/_tree_buy_btns、camp.treasure._workshop_rows;ui_click treasure._workshop_holder | 卡④ §7 削弱申报表行 4(深员改指新界面成员——历史既有口径) | ✅ |
|
||||
| screen_flow band._badge.value_label.text | 卡⑤ §7 V6 判据绑定面明文钉 value_label.text(badge 工厂约定单点) | ✅ |
|
||||
| ui_click :694/:717 confirm_dialog._secondary_btn.visible | 本批新增成员(三钮化即被测改动本体)、两/三出口形态唯一直观观测面、无公开访问器 | ⚠️(对照表未注明直查理由——建议随缺漏补差补一句申报,不构成判红项) |
|
||||
| main_esc_flow :31 读 flow.stack._list(产品码跨类私有读) | 卡⑤ 契约 9 判据单点=ModalStack 登记册现开集合 sanctioned 读法(ModalStack 无公开现开集合访问器;代码注记自陈) | ✅ |
|
||||
| screen_flow HUD 段 main._camp_pres.views.refresh_bus 直呼 | 卡⑤ 契约 5 时机③「夹具直写后探针显式触发」授权 | ✅ |
|
||||
|
||||
## 5. 自跑抽查回执(worktree 内实跑;六条全绿)
|
||||
|
||||
| # | 命令 | 退出码 | 关键行 |
|
||||
|---|---|---|---|
|
||||
| 1 | `python tools/run_system_test.py` | 0 | 「69 项检查,0 项失败」「PASS(退出码/摘要失败数/脚本错误扫描 三闸全过)」 |
|
||||
| 2 | `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd`(V14) | 0 | 11 条 [PASS] 逐条在案+「all green (11 checks)」 |
|
||||
| 3 | `godot --headless --path game --script res://tests/unit/presentation/forge_workbench_test.gd`(承载类迁移) | 0 | 12 条 [PASS]+「all green (12 checks)」——断言零改实证 |
|
||||
| 4 | `godot --headless --path game res://probe/screen_flow_probe.tscn`(含 Esc 段) | 0 | 「PASS — 六步主流程+回退路径全绿」(_ready 序含 `_step_camp_esc_and_hud`,Esc 段红即 FAIL) |
|
||||
| 5 | `bash game/tests/static_scan.sh`(S13 基线) | 0 | 「S13 ok」「基线外新违规 0 条,较登记值恶化 0 条」 |
|
||||
| 6(加跑) | `godot --headless --path game res://probe/ui_contrast_probe.tscn` | 0 | 「PASS — 对比度 36 对测点全绿」(与报告 V10 读数一致) |
|
||||
|
||||
render_gate 按审计范围禁跑(05 红=L3 呈报在案,见 §6 记档 1);MC 零跑(零数值零行为,符合卡面闸口径)。
|
||||
|
||||
## 6. 总结论
|
||||
|
||||
**不通过(限项)——缺漏 1 项+轻微缺漏 1 项+记档核对 4 项;缺漏 1 补齐并复核后可转通过。** 除下列缺漏外,三卡对照表、判据绑定面、削弱申报、直查例外、自跑抽查全部通过;无未授权测试削弱。
|
||||
|
||||
### 缺漏清单
|
||||
|
||||
1. **卡⑤ V5 退出项验收断言缺位**(对照表 ❌ 行)。卡面 §7 V5 验收测试=「ui_struct_probe.gd:_ready(退出钮接线结构断言)〔ESC批 V5〕」,判据绑定面=「钮 pressed 连接目标=_on_quit→_quit_game(绑信号连接与调用链)」;实际全仓 grep 零该断言(quit_requested/_on_esc_quit 连接链无任何落码检查),〔ESC批 V5〕尾缀零命中。报告对照表该行改称「连接链断言(main_ui_build 接线在位)」——接线代码在位属实(main_ui_build :242),但「静态判据」并未落码,「绿」的实质=装配期 connect 不报错的间接承载,不满足卡面「绑信号连接」的断言要求,对照表该行名不副实。卡面已申报 headless 不可真退的观测面局限并给出可行静态形态。**补法(最窄单元)**:ui_struct Esc 结构段加一条静态断言(如 quit_requested 连接表非空且连接目标=_on_esc_quit)+〔ESC批 V5〕尾缀,孤立验证后并套件复跑。
|
||||
2. **(轻微)尾缀覆盖缺口**。卡④ V4/V6/V7/B1/B2 与卡⑤ B1/B2/B3 无卡面 §7 规定的〔营地图批 Vn/Bn〕〔ESC批 Bn〕尾缀(grep 零命中);对应验证本体全部在役且当轮实跑(V4=forge_workbench 12 项+ui_click 购买链;V6=ui_click 灰字段;V7=screen_flow 回退段;B 行=对应 V 行断言承载),缺的是卡面「断言尾缀与卡片清单互相 grep」的对账形式。成因=卡⑥ 波先行改指保留〔句柄子容器批 V1〕尾缀+V4 受「断言零改」申报约束(补尾缀即违反零改,可申报豁免)。**补法**:V6/V7/B 行断言消息文本可在后续批补尾缀;V4 记录豁免依据即可。
|
||||
|
||||
### 记档核对项(在案事项复核,不算缺漏)
|
||||
|
||||
1. **05 渲染闸红(shot_checker A 段色数判据互斥)**=L3 呈报文件在盘(reports/停机呈报-shotchecker色数判据互斥-2026-11-01.md),但该文件 git **未跟踪**(?? 状态)——合回合并不携带至 master,归档链注意;合回前须用户裁决读法 A/B+闸重跑(实现报告 §7/反哺点 #10 已登记)。
|
||||
2. **反哺点 #12 事实性偏差**:称 CAMP_HEADER_BAND「现役消费面=ui_contrast 表注销四行后零消费」——实测 keystone_badge 工厂(ui_kit.gd :629-631)在役消费、新 CampHudBand 经该工厂消费、level_map_screen/shop_overlay_view 亦有消费;令牌退役评估前提失实,文档批裁决前须订正(ui_contrast 删行授权不受影响——删的是营地域头带/铭牌/条带测点对,非令牌本身)。
|
||||
3. **卡⑤ V7 名实差**:报告称源码扫描「扫描面>0 非空前置」——ui_struct :127-129 实现无长度非空守卫(FileAccess 读失败=空串静默通过);子树扫描面在浮窗实例在座前提下非空成立。建议后续批补一行长度守卫。
|
||||
4. **卡④ V9 扫面注记**:反参照断言扫面=场景根直接子层(get_children 非递归),报告称「场景根子树」;HudBandSlot 在扫面内,嵌套 Button 不计。新立断言无削弱对象,范围注记即可。
|
||||
|
||||
### 审计范围声明
|
||||
|
||||
本审计执行上列六条最窄抽查与静态读数+全量 diff/卡面/报告逐行核对;未跑 render_gate(在案红待裁)、未跑 MC、未跑 ui_probe/ui_click/ui_struct/shot_probe 单件直跑(其营地段断言经 system_test+screen_flow_probe+ui_contrast 实跑间接覆盖,且逐行静态核实);审计过程零产品码/测试码改动。
|
||||
Reference in new issue
Block a user