目标身份 PASS · UI 点击回归待补2026-09-03

Correctness Audit · Batch A

同名进程误绑已修复,0 值现在有可追溯语义

2026-09-03 修复后,Mac App 将所选 Bundle ID 传入正式内置 Collector,Collector 只读解析 PID 并用进程表二次核对;同名 executable 不再作为 Bundle ID 模式的回退条件。前台真机复验中,28 个样本全程绑定唯一目标,CPU、内存、线程、CSwitch 与 Wakeups 均呈动态值;另一个同名后台进程的 11 个样本被正确标记为 not-target-foreground,FPS/GPU 派生值不再归因给它。目标身份、数值动态性和前台归属门禁通过;新版 App 的人工 UI 点击全链路仍作为独立最终回归,不与 Controller/Session 真机闭环混为同一证据。

Target identity PASSForeground gate PASSValue dynamics PASSUI click gate PENDING

Reproduction

错误绑定、诊断探针与修复后正式 Collector 对照

指标原 Session:错误同名 PID修复后内置 Collector:28 样本判断
App CPU162/162 为 027/27 有效样本非零,0.455%–3.032%动态性恢复
Physical Footprint固定约 12.47 MB166.63–166.71 MB目标归属正确
Resident Memory固定 0.25 MB117.92–117.94 MB目标归属正确
Thread Count固定 121–22目标归属正确
Context Switches / s162/162 为 062.990–148.689计数器持续增长
Wakeups / s162/162 为 048.616–113.762计数器持续增长
Disk Read / Write均为 027 个有效间隔均为 0已确认为该窗口的合法静止值
Foreground FPS与错误后台 PID 混在一起前台目标 28 个样本,最大 35已有前台门禁
后台 FPS/GPU仍被当作目标数值11/11 不输出派生值,quality 均为 not-target-foreground错误归因已阻断

正式 App 内置 Collector 与 Controller → Session Store 两层复验均使用修复后代码。另一次 21 样本的 Controller 真机闭环得到 completed manifest,CSV 行数与 manifest 一致,gap/duplicate/out-of-order/parse/writer failure 均为 0。所有公开记录继续使用设备/目标别名,原始 Bundle ID、PID 和设备标识不写入仓库。

Root cause

Bundle ID 在 Mac 层存在,但没有传给 Collector

Mac App 选中目标(Bundle ID + executable) ↓ CollectorLaunchConfiguration 只传 --executable ↓ TargetSysmonTap 遍历进程表,命中第一个同名 executable ↓ 设备上同时存在两个 executable 同名、Bundle ID 不同的进程 ↓ Collector 绑定静止/挂起的错误 PID;Graphics 仍报告设备前台数据

只读 ProcessControl.process_identifier_for_bundle_identifier 返回了所选 Bundle ID 的实际前台 PID;只读进程表同时确认另一个不同 Bundle ID 的进程具有相同 executable。固定到正确 PID 后动态指标恢复,排除了 rate 计算公式和 sampleInterval 配置是本次全 0 主因。0、500 ms 与 1 s 三种 Sysmontap 间隔配置均能在正确 PID 上看到 CPU 和累计计数器增长。

Zero classification

0、missing 与错误目标必须分开

可能合法的 0

  • 采样窗口内没有磁盘读写。
  • 静态画面没有新 CoreAnimation 帧。
  • GPU 在该窗口未工作。
  • 后台/挂起进程 CPU 与调度增量为 0。

不可直接验收的 0

  • 目标身份未由 Bundle ID 校验。
  • CPU、CSwitch、Wakeups 连续数分钟全 0,累计 counter 完全不变。
  • Resident 仅 0.25 MB、线程数 1,同时 UI 却显示设备前台 FPS。
  • 字段存在就被写成 available,未区分“可信动态值”和“来源异常”。

Implemented correction

批准的最小修复已落地

  1. Mac App 将 Bundle ID 传入 Collector,不再只传 executable。
  2. Collector 通过 Bundle ID 只读解析 PID,并用进程表的 bundleIdentifier 二次确认。
  3. 进程重启时重新按 Bundle ID 解析;Bundle ID 模式禁止回退为“同名 executable 第一个”。
  4. 新增 target_identity、identity verified、foreground 和 lifecycle 状态,身份不一致时 fail closed。
  5. 目标非前台时保留 Raw Graphics,但不输出 FPS/GPU 派生值;客户端显示 — · not-target-foreground,也不沿用旧前台值。
  6. CPU 与多个累计 counter 连续 10 个样本不变时标记 suspect-static
  7. Python 10/10、Swift 26/26、App 0.3.0 严格签名检查、前台/后台真机门禁和 Controller → Session Store 闭环均已执行。
独立剩余门禁
当前数值和归属结论已恢复;新版 App 的“打开窗口 → 点击开始/停止”人工 UI 回归仍需单独补录,本页不用 Controller 驱动的真机闭环冒充 UI 点击证据。