Owner 新会话启动审计与 SW-1 有界采集窗口差分实验 · 实施增量
角色与边界:本页由 Implementation AI 交付,是实施记录而不是验收结论。真实设备/应用/进程身份只留私有证据,公开统一使用「设备 A」「目标 App A」;本页不含 UDID、序列号、Bundle ID 或真实 PID。无侵入红线保持:不改目标 App 源码、不重签、不注入、不 Hook、不嵌 SDK;本批未改 Total、配对规则、采集过滤、源重启、Network、FrameTime、Hybrid,未发布网站,未自判 PASS。
合同依据:Owner 新会话启动审计与 SW-1 有界采集窗口差分实验(Lead 方案提交 e634d3994106890567782e71319b1a140daa1e41)。试验变量只有一个:默认关闭的 PERFOWL_STARTUP_SCENE_WINDOW_EXPERIMENT。
入口分类更正(R1,2026-09-28,依 Lead 独立审计)
原快照把 §4 的两轮记作「两个真实 UI Session」并称「无功能性偏差」——这是错的,现予更正。两轮由驱动脚本直接 subprocess.Popen 包内 perfowl_collector_core stream --prewarm,再向其 stdin 发送 prepare_app → start → stop;未通过 App 的 perfowl.capture.toggle 操作,未由 App 自身启动该核心。其正确名称是「包内核心命令入口真机辅助轮」:真机 Raw 是有效的命令入口辅助证据,但不能充当真实 UI Session。
正式真实 UI E3 = NOT SATISFIED(本批未取得任何真实 UI 轮次);辅助轮结果为 inconclusive,正式真实 UI E4 = NOT EVALUATED(未评估),本页不构成任何 E4 判定。相同 planHash / CapturePlan 只证明 Start 之后的采集配置相同,不证明入口、预热或 App 生命周期相同,不推出启动时间稳定性提升。
已测得数字(开关读回、配置、hash、locator、stop/资源、主字段重放、未 applied、同域时间 null)原样保留,未抹改,只更正证据等级与入口归属。
1. 交付范围与 exact commit / parent
产品改动提交 65f82c1a22862af9d1cddcee11b8c7a7028bd94a,parent 1c86cf39fcf475e940fc48bf11174df85e8e3c75;范围 4 文件、+2294 / −1。
| 文件 | 变化 | 说明 |
|---|---|---|
MacApp/Sidecar/perfowl_collector_core/realtime.py | +292 / −1 | 唯一产品改动:开关解析、纯决策 helper、单次 opt-in 等待分支、9 条 manifest 遥测 |
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) |
唯一删除行: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 分支。
1.1 如实披露的偏差
首要偏差是实质性入口偏差:两轮未走 App perfowl.capture.toggle、核心非 App 启动 ⇒ 只能记为包内核心命令入口真机辅助轮,并因此正式真实 UI E3 = NOT SATISFIED。以下为工程/环境侧三条偏差。
- (a) 构建环境重建:文档化的冻结构建环境
/private/tmp/perfowl-core-py312被 macOS 的/private/tmp定期清理掏空(PyInstaller/等为 0 文件、pyvenv.cfg为空使解释器退回系统 3.12)。按build-app.sh既有 bootstrap 路径、用已提交锁文件在同一路径重建同一环境(非新建常驻 venv、不改任何仓库配置),就绪判据READY 3.12.3 x86_64 11.3.1 6.22.3;损坏目录备份为…/perfowl-core-py312.gutted-20260927。 - (b) 冻结包就地改名:为免
build-app.sh的rm -rf覆盖 Build74 公证 App,构建前将其就地改名为Perfowl-Build74-Phase2-f3c9b73-notarized.app(未复制、未删除、逐字节保留,可执行文件 SHA 仍5c1b8aae…)。 - (c) 定位器布局扩展:本批辅助轮会话由新打包脚本产出,其会话产物平铺在会话根,而定位器原先把
collector-core/嵌套路径写死。为使同一把只读尺子能量测新会话,新增session_core_dir()(嵌套优先,找不到才退回平铺)并替换 4 处取路径点(纯增量 28 行);字节级算法、映射门与判决逻辑一行未动。E1 阶段工具 SHA-256 为98ebdc1659fc2dc03b45c566d6d53b831206820689f3a40e5b5bcda40fb4940e,E3 阶段为f95d619c528a680907e29755eddfa8e376d1347d4c3e5dabc0ff090d9ba8299d;两者不混用。回归:47 项专项测试全绿,并在嵌套布局的真实历史会话census-S2上取到正常判决(recordsScanned=1421166)。
2. E1:确定性测试与 OFF 回归
| 项目 | 结果 |
|---|---|
| 本批新增测试 | 23 + 24 = 47 项全绿(布局扩展后复跑仍 47 项 OK) |
| 既有相关测试 | test_perfowl_realtime + test_perfowl_launch_trace 97 项全绿;本批聚焦合计 144 项 OK |
| Sidecar 全量 | 1011 项中 6 项失败/错误,经同环境交错隔离对照证明在原始 HEAD 树上完全相同地失败⇒ 可归因回归 0,6 项待 Lead 复核(不写「0 失败」) |
| OFF 等价重放 | 8 轮历史会话中 7 个含 CoreProfile 流的会话 mainDiff == {};E3 两轮新会话亦 mainDiff == {}(见 §4.3) |
| 独立定位器交叉 | 与 Lead 对 O1 的审计逐项吻合:recordsScanned=2235860、opener 0、closer 21(18 属他进程、3 映射未知)、假命中 0、gatedMappingRecords=118323 |
| 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,不触扫描路径,后台队列容量未扩大 |
3. E2:实验包工程
包命名明确 experimental,冻结 Build74 包与回滚包全部保留(7 个既有 dist ZIP 收尾后 SHA-256 逐字未变)。
| 项目 | 证据 |
|---|---|
| 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 通过;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)。仅有构建未安装到系统目录、未发布。
4. 包内核心命令入口真机辅助轮(已执行,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 操作与进程树 ⇒ 这两轮只能记为包内核心命令入口真机辅助轮,正式真实 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 | 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 / 4.018156 s | timed-out / 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 | 同上 / 1 |
| 轮次 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 |
结论先行(事实陈述):两轮采集配置逐项相同,但 ON 轮新增等待没有 applied —— ExtensionApplied=false,DeadlineMonotonicNs / ExtensionStartedMonotonicNs / ExtensionEndedMonotonicNs / DurationMs 全部为 null。窗口假设在本轮未获得判别性检验。
4.1 采集配置逐项对照(全部相同)
| 必比项 | 两轮共同读数 |
|---|---|
capturePlanHash | f9f5407724bdf97769f439a27ff4e87597fbfbdae77b5c8fc72b5bb9b79a8c3b(与冻结值一致) |
| registryHash 侧 | policyVersion=all-supported.v1;requestedMetricCount=12,ID 集合与冻结 12 项逐条相同 |
identityStatus | verified |
四类生命周期 kdf2 | ['0x1F070000','0x2B870000','0x31CA0000','0x2BDC0000'] |
csd / bm / rp | 0 / 0 / 100 |
| 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 / full / start 1 · stop 1 · restart 0 |
coreProfileConfigSignature 与 planHash 两轮逐字相同 ⇒ 两轮进入核心的采集配置是同一份;差异只出现在会话身份 UUID、数据量与设备相位。
4.2 独立只读纯字节 locator
| 读数 | 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 | 268,537 | 158,704 |
identityMismatchedRecords | 0 | 0 |
conflictingThreads / conflictThreadEndpoints | [] / 0 | [] / 0 |
unknownThreadEndpoints | 8 | 3 |
otherProcessCompleteChains / unalignedLifecyclePatternHits | 0 / 0 | 0 / 0 |
chunksBlobSkipped / streamRejectedReason | 12 / None | 12 / None |
- ON 轮出现了本批首次记录到的目标线程 IFR opener(此前 O1 与本次 OFF 轮均为全线程 0 opener);但 ON 轮没有合法 closer,故
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 同形。
4.3 报告差分与隔离离线重放
全字段差分共 13 项不同:3 项为预期的实验遥测(Enabled false→true、Eligible true→false、DecisionReason);2 项为会话身份(DTX tc[0].uuid);2 项为数据量(blob 字节与 SHA);1 项为等待相位(耗时 4.018156 vs 4.000654,openPhases UIKit Scene Creation vs Initial Frame Rendering);4 项为派生产物(decodedRecordCount 4,068,906 vs 2,743,178;totalDurationMs 1524.98525 vs null;totalQuality repaired vs missing;totalSource coreprofile-endpoint-repaired vs null)。
报告形态差异(都不是开关造成的,因为 ON 轮开关未 applied):OFF 11 span、totalRepairReason=frame-end-repaired-ambiguous;ON 12 span、IFR 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 等价性在两轮新会话上同样成立。原生 live/final 与离线重放分开交付:会话内保留 report-live.json、report-final.json、launch-trace-live.json、startup-report-live.json;离线重放只写批次 out/ 下独立 JSON,不覆盖会话内报告。
drain 读数:OFF drainStatus=timeout、chainObservedClosed=false、targetActionableCount=23、rejectedEventCount=23(thread-binding-unknown=18、no-opener=1);ON drainStatus=quiescent、chainObservedClosed=false、targetActionableCount=0。两轮都没有可闭合的 IFR 链。
4.4 同轴时序:本轮不可评估(遥测记录缺口)
合同 E4 要求判「端点出现在 base 截止之后的同域收到时间」。本批实现把 startupSceneWindowExperimentExtensionStartedMonotonicNs 定义为「延长实际开始时(即 base 截止点)」的读数,因此只有 applied 才会有值。两轮 ExtensionApplied=false ⇒ 该键与 DeadlineMonotonicNs 均为 null。
后果:sw1_endpoint_timing.py 两轮 baseCutoffMonotonicNs=null,所有端点的 deltaFromBaseCutoffMonotonicNs / receivedAfterBaseCutoff / receivedWithinMaxDeadline 全为 null;报告里的 …AfterBaseCutoff=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)。
4.5 封存、只读性与安全状态
两轮均先落只读封存清单再分析;分析结束重跑全文件重哈希:两轮各 30 文件、逐文件 size/mtimeNs/SHA-256 全部相同(IDENTICAL_ACROSS_ANALYSIS=true),包括 260 MB / 175 MB 的 core-profile-chunks.bin。两轮均 safetyAborted=false,Raw 峰值 ≪ 1 GiB 上限、wall ≪ 120 s;Stop 响应即时(stop_requested→stopped 约 0.155 s / 0.053 s),sidecar-exited exitCode=0。宿主资源为 1 Hz 环境观察(常驻内存约 11.83–12.07 GB),不是产品性能门禁。
5. 辅助轮结果对原 E4 判据的事实映射(只做事实映射,不裁定;正式 UI E4 未评估)
| 合同 §4 E4 判据 | 本批两轮事实 | 是否命中 |
|---|---|---|
| ON 获得目标同线程 IFR opener + 合法 closer,身份/代际/tick 链闭合且原生配对 candidate 成立 ⇒ 该轮阳性 | ON 轮只有 opener、无 closer;verdict=OPENER-ONLY | 未命中 |
| 只有新增等待确实 applied、端点出现在 base 截止之后的同域收到时间,才能支持「更长窗口保留了端点」 | ExtensionApplied=false,base 截止未被记录 ⇒ 支持条件不成立,且该比较缺数据 | 未命中 |
| ON 端点早已在 base 截止之前,或 OFF 本来也完整 ⇒ 不具判别力 | OFF 本来也不完整(IFR opener 0、IFR 阶段 missing) | 未命中(判别力缺失来自 applied=0) |
| ON applied 但仍无 opener ⇒ 窗口假设本轮不支持,冻结该实验 | 不适用(本轮未 applied) | 不适用 |
| ON 未 eligible / 两轮形态不满足 ⇒ 如实 inconclusive,不自行扩样 | ON Eligible=false(scene-open-phase-absent);两轮端点形态不同(CLOSER-ONLY vs OPENER-ONLY) | 命中本情形 |
| 伪造/跨线程/跨代际/他进程链、原文件变化、OFF 行为回归、Stop 失效、资源越界 ⇒ REPAIR REQUIRED | 两轮 identityMismatchedRecords=0、conflictingThreads=[]、otherProcessCompleteChains=0、假命中 0;30/30 文件逐字节不变;离线强制 OFF 重放 mainDiff={};Stop ≤0.16 s;未触护栏 | 未发现该类问题 |
实施方结论(不是验收结论):本批的包内核心命令入口辅助实验记 inconclusive(ON 未 eligible、两轮形态不满足),未追加轮次、未刷概率、未扩样。窗口假设既未被证实、也未被证伪。本表不构成任何 E4 判定:辅助轮不是真实 UI 轮次 ⇒ 正式真实 UI E3 = NOT SATISFIED、正式真实 UI E4 = NOT EVALUATED(未评估);表中「命中/未命中」只描述辅助轮观察事实。
6. 未证明项与遗留
- 窗口假设未取得判别性真机证据(命令入口辅助轮同样未取得);不得据此宣称修复有效或产品验收通过。
- 本批未取得任何真实 UI 轮次:正式真实 UI E3 = NOT SATISFIED、正式真实 UI E4 = NOT EVALUATED(未评估);辅助轮不占「最多两个真实 UI Session」预算,也不能替代它。
- 「更长窗口是否保留救到了端点」本轮无法回答:base 截止未被记录。若 Lead 仍要检验该假设,需先决定是否为「base-grace 到期点」补一条无条件遥测;本批未改产品语义。
- 「ON 轮出现 1 个目标线程 IFR opener」是单轮观察,与 OFF 轮形态不同;不能据此推断开关有效果(ON 轮开关未 applied),也不能排除设备/系统侧运行间差异。
- 两轮均无 drain 内可闭合链(OFF
timeout、ONquiescent,chainObservedClosed=false)。 - 冻结核心与既有两个包的分发工程另有既有偏差(TSA 打包脚本、archive renderer)不在本批范围。
- 生产开关保持默认关闭;A1 正式 UI E4、Build74 正式验收、Phase C Hybrid 均不因此改变;Network 巨值与 FrameTime 时钟/P95/Jitter 仍另批。
7. 注册与联动(C2 / C3 / C5)与远程状态
- C2:
site/devlog/index.md时间线顶部新增本批节点;docs/architecture/新增本页实施增量快照(归档源,/archive/由构建自动同步)。 - C3:同步更新「八阶段总计划」P4 行与「未关门门禁」的 P4 SW-1 行(由「尚未实施」改为「包内核心命令入口辅助轮已执行、辅助实验 inconclusive;正式真实 UI E3 未满足、E4 未评估、待 Lead 裁定」)。
- C5:本批不新增指标、不改变任何指标的支持状态或计数。经检索
site/knowledge/与site/.vitepress/theme/components/HomeExtras.vue,不存在描述该实验(默认关闭开关 / completion-wait 窗口)的位置,故按合同「只在确有对应实验说明位置增加」的要求,未向任何用户页插入说明,避免把未验收的实验写成用户可见能力;「默认关闭、未验收」的表述只留在本 devlog 与归档快照中。并执行npm run build验证 0 报错、0 死链(知识门禁PASS: 66 Registry contracts、sync-archive283 文件)。 - 远程:GitHub 与 GitLab 各只尝试一次普通快进推送;GitLab 失败不重试、不阻断,失败即单列 partial,不用本地镜像代替真实远程。本批不发布网站。
- 证据位置:两个原始辅助轮会话、轮次 driver/wire/timeline、分析产物与封存清单保存在私有批次目录(只读封存;原始 Raw 与报告未回写)。
- R1 入口更正(2026-09-28):依 Lead 独立审计(
5d700fa)执行最小文档与交付修正——两轮统一改称「包内核心命令入口真机辅助轮」、更正为「存在实质性入口偏差」、正式真实 UI E3 未满足 / E4 未评估;公开材料移除 2 处真实 PID 并对PID / UDID / 序列号 / Bundle ID / 设备型号 / iOS build扫描零命中;全部实测数字与旧归档原样保留;locator 28 行布局补丁算法与身份门一行未动(PYTHONPATH=tests:.下聚焦 144 项 OK);Sidecar 全量 6 项异常记「基线归因未独立闭合」,不写「零回归」。本页随之同步。R1 不给 SW-1 产品 E4 PASS;R2(真实 App UI OFF→ON 复验)仅在 R1 经 Lead 复核后由 Test AI 实施,本批未进入 R2。