Implementation Result · Batch A
P0 数据保真 + P1 已有源完整承接
0 值根因修复已经并入 A 批次基座:Mac App 显式传递所选 Bundle ID,Collector 精确解析并二次核对 PID,同名 executable 不再导致误绑。正式 App 内置 Collector 已在当前真机上完成前台 28 样本和后台同名进程 11 样本复验;Controller → 内置 Collector → Session Store 的 21 样本闭环生成 completed manifest 和一致 CSV。目标身份、动态数值和 FPS/GPU 前台归属门禁已通过;为保持证据分层,新版 App 的人工 UI 点击回归仍独立记为待补。
Approved scope
批准项与实际交付
| 范围 | 本轮结果 | 状态 |
|---|---|---|
| P0 数据保真 | 保留 Process/System/Graphics 原始区块、实际属性清单、累计 counter、rate 和质量状态 | 已实现 |
| P1 已有源承接 | CPU、Physical/Resident Memory、线程、CSwitch、Wakeups、磁盘、FPS、Render/Tiler/Device GPU | 已实现 |
| 客户端 | 12 项指标可选展示,每图 MIN/AVG/MAX,missing/warmup/reset 不伪装成 0 | 已实现 |
| 设备基座 | 引入 OS 版本路由、独立 tunnel manager、按 UDID 恢复、真实 DVT 门禁与可见重试 | 已实现 |
| 最终真机验收 | 正式内置 Collector 目标身份、前台/后台归属、动态数值与 Controller/Session 闭环通过 | 数值 PASS UI 点击待补 |
Data fidelity
Raw Event → Metric(version) → Report
DVT Sysmontap / Graphics
├─ rawProcess / rawSystem / rawGraphics
├─ cumulative counters
├─ derived rates + warmup / valid / counter-reset / missing
└─ capability attributes + sample interval
↓
CollectorWireEvent (protocol v1 / schema v2)
↓
PerformanceSample + Metric Registry v2
↓
collector.jsonl + events.jsonl + metrics.csv + quality.json
协议版本继续为 perfowl.collector/1,Schema 独立升级到 v2;客户端仍可读取 Schema v1。未经 PerfDog/Xcode 同场校准的指标继续标记 Experimental。
Codesign4QC adaptation
设备连接基础服务不再由采集器猜测
本轮没有继续用临时命令绕过 tunnel,而是参照 Codesign4QC 已经处理成熟的连接链进行窄化适配。Perfowl 保留自己的 service/domain 边界,没有复制其签名、安装、自动化和巨型 AppModel。
直接借鉴
- usbmuxd 事件驱动与 generation 隔离。
- iOS 17.0–17.3 使用 USB RemoteXPC,17.4+ 使用 USB Lockdown tunnel。
- tunneld 只做被动 HTTP manager,关闭自动 monitors。
- 只 cancel/start 选中 UDID,不 clear 其他设备。
- AppleScript 特权启动不使用 nohup,重定向全部描述符。
- 真实 DVT process-list 通过后才发布 ready。
Perfowl 修正
- 使用独立管理端口,不停止或清除其他 App 的 tunnel。
- 设备、App 和性能服务分层就绪;不再把“USB 在线”当成“可采集”。
- 选定 tunnel port 显式传入 Collector,避免隐式使用错误端口。
- UI 提供性能服务阶段、实际 route 和独立重试。
Verification ledger
自动化、构建与代码基线
| 层级 | 结果 | 证据边界 |
|---|---|---|
| Python Collector | 10/10 通过 | 含同名 executable 选择、PID/Bundle 不一致 fail closed、非前台 graphics 门禁和长静止标记 |
| Swift Core/UI | 26/26 通过 | 含路由、tunneld 解码、后台启动、端口传递、Session 和 Fixture |
| Release App | 0.3.0 构建与严格签名校验通过 | 内置 Collector 已包含 --bundle-id 和 ProcessControl;当前为本机 x86_64/ad-hoc |
| 代码提交 | 94dd99d 指标保真;caf46d0 设备连接就绪;本轮修复与文档同批提交 | 本地 Git,未推送远程 |
Real-device acceptance
当前设备验收状态:身份和数值通过,UI 点击独立待补
验收全程为只读采集:不启动、不修改、不注入、不重签目标 App,也不代操作任何业务。公开材料统一使用“设备 A / 目标 App A、B、C”别名。
| 层级 | 实际观测 | 判定 |
|---|---|---|
| 设备与应用目录 | 1 台 USB 设备;34 个 User App;USB Lockdown / DVT 路由;真实 DVT process-list 探测 Ready | 通过 |
| Collector · 目标 App A | 125 个连续样本;attached/stopped 各 1;error/waiting/sequence gap 均为 0;每个 sample 保留 Raw Process/System/Graphics | 通过 |
| Collector · 目标 App B | 186 个连续样本;attached/stopped 各 1;error/waiting/sequence gap 均为 0;每个 sample 保留 Raw Process/System/Graphics | 通过 |
| 内置 Collector · 前台目标 | 28 样本,identity verified/foreground 全程为 true,唯一 PID;CPU 0.455%–3.032%,Thread 21–22,CSwitch 62.990–148.689/s,Wakeups 48.616–113.762/s | 身份/动态性 PASS |
| 内置 Collector · 同名后台目标 | 11 样本,identity verified=true、foreground=false;Raw Graphics 均保留,FPS 与三项 GPU 派生值全部省略,quality 为 not-target-foreground | 前台归属 PASS |
| Controller → Session Store | 21 样本,manifest=completed,metrics.csv=21 行,wire=30,identity verified=true,gap/duplicate/out-of-order/parse/writer failure 均为 0 | 真机闭环 PASS |
| 新版 App UI 点击 | 本轮自动化环境未得到可重开的 App 主窗口;未用 Controller 闭环冒充点击证据 | 人工回归待补 |
| 中断恢复 | 客户端退出遗留的 recording Session 在重启后标记为 interrupted,没有误记 completed | 通过 |
Final device gate
当前结论与下一个停止点
已通过
- Bundle ID → PID 解析与进程表二次校验。
- 同名 executable 不再误绑,进程重启时重新解析。
- 前台目标动态数值、后台 FPS/GPU 不归因、长静止 suspect 语义。
- Raw/Derived/Quality 与 completed Session 文件闭环。
进入 P2 前建议补录
- 在可视 App 窗口中手工选择设备/目标,点击开始与停止。
- 确认 UI 显示“Bundle ID / PID 已校验”和前台状态。
- 对应 Session 的 manifest=completed,且 metrics.csv 数值与页面最新样本一致。
- 完成该 UI 门禁后再把 A 批次整体标记为 Full PASS。