Files
MailUI4Agents/client/electron/test
JianFeeeee e917b8782a 跨端: feat(设备闸): DeviceProbe.ts —— "读到别人的界面"是假绿来源,读之前先判"是谁的",拿不到就记未验
pi 邮件 `971c58fa` §4 / `bf583b0f` §2。别的 agent 在同模拟器上 `aa start` 会抢前台,
之后读到的控件树是**它的窗口** ⇒ 断言可能通过也可能红,**两者都不是在讲我们的界面**(前者=假绿)。

- `foregroundVerdict` 判决只有三种:`ours` / `other` / `unverified`;**只按 bundle 判,不许看标题/文案/控件名**
  (别人的合法 dump 里完全可能有同名控件与同文案,"邮件"这种通用词尤其容易撞);
- `parseForeground` 取不到就 **undefined**(空 dump / 截断 / 格式变了都不猜);
- `mayAssertOn === false` ⇒ 调用侧必须记 **`未验`**(欠账继续开着),**不许**记通过、**不许**静默跳过
  —— 跳过会在下一轮被读成"验过了";
- `unverifiedReason` 统一状态词,并写明"**缺证据 ≠ 没有那个现象**"。

判据喂 4 类样本(pi 指定的最易漏输入):① 我们的 dump ② **别人的合法 dump(含同名控件 + 同文案)**
③ 截断/畸形 ④ **空 dump**(窗口没起来时最常见,最容易被当成"坏现象不存在")。
另加一条只按 bundle 判的反证(把标题改成"像我们"也不许变 ours)。

**顺手抓到自己一个坑**:`firstMatch` 第一版的否定类既接受非 ASCII 也接受**换行**
⇒ 对 `windowTitle: 邮件\n abilityName: …` 会吞掉中文标题并**捕获下一行的键名**,
"标题"读到 `abilityName`(看起来有值、其实指错地方)。判据当场抓到 ⇒ 改成按行取、值允许中文、空值不回退。
2026-09-15 11:54:25 +08:00
..