外观
采集启动、首点与停止延迟修复结果
交付结论
L1~L4 的无设备开发已完成,Foundation 升级为 collector-foundation.2.7-beta,Mac App 升级为 1.0.0 (38)。本批修复了已定位的三条工程阻塞路径:点击后先处理大缓存、普通指标被重型源饿死、停止收尾无统一短预算。
本结论为 E2 构建/合成压力证据,不把它描述为真机体验已经关门。Build 37 留存会话的 19.59 秒启动、0 sample、121.33 秒停止是修复前 E4 历史证据;Build 38 仍需用户在同类设备与应用上完成 E4 复测。
L1 · 启动快路径
- 两级预热完成后,点击路径只创建 Session、写入紧凑 loss/control 事实并立即发出唯一一次 launch;不再遍历、序列化或解码整个预热 CoreProfile ring。
- 预热证据通过
_prepend_events在 launch 后按源顺序承接。 - 预热 ring 从单纯
64 chunks改为64 chunks + 32 MiB双预算,live queue 为512 chunks + 64 MiB双预算。 - 超出预算会累计 drop count/bytes,写入
core-profile.source-loss.raw,Session 标为partial;不丢失后仍宣称 valid,不以 0 填缺值。 - 300 MiB 合成 decoded-source 负载覆盖单次 launch、launch 先于 CoreProfile decode、端到端 click-to-launch ≤500 ms 合同。
L2 · 普通样本与重型处理隔离
- pymobiledevice3 仍是唯一设备 Provider/DTX owner;worker 只处理已到主机的 Raw,不新开设备 socket。
- 每个普通 Adapter 一启动就创建 consumer,不再等待所有慢可选源完成。
- 预启动 CoreProfile consumer 最后调度,每条 Raw 后显式让出事件循环。
- JSON/base64 写盘由单线程有序 host writer 执行;全局 Session sequence 仍由
RawSessionRecorder唯一分配。 - CoreProfile Frame/Startup 解码离开 DTX/control event loop;Frame decoder 只更新独立的短锁状态,不并发修改普通 Metric Engine;sysmontap/lifecycle 可继续投影并发送 Wire sample。
- JSONL 仍 append-only;flush 改为
16 MiB 或 250 ms有界批次,finalize 时仍执行 flush、fsync、SHA-256 与严格 replay。
L3 · 停止链与 Startup 状态
停止 UI/Wire 现在区分:
stop_requested:停止指令已确认;capture_stopped:采样边界已关闭,UI 立即离开采集态;closeout_progress/stopping-sources:关闭设备源;closeout_progress/sealing-raw:封存 Raw;finalizer_progress:离线解析与报告阶段。
CoreProfile drain 上限 2 秒,所有 Adapter stop 共用 1 秒总预算,DTX owner close 1 秒,lease close 0.5 秒;Mac 端异常总兜底由 120 秒收紧为 10 秒,超时按 partial 收口。报告阶段不再持有设备源。
Startup 面板在最终九阶段报告尚未闭合时显示 采集中,封存后显示 解析中,最终没有可信结果时显示 缺失;继续保留 candidate/partial/missing,不把外部 observed-running 或 foreground-ready 冒充九阶段 Total。
L4 · 自动回归
| 验证 | 结果 | 证据 |
|---|---|---|
| Python Sidecar/Core | 233 / 233 | E2;冻结 Python 3.12 + pymobiledevice3 环境 |
| Swift | 109 / 109 | E2;x86_64 macOS 测试目标 |
| 300 MiB 启动模型 | 20 / 20 | E2;每轮断言唯一 launch、launch 先于 decode、click-to-launch ≤500 ms |
| 30 MiB 重型源下普通首点 | 20 / 20 | E2;每轮断言合法 sysmontap Raw→Wire ≤250 ms |
| 启动模型完整测试进程 P95 | 329.413 ms | 仅为进程+unittest 墙钟,不冒充产品 click-to-launch |
| 首点模型完整测试进程 P95 | 337.219 ms | 同上,不冒充 Raw→Wire 产品边界 |
| Registry | 64 / 64 | 公式与 metricID 未改变 |
| Build 38 内部 ZIP | x86_64;110,299,005 bytes | SHA-256 d3255ee5039ae73c715393a3bf4ca293fcbfecf9954d19d5909aeb74230f6858;独立解包、严格 codesign 与 Core probe 通过 |
机器证据 使用 nearest-rank:排序后取第 ceil(0.95 × 20)=19 项。该文件不含设备、应用、账号或证书身份。
公式与质量语义
本批没有改变任何业务指标数学公式、单位、scope、差分窗口或取整规则,因此 64 项 Canonical 公式版本不升级。变更的是采集管线质量语义:
prelaunchRingOverwriteCount > 0或prelaunchLiveQueueDropCount > 0→ CoreProfile Raw 质量为partial;droppedEventHighWater = max(source drop, bridge drop);- 丢失情况下 Startup/Frame 派生继续 fail-closed 为 partial/missing,不填 0;
- 单 Adapter 保持源顺序,跨 Adapter 以 host monotonic timestamp 审计,不伪造全局设备时序。
Canonical 说明同步更新至深度 Raw 源的质量与发布语义。
仍开放的门禁
- Build 38 真机点击→launch、首个普通 sample、停止→设备释放需要 E4 复测;本轮未访问设备。
- 真实 300~450 MB Raw 的完整 finalizer 墙钟尚未重新测量;10 秒故障兜底可能生成 partial,不能宣称报告性能已完全关门。
- 商店 App 九阶段仍受 target attribution / RAW schema 门禁影响;管线变快不等于九阶段数值已具备。
- iOS 26/27 仍是 E2 candidate;GPU Counter data row、ThermalStatus 稳定源、竞品同窗数值校准继续开放。
- 本机无有效 Developer ID identity,notary keychain profile 也不可用;当前只能生成 ad-hoc 内部测试包。Gatekeeper / staple 未通过,不能称为公证正式包。
- 对外分发仍受 universal2、GPL 法务、Developer ID 与公证凭据门禁约束。
下一阶段与整体进度
下一阶段是 Build 38 的 E4 体验验收:同一设备/应用至少各跑 Startup 开/关 3 轮,记录点击→launch、合法普通样本→Wire、首样本、停止采样反馈、设备释放、最终报告与 Startup quality。若仍慢,按 Wire 阶段时间戳定位到设备调用、writer、decoder 或 finalizer,不再用整体体感猜原因。
整体上,64 项 Registry 与 iOS 15~18/26/27 E2 合同保持;P4 的离线工程修复完成,真机体验门禁仍开放。P2 Startup 九阶段、P3 长窗口/PID 归因、P5 Thermal/物理放电、P6 GPU data row、P7 Cloud/正式发布尚未全部关门。