planP4E2partial2026-09-20

启动时间稳定性优化开发方案 v1:独占采集窗口与独立端点账本 ​

本方案承接启动时间稳定性重评,把“先验证双 Tap 争用,再解除 Total 对阶段完整配对的依赖”细化为可执行开发批次。当前仅完成方案与口径入档,没有修改产品代码,也没有把稳定获取状态升级为 validated。进入 SSO-0/SSO-1 实现仍需用户明确批准。

1. 决策 ​

采用 SSO(Startup Stability Optimization)双主线方案:

  1. 采集源主线:以当前配置完成 G0 对照;若证实 ActivityTrace 与启动 CoreProfile 同窗会降低准确 Total 成功率,则把启动窗口改成 Startup 独占 Trace Window,Startup stop → drain → release 后再启动 ActivityTrace。全程只有一次目标 App launch,不通过第二次启动补数据。
  2. 解码主线:引入 Independent Endpoint Ledger(独立端点账本),System Interface BEGIN 一经目标身份和 generation 验证即独立留存,不再要求第一阶段 END 存活后才能参与 Total;九阶段 span 配对与 Total 端点计算分离。
  3. 准确性主线:首帧 END 身份不足时不升格为精确值。frame-end-repaired 单候选默认降为待验证的 repaired;真正首帧 END 丢失但后续帧存活的反例加入永久回归。
  4. 条件探索:只有前两条落实后仍未达到门槛,才执行 ActivityTrace 单源启动事务普查 G2;没有目标实例与首帧语义证据就停止,不把整机 FrameLifetime 替代目标 App 首帧。

1.1 为什么不直接选其他方案 ​

方案 决策 原因
继续增大 kdebug buffer / 改 bm 不进入生产优化主线 既有真机样本仍持续出现设备丢失 episode,大档还撞 ready 超时
延长 ready/grace/总等待 不作为稳定性修复 只能覆盖晚到,不能恢复已丢事件;还会直接增加首结果和停止延迟
多轮自动冷启动择优 不作为默认产品方案 改变用户可见语义、缓存和热状态;有选择偏差,且不是这一次启动的稳定结果
跨轮拼接起点/终点 禁止 构造了一次未真实发生的启动
用进程前台、截图或整机第一帧代替 禁止复用当前 metricID 定义、时钟和误差模型不同,不能冒充 App Launch Total
无条件串行两个 Tap 暂不直接落地 当前配置是否仍争用需要 G0 因果对照;串行会牺牲 Display 启动窗口覆盖,必须用证据换取该取舍

2. 目标、非目标与成功定义 ​

2.1 目标 ​

2.2 非目标 ​

2.3 稳定性的正式分母 ​

令 N_all 为所有已接受并发起的启动测量请求;源未武装、launch 失败、等待超时、缺报告均进入失败分类。用户主动取消单列,并同时报告含取消和剔除取消两种口径。

text
P_numeric = N_with_any_numeric_total / N_all
P_exact_candidate = N_with_identity_valid_paired_endpoints / N_all
P_phase = N_with_all_required_phases / N_all
P_source_ready = N_startup_source_armed / N_all

其中 P_numeric 只代表有值率;repaired、ambiguous、start-substituted 不并入 P_exact_candidate。在没有同义参考校准前,名称保持 exact_candidate,不称最终 ground truth。

3. 冻结的架构 ​

3.1 单 Session Trace 生命周期状态机 ​

新增 Session 内部的轻量状态机 StartupTraceWindowGate(名称可在实现时按现有模块风格调整),不新建第二 DTX owner:

text
idle
  → startup-arming
  → startup-active
  → startup-completing
  → startup-draining
  → startup-released
  → display-arming
  → display-active
  → closing

强约束:

3.2 G0 对照模式 ​

SSO-0 仅增加可审计的实验策略和时间线,不先改变默认生产策略:

模式 启动窗口 Display 用途
overlap-current CoreProfile ActivityTrace 允许同窗 当前行为对照
startup-only-control CoreProfile 本轮不启动 ActivityTrace 隔离 ActivityTrace 增量影响
serial-startup-then-display CoreProfile 独占 release 后启动 ActivityTrace 验证串行是否减少启动端点缺失

策略只能由内部实验配置选择,默认值保持当前行为,配置和最终 resolved 值进入 manifest。正式切换生产默认值必须由 G0 E4 决策门通过。

3.3 G0 必需的源时间线 ​

新增 startupTraceSchedule 诊断块,所有时间使用 host monotonic,仅用于调度审计,不与设备 Mach tick 混算启动耗时:

json
{
  "policy": "serial-startup-then-display",
  "startupTapArmBeginNs": 0,
  "startupTapReadyNs": 0,
  "launchRequestedNs": 0,
  "startupEndpointObservedHostNs": null,
  "startupWaitFinishedNs": 0,
  "startupStopAckNs": 0,
  "startupDrainFinishedNs": 0,
  "startupReleasedNs": 0,
  "displayTapArmBeginNs": 0,
  "displayTapReadyNs": 0,
  "overlapDurationMs": 0.0,
  "displayCoverageGapMs": null,
  "transitionStatus": "completed|partial|cancelled",
  "reason": null
}

公式:

text
overlapDurationMs = max(0, min(startupReleasedNs, displayStoppedNs)
                          - max(startupTapArmBeginNs, displayTapArmBeginNs)) / 1e6

displayCoverageGapMs = (displayTapReadyNs - launchRequestedNs) / 1e6

若任一必要时间戳缺失,对应值为 null,不补 0。串行模式验收要求 overlapDurationMs == 0;Display gap 必须在 UI/报告披露,不能把未采集窗口描述成完整覆盖。

4. 独立端点账本 ​

4.1 数据结构 ​

在 RealtimeLaunchTraceDecoder 内新增有界 endpoint evidence,而不是复制全部 Raw:

text
LaunchEndpointEvidence
  kind: system-begin | initial-frame-opener | frame-terminal
  machTicks
  timestampNs
  debugID
  threadID
  targetPID
  targetGeneration
  sourceEpoch
  reconnectGeneration
  arrivalSequence
  decoderProfileVersion
  selectionState
  selectionReason

sourceEpoch/reconnectGeneration 需由 consume() 调用链显式传入或从可信 envelope 读取;字段不可得时保持 null,不得默认成 1 后参与“同源”证明。每类端点候选有固定上限,建议起点≤8、opener≤16、terminal≤32;超限时 endpointEvidenceTruncated=true,Total 不得升格为 clean candidate。

4.2 起点选择 ​

System Interface BEGIN 的原始 marker 在完成目标线程归属后立即进入端点账本,不等待 System Interface END。

选择合同:

  1. 目标 PID、generation、source epoch 必须匹配当前 launch。
  2. machTicks 位于本轮 CoreProfile 窗口,且不晚于所选 frame opener/terminal。
  3. 只有一个合法起点时选中,startSelectionReason=unique-system-begin。
  4. 多个合法起点时沿用并显式记录当前 profile 的“同线程重复 BEGIN 取最后一个”规则;缺少后续边界约束时降为 duplicate-system-begin-unresolved,不静默任选。
  5. 无 System BEGIN 时,最早 dyld/Static BEGIN 仍可作为诊断性 start-substituted,但保持 repaired,不进入准确成功率。

修复后的 Total 起点直接取选中的真实 system-begin.machTicks,不再从完整 System Interface span 反推。

4.3 终点选择与降级规则 ​

Initial Frame END 仍要求与本轮目标身份、generation、epoch 一致。以下规则冻结:

设备丢事件 marker 为 0 只表示“未观测到丢失证据”,不把它用作无损证明。

4.4 报告兼容 ​

保留现有字段供旧客户端读取:totalDurationMs、totalQuality、totalSource、totalRepairReason。新增:

text
endpointIntegrity:
  paired-candidate
  paired-with-loss-evidence
  start-substituted
  single-terminal-unverified
  multiple-terminals-ambiguous
  evidence-truncated
  missing

endpointEvidence: {...}
endpointEvidenceTruncated: Bool
startupTraceSchedule: {...}
displayCoverageStartsAfterStartup: Bool

旧报告缺少新字段时 Swift 解码保持可选;不得把缺字段回填为 paired-candidate。UI 主结果继续显示数值和现有 repaired 提示,同时增加“端点完整 / 端点待验证 / 端点存在丢失证据”三级说明。导出保留全部审计字段。

5. 公式、单位、窗口与质量语义 ​

5.1 App Launch Total ​

令选中的真实 System BEGIN 为 S,同一目标实例的 Initial Frame END 候选为 E:

text
durationNs = ((E - S) × machNumer) // machDenom
AppLaunchTotalMs = durationNs / 1_000_000

5.2 误差方向 ​

若用晚起点 S' > S:

text
errorMs = -((S' - S) × numer // denom) / 1e6

若把后续帧 E' > E 当首帧:

text
errorMs = ((E' - E) × numer // denom) / 1e6

两种错误可能偶然抵消,所以“数值与预期接近”不是正确性证据。

5.3 质量优先级 ​

text
missing/global-gate
  > evidence-truncated
  > identity/generation/epoch mismatch
  > loss-observed or terminal-unverified
  > start-substituted / multiple-terminals-ambiguous
  > paired-candidate

高优先级异常不得被低优先级成功条件覆盖。phaseCoverageComplete 与 endpoint integrity 正交保存。

6. 代码范围 ​

6.1 SSO-0:争用验证与调度审计 ​

文件 计划修改
MacApp/Sidecar/perfowl_collector_core/realtime.py 增加实验策略解析、Trace Window 状态机、ActivityTrace 延迟启动、Stop 优先、调度时间线
MacApp/Sidecar/perfowl_collector_core/contracts.py 若现有诊断合同承载不足,增加可选 schedule 字段;不改变 Raw 事件定义
MacApp/Sidecar/perfowl_collector_core/recording.py 把 resolved policy 与最终 schedule 写入 manifest
MacApp/Sidecar/perfowl_collector_core/online_report.py 输出 coverage gap 与 overlap 诊断,不改变 Display 指标公式
MacApp/Sidecar/tests/test_startup_trace_window_gate.py 新增状态机、取消、超时、降级、零 overlap 集成测试

SSO-0 不修改默认产品策略。E4 结论通过后,另一个窄批次才把默认值切为串行。

6.2 SSO-1:独立端点账本 ​

文件 计划修改
MacApp/Sidecar/perfowl_collector_core/launch_trace.py endpoint evidence、起点独立选择、终点完整性分类、报告字段
MacApp/Sidecar/perfowl_collector_core/realtime.py 向 decoder 传递 source epoch/reconnect/generation,封存 schedule 与 endpoint evidence
MacApp/Sources/PerfowlCore/PerformanceModels.swift 新字段全部 optional,兼容旧报告
MacApp/Sources/PerfowlCore/StartupTracePresentation.swift 展示 endpoint integrity 与 Display coverage gap
MacApp/Tests/PerfowlCoreTests/StartupTracePresentationTests.swift 旧报告、paired、loss、unverified、missing 展示回归
MacApp/Sidecar/tests/test_perfowl_launch_trace.py 补齐起点存在但 phase END 丢失、真正首帧丢失但后续帧存活等反例

6.3 SSO-2:生产默认切换(条件批次) ​

仅在 G0 满足决策门时:

6.4 SSO-3:知识与实现记录 ​

实施批次必须同步:

7. 实施批次与批准边界 ​

批次 内容 默认行为变化 出口
SSO-0A 调度诊断与三模式实验开关 无 E2 状态机/集成测试、可审计内部包
SSO-0B A/B/C 真机筛查 无 判断双 Tap 是否是当前因果因素
SSO-1A 独立起点账本 + 永久反例测试 改进解码,新增质量字段 E2 回放与性能通过
SSO-1B Fixture / 真机端点校准 无新增算法 起点误差、首帧身份和平台 profile 结论
SSO-2 条件性默认串行切换 有 仅在 G0 决策门通过后实施
SSO-3 跨平台准入、正式包与文档收口 无算法变化 supported matrix 与交付门禁
G2 ActivityTrace 单源启动事务 spike 默认 OFF 仅在 SSO-1/2 仍不达标时触发

本次用户指令批准的是“形成开发方案并入档”,不是产品实现授权。后续“继续分析/把方案写细”仍停留在文档;只有“按 SSO-0/SSO-1 开发”才进入代码。

8. 测试策略 ​

8.1 单元测试 ​

端点至少覆盖:

  1. clean control;
  2. System BEGIN 存活、System END 丢失——Total 必须仍使用原始 BEGIN;
  3. 重复 System BEGIN 的确定性选择和 unresolved 降级;
  4. code=12 存活、真正首帧 END 丢失、后续 terminal 存活——不得计入 exact candidate;
  5. code=12 丢失、单 terminal——single-terminal-unverified;
  6. 多 terminal——ambiguous;
  7. opener→terminal 窗口有设备 loss marker;
  8. loss marker=0 不自动升格;
  9. cross-generation/sourceEpoch/reconnect 拒绝配对;
  10. evidence 超限 fail-closed;
  11. 无/非法 timebase、E≤S、未知 profile;
  12. 旧报告无新字段仍能解码显示。

Trace Window 状态机至少覆盖:

8.2 集成与回放 ​

8.3 G0 真机实验 ​

固定同设备、同系统 build、同 App 版本、同其他指标选择。每个 App 内采用 A/B/C 交叉均衡顺序,轻/重目标和静置后首轮/连续轮分层;每个 cell 起步 30 轮,只作筛查。

主指标:P_exact_candidate、terminal presence、endpoint integrity、source armed、device loss marker、启动等待时长、Display coverage gap。辅助记录温度、电量、网络、旧进程终止状态和可识别预热状态。

串行决策门:

30 轮筛查的 Wilson 区间仅用于方向判断。若差异不稳定或 B/C 无改善,SSO-2 停止,不为“看起来合理”切默认。

8.4 准确性校准与最终稳定性门 ​

任何错 App、错 generation、错首帧、跨 epoch 配对都算正确性失败,不仅是离群点。

9. 轻量化与性能门禁 ​

9.1 复杂度和资源预算 ​

路径 预算
endpoint evidence 热路径 O(1)/匹配事件;固定数组上限,禁止无界增长
endpoint report O(K log K),K≤56;实际常数有界
现有语义重建 保持当前排序与两遍归属,不因本方案增加第二次全 Raw 扫描
调度状态机 O(1)/状态转换,不轮询;全部事件驱动
新增常驻内存 endpoint + schedule 目标 <64 KiB/Session;绝对门禁 <1 MiB
新增持久化 JSON 目标 <16 KiB/Session;不默认保存全 CoreProfile Raw
并发 单 DTX owner;受控 trace tap 并发上限=1(串行策略)
ready 保持现有 5 s;不为实验大缓冲放宽
startup wait 保持现有 15 s 绝对上限
Stop 不突破当前 Closeout 总预算和 Swift watchdog 边界

9.2 基准要求 ​

实施后必须使用相同全尺寸 Raw 对比旧/新:

未达到预算或缺少前后对比时,状态保持 partial。

10. 风险、护栏与回滚 ​

风险 护栏 回滚
串行后丢失启动期间 Display 覆盖 displayCoverageGapMs、UI pending 状态、报告披露 恢复 overlap policy
Startup 超时拖延 Display 15 s 绝对上限 + 有界 drain;Stop 优先 关闭 serial 默认
独立起点选错重复 BEGIN 保留全部有界候选和 selection reason;不确定即 repaired/missing 回退旧计算,保留新诊断关闭发布
后续帧误作首帧 永久负例;single terminal 不称 exact 禁用 repaired 数值发布,仅留诊断
新字段破坏旧报告 全部 optional、旧 JSON fixture 合同测试 Swift 展示回退到旧字段
与在途 Display/Closeout 修改冲突 每批开始重新检查 diff;精确暂存本批文件 停止合并,不清理他人改动
G0 实验污染生产 内部策略、resolved policy 入 manifest、默认保持现状 删除实验入口并保留归档结果

每批一个窄提交;禁止强推。历史 Session 和已发布 devlog 数字不重写。

11. G2 条件分支与停止条件 ​

触发条件:完成 SSO-1,且 G0/SSO-2 仍使声明平台的 P_exact_candidate 达不到目标,同时缺失主要集中在 terminal identity。

G2 只运行 ActivityTrace 单源 census:先统计 schema/子系统/事件名,不保存日志正文;发现候选后再验证目标 PID/launch transaction/scene/surface 身份、设备时钟、首帧语义和独立丢失路径。

满足下列任一项即停止:

G2 若形成新定义,必须使用新的 metricID 和 Canonical 文档,不覆盖当前 App Launch Total。

12. 交付与发布门禁 ​

每个产品代码批次完成后按项目规则执行:

  1. 匹配单元、集成、全量 Python/Swift、知识门禁与 VitePress 构建;
  2. 真实规模性能前后对比;
  3. 本地窄提交;
  4. 当前分支同一提交双远程推送尝试;
  5. Developer ID 对 App/容器签名,提交 Notary,成功后 stapling;
  6. codesign --verify --deep --strict、Gatekeeper、独立解包/安装、universal 架构、dSYM UUID、SHA-256;
  7. 真机 E4 与原生 UI 录证;
  8. delivery webhook;
  9. 汇报下一阶段与整体进度。

证书、Notary、网络、设备或 GPL-3.0 法务门禁缺失时如实标记 partial/blocked,不把内部测试包描述为正式交付。

13. 本方案的验收清单 ​

14. 下一阶段与整体进度 ​

下一阶段:等待用户明确回复“按 SSO-0/SSO-1 开发”。获得批准后先做 SSO-0A 调度诊断与 G0 三模式,不直接切默认;随后做 SSO-1A 独立端点账本和永久反例测试。

整体进度:研究和开发方案已完成入档;产品现状仍是“可获取但不稳定,端点正确性存在开放门禁”。稳定方案实现、真实设备因果验证、分层准确率、性能、原生 UI、正式签名公证与分发合规均未关闭。