外观
P2 Startup Mach Clock Bridge v1 修订方案
修订结论
ActivityTrace 与 CoreProfile 虽可在同一 pymobiledevice3 DvtProvider 打开不同 DTX channel,但 iOS 17 真机同窗探针显示两个 trace tap 会争用设备侧 trace 会话:单 provider 与双 provider 均为 ActivityTrace 有回包、CoreProfile 0 条;CoreProfile 单源对照可解码 401,517 条记录。因此 ActivityTrace 不进入实时 StartupTiming 链,也不为它增加第二个 DTX owner。
本批改用 Fixture 直接记录 mach_absolute_time() 原始 tick。Fixture 停止后再通过 House Arrest 读取 marker 文件,与 CoreProfile KDebug 的 machTicks 在同一 Mach absolute 时间轴上审计。该能力只用于可控 Fixture 校准,不进入任意被测 App 的产品依赖。
数据流
text
受控 Fixture 启动
├─ CoreProfile(唯一 DTX owner)→ KDebug machTicks + timeConfig
└─ Fixture 公开生命周期回调 → mach_absolute_time + mach_timebase_info → 沙箱 JSONL
采集停止
└─ House Arrest 顺序读取 JSONL → SHA-256 → startup-clock-bridge-report.jsonHouse Arrest 在 CoreProfile 停止后使用,不与 DTX trace 会话并发。产品测试普通 App 时不读取其容器。
门禁
- Fixture marker 必须有
phase、edge、machAbsoluteTicks、machNumer、machDenom、注入延迟与单调序号。 - marker 与 CoreProfile
numer/denom必须相等且合法;同 phase 必须唯一 begin/end、严格递增、耗时非负。 - marker 时间窗必须落入 CoreProfile 解码记录的最小/最大 Mach tick 窗口;跨 generation、重连或时间倒退即失败。
markerDurationMs与注入延迟误差不超过max(5 ms, injectedDelayMs × 5%),先证明 Fixture 本身执行正确。- 语义因果门禁仍使用 control/delayed 各至少 3 次、
max(20 ms, injectedDelayMs × 20%);只有完整 CoreProfile Span 可进入审计。 - 任何缺失保持
null/—,不以 0 补值;本批不根据邻近事件直接命名 fingerprint。
实施
- Fixture 生命周期 marker 追加 Mach tick JSONL,启动第一条 marker 前原子清空旧文件。
run-startup-evidence.py在 trace 结束后顺序读取 marker 文件,写入本地证据并计算 SHA-256。- 新增纯函数
startup_clock_bridge:验证 schema、时间基、配对、窗口与 marker 注入误差,输出 fail-closed 报告。 - Python 测试覆盖正常、缺失、时间基变化、旧文件污染、逆序与窗口外;Fixture/站点构建通过。
- iOS 17/18 各做短 Session;若同钟门禁通过,再重跑 control/will/did 各至少 3 次并复算 Semantic Evidence。
回滚
删除 Fixture marker 文件写入与离线桥接工具即可;Collector Core 产品链、唯一 DTX owner、CoreProfile raw 和现有启动展示不变。