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 真机闭环混为同一证据。
Reproduction
错误绑定、诊断探针与修复后正式 Collector 对照
| 指标 | 原 Session:错误同名 PID | 修复后内置 Collector:28 样本 | 判断 |
|---|---|---|---|
| App CPU | 162/162 为 0 | 27/27 有效样本非零,0.455%–3.032% | 动态性恢复 |
| Physical Footprint | 固定约 12.47 MB | 166.63–166.71 MB | 目标归属正确 |
| Resident Memory | 固定 0.25 MB | 117.92–117.94 MB | 目标归属正确 |
| Thread Count | 固定 1 | 21–22 | 目标归属正确 |
| Context Switches / s | 162/162 为 0 | 62.990–148.689 | 计数器持续增长 |
| Wakeups / s | 162/162 为 0 | 48.616–113.762 | 计数器持续增长 |
| Disk Read / Write | 均为 0 | 27 个有效间隔均为 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
只读 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
批准的最小修复已落地
- Mac App 将 Bundle ID 传入 Collector,不再只传 executable。
- Collector 通过 Bundle ID 只读解析 PID,并用进程表的
bundleIdentifier二次确认。 - 进程重启时重新按 Bundle ID 解析;Bundle ID 模式禁止回退为“同名 executable 第一个”。
- 新增
target_identity、identity verified、foreground 和 lifecycle 状态,身份不一致时 fail closed。 - 目标非前台时保留 Raw Graphics,但不输出 FPS/GPU 派生值;客户端显示
— · not-target-foreground,也不沿用旧前台值。 - CPU 与多个累计 counter 连续 10 个样本不变时标记
suspect-static。 - Python 10/10、Swift 26/26、App 0.3.0 严格签名检查、前台/后台真机门禁和 Controller → Session Store 闭环均已执行。