From 2cbd2ca9a7ed42c6e6eec1ba4568482d9562e373 Mon Sep 17 00:00:00 2001
From: DKChan <524912269@qq.com>
Date: Fri, 6 Nov 2026 01:50:50 +0800
Subject: [PATCH 1/6] =?UTF-8?q?=E6=89=B91(QA=20harness=C2=B7=E6=8E=A2?=
=?UTF-8?q?=E9=92=88=E5=AD=98=E9=87=8Femit=E7=9C=9F=E8=BE=93=E5=85=A5?=
=?UTF-8?q?=E5=8C=96+=E8=A6=86=E7=9B=96=E7=99=BB=E8=AE=B0=E5=86=99?=
=?UTF-8?q?=E5=85=A5):=20=E4=B8=A4=E6=8E=A2=E9=92=8852=E5=A4=84emit?=
=?UTF-8?q?=E7=AB=99=E7=82=B9=E8=BD=AC=E7=9C=9F=E8=BE=93=E5=85=A5=E7=AE=A1?=
=?UTF-8?q?=E7=BA=BF(push=5Finput=20press+release=E6=88=90=E5=AF=B9)51?=
=?UTF-8?q?=E5=A4=84,=E4=BF=9D=E7=95=991=E5=A4=84=E7=BD=AE=E7=81=B0?=
=?UTF-8?q?=E6=80=81=E7=A9=BF=E9=80=8Femit=E6=A0=87=E3=80=94=E6=8E=A5?=
=?UTF-8?q?=E7=BA=BF=E6=96=AD=E8=A8=80=E3=80=95;=20=E6=96=B0=E5=A2=9Eprobe?=
=?UTF-8?q?=5Fcoverage=5Frecorder.gd=E7=9C=9F=E8=BE=93=E5=85=A5=E8=A6=86?=
=?UTF-8?q?=E7=9B=96=E7=99=BB=E8=AE=B0=E4=BB=B6(=E6=97=97=E6=A0=87?=
=?UTF-8?q?=E5=9C=A8=E4=BD=8D=E6=9C=9F=E9=97=B4=E5=91=BD=E4=B8=AD=E5=85=A5?=
=?UTF-8?q?=E8=B4=A6,=E9=94=9A=E9=93=BE=E5=BD=92=E4=B8=80=E5=8C=96?=
=?UTF-8?q?=E9=94=AE=3D=E5=85=B7=E5=90=8D/=E8=84=9A=E6=9C=AC=E9=94=9A+?=
=?UTF-8?q?=E7=B1=BB#=E9=92=AE=E9=9D=A2=E6=96=87=E6=9C=AC+=E5=BA=8F?=
=?UTF-8?q?=E4=BD=8D,@=E4=B8=B4=E6=97=B6=E5=90=8D=E4=B8=8D=E5=85=A5?=
=?UTF-8?q?=E9=94=AE,JSONP=E8=90=BDtests/.gates/coverage/=E6=AF=8F?=
=?UTF-8?q?=E6=8E=A2=E9=92=88=E4=B8=80=E4=BB=B6);=20probe=5Fui=5Futil?=
=?UTF-8?q?=E8=A1=A5coverage=5Fhook=E5=8D=95=E7=82=B9+push=5Fmotion/push?=
=?UTF-8?q?=5Fwheel(=E6=BB=9A=E8=BD=AEpress+release=E6=88=90=E5=AF=B9?=
=?UTF-8?q?=E2=80=94=E2=80=94=E5=8F=AA=E5=8F=91press=E9=92=89=E6=AD=BB?=
=?UTF-8?q?=E9=BC=A0=E6=A0=87=E7=84=A6=E7=82=B9=E5=AE=9E=E8=AF=81fork/?=
=?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=90=A5=E5=9C=B0=E4=B8=A4=E9=92=AE=E7=82=B9?=
=?UTF-8?q?=E5=87=BB=E5=85=A8=E5=A4=B1=E6=95=88)/window=5Fpanel/scroll=5Fb?=
=?UTF-8?q?utton=5Finto=5Fview(=E6=8A=98=E5=8F=A0=E5=8C=BA=E8=A1=8C?=
=?UTF-8?q?=E9=92=AErect=E8=B6=8A=E7=AA=97=E5=BA=95=E6=A0=8F=E5=AE=9E?=
=?UTF-8?q?=E8=AF=81=E8=AF=AF=E4=B8=AD=E8=BF=94=E5=9B=9E=E8=90=A5=E5=9C=B0?=
=?UTF-8?q?=E9=92=AE,=E7=9C=9F=E8=BE=93=E5=85=A5=E6=BB=9A=E8=BD=AE?=
=?UTF-8?q?=E6=BB=9A=E5=85=A5=E5=8F=AF=E8=A7=86=E5=8C=BA=E5=86=8D=E7=82=B9?=
=?UTF-8?q?);=20V5b=E9=81=AE=E6=8C=A1=E8=AF=95=E6=8E=A2=E8=AE=A2=E6=AD=A3?=
=?UTF-8?q?=3D=E5=89=8D=E7=AA=97=E7=BB=8F=E7=9C=9F=E5=AE=9E=E8=BF=94?=
=?UTF-8?q?=E5=9B=9E=E9=92=AE=E6=B8=85=E8=B4=A6=E5=86=8D=E7=9C=9F=E7=82=B9?=
=?UTF-8?q?=E5=BC=80=E7=AA=97(emit=E7=9B=B4=E5=8F=91=E7=A9=BF=E9=81=AE?=
=?UTF-8?q?=E7=BD=A9=E5=B1=9E=E5=8F=A3=E5=BE=84=E8=BF=9D=E4=BE=8B);=20?=
=?UTF-8?q?=E8=90=BD=E7=82=B9=E5=88=A4=E5=AE=9A=E8=A1=A5=E9=92=892?=
=?UTF-8?q?=E5=A4=84(esc=E6=AE=B5=E5=AD=90=E7=95=8C=E9=9D=A2=E5=BC=80?=
=?UTF-8?q?=E7=AA=97=E8=90=BD=E7=82=B9/=E6=A0=91=E7=AA=97=E8=BF=94?=
=?UTF-8?q?=E5=9B=9E=E9=92=AE=E8=90=BD=E7=82=B9);=20test-conventions=20?=
=?UTF-8?q?=C2=A72=E6=96=B0=E5=A2=9EUI=E9=A9=B1=E5=8A=A8=E6=96=AD=E8=A8=80?=
=?UTF-8?q?=E7=9C=9F=E8=BE=93=E5=85=A5=E7=AE=A1=E7=BA=BF=E6=9D=A1=E6=96=87?=
=?UTF-8?q?(=E6=BB=9A=E8=BD=AE=E6=88=90=E5=AF=B9+=E6=8A=98=E5=8F=A0?=
=?UTF-8?q?=E5=8C=BA=E6=BB=9A=E5=85=A5+=E8=90=BD=E7=82=B9=E5=88=A4?=
=?UTF-8?q?=E5=AE=9A+=E6=8E=A5=E7=BA=BF=E6=96=AD=E8=A8=80=E8=B1=81?=
=?UTF-8?q?=E5=85=8D=E5=8F=A3=E5=BE=84);=20.gates/.gitignore=E6=94=B6cover?=
=?UTF-8?q?age/=E3=80=82=E8=AF=BB=E6=95=B0:=20screen=5Fflow=5Fprobe?=
=?UTF-8?q?=E5=AD=A4=E7=AB=8B=E7=9B=B4=E8=B7=91PASS(=E5=85=AD=E6=AD=A5?=
=?UTF-8?q?=E5=8A=A8=E7=BA=BF+=E5=B1=8F=E7=BA=A7=E4=BA=92=E6=96=A5?=
=?UTF-8?q?=E5=85=A8=E7=BB=BF);=20ui=5Fclick=5Fprobe=E5=AD=A4=E7=AB=8B?=
=?UTF-8?q?=E7=9B=B4=E8=B7=91exit=3D0=E9=97=AE=E9=A2=98=3D0(budget=3D15210?=
=?UTF-8?q?,=E4=B8=89=E7=AC=94=E6=A0=91=E8=B4=AD=E4=B9=B0=E8=AF=B7?=
=?UTF-8?q?=E6=B1=82=E5=85=A8=E9=80=9A,PROBE=5FSEED=3D7);=20=E7=99=BB?=
=?UTF-8?q?=E8=AE=B0=E8=90=BD=E7=9B=98ui=5Fclick=3D27=E6=8E=A7=E4=BB=B6/38?=
=?UTF-8?q?=E5=91=BD=E4=B8=AD/=E4=B8=B4=E6=97=B6=E5=90=8D=E8=B7=B3?=
=?UTF-8?q?=E8=BF=870,screen=5Fflow=3D19=E6=8E=A7=E4=BB=B6/25=E5=91=BD?=
=?UTF-8?q?=E4=B8=AD=E3=80=82=E5=85=A8=E9=87=8F=E6=A1=A3=E9=97=B8(fd9c8ad9?=
=?UTF-8?q?=E5=9F=BA=E7=BA=BF):=20=E4=B8=A4=E6=96=B0=E5=A2=9E=E7=BA=A2?=
=?UTF-8?q?=E5=9D=87=E5=88=A4=E4=B8=BA=E4=B8=BB=E5=8C=BA=E6=8E=A8=E8=BF=9B?=
=?UTF-8?q?=E6=BC=82=E7=A7=BB=E9=9D=9E=E6=9C=AC=E6=89=B9=E5=BC=95=E5=85=A5?=
=?UTF-8?q?=E2=80=94=E2=80=94=E6=B5=81=E6=B0=B4=E7=BA=BF=E9=97=B8=E7=BA=A2?=
=?UTF-8?q?=3D=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95QA=E6=9D=A1=E7=9B=AE?=
=?UTF-8?q?=E8=AF=81=E6=8D=AE=E5=8F=A5(master=201730a8fb=E5=B7=B2=E4=BF=AE?=
=?UTF-8?q?),=E5=8D=95=E5=85=83settlement=5Fwiring=5Fsnapshot=E7=BA=A2?=
=?UTF-8?q?=E5=BE=85=E5=B9=B6master=E5=90=8E=E7=AA=84=E8=B7=91=E5=A4=8D?=
=?UTF-8?q?=E6=A0=B8;=20=E6=9C=AC=E6=AD=A5=E5=87=AD=E6=8D=AE=3D=E4=B8=A4?=
=?UTF-8?q?=E6=8E=A2=E9=92=88=E7=9B=B4=E8=B7=91=E7=BB=BF+=E5=81=8F?=
=?UTF-8?q?=E5=B7=AE8=E6=9D=A1=E5=B7=B2=E5=9B=9E=E5=86=99qa-harness?=
=?UTF-8?q?=E8=AE=A8=E8=AE=BA=E6=96=87=E6=A1=A3=C2=A710?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
design/engineering/test-conventions.md | 2 +
game/probe/probe_coverage_recorder.gd | 207 ++++++++++++++++++++++
game/probe/probe_coverage_recorder.gd.uid | 1 +
game/probe/probe_ui_util.gd | 74 +++++++-
game/probe/screen_flow_probe.gd | 63 +++----
game/probe/ui_click_probe.gd | 118 +++++++-----
game/tests/.gates/.gitignore | 4 +-
7 files changed, 390 insertions(+), 79 deletions(-)
create mode 100644 game/probe/probe_coverage_recorder.gd
create mode 100644 game/probe/probe_coverage_recorder.gd.uid
diff --git a/design/engineering/test-conventions.md b/design/engineering/test-conventions.md
index c9eee8a7..32f46d5e 100644
--- a/design/engineering/test-conventions.md
+++ b/design/engineering/test-conventions.md
@@ -20,6 +20,8 @@
凡模态覆盖层,探针必须断言:打开后自身 visible 且遮挡物已隐藏(模态被遮挡 = 功能存在但不可达)。
+**UI 驱动断言须走真输入管线(2026-11-06 立)**:探针里「点按钮/点场景物件」类驱动断言,一律经引擎输入管线承载(合成 InputEvent 走 `push_input`,press+release 成对;合成滚轮同样必须 press+release 成对——只发 press 会把鼠标焦点钉死在按下点控件上,后续点击全部失效);信号直发(`pressed.emit()` 等)绕过命中测试,保不了「玩家点击可达」,只许用于真输入到不了的面并当场标〔接线断言〕(现役例:置灰态穿透钉处理器兜底)。折叠区控件先以真输入滚轮滚入可视区再点。每个动线断言钉「落点」判定(点了之后到哪个屏/哪层可见),防驱动中断后的空转假绿。真输入命中控件时自动登记控件覆盖(探针共用面登记件落 `.gates/` 观测产物),覆盖面生长不靠人记。
+
## 3. 缺陷修复必须沉淀回归断言
每个缺陷修复必须在探针或冒烟中留下能抓住该缺陷的断言(例:封印动作耗尽 AP → 必须进入第 2 轮;
diff --git a/game/probe/probe_coverage_recorder.gd b/game/probe/probe_coverage_recorder.gd
new file mode 100644
index 00000000..feff5ca1
--- /dev/null
+++ b/game/probe/probe_coverage_recorder.gd
@@ -0,0 +1,207 @@
+# probe_coverage_recorder.gd — 真输入覆盖登记件(探针共用面)
+# 是什么:探针/C 驱动件把合成 InputEvent 经 Viewport.push_input 送进引擎输入管线时,登记
+# 「真输入实际命中了哪些交互控件」,探针收尾落 JSONP 式 .js 到 tests/.gates/coverage/
+# (.js 供 file:// 页面
+
+
+
+
+
+
+
+
+
+
+
+