Commit Graph

2 Commits

Author SHA1 Message Date
b413fbb43e 跨端: fix(设备闸): 按真机形状改写解析(前台 = state #FOREGROUND 那个 mission 的 bundle),判据改喂真机样本
第一版是**猜的**格式(`bundleName: com.x`),真机上根本没有这种写法;退一步"取第一个 bundle name"
又会取到别人的(真机多 mission,`#31 com.example.homeagent` 排在我们 `#32` 前)⇒ 假绿(pi 独立复现)。

真机形状(样本 `test/fixtures/aa-dump-l-real.txt`,实采):每块 `Mission ID #N … ` +
`bundle name [com.x]` + `state #FOREGROUND/#BACKGROUND`;**前台只由 `state #FOREGROUND` 决定**。

- `parseMissions` / `foregroundBundle`:按块解析,取不到返回空(不猜、不兜底);
- `foregroundVerdict` 三态不变:`ours` / `other` / `unverified`;
- 有 mission 但**全无 FOREGROUND** ⇒ `unverified`(不是"没我们所以算别人");
- 空 dump / 截断 ⇒ `unverified`,状态词写明"**缺证据 ≠ 没有那个现象**"。

判据 5 条(喂真样本 + 对调状态 + 空/截断/无前台 + 撞名撞文案反证)全绿。
真样本本身含"对方在前台"那一刻 —— 争用在一分钟内真实发生过,所以这不是构造出来的场景。
2026-09-15 12:05:17 +08:00
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