工程+文档(判据出处行锚挂钩+存量清偿第一批·test oracle 项): test-conventions §8.3 立「判据出处行锚」(需求点格须带现行文档:行锚——断言预期值从规格句抄出禁反推实现)+退役对账义务+真实入口判定收窄(信号直发=接线验证不充真实入口)+§8.7 审计加判据出处核对问; capability_audit 增链式锚反向覆盖机检(80套件须被能力行承接——13链断套件补挂 9 能力行归零); pipeline_gate 增 C5 行锚格式机检(生效日 2026-11-05 按卡文件名日期分流——红证「判据出处行锚缺失」+旧卡零误伤双验); 清偿第一批=大门两分支/进档链/设置入口真输入化(emit→push_click 经 push_input 管线,open_camp_via_savesel coroutine 化补排版帧——开层同帧 rect 未排真点击落空实证修复,7 调用点 await)+README 能力行 :158 七物件接线验证降级残险登记/:159 大门行真入口换承载; 待办清单登记分期条目(28); 同区并入闸门耗时基线表(README 耗时基线节+无远端旧口径换代,--docs 已验)。验证: capability_audit --strict 绿(链断0)/pipeline_gate PASS/probe_gate --click --full 全段 PASS(ui_click_probe 问题=0)/--docs 验收通过零新增红

This commit is contained in:
DKChan committed 2026-11-05 02:48:07 +08:00
1 parent 9011efc3b5
commit aeff033e9b
11 files changed
+124 -34

No files matched your search

+25 -1
View File
@@ -118,6 +118,29 @@ static func isolate_save(main, tag: String, mark_first_done: bool = false, with_
main.settings_store = SettingsStoreScript.new("user://%s_settings.cfg" % tag)
return iso
# ---- 真输入点击承载(test-conventions §8.3「真实入口」判定口径)----
# 合成鼠标事件经 Viewport.push_input 进引擎输入管线(hitbox/命中测试参与),press+release 成对
#(BaseButton pressed 信号走 release 沿——ui_input_probe :717-733 / screen_flow_probe :484-499 同式)。
# 信号直发(pressed.emit())只许标「接线验证」,不得充当真实入口断言的驱动。
static func push_click(main, ctrl: Control) -> void:
push_click_at(main, ctrl.get_global_rect().get_center())
static func push_click_at(main, pos: Vector2) -> void:
var down := InputEventMouseButton.new()
down.position = pos
down.global_position = pos
down.button_index = MOUSE_BUTTON_LEFT
down.pressed = true
main.get_viewport().push_input(down, true)
var up := InputEventMouseButton.new()
up.position = pos
up.global_position = pos
up.button_index = MOUSE_BUTTON_LEFT
up.pressed = false
main.get_viewport().push_input(up, true)
# 营地经进档开层(卡② mn9 新路径——campbtn 已撤;槽模板注入隔离命名空间,防碰真实槽
# user://save_slot_N.json——真实档红线)。创建=激活=暂行开营地(卡③ Q3 乙落点);
# 驱动后写盘目标=隔离槽文件(持久化断言读 user://<tag>_slot_1.json)。返回 false=新档钮缺失(驱动中断)。
@@ -130,8 +153,9 @@ static func open_camp_via_savesel(main, tag: String) -> bool:
if FileAccess.file_exists(sp):
DirAccess.remove_absolute(sp)
main._open_save_select()
await main.get_tree().process_frame # 排版帧——真点击命中的是控件 rect,开层同帧容器未排(emit 无此依赖)
var new_btn: Button = main.ui.modals.menu.save_select_overlay._new_btns.get(1)
if new_btn == null:
return false
new_btn.pressed.emit() # 真实按钮信号路径 → _on_save_select_new → create_slot+open_camp
push_click(main, new_btn) # 真输入 → _on_save_select_new → create_slot+open_camp
return true
+4 -4
View File
@@ -110,7 +110,7 @@ func _step_boot_menu() -> void:
# ---- ② 菜单 → 营地(真实按钮信号路径)----
func _step_menu_to_camp() -> void:
# 营地经进档开层(卡② mn9 新路径——campbtn 已撤;槽模板注入隔离命名空间)
if not ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_camp"):
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_camp"):
_problems.append("②菜单→营地:选档层新档钮缺失(新路径驱动中断)")
return
await _frames()
@@ -141,7 +141,7 @@ func _step_save_select_open_back() -> void:
if esb == null:
_problems.append("[savesel] mn3 进入存档钮缺失(卡② 交付物)")
return
esb.pressed.emit() # 真实按钮信号路径 → _open_save_select(卡② mn3 点击链——卡③ 直调中间态就此闭环)
ProbeUiUtil.push_click(main, esb) # 真输入(push_input 管线)→ _open_save_select(卡② mn3 点击链——真实入口承载)
await get_tree().process_frame
var seals := _screen_seals()
if not main.ui.modals.menu.save_select_overlay.visible or not seals_check_single(seals):
@@ -238,7 +238,7 @@ func _step_end_back_to_menu() -> void:
# ---- ③' 营地 Esc 浮窗+HUD(卡⑤——真实键盘合成路径 push_input;四态路由+三出口+语境分支+余额单口)----
func _step_camp_esc_and_hud() -> void:
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_esc", false, false, true)
if not ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_esc"):
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_esc"):
_problems.append("[esc] 营地入口缺失(选档层新档钮驱动中断)〔ESC批 V1〕")
return
await _frames()
@@ -301,7 +301,7 @@ func _step_camp_esc_and_hud() -> void:
# 互斥单开/ESC 优先序/窗内滚动/生涯同壳——行为面(开合路由)零改,只钉窗壳可观测提交面。
func _step_camp_window_shell() -> void:
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_winshell", false, false, true)
if not ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_winshell"):
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_winshell"):
_problems.append("[winshell] 营地入口缺失(选档层新档钮驱动中断)〔窗口化批 V1〕")
return
await _frames()
+1 -1
View File
@@ -120,7 +120,7 @@ func _ready() -> void:
if main.ui.modals.menu.career_overlay.visible or not main.ui.screens.start_overlay.visible:
_problems.append("生涯页关闭后页未隐藏或开始层未恢复")
# ② 营地场景图(进档开层新路径——卡② mn9;截图=可点击场景图形态——卡④ 契约 9 V1 验收载体)
if not ProbeUiUtil.open_camp_via_savesel(main, "smoke_shot_probe_camp"):
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_shot_probe_camp"):
_problems.append("营地入口缺失(选档层新档钮——新路径驱动中断)〔句柄子容器批 V1〕")
else:
await get_tree().process_frame
+7 -7
View File
@@ -61,7 +61,7 @@ func _ready() -> void:
# swap=true(整链换注——购买写盘经 autoload 落隔离槽文件,与下方持久化核验同源;
# 原 swap=false 形态的写盘走 iso 实例旧路径,与槽文件断言不同源——卡② mn9 换代)
var iso_c = ProbeUiUtil.isolate_save(main, "smoke_click_probe_camp", false, false, true)
if not ProbeUiUtil.open_camp_via_savesel(main, "smoke_click_probe_camp"):
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_click_probe_camp"):
_problems.append("营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕")
else:
await get_tree().process_frame
@@ -302,7 +302,7 @@ func _ready() -> void:
if settings_btn == null:
_problems.append("设置入口按钮缺失(开始层 settingsbtn)")
else:
settings_btn.pressed.emit() # 真实按钮信号路径 → _open_settings
ProbeUiUtil.push_click(main, settings_btn) # 真输入(push_input 管线)→ _open_settings
await get_tree().process_frame
if not main.ui.modals.menu.settings_overlay.visible or main.ui.screens.start_overlay.visible:
_problems.append("设置面未打开(点击路径)")
@@ -685,7 +685,7 @@ func _ready() -> void:
main._camp_pres.open_camp()
await get_tree().process_frame
var bal_gate: int = main._camp_data()["balance"]
main.ui.modals.camp.scene.object_pressed.emit(&"gate")
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"gate").get_center())
await get_tree().process_frame
if not main.ui.modals.menu.confirm_dialog.is_open():
_problems.append("大门无断点:确认弹窗未开(点大门应先出确认不直接进冒险)〔营地图批 V3〕")
@@ -697,9 +697,9 @@ func _ready() -> void:
await get_tree().process_frame
if not main.ui.modals.camp.scene.visible or main.run_scope.is_adventure or main._camp_data()["balance"] != bal_gate:
_problems.append("大门取消:未无变更退回营地(写口零调用/营地根 visible 失守)〔营地图批 V3〕")
main.ui.modals.camp.scene.object_pressed.emit(&"gate")
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"gate").get_center())
await get_tree().process_frame
main.ui.modals.menu.confirm_dialog.confirmed.emit() # 「是」→开始新冒险
ProbeUiUtil.push_click(main, main.ui.modals.menu.confirm_dialog._confirm_btn) # 真点「确认」→开始新冒险
await get_tree().process_frame
if not main.run_scope.is_adventure or main.ui.modals.camp.scene.visible:
_problems.append("大门确认:冒险未发起或营地场景屏未隐藏〔营地图批 V3〕〔营地图批 B1〕")
@@ -712,11 +712,11 @@ func _ready() -> void:
})
main._camp_pres.open_camp()
await get_tree().process_frame
main.ui.modals.camp.scene.object_pressed.emit(&"gate")
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"gate").get_center())
await get_tree().process_frame
if not main.ui.modals.menu.confirm_dialog.is_open() or not main.ui.modals.menu.confirm_dialog._secondary_btn.visible:
_problems.append("大门有断点:三出口形态失守(次钮应现形)〔营地图批 V3〕")
main.ui.modals.menu.confirm_dialog.secondary_confirmed.emit() # 「开始新冒险」出口
ProbeUiUtil.push_click(main, main.ui.modals.menu.confirm_dialog._secondary_btn) # 真点「开始新冒险」出口
await get_tree().process_frame
if not main.run_scope.is_adventure or main.ui.modals.camp.scene.visible:
_problems.append("大门有断点次确认:冒险未发起或营地未隐藏〔营地图批 V3〕")
+1 -1
View File
@@ -24,7 +24,7 @@ func _ready() -> void:
# 隔离存档换注 main.meta 保确定性(禁碰真实档 user://save.json——SaveManager 路径注入纪律;
# 营地先行段只换 meta 不换 save_manager——冒险段换注零档在前)----
ProbeUiUtil.isolate_save(main, "smoke_ui_probe_camp", false, false, false)
if not ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_probe_camp"):
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_probe_camp"):
problems.append("营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕")
else:
await get_tree().process_frame
+1 -1
View File
@@ -38,7 +38,7 @@ func _ready() -> void:
main._on_settings_closed()
_settle()
if not ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_struct_probe_menu"):
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_struct_probe_menu"):
problems.append("[camp] 营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕")
else:
_settle()