外观
Owner 新会话启动审计与 SW-1 有界采集窗口差分实验
1. Lead 决策与边界
Lead 独立读取 Owner 新录制会话 O1 的产品报告、核心清单、原始事件、外置二进制与指标文件,并在当前 5309283a28499c613bc312a2192f798a65dbdd97 进行只读核验。本页 E4 指真实会话证据;本页新增实验尚未实施,不能据此宣称修复有效或产品验收通过。
本次完整启动时间仍 missing;现有字节中没有 IFR opener。批准 SW-1 默认关闭的单变量窗口实验,不批准生产策略修改。 A1 UI E4 保持 OPEN;Phase C Hybrid 保持 FROZEN;Network 与 FrameTime 各自另批。
Owner 的固定流程:Lead 落盘方案并派发,Implementation 按合同执行,交付后 Lead 独立验收;无需逐批等待 Owner 再次审批。Owner 新增规则:GitLab 每批只尝试一次推送,失败不重试、不阻断 GitHub、实验或技术验收。远程同步失败单列 partial,不篡改真实 ref,不 force。此规则不授权绕过现有生产部署守卫;本批不发布网站。
2. O1 独立证据
原始位置与真实设备/应用/进程身份只留私有证据;公开统一用 O1、设备 A、目标 App A。私有目录:~/Perfowl-Local-Archive/owner-startup-audit-20260927/,只有脚本与证据,没有新 worktree、虚拟环境或 Raw 副本。
| 项目 | 独立读数 | 解释 |
|---|---|---|
| 全会话时长 | 629.939 s | 长会话不等于启动 tap 持续运行 |
| 产品 CSV | 622 行 | 观察样本,不代表完整启动端点 |
| 请求指标 | 38 项 | 非历史 startup-only 12 项配置,不用于成功率直接比较 |
| CoreProfile | 39 chunks:31 binary + 8 bplist | 全部 startup-lifecycle / active |
| binary 解码记录 | 2,235,860 | 使用 RAW v2 头、跨 chunk 余数与实际流偏移对齐 |
| IFR opener | 全线程 0,目标线程 0 | 跨整个已保存 CoreProfile 字节扫描,不只查白名单/报告 |
| IFR closer | 全线程 21,冻结映射可归属目标的 0 | 18 属其他进程、3 映射未知;未知不可冒认目标 |
| 可解释生命周期 action 记录 | 全线程 42,冻结映射目标 13 | action 记录数不等于 report targetRecordCount |
| 出厂 Total | null / missing,status partial | requiredMissingPhases 仅 IFR;sceneWillConnectTo 另有不完整边界 |
| 当前纯内存重放 | 10 个主字段与出厂报告零差异 | 不调用会回写文件的 derive_session;不证明录制二进制版本相同 |
| tap completion wait | timed-out / startup-completion-grace-expired,4.040685 s | 非语义完整成功 |
| 结束时 open phase | UIKit Scene Creation | 当前延长条件仅 didFinishLaunchingOpen,此状态不获延长 |
| tap stop drain | quiescent,postStopChunkCount=0,post-startup observed bytes=0 | 本次没有 A1 drain 候选可救 |
| 设备 loss marker | 4 | host liveQueueDrop=0 不等于设备无丢失;不能断言恰好丢了 IFR |
| writerQueueWait | P95 901.689 ms / max 1412.541 ms | backlog 线索,尚无因果归因 |
文件独立 SHA-256:
- Raw:
8db320b3c2af40bdc9887329911829bf4b5001a2cb611f5e3d55510f532afef4。 - CoreProfile blob:
d4e04e594555b9f223614488770702f68f2758e1cc3c3e735f11dc185e51fb3d。 - Derived metrics:
571216701bd0cb0362d9daa63ad88d981ef91bce9a9651ee0e2fab7e1099a8c8。
各 chunk SHA 也逐块核验。整个 Session 全文件的 SHA、size、mtimeNs 在审计前后相同;只证明本次审计区间未变,不追溯此前不可变性。私有脚本一次审计约 5.96 s(包括前后哈希),不是产品性能门禁。
2.1 时钟与源码交叉核验
主机域:launch.requested → startupSemanticComplete 约 7.720 s;semantic flag → tap stop request 约 48.698 ms;stop request → drain complete 约 770.286 ms。completion wait 4.040685 s 是其中一个等待阶段,不能称为“点击后 4 s 停源”。设备域已保存的最大 kernel tick 相对选定 launch-start tick约 +1438.815 ms;这是覆盖读数,不是 Total、也不是与主机域同轴的窗口。
realtime.py 的等待循环允许 didFinishLaunchingOpen 获得一次 8 s 延长,且总 deadline 受 launch-request 主机时钟 +15 s 约束。grace 到期后仍会设置 startup_semantic_complete 并 request_stop_for_drain。名称里的 complete 因此不能单独证明 IFR 完整。实际安装包来源尚未绑定到 Git 完整 SHA:当前源码说明候选机制,Raw/manifest 证明本次真实结果,两者证据分开。
已排除的直接修复方向:O1 没有 opener,修改 A1 role 保留、重新配对现有 closer、重放原文件,都不能恢复缺失端点。尚未证明:端点在 stop 后产生/送达,设备 overflow 丢了 opener,或目标行为/系统 schema 本来不同。延长窗口只是可证伪的假设,不是根因结论。
2.2 其他性能读数与独立异常
- CSV 目标 CPU 均值约 1.85%,峰值 175.86%:目标进程非归一化口径可超过 100%,不是整机 CPU。物理 footprint 约 438.6–525.6 MiB;均为现有 candidate 观察,未做同场校准。
- CSV FrameTime 613 点,均值约 18.46 ms;frame-report 使用 5554 条呈现记录、5407 个区间,平均约 65.65 ms。两者样本/窗口不同;不能把后者作为这 10 分钟 App 卡顿真值。FrameTime P95、Pacing Jitter coverage 仍 missing,时钟/窗口另批。
- CSV 出现 process network Send 约
1.7029451528330846e19 bytes/s,仍标 candidate。这是明确的数值可信度异常,禁止据其算平均带宽/性能结论;是否 unsigned 哨兵、reset、上游差分或时间窗问题待独立 Raw 归因。不同于此前 DeviceNetworkAggregateStream 入口缺陷,不能直接沿用旧根因。本批不改 Network。 processObservedRunningMs/foregroundReadyMs的 4179.916543 ms 是轮询观察值,不是完整 App Launch Total;九段累计约 949.285121 ms 也不是 Total。
3. SW-1:唯一实施合同
3.1 目标与实验变量
回答一件事:在同一正确 UI 配置下,UIKit Scene Creation 尚开且 IFR 未配对时,多保留剩余的现有主机预算,是否能获得目标线程真实 IFR opener/closer?
默认 OFF 的环境开关 PERFOWL_STARTUP_SCENE_WINDOW_EXPERIMENT:缺值/0=OFF,1=ON,其他值 fail-closed OFF 并记录解析诊断。开关在核心启动时固定,不支持中途翻转。
ON 仅在原 base-grace 到期的检查点生效,必须同时满足:未 Stop/closing、有效动态目标身份、尚未 completionObserved、UIKit Scene Creation 仍在现有 decoder openPhases、现有 launch-request 主机 max_deadline 尚未到达。此时只允许一次延长,deadline 设为现有 max_deadline,不另造 deadline。已存在 didFinish-open 路径保持原样并优先,禁止延长叠加。延長必须被显式标记为 scene-window-experiment,不伪称 completion-observed 或干净完成。
这是最多补足 launch-request 后 15 s 的主机等待,不是设备 tick 准入上界。Stop 必须随时打断;completionObserved 仍立即结束;max deadline 仍失败闭合并保留 missing。openPhases 为空、仅其他 phase、目标未验证、时钟边界缺失,一律不进入新增分支。
3.2 允许范围
MacApp/Sidecar/perfowl_collector_core/realtime.py:上述单次 opt-in 等待分支、解析与少量 telemetry;可提取一个纯等待决策 helper 以便 deterministic tests。- 专项测试文件:边界/竞态/资源测试;最小新增离线只读 locator 工具可放现有 tools 路径。不引入外部依赖。
- 关联 devlog 实施增量及 C2/C3;由于触及实验采集链,Implementation 做 C5 闭环复核,knowledge/HomeExtras 保持原支持状态/计数,只在确有对应实验说明位置增加默认关闭、未验收说明,不包装成支持率提升。
- 新包构建、签名、公证与独立安装;包命名明确 experimental,冻结 Build74 包和回滚包保留。
禁止改:launch_trace.py 配对/保留/质量/Total,metric_engine/Network/FrameTime,kdf2/bm/bso/bsoc/csd/rp/frame filter,source restart/rearm,Phase C,普通首帧替代端点,UI 指标默认选择,pre-push/网站生产部署。不得合并 G2/SSO/WIP 分支。
3.3 最少 telemetry(原主机域,缺值保留 null)
manifest 增量命名保持 startupSceneWindowExperiment* 前缀:enabled、eligible、extensionApplied、decisionReason、deadlineMonotonicNs、extensionStartedMonotonicNs、extensionEndedMonotonicNs、openPhasesAtDecision;同域耗时按 (end-start)/1e6,负/缺值置 null。记录现有 completion waitStatus/reason、tap stop/drain 与 sourceEpoch/targetGeneration,保留 original 字段语义,不回写旧会话。
不新增指标、不新增总时间公式。读取检查点 snapshot 一次、内存 O(1) 状态、最多 3 条新增控制 telemetry;禁止高频轮询/每记录格式化/无界 ledger。等待继续复用 event race,每个 wait 子任务在 finally 取消并 gather。
4. 实施与验收顺序(不刷概率)
E0:先复核录制来源与同类历史
复核当前 HEAD/status;只读定位 O1 所用安装包(真实 executable 路径、Info.plist、核心 SHA、可获得的完整源码 provenance)。缺来源标 unknown,不编造。阅读历史 dedicated/prewarm/grace/rearm 记录:若发现已完成完全同条件窗口实验,停止重复,实现前交 Lead 该证据。异类 bm/bso、rearm 与角色反事实不算同实验。
复跑 O1 namespace scan,明确 RAW v2 头、bplist、跨 chunk partial record、外置 blob SHA与偏移,不按 blob 全局64字节步长扫描;opener 的 func-bit 变体也覆盖。输出 main-thread witnesses、所有未知 closer 身份;禁止靠最终 PID map 把线程重用冲突洗白。必要时用第二个纯字节定位器复核 code12,不新增整棵源码复制。
E1:确定性测试 + OFF 等价
必须覆盖:OFF/无开关/非法值,唯一 Scene-open 可延长,其他 phase 不延长,无动态身份,已完成,不存在 launch边界,deadline 恰等/已过,didFinish 已延长不叠加,Stop 在决策前/等待中/完成同时到来,source closing,任务取消与无泄漏,超时保持 missing。
旧四轮 + 三轮 UI + O1 的 Raw/报告只读重放,证明 OFF 主字段、pairing、保留与指标算法不变;不同 schema 使用隔离工具兼容,不改原文件。新工具测试包含分块拆头、拆记录、bplist夹块、debugID出现在 args 的假命中、跨源/代际、映射未知/冲突、只 closer、其它进程完整链;假命中不能形成 PASS。
专项与现有 Sidecar 全量匹配验证;不以计时 flake 自行判回归/非回归。OFF 性能交错至少 3 配对,同 Python/字节码状态:单MB扫描吞吐下降 ≤5%,RSS 增量 ≤8 MiB,无额外 Raw全量复制/I/O;首响应与 Stop响应不劣化。ON 最长等待是刻意的实验成本,必须分列,不能与 OFF 同预算掩盖。ON 后台队列原容量不扩大。
E2:实验新包工程
Developer ID、secure timestamp、hardened runtime、notary Accepted、staple、deep-strict、Gatekeeper、独立解包启动、ZIP完整 SHA、核心 SHA与exact commit绑定均要留证。仅有构建不进入真机。嵌套 TSA 的既有缺口只对实验构建产物重签,不并改 build-app.sh;证据如实区分原脚本与产物处理。
E3:最多两个新真实 UI Session
同一个新实验包,设备 A、目标 App A、相同 cold-launch 流程,只勾 Startup Timing 12 项、关闭截图;逐项比较 planHash/registryHash、identity、四 lifecycle kdf2、csd0、bm0、rp100、exact-debug-id。O1 的 38 项+截图不是这一对的基线,不用新旧不同配置宣称提升。
按 OFF → ON 顺序各一轮,最多 2 个新 Session,包括 INVALID 轮也计入预算;每轮一次 Start/Stop,固定观测30 s,若启动完成也不提前人为挑窗口。每次切换 env 后完整重启 App及其预热核心,验证实际核心继承状态;不要重用旧进程。未按预定开关/配置进入核心即 INVALID,停止,不补刷。
先落只读封存清单再分析,分析结束全文件重哈希。UI 原生 live/final 与隔离 offline replay分别交付;App 未写诊断块属于已知路径差异,不覆盖成 offline 报告。每轮有界收集宿主 CPU/RSS/I/O 与 UI同轴操作记录;策略不允许的项写 unknown,不绕路自升证据。单轮 wall 上限120 s、Raw 观察安全预算1 GiB;触线立即按真实 UI Stop收尾,记录 safety-aborted,不继续采样;不人为加压/延迟/改 drain。
E4:Lead 判据
- ON 获得实际目标同线程 IFR opener +合法closer,raw locator/身份/代际/设备 tick链闭合且现有原生配对 candidate成立:只说明该轮实验阳性;2轮不证明稳定性提高。只有新增等待确实 applied、端点出现在 base截止之后的同域收到时间,才能支持“更长窗口保留救到了端点”。
- ON 端点早已在 base截止之前,或 OFF 本来也完整:实验对“窗口致缺失”不具判别力,不自判修复。
- ON applied但仍无opener:窗口假设本轮不支持,冻结该实验,下一步由 Lead依 loss/线程/source证据选择源丢失取证,不继续加时间、刷轮数。
- ON 未 eligible / 两轮形态不满足:如实 inconclusive,不自行扩样。
- 任意伪造/跨线程/跨代际/其他进程链、原文件变化、OFF行为回归、Stop失效、资源越界:REPAIR REQUIRED。
若阳性,Lead另定生产最小补丁与至少跨设备/配置正负回归;这之前默认开关仍关闭,A1 UI E4/Build74正式验收均不因此关闭。Native active candidate不等于 A1 drain正向,实验也不强行要求事件落在drain。
5. 交付合同与环境纪律
只使用主工作区、现有依赖和一个私有批次目录。零新增常驻 worktree/venv;若测试必须临时隔离,最多一个目录、验证后移除并交代。四项他方 WIP 与 Instruments trace逐字节保全;只显式暂存本批路径,不 reset/clean/全量暂存。
Implementation 交付 exact commit/parent/五类文件范围与偏差,deterministic测试与OFF回归,包绝对路径与完整SHA/provenance,两轮真实UI原始哈希/配置/同域窗口/locator/loss/资源/报告差分,所有unknown及停止理由,C2/C3/C5、GitHub与GitLab一次尝试分别状态、Webhook。不生产发布;不自判PASS;不得开启Network、FrameTime、Hybrid下一阶段。
整体路线:SW-1窗口假设验证 → Lead选择生产最小修复或源丢失分支 → 同配置跨设备稳定性验证 → 新包正式E4。Dedicated已实施不等于端点稳定;Hybrid没有完成,继续冻结。网络巨值另建待办;FrameTime时钟与P95/Jitter缺值另批,不能靠这批扩大支持声明。
6. Implementation Update(2026-09-27)
本段是实施方交付记录,不是验收结论。E0/E1/E2 三个阶段已完成留证;原 E3 的两个 Session 已在宿主解锁后按 OFF → ON 执行,结果 inconclusive(ON 未 eligible)。
入口分类更正(R1,2026-09-28,依 Lead 独立审计
5d700fa)原 §6 把这两轮记作「两个真实 UI Session」,并称「无功能性偏差」——这是错的,现予更正。
两轮由驱动脚本直接
subprocess.Popen包内perfowl_collector_core stream --prewarm,再向其 stdin 发送prepare_app → start → stop;它们没有通过 App 的perfowl.capture.toggle操作,也没有由 App 自身启动该核心。因此这两轮的正确名称是「包内核心命令入口真机辅助轮」,属有效的命令入口辅助证据,但不能充当原合同要求的两份真实 UI Session。
- 正式真实 UI E3 = NOT SATISFIED:本批未取得任何真实 UI 轮次。
- 辅助轮结果为 inconclusive;正式真实 UI E4 = NOT EVALUATED(未评估),本段不构成任何 E4 判定。
- 相同 CapturePlan /
planHash只证明 Start 之后的采集配置相同,不证明入口、预热或 App 生命周期相同;不得据此推出启动时间稳定性提升。- 已测得数字(开关读回、配置、hash、locator、stop/资源、主字段重放、未 applied、同域时间
null)原样保留,未抹改;只更正证据等级与入口归属。实施方不自判 PASS;正式结论由 Lead 独立裁定。
6.1 Exact commit / parent 与文件范围
- 交付 commit:
65f82c1a22862af9d1cddcee11b8c7a7028bd94a,parent:1c86cf39fcf475e940fc48bf11174df85e8e3c75。 - 范围 4 文件、
+2294 / −1:
| 文件 | 变化 | 说明 |
|---|---|---|
MacApp/Sidecar/perfowl_collector_core/realtime.py | +292 / −1 | 唯一产品改动:开关解析、纯决策 helper、单次 opt-in 等待分支、9 条 manifest telemetry |
MacApp/Sidecar/tests/test_sw1_scene_window_experiment.py | +635(新增) | 23 项确定性测试:开关、决策、端到端等待 |
MacApp/Sidecar/tests/test_sw1_scene_window_locator.py | +450(新增) | 24 项定位器测试:分块/拆记录/夹块/假命中/身份/绑定/只 closer/他进程链 |
tools/validation/sw1/offline_scene_window_locator.py | +917(新增) | 最小离线只读 locator(locate / replay),工具 SHA-256 98ebdc1659fc2dc03b45c566d6d53b831206820689f3a40e5b5bcda40fb4940e |
唯一删除行:wait_reason = "max-startup-wait-exceeded" 被改为按是否已应用实验延长而二选一的自描述 reason;其余全部为新增。未触碰 launch_trace.py、metric_engine、Network、FrameTime、任一 filter、source restart/rearm、Phase C、UI 指标默认选择、pre-push 与站点部署;未合并任何 G2/SSO/WIP 分支。
偏差:存在实质性入口偏差(入口分类更正见 §6 开头:两轮为包内核心命令入口辅助轮,不是真实 UI Session)。工程侧另有三条如实披露的偏差 ——(a)构建环境重建(§6.4);(b)为免 build-app.sh 的 rm -rf 覆盖 Build74 公证 App,在构建前把它就地改名为 Perfowl-Build74-Phase2-f3c9b73-notarized.app(未复制、未删除、逐字节保留);(c)定位器布局扩展:上表记录的 98ebdc16… 是 E1 阶段使用的修订版,本批辅助轮会话由新打包脚本产出、其会话产物平铺在会话根(manifest.json/raw-events.jsonl/core-profile-chunks.bin 直接在会话根),而定位器原先把 collector-core/ 嵌套路径写死。为使同一把只读尺子能量测新会话,新增 session_core_dir() 解析器(嵌套优先,找不到才退回平铺)并替换 4 处取路径点,纯增量 28 行、无行为分支改写;locate_lifecycle_endpoints 的字节级算法、映射门、判决逻辑一行未动。辅助轮阶段的工具 SHA-256 为 f95d619c528a680907e29755eddfa8e376d1347d4c3e5dabc0ff090d9ba8299d。回归证据:本批 47 项专项测试(tests.test_sw1_scene_window_locator + tests.test_sw1_scene_window_experiment,stdlib unittest)全绿;并在一个嵌套布局的真实历史会话(census-S2,当轮唯一目标进程、recordsScanned=1421166)上取到正常判决,证明嵌套路径仍按原样解析。E1 的既有证据仍绑定 98ebdc16… 修订版,两者不混用。共享工作区只显式暂存本批路径,未 reset/clean/全量暂存。
6.2 E1:确定性测试与 OFF 回归(已完成)
- 新增 23 + 24 = 47 项测试全绿;
test_perfowl_realtime+test_perfowl_launch_trace97 项全绿;本批聚焦合计 144 项 OK。 - Sidecar 全量 1011 项中 6 项失败/错误。基线归因未独立闭合:本次归因所用的唯一临时目录已在验证后移除,未保留可供核对的双侧原始日志,因此只能记下「6 项在原始 HEAD 树上同形失败」这一当时观察,不得写成已证明的「零回归」;6 项待 Lead 独立复核。
- OFF 等价重放:8 轮历史会话中 7 个含 CoreProfile 流的会话
mainDiff == {}全一致(按冻结口径喂全部块 +emit_completed_trace=True+report()不传 hash,复现出厂发布的冻结修订版);ui-appA-r1无 CoreProfile 流,如实标“不适用”。会话collector-core清单分析前后逐字节相同。 - 独立定位器交叉:与 Lead 对 O1 的审计逐项吻合(
recordsScanned=2235860、opener 0、closer 21(18 属其他进程、3 映射未知)、假命中 0、gatedMappingRecords=118323);定位器按冻结同门取映射(launch 作用域、跳过 frame-continuation),因此不能靠最终进程映射把线程重用冲突洗白。 - OFF 性能交错(3 配对,最重样本):median base 92.485 MB/s、ship 93.944 MB/s,吞吐变化 −1.578 %(门 ≤5 % 下降)PASS;ship 峰值 RSS 增量 0 B(门 ≤8 MiB)PASS;每样本“单次整块读”成立、base/ship
decodedRecordCount逐对相同、会话清单未变 PASS。 - ON 决策成本单列:100 万次调用 OFF 270.53 ns / ON 530.86 ns / 非法值 287.47 ns,RSS 增量均 0,不触扫描路径,后台队列容量未扩大。
6.3 E2:实验包工程(已完成)
包命名明确 experimental,冻结 Build74 包与回滚包全部保留(7 个 ZIP 收尾后 SHA-256 逐字未变;就地保留的 Build74 公证 App 可执行文件仍为 5c1b8aae…)。
| 项目 | 证据 |
|---|---|
| Developer ID + hardened runtime | 构建启用 Developer ID 身份与 --options runtime(身份名称/指纹留私有证据) |
| secure timestamp | 对实验构建产物单独重签(产品脚本 build-app.sh 对嵌套代码用 --timestamp=none 的既有缺口未修改):signed_files_checked=323、missing_timestamp=0 |
| 公证 | status = Accepted(submission id 09605b71-bba3-42e7-a245-ece140c96b10) |
| staple + deep-strict | xcrun stapler validate = The validate action worked!;codesign --verify --deep --strict = valid on disk / satisfies its Designated Requirement |
| Gatekeeper | spctl -a -vvv -t install = accepted / source=Notarized Developer ID |
| 独立解包启动 | 另目录 ditto 解包后:deep-strict 通过、spctl accepted、staple 校验通过、包内核心 probe = "ready":true(metricContractCount=66、valid=true) |
| 提交包 SHA-256 | 98f57d67182c5b49def9671516ee84689d8564ed59b339c2edb9eadcefedd9e2(109,839,265 B) |
| 分发包 SHA-256 | 4234c273995e5f2e86c4043533e0f83752d2a8fa9c67a62ceba7b169d8fd0216(109,844,024 B) |
| 核心 ↔ exact commit | 冻结核心 SHA-256 45c43e9effe83f7030168e2b8e18e89f9e5ccae62aa4fe30dff1a6c21e864745;git diff --exit-code HEAD 对核心构建输入 = NO_DIFF_VS_HEAD;build-sidecar-core.sh 缓存键(记录值 == 复算值)b0ea11e6f20a63ef2040d42bf1f270b1103125875d0c984afd31187a3eb16091 |
| 包内核心 == 冻结核心 | 两者去签名后逐字节相同(同 2f807184…、同为 12,301,760 B,cmp 全等)⇒ 包内核心 SHA a1bd4097… 与冻结核心 45c43e9e… 的差异只是嵌入的代码签名块 |
包绝对路径:MacApp/dist/Perfowl-SW1-SceneWindow-Experimental-b75-x86_64-notarized.zip(另存提交包同名 -notarize-submit.zip)。仅有构建未安装到系统目录、未发布。
6.4 环境偏差(如实披露)
本批发现文档化的冻结构建环境 /private/tmp/perfowl-core-py312 已被 macOS 的 /private/tmp 定期清理掏空——目录树尚在但 PyInstaller/、altgraph/、macholib/、_pyinstaller_hooks_contrib/、setuptools/ 均为 0 文件,pyvenv.cfg 为空使解释器退回系统 3.12 并从 user site 解析模块,import PyInstaller 失败。按 build-app.sh 既有的 bootstrap 路径,用已提交的锁文件在同一路径重建同一环境(非新建常驻 venv、不改任何仓库配置):就绪判据 READY 3.12.3 x86_64 11.3.1 6.22.3。损坏目录已备份为 …/perfowl-core-py312.gutted-20260927。另有本机批量删除守卫拦截构建脚本自身的 rm -rf,按既有 env -u … 前缀执行,未放宽任何策略。
6.5 包内核心命令入口真机辅助轮(已执行,OFF → ON;非真实 UI Session)
宿主解锁后,用同一个 E2 公证实验包、同一台设备 A、同一目标 App A、同一 controlled-cold-launch 流程,只勾 Startup Timing 12 项、关闭截图,OFF → ON 各执行一轮;单轮一次 Start/Stop、固定观测 30 s、每轮全新核心进程(不复用旧进程)。
入口如实披露(本批的实质性偏差):驱动脚本直接 subprocess.Popen 包内 perfowl_collector_core stream --prewarm,再向其 stdin 发送 prepare_app → start → stop(复现 App wire 序列)。它未通过 App 的 perfowl.capture.toggle 操作,未由 App 自身启动该核心,也未记录 App 原生 UI 操作与进程树。故这两轮记为包内核心命令入口真机辅助轮:其真机 Raw 是有效的命令入口辅助证据,但不能充当真实 UI Session;正式真实 UI E3 仍为 NOT SATISFIED。
两轮 planHashEcho 均命中冻结 capturePlanHash,sidecar-exited exitCode=0、fatal=None、safetyAborted=false,未触 wall 120 s / Raw 1 GiB 护栏。
| 项目 | OFF 轮 | ON 轮 |
|---|---|---|
| 会话别名 / 会话目录 | 2b750830 / …/sessions/2b750830-22a8-4e4a-ae6a-8101639682f7 | e6fda76c / …/sessions/e6fda76c-7bf2-4b54-93a3-136cbc55c7ae |
| 开关继承(核心实测,非驱动声明) | Enabled=false(驱动 sceneWindowEnvPresent=false) | Enabled=true(驱动 env=1) |
Eligible / ExtensionApplied | true / false | false / false |
| 决定原因 | experiment-off-unset | scene-open-phase-absent |
| 4 s base-grace 到期时 openPhases | ["UIKit Scene Creation"] | ["Initial Frame Rendering"] |
| completion wait 状态 / 耗时 | timed-out / startup-completion-grace-expired / 4.018156 s | 同上 / 4.000654 s |
| Raw SHA-256 | a41ca4d6666d26d9069ef93d33010615d7d5e19799b6c686680dcf1bc44f5af8 | 60e507ce74e9a186c9e8e28c4c87dba19fd3aab350f21754cd9db221086ac1fd |
| CoreProfile blob SHA-256 / 字节 / 块数 | 8bee8b40313631542cc964450cd8e97917b05baf45d9b783198cdb3da6d89e5f / 260,490,968 / 61 | b5788142252a917f06a3b1023630ac4fc7e35762b0d14f026b1d67a4717e87af / 175,644,416 / 48 |
| 目标进程 / generation / 身份 | 当轮唯一目标进程(主机侧身份 verified)/ 1 / identityVerified=true、targetForeground=true | 同上 / 1 / 同上 |
clickToLaunchRequestMs | 3738.353 | 3525.946 |
| 轮次 wall / Raw 峰值 | 30.828 s / 260,990,632 B | 32.002 s / 176,116,005 B |
| 只读封存清单(分析前后) | 30 文件 / 261,027,835 B | 30 文件 / 176,153,589 B |
结论先行(事实陈述,不构成验收结论):两轮的采集配置逐项相同(§6.5.1),但 ON 轮的新增等待没有 applied —— ExtensionApplied=false,DeadlineMonotonicNs / ExtensionStartedMonotonicNs / ExtensionEndedMonotonicNs / DurationMs 全部为 null。因此窗口假设在本轮未获得判别性检验(§6.5.4、§6.6)。
6.5.1 采集配置逐项对照(合同必比项,全部相同)
| 必比项 | 两轮共同读数 |
|---|---|
capturePlanHash(planHash) | f9f5407724bdf97769f439a27ff4e87597fbfbdae77b5c8fc72b5bb9b79a8c3b(与冻结值一致) |
registryHash 侧(policyVersion + 12 项 metric ID) | all-supported.v1;requestedMetricCount=12,ID 集合与冻结 12 项逐条相同 |
identityStatus | verified |
四类生命周期 kdf2 | ['0x1F070000','0x2B870000','0x31CA0000','0x2BDC0000'](与冻结族逐项相同) |
csd / bm / rp | 0 / 0 / 100 |
ta / tk | [[3],[0],[2],[1,1,0]] / 3 |
| exact-debug-id(帧过滤) | frameFilterExperiment=exact-debug-id;requestedFrameFilter=0x31800318;effectiveFrameFilter=['0x1f070000','0x2b870000','0x31ca0000','0x2bdc0000'] |
coreProfileConfigSignature | 31a6c916320c749285b3a2be8c2d1c17803cf19ec00430ed484e9b509bc2da06 |
| 其余 DTX 参数 | samplingTriggerEnabled=false、callstackDepth=0、kdebugFilters==requestedKdebugFilters=[520552448,730267648,735838208,835321856] |
| 采集模式 / 保留 | startup-only / coreProfileRawRetention=full |
| 源生命周期 | coreProfileStartCount=1、coreProfileStopCount=1、coreProfileRestartCount=0 |
coreProfileConfigSignature 与 planHash 两轮逐字相同,说明两轮进入核心的采集配置是同一份;差异只出现在会话身份 UUID、数据量与设备相位。
6.5.2 独立只读纯字节 locator(offline_scene_window_locator.py locate)
| 读数 | OFF 轮 | ON 轮 |
|---|---|---|
verdict / 理由 | CLOSER-ONLY / thread-binding-unknown、closer-without-opener | OPENER-ONLY / thread-binding-unknown、opener-without-closer |
| 目标线程 IFR opener | 0 | 1(当轮唯一目标线程、debugID 730267696、blob offset 648448、chunk sequence=44) |
| 目标线程 IFR closer | 26 | 0 |
| 全线程 opener / closer | 0 / 60 | 1 / 23 |
recordsScanned | 4,068,906 | 2,743,178 |
gatedMappingRecords(launch 作用域映射门) | 268,537 | 158,704 |
distinctThreadsBound / targetThreadCount | 2455 / 99 | 2421 / 82 |
identityMismatchedRecords | 0 | 0 |
conflictingThreads / conflictThreadEndpoints | [] / 0 | [] / 0 |
unknownThreadEndpoints | 8 | 3 |
otherProcessCompleteChains | 0 | 0 |
unalignedLifecyclePatternHits(非 48 偏移假命中) | 0 | 0 |
chunksBlobSkipped / extraRawHeaderChunks / prefixChunks | 12 / 0 / 1 | 12 / 0 / 1 |
streamRejectedReason | None | None |
三点必须如实并列:
- ON 轮出现了本批首次记录到的目标线程 IFR opener(此前 O1 与本次 OFF 轮均为全线程 0 opener)。但 ON 轮没有合法 closer,故
verdict=OPENER-ONLY。 - 端点存在 ≠ IFR 阶段闭合:ON 轮报告里该 debugID 被当作
UIKit Scene Creationspan 的 end 使用(spanCount=12、supersededBeginCount=1),IFR 阶段仍quality=missing、requiredMissingPhases=["Initial Frame Rendering"]。 - 两轮端点形态不同(OFF 只有 closer、ON 只有 opener),不是同形态配对;OFF 轮与 O1 同形。
6.5.3 报告差分与隔离离线重放
sw1_ui_diff.py 对两轮做全字段差分,共 13 项不同,其中:
- 3 项为预期的实验遥测:
startupSceneWindowExperimentEnabled(false→true)、Eligible(true→false)、DecisionReason(experiment-off-unset→scene-open-phase-absent)。 - 2 项为会话身份:DTX
tc[0].uuid(ea420af5…vsc786e2c1…)。 - 2 项为数据量:
coreProfileBlobByteCount、coreProfileBlobSHA256。 - 1 项为等待相位:
CompletionWaitElapsedSeconds(4.018156 vs 4.000654)与CompletionWaitOpenPhases[0](UIKit Scene CreationvsInitial Frame Rendering)。 - 4 项为派生产物:
decodedRecordCount(4,068,906 vs 2,743,178)、totalDurationMs(1524.98525 vsnull)、totalQuality(repairedvsmissing)、totalSource(coreprofile-endpoint-repairedvsnull)。
报告形态差异(都不是开关造成的,因为 ON 轮开关未 applied):OFF 11 span、status=partial、reason=lifecycle-spans-incomplete、totalRepairReason=frame-end-repaired-ambiguous;ON 12 span、totalQuality=missing、IFR quality=missing reason=phase-boundary-incomplete。两轮 requiredMissingPhases=["Initial Frame Rendering"] 相同,unmatchedBeginCount=1、unmatchedEndCount=0 相同,源质量均 lossFree=true、liveQueueDropCount=0(设备 loss marker OFF 8 / ON 5)。
隔离离线重放(把两轮会话喂冻结口径、SW-1 强制 OFF):两轮均 mainUnchanged=true、mainDiff={}(OFF 61 块、ON 48 块,无 frame-continuation 跳过)⇒ 新会话在 OFF 语义下主字段与出厂封存报告零差异,OFF 等价性在两轮新会话上同样成立。
drain 读数(取自 launch-trace-report.json,非 manifest):OFF drainStatus=timeout、chainObservedClosed=false、targetActionableCount=23、rejectedEventCount=23(thread-binding-unknown=18、no-opener=1);ON drainStatus=quiescent、chainObservedClosed=false、targetActionableCount=0、rejectedEventCount=0(thread-binding-unknown=26)。两轮都没有可闭合的 IFR 链。
原生 live/final 与隔离离线重放分开交付:会话内保留 report-live.json、report-final.json、launch-trace-live.json、startup-report-live.json 等出厂在线产物;离线重放只写本批 out/ 下的独立 JSON,不覆盖会话内报告。
6.5.4 同轴时序:本轮不可评估(telemetry 记录缺口,如实披露)
合同 E4 要求判「端点出现在 base 截止之后的同域收到时间」。本批实现把 startupSceneWindowExperimentExtensionStartedMonotonicNs 定义为「延长实际开始时(即 base 截止点)」的读数,因此只有 applied 才会有值;两轮 ExtensionApplied=false ⇒ 该键与 DeadlineMonotonicNs 均为 null。
后果:sw1_endpoint_timing.py 的两轮输出 baseCutoffMonotonicNs=null,所有端点的 deltaFromBaseCutoffMonotonicNs / receivedAfterBaseCutoff / receivedWithinMaxDeadline 全部为 null,targetOpenersReceivedAfterBaseCutoff=0 只是「非 true 的计数」,不得读成「端点在 base 截止之前到达」。
因此本轮无法回答「更长窗口是否保留救到了端点」。可作为补充的、已记录的宿主域锚点(不是 base 截止,不能替代判据):OFF 轮目标 closer 的 chunk 收到时间跨度 534532393233813 → 534542570786815(launch_requested 为 534531388934869,stop 为 534557589616671);ON 轮唯一目标 opener 的 chunk 收到时间为 534620735286539(launch_requested 为 534614922047009,stop 为 534642008509243,startupSemanticCompleteNs=534621005612204)。
这是本批暴露的 telemetry 缺口,不是产品缺陷:若后续仍要检验该假设,需由 Lead 决定是否新增「无条件记录 base-grace 到期点」的字段;本批未擅自改动产品语义。
6.5.5 封存、只读性与安全状态
- 两轮会话均先落只读封存清单再分析;分析结束后重跑全文件重哈希:两轮各 30 文件、逐文件 size/mtimeNs/SHA-256 全部相同(
IDENTICAL_ACROSS_ANALYSIS=true),包括 260 MB / 175 MB 的core-profile-chunks.bin。(清单的generatedUtc按设计不同,其余字段一致。) - 两轮均未触安全护栏:
safetyAborted=false,Raw 峰值 260,990,632 B / 176,116,005 B ≪ 1 GiB 上限,wall 30.8 s / 32.0 s ≪ 120 s。Stop 响应即时(stop_requested→stoppedOFF 约 0.155 s、ON 约 0.053 s),sidecar-exited exitCode=0。 - 宿主资源(驱动 1 Hz 采样,
psutil):两轮常驻内存约 11.83–12.07 GB,CPU 区间 OFF 30.0–100.0 %、ON 0.0–47.7 %;采样为环境观察,非产品性能门禁(产品性能门禁见 §6.2 OFF 交错)。 - 两轮使用的核心与 App 可执行文件 SHA 与 §6.3 一致(
a1bd4097…/ee3dfc15…)。
6.6 辅助轮结果对原 E4 判据的事实映射(Implementation 只做事实映射,不裁定;正式 UI E4 未评估)
| 合同 §4 E4 判据 | 本批两轮事实 | 是否命中 |
|---|---|---|
| ON 获得实际目标同线程 IFR opener + 合法 closer,locator/身份/代际/设备 tick 链闭合且原生配对 candidate 成立 ⇒ 该轮实验阳性 | ON 轮只有 opener(1)、无 closer;verdict=OPENER-ONLY | 未命中 |
| 只有新增等待确实 applied、端点出现在 base 截止之后的同域收到时间,才能支持「更长窗口保留救到了端点」 | ExtensionApplied=false(两轮),base 截止未被记录 ⇒ 支持条件不成立,且该比较缺数据(§6.5.4) | 未命中 |
| ON 端点早已在 base 截止之前,或 OFF 本来也完整 ⇒ 实验对「窗口致缺失」不具判别力 | OFF 本来也不完整(IFR opener 0、IFR 阶段 missing),不是「OFF 本来完整」 | 未命中(判别力缺失来自 applied=0,而非 OFF 完整) |
| ON applied 但仍无 opener ⇒ 窗口假设本轮不支持,冻结该实验 | 不适用(本轮未 applied) | 不适用 |
| ON 未 eligible / 两轮形态不满足 ⇒ 如实 inconclusive,不自行扩样 | ON Eligible=false(scene-open-phase-absent);两轮端点形态不同(CLOSER-ONLY vs OPENER-ONLY);两轮均 requiredMissingPhases=["Initial Frame Rendering"] | 命中本情形 |
| 任意伪造/跨线程/跨代际/其他进程链、原文件变化、OFF 行为回归、Stop 失效、资源越界 ⇒ REPAIR REQUIRED | 两轮 identityMismatchedRecords=0、conflictingThreads=[]、otherProcessCompleteChains=0、unalignedLifecyclePatternHits=0;30/30 文件分析前后逐字节不变;离线强制 OFF 重放 mainDiff={};sidecar-exited exitCode=0、Stop ≤0.16 s;未触 wall/Raw 护栏 | 未发现该类问题 |
实施方结论(不是验收结论):本批的包内核心命令入口辅助实验记 inconclusive(ON 未 eligible、两轮形态不满足),未追加轮次、未刷概率、未扩样。窗口假设既未被证实、也未被证伪。
本表不构成任何 E4 判定:辅助轮不是真实 UI 轮次,故 正式真实 UI E3 = NOT SATISFIED、正式真实 UI E4 = NOT EVALUATED(未评估)。表中「命中/未命中」只描述辅助轮的观察事实,不能读成正式 E4 结论。
6.6.1 未证明项与遗留
- 窗口假设未取得判别性真机证据(命令入口辅助轮同样未取得);不得据此宣称修复有效或产品验收通过。
- 本批未取得任何真实 UI 轮次:正式真实 UI E3 = NOT SATISFIED、正式真实 UI E4 = NOT EVALUATED(未评估)。辅助轮不占原合同「最多两个真实 UI Session」预算,同时也不能替代它。
- 「更长窗口是否保留救到了端点」本轮无法回答:base 截止未被记录(§6.5.4)。若 Lead 仍要检验该假设,需先决定是否为「base-grace 到期点」补一条无条件遥测;本批未改产品语义。
- «ON 轮出现 1 个目标线程 IFR opener» 是单轮观察,与 OFF 轮形态不同;不能据此推断开关有效果(ON 轮开关未 applied),也不能排除设备/系统侧运行间差异。
- 两轮均无
drain内可闭合链(OFFtimeout、ONquiescent,chainObservedClosed=false)。 - 冻结核心与既有两个包的分发工程另有既有偏差(TSA 打包脚本、archive renderer)不在本批范围。
- 生产开关保持默认关闭;A1 正式 UI E4、Build74 正式验收、Phase C Hybrid 均不因此改变;Network 巨值与 FrameTime 时钟/P95/Jitter 仍另批。
6.7 C2 / C3 / C5 与远程状态
- C2(已执行):
site/devlog/index.md时间线顶部新增本批节点;docs/architecture/perfowl-p4-startup-owner-session-window-differential-plan-2026-09-27-implementation-update.html为本批实施增量快照(手写归档源,不派生自site/public/;prebuild的sync-archive会同步为/archive/…)。 - C3(已执行):「当前位置」顶部新增本批段落;「八阶段总计划」P4 行与「未关门门禁」的 P4 SW-1 行由「产品尚未实施」更新为「包内核心命令入口辅助轮已执行、辅助实验 inconclusive;正式真实 UI E3 未满足、E4 未评估、待 Lead 裁定」,并保留 A1 正式 UI E4 OPEN、Phase C Hybrid FROZEN。
- C5(已执行):本批不新增指标、不改变任何指标的支持状态或计数。经检索
site/knowledge/与site/.vitepress/theme/components/HomeExtras.vue,不存在描述该实验(默认关闭开关 / completion-wait 窗口)的位置,故按合同「只在确有对应实验说明位置增加默认关闭、未验收说明」的要求,未向任何用户页插入说明 —— 避免把未验收的实验写成用户可见能力;「默认关闭、未验收」的表述只留在本 devlog 与归档快照中。npm run build通过:知识门禁PASS: 66 Registry contracts、sync-archive283 文件(含本批新快照)、VitePressbuild complete in 33.33s、无死链报错。 - 远程:GitHub 与 GitLab 各只尝试一次普通快进推送;GitLab 失败不重试、不阻断,失败即单列 partial,不用本地镜像代替真实远程。本批不发布网站(未执行
npm run deploy)。 - 本批提交范围(一个窄范围本地提交):本 devlog、
site/devlog/index.md、docs/architecture/…-implementation-update.html、tools/validation/sw1/offline_scene_window_locator.py(布局扩展,偏差 c)。共享工作区其余他方 WIP 与MacApp/Tests/1.trace/未触碰,未reset/clean/全量暂存。
6.8 R1 入口更正与交付修正(2026-09-28)
依 Lead 独立审计(5d700fa7863a6db62880007d9e9e6e0d8c161ddc;方案 site/devlog/p4-startup-sw1-lead-audit-and-true-ui-revalidation-plan-2026-09-28.md)执行 R1 · 最小文档和交付修正:未采集任何新 Session、未改产品代码、未触碰他方 WIP、未发布网站。R1 的实施记录落在本 §6.8,不修改已发表的历史数字与旧归档。
| 项目 | 结果 |
|---|---|
| 实施起点的冻结状态 | HEAD 5d700fa7863a6db62880007d9e9e6e0d8c161ddc;本批四条目标路径未被他人推进(5d700fa 仅新增 Lead 方案与 handoff,未触碰 devlog/索引/归档/locator) |
| 受保护四项他方 WIP | p4-build74-phase2-post-r3-minimal-repair-plan-2026-09-24.md 3302191444fca89cab542a0a736a288f5797dfc1237eeed5fedc47a0dec447d3;p4-build74-instruments-subscription-and-startup-endpoint-differential-audit-plan.md bcc5e64d4684f9ff066e9af7b3bdb254bee003a61be52cbdcdca2bed16ec75d2;p4-build74-owner-e4-two-session-targeted-validation-plan-20260924.md fd35bf6d91285c6077471b2772cc1124e4ee0d119b3f817510eb98fa5c0709cd;MacApp/Tests/1.trace/ 820 文件 / 314,106,259 B / 聚合指纹 fafe529aa58c5a84d72e956c98627c65998a23fac87260403e0d5e76bfa51a08 —— 全部逐字节未触碰 |
| 入口分类更正 | 两轮统一改称「包内核心命令入口真机辅助轮」;正式真实 UI E3 = NOT SATISFIED、正式真实 UI E4 = NOT EVALUATED(未评估);辅助轮不占也不替代「最多两个真实 UI Session」预算 |
| 偏差更正 | 「无功能性偏差」→「存在实质性入口偏差」(未走 App perfowl.capture.toggle、核心非 App 启动) |
| 公开隐私 | 移除 2 处真实 PID(§6.1 历史样本描述 1 处、§6.2 O1 closer 归属 1 处);本批新增内容对 PID / UDID / 序列号 / Bundle ID / 设备型号 / iOS build / 证书指纹 / 凭据档名 扫描 零命中 |
| 数值保全 | 全部实测数字(开关读回、配置、hash、locator、stop/资源、主字段重放、未 applied、同域时间 null)原样保留;旧归档与既有已发表行未改 |
| locator 平铺/嵌套补丁 | +24/−4(28 行),仅新增 session_core_dir() 并替换 4 处取路径点;字节级算法、映射门、判决逻辑与身份门一行未动(git diff 复核);工作树 SHA-256 f95d619c528a680907e29755eddfa8e376d1347d4c3e5dabc0ff090d9ba8299d(HEAD 侧为 E1 的 98ebdc16…) |
| 聚焦测试 | PYTHONPATH=tests:. 下 test_sw1_scene_window_locator + test_sw1_scene_window_experiment + test_perfowl_realtime + test_perfowl_launch_trace = Ran 144 tests … OK(144/144) |
| 全量六项异常 | 基线归因未独立闭合:归因用临时目录已在验证后移除,未保留可核双侧日志 ⇒ 只记「6 项在原始 HEAD 树上同形失败」的当时观察,不写「零回归」;6 项待 Lead 独立复核 |
| 三处材料一致性 | devlog / site/devlog/index.md / 归档快照的状态、数字、入口表述逐项对齐;归档快照严格 HTML 校验:DOCTYPE 存在、lang="zh-CN"、标签完全平衡(0 错、0 残留)、无未引号属性、7 个 <h2> / 6 个 <h3> / 7 个 <table> |
| 站点 build(只构建,不部署生产) | npm run build RC=0:[metric-knowledge-gate] PASS: 66 Registry contracts…(含既有 42 条 content-risk WARN,未变)、[sync-archive] docs/ -> public/archive/ (283 files)、build complete in 273.36s、无死链报错;归档副本与源逐字节相同(23c57779…,31,506 B);site/public/archive/ 属 .gitignore 生成物,不入 Git |
| 构建环境偏差(如实披露) | 首次 npm run build 被本机批量删除守卫拦截、第二次 sync-archive.sh 的 rm -rf public/archive 触发 broker 读超时;按既有 env -u CODEBUDDY_SAFE_DELETE_BULK_STATE_DIR -u CODEBUDDY_TOOL_CALL_ID 前缀并把 broker 读超时上限调高后通过。未放宽任何安全策略、未改脚本、未执行 npm run deploy |
| 远程 | GitHub 普通快进推送一次;GitLab 最多一次,失败单列 partial、不重试、不阻断其他技术工作 |
| 边界 | R1 不给 SW-1 产品 E4 PASS。R2(真实 App UI OFF→ON 复验)仅在 R1 经 Lead 复核后由 Test AI 实施;本批未进入 R2,未开启 Network / FrameTime / Hybrid / 首页改版 |
遗留(交 Lead 复核):site/devlog/index.md 存在 3 行既有已发表内容含设备型号、术语「Bundle ID」与历史凭据档名(第 198 / 939 / 1001 行)。它们不在本批 diff 行范围内(本批仅改第 28–29 / 247 / 294 / 305–308 行),按 R1「不得触碰已发表历史数字、旧归档」的边界未改动,在此如实列出供 Lead 决定是否另批处理。