validationP4E4partial2026-09-25

Build74 Phase 2 A1 · 新包真机证据 Lead 审计与 UI 定向验证方案

角色与判定(2026-09-25):Lead AI;本轮只读核证及方案入档,未改产品代码。 Implementation 的 42695fcefd9488b218b47c737d7662b97666b532 为 f3c9b73d20c39e70aa39243be0ba9a4ee2a19688 上的 3 文件纯文档提交。A1 E2 PASS 保持;新包签名/公证/独立解包子门 E3 通过;16 轮是真设备、真捆绑核心的命令入口诊断证据,不是 Canonical §5 指定的冻结 App UI 入口,故 A1 正式 E4 NOT PASS / OPEN。不能把包装成功、旧 r3 或命令入口回放写成 UI E4。

唯一技术实施依据仍是 Phase 2 Canonical 方案 §5;本页是 Lead 对其 E4 证据门的追加决定。旧报告及数字不回改,错误口径只在本页更正。

1. 已独立核实的事实

项Lead 复核证据等级 / 限制
Git 边界42695fc 恰 3 个文档/索引路径、产品代码 0 diff;共享工作区仍有 4 项他方 WIP,未触碰E1
包新 ZIP SHA-256 22ab40b54f1e9fddd381715851383262f11608c1ad4b00a24ef25d9cd12c750e,109,842,490 B;公证日志 Accepted / issues=None;原 App 与独立解包 App 的 strict deep codesign、Gatekeeper、stapler 均通过,版本 83、x86_64;ZIP 与独立解包内核心二进制哈希一致E3 包工程通过,不是 UI E4
16 份新会话Lead 直接只读重算全部 16 份 raw-events.jsonl 和 core-profile-chunks.bin SHA-256,逐份与 manifest 相等;final sourceRawSHA256 也与 Raw 相等。16/16 final 有诊断、live 无诊断;诊断闭合 0/16真设备命令入口 E4 观察;不替代冻结 UI 入口
窗口形态16 份生命周期扫描归类为 **12 份 IFR opener 在 `startup-lifecycleactive`、4 份整份 Session 无 opener、0 份 drain opener;旧 r3 对照有 1 份 drain opener。实施文档 S-2 的「13 轮 active + 4 轮无 opener」相加为 17,应读作 12 + 4;「13 轮 target-actionable-no-closure + 3 轮 no-lifecycle-records」是另一套诊断形态**,不可与 opener 存在性表混用。Raw 窗口事实;不是因果结论
live/final 主字段Lead 直接对比 16 份 live/final:status、quality、totalDurationMs、totalQuality、totalSource、totalRepairReason、phaseCoverageComplete 均逐轮相同;较宽的主字段集合有 12 轮仅 decodedRecordCount 不同、4 轮完全相同支持「A1 诊断未提升主 Total」;不证明 Total 数值准确

原始 Session、私有归档及旧 MacApp/Tests/1.trace/ 全部只读保全;公开文档只用 Device A / App A / Fixture A 别名。

2. 阻断正式 E4 的独立发现

F-1 · allConfigsMatchFrozenUi 只比较 Start 后的 15 字段,不能证明 UI 入口等价

Swift UI 的 PerformanceSessionController.trySendPrewarmApp() 调用 CollectorSupervisor.prepareApp() 未传 metricIDs 与 screenshotsEnabled,故 prepare_app 用其默认完整 Registry 指标集与默认截图标志;UI 还须收到 app_ready 并通过 collectorReadyForStart 才允许 Start。私有驱动的 prepare_app 则显式传12 条 startup 指标、screenshotsEnabled=false、冻结 Start hash,且在 prepare_app_accepted 时立即发送 Start;它没有复现 UI 的 app_ready 门及用户点击前的预热等待。两者的最终 kdf2/csd/bm 等 15 字段一致,不代表预热来源、负载、时序与 Stop 交付窗口一致。此差异具有因果可能性,但不能据此宣称已找到主机滞后的根因。按 Canonical §5 原文,本批 16 轮只作真机命令入口诊断,不计入冻结 UI 正/负向准入样本。

F-2 · totalNeverPublished=true 是失效的机械断言

私有汇总器把 totalNeverPublished 定义成「Total 为空 或 诊断链未闭合 或 TotalQuality=candidate」。本批诊断链 0/16 闭合,故该布尔值不论 Total 是否有数都恒 true。Lead 直接读取 16 份 final:12 份 candidate 有数、2 份 repaired 有数、2 份 missing 为空;不是「Total 从未发布」。16/16 live 与 final 的上述 Total 字段相同,支持更窄的「没有被 A1 诊断升级」事实。candidate/repaired 的跨场准确度本批未校准,不能用 14 个有数会话推断启动成功率或端点语义。

返工证据表时删除失效布尔名,分别输出 nativeTotalQualityCounts={candidate:12,repaired:2,missing:2}、liveFinalTotalFieldsEqualCount=16、diagnosticClosedCount=0,并提供逐轮的 live/final 来源与质量字段;所有数字从原报告只读复算,绝不写回 Session。

F-3 · Raw 窗口事实成立,「主机滞后是根因」和「grace 截止」未被证明

launch_trace.py 的诊断只扫描 frame-continuation|post-stop-drain 块,故本批 12 份 active opener 对 A1 drain 诊断必然不可见;4 份无 opener 也不能闭合。这只是必要输入条件,不是「opener 晚到便足以闭合」:仍须目标 PID/代际、同线程、设备 tick 顺序、scene anchor、无竞争 transition 等门。实施文本「闭合充要条件 = opener 主机到达晚于 cut」应作废。

私有 probe_opener_deadline.py 以 firstDrainChunkHostNs − waitElapsedSeconds 反推 completion-wait 起点,但源码在 wait 结束与首个 drain 块到达之间还执行标记切换、report/emit、request_stop_for_drain() 与传输等待;该差值不能标为实际 wait 起点。timeout 轮 waitElapsed≈4s 时,脚本所谓 grace deadline 在代数上几乎就是首个 drain 块的 hostReceive 时刻;r3 的 +1915.8ms 是 opener 块相对首 drain 块的量,不是精确 grace 截止证明。12 份新轮的设备侧事件相对时距接近 r3,支持「设备行为可能相似」,但没有排除 UI/CLI 预热差异、主机调度或传输变化;writerQueueWaitMaxMs 单值不能独立证明源头滞后原因。时钟/流程因果归属 = UNKNOWN。 不修改角色、窗口、时限或采集配置来制造晚到。

F-4 · 两项工程问题独立排队

MacApp/scripts/build-app.sh 的嵌套二进制 --timestamp=none 经 Apple 首次公证 322 条 secure-timestamp 错误否证;本轮逐件补 TSA 后 Accepted,说明当前包已有效,但下一次从脚本直接构建仍会失败。另 site/scripts/render-archive.py 对代码跨度内的字面 ** 继续套加粗正则,已在新归档 HTML 留下不匹配 <code>/<strong>;HTTP 200、站点 build 成功不等于归档内容正确。两项另开工程小批,不混入 UI E4 指标语义或篡改既有归档。

3. 下一批唯一可执行方案:A1-E4-UI(无产品代码改动)

  1. Gate 0 · 固定包与入口:仅使用已核实 SHA 的 Build 83 公证 ZIP,在独立目录解包并启动真正的 Perfowl SwiftUI App,不是直接启动 perfowl_collector_core stream。记录 App 可执行文件路径、Bundle 版本、内置 core 哈希与实际 child process 路径;录屏或可审计 UI/辅助功能日志证明 Device A、目标 App A/Fixture A 选择、App Ready 与 Start/Stop 操作时刻。私有证据可含原始标识,公开材料只写别名。若不能证明真实 UI 入口,停止并交阻塞,不再称「GUI 等价」。
  2. Gate 1 · 逐轮冻结条件:核对目标设备/系统、12 项 Start CapturePlan、capturePlanHash、exact-debug-id、kdf2 四类、csd=0、bm=0、rp/tk/ta;并单列预热阶段实际 prepare_app 指标集/截图标志、app_ready、Start 相对 ready 的时序,以及来源路由。不能只用 15 字段等同前后两段协议;任一关键配置不匹配即标 INVALID,不进入正负向统计。
  3. Gate 2 · 定向而非刷概率:先 App A 两轮、Fixture A 一轮,按 UI 正常操作,不调负载、录制时长门槛、Stop drain、过滤器或角色标记来追求 r3。每轮按原始字节分类:drain 完整链 / 只有 opener / 只有 closer / 全无 / 身份缺失或冲突 / 容量与 timeout;既要保留真实负向,也不预设三条事件。若三轮无可判定正向链,立即停止同构重复,交 Lead 决定是否进入单独的采集来源/时序研究;不擅自扩样到十几轮。
  4. Gate 3 · 原始产物与报告:原始 App Session 只读封存并重算 Raw、blob、manifest 哈希;记录 UI live 报告与 Stop 后产物。需要最终 Raw 重扫时,仅在真实字节隔离副本上运行现有 finalize,标记为「新包核心对 E4 Raw 的离线 final」,不得写回 App 原 Session、不得把 CLI final 冒充 UI 自动产物。逐字段比较 Total/质量/来源/phase、诊断、live/final 差异;输出实际 candidate/repaired/missing 分布,不再使用 totalNeverPublished。
  5. 正式 E4 门:至少一个新包真实 UI会话在最终 Raw 中有身份可信、同线程、设备 tick 有序、阶段链闭合的 drain 正向诊断;另有真实负向形态;配置、哈希与 live/final 主字段证据齐备,Lead 才考虑 E4 PASS。即便通过,D1 仍不授权发布 drain Total;主报告字段不得被诊断提升。若没有正向,维持 E4 OPEN,不因包已公证或 14 份原生 Total 有数而改判。

资源与并发边界:沿用现有有界采集与 Stop 超时,不并发跑其他测试;单批最多 3 个新 UI Session,分析只做一次单遍 Raw 分类与哈希,已有结果复用;不新增高频轮询/多份原始字节复制。交付每轮启动到 Stop/最终报告耗时、CPU/RSS/I/O 峰值及最差一轮,与本批命令入口只作形态对照,不把两入口耗时差直接归因于产品代码。若真机/凭据/环境不满足,记录 blocking reason 后停止。

交付与角色:Implementation AI 只采集并提交原始证据、日期化增量记录、真实偏差、站点新增归档、双远程与 Webhook;不改产品语义,不自判 E4 PASS。Owner 将完整交付转 Lead,Lead 直接独立验收,无需逐批 Owner 审批。TSA 构建脚本与 archive renderer 分别留下一批方案,Network、FrameTime B1/B2/B3、Phase C 保持独立。

Implementation Update · 2026-09-25 · A1-E4-UI 真 UI 三轮采集与证据收口

> 关联合同:本文件 §3 Gate 0–3。裁定依据:三轮真实 UI Lead 裁定(93ec9c5)。基线 c95657c275a524c0a7c7a279a9e097db1700fadc,本轮产品代码零改动,只新增本机私有采集/分析工具与公开文档。以下数字全部由只读复算得出,实施方不自判 E4 PASS。证据母本保留在本机私有归档;公开材料只用 Device A / App A / Fixture A 别名。

I-0 · Gate 0 入口与环境前置

I-1 · 三轮原始形态(Gate 1 冻结条件 + Gate 2 分类)

轮次目标Gate 1 配置请求指标capturePlanHashCoreProfile blob会话规模IFR opener 所在窗口形态标签
A1-E4-UI r1App AINVALID2621201d158ebee4bf5aafc7bc8b4f6e239cb0943f31005eaeb3251e518e6ba3e7无(captureMode=none)30 文件 / 12,188,834 B无all-absent
A1-E4-UI r2App Avalid12f9f5407724bdf97769f439a27ff4e87597fbfbdae77b5c8fc72b5bb9b79a8c3b112,388,828 B / 38 块35 文件 / 113,237,637 B整份会话无 opener,有 20 条 closercloser-only
A1-E4-UI r3Fixture Avalid12f9f5407724bdf97769f439a27ff4e87597fbfbdae77b5c8fc72b5bb9b79a8c3b73,563,656 B / 25 块35 文件 / 74,418,337 B**1 条 opener 位于 `startup-lifecycleactive`**;drain 内 0 条 opener、19 条 closerendpoints-present

判定轴是字节流里的 begin:Initial Frame Rendering(IFR opener):r3 的唯一 opener 与出厂报告选中的 IFR span 终点在同一 active 窗口;frame-continuation|post-stop-drain 窗口内 opener 数为 0。

I-2 · r1 判 INVALID 的根因:默认 UI 指标组不含 Startup Timing

r1 并非采集失败,而是侧边栏指标组未含 Startup Timing:PerformanceSessionController.scopedCapturePlan(for:) 由用户勾选的指标组决定 startupEnabled/screenshotsEnabled/requestedMetricIDs,而 WorkbenchMetricCatalog.defaultSelection 默认的 10 组不含 .startupTiming 与 .screenShot。因此默认勾选必然得到 startupEnabled=false、coreProfileCaptureMode="none",不会产生 CoreProfile blob,也不会有 App launch-trace-report.json。r1 的 capturePlanHash=21201d15…、26 项请求指标、无 blob、离线 final status="missing"/reason="target-lifecycle-events-missing" 均与此一致。r1 按合同标 INVALID,不进入正负向统计,也不计入第二个有效 App A 样本。

I-3 · 冻结配置核验(Python 独立复算,两轮有效)

r2/r3 逐字段与本批冻结的 UI 15 字段一致(自产物独立复算,非采信自报):launchMode=controlled-cold-launch、startupEnabled=true、screenshotsEnabled=false、coreProfileRawRetention=full(source=wire)、frameFilterExperiment=exact-debug-id、requestedFrameFilter=0x31800318、effectiveFrameFilter=["0x1f070000","0x2b870000","0x31ca0000","0x2bdc0000"]、callstackDepth=0、bm=0、rp=100、csd=0、tk=3、kdf2=[520552448,730267648,835321856,735838208]、ta=[[3],[0],[2],[1,1,0]]、capturePlanHash=f9f5407724bdf97769f439a27ff4e87597fbfbdae77b5c8fc72b5bb9b79a8c3b。两轮 capturePlanHash 相同,且与上一批命令入口会话的冻结 hash 相同 —— 即配置层等价,但不等价于入口等价(见 I-4)。

I-4 · 原始 UI 产物 / 出厂报告 / 隔离 replay 的三层区别

I-5 · 原始哈希(只读复算)

轮次raw-events.jsonl SHA-256CoreProfile blob SHA-256core-seal SHA-256
r1e6098a5ff05811940bd65062f45ccf58ea94937e7e77d24c3a13da3b74d92b43—16aba1b0e5225fad193a21adc52c288e3948694a718ce2bb43bb2c08fa603b9d
r25cb2962de16bf7634a5ea74f6267c5f2c08054398deb8d5758b33f3047d06e478d5b95ba18a312c1a2413a85378eac429550ed4bd9c22aa2965ced9b9fc43bb29d9c8c2001fd3c4aa349f39d98ff60730e1819b5605c8d0971571866a104d8ad
r31b98ef5fae76e88ea6c827ad1a4a678ab2f17b7f51b51158896978733629fc0fcd7191776c8a1f9e5c71cd819a46d841476c78078bcec6779d16c59be2ff55355bc38bb2dac601725c89fabe637e886cdb1c6ef8b042d801ef9cfded92d928dc

三轮的 pristine / manifest / 离线重算三处 rawSHA256 逐轮相等;blob 的 pristine 与 manifest 亦相等。

I-6 · 目标指标的发布状态,以及替换 totalNeverPublished 的三项判据

合同目标指标 ios.process.startup.app_launch_total_ms 只在 report-final.json 的 coverage[] 落地(metricManifest.metricIDs=[]、metrics-derived.jsonl 0 字节、其 SHA-256 为 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855):r1 未请求该指标;r2 valueQuality=missing(reason=lifecycle-spans-incomplete,sampleCount=0);r3 valueQuality=candidate(sampleCount=1)。故 r3 是启动报告与覆盖账本含一项 candidate,不是「已生成一条 derived metric 时间序列」。

已按合同删除失效判据 totalNeverPublished,改列三项:

I-7 · 启动至 Stop / 最终报告耗时 / 资源峰值

项r1r2r3
UI 按压 Start→Stop (s)57.45973954.07889556.738987
产品 durationMonotonic (s)59.78739250.67713153.4672
handoff requested→drainComplete (s)—1.1163255691.629447819
handoff requested→stopAck (s)—0.0372364360.019608489
writerDrainDurationMs261.3134320.0342860.039521
checkpointMaxDurationMs502.622474632.802779528.164961
Perfowl.app RSS 峰值 (MiB)303.4337.5205.7
包内核心 prewarm RSS 峰值 (MiB)88.6181.5192.9
包内核心 screenshot-worker RSS 峰值 (MiB)74.073.471.1
包内 pymobiledevice3 RSS 峰值 (MiB)85.784.684.8
承载 startup 指标的核心样本数000
宿主机 CPU% 峰值unknownunknownunknown
宿主机磁盘 I/O 峰值unknownunknownunknown
设备侧 CPU/内存/磁盘/网络峰值unknownunknownunknown

unknown 的原因:宿主机 CPU/I/O 因宿主程序策略拒绝 ps(/bin/ps 与关闭沙箱均被拒),且本轮采样未收 proc_pid_rusage;设备侧四个指标族因冻结的 startup-only 选择未被请求,产品自记为 valueQuality=missing。两者都不补造 0。 r1 无 handoff* 是因为它没有捕获 CoreProfile,未进入 stop-drain handoff 路径。

I-8 · 原始会话封存与不可变性(Gate 3)

三轮原始 App Session 只读封存(逐文件记录 relPath/bytes/mtime/SHA-256,30/35/35 个文件);封存后全量复核 100/100 重算一致、MISMATCHES=0、mtime changes=0 ⇒ 三次锁屏与三次离线 finalize 都没有改动任何原会话。

I-9 · 未达门槛与交付边界(不自行宣布 PASS)

正式 E4 门要求至少一份新包真实 UI Raw 中出现身份可信、同线程、设备 tick 有序、阶段链闭合的有界 post-stop-drain 诊断。本轮 diagnosticClosedCount=0/3、选中 opener/closer 全为 null ⇒ A1 正式 UI E4 = OPEN / NOT PASS。三个额度都已用完(合同「单批最多 3 个新 UI Session」),有效 App A 仅 r2 一轮 ⇒ Gate 2 预设样本构成未完成,原样记缺口,不把 INVALID 的 r1 计成第二个有效 App A。按 Lead 裁定:不授权第 4 个 UI Session,停止同构采集;本轮不再改产品代码、不调录制时长/负载/过滤器/角色/Stop 时限、不用离线改字节制造正向。下一步「采集窗口/来源时序差分取证」由 Lead 另拟方案。

同时如实记录本批的两项口径更正(Lead 独立复核,93ec9c5):① r3 的 rejectedEventCount=14 与 rejectReasons 求和 6 不同单位(前者为 target-layer event,后者为跨预筛/身份/线程/链的 reason 次数,一次 no-opener 可拒整组),不是账本缺陷;② r3 唯一 IFR opener 在 startup-lifecycle|active、drain 内 0 个 opener ⇒「原生端点配对成功而有界 drain 不闭合」是两个不同窗口的预期差异,不是同一证据链自相矛盾。

Implementation Correction · 2026-09-25 · A1-E4-UI 交付口径更正(Lead 文档收口 R1)

本节按 Lead 独立交付审计(deaf8d7)的「唯一最小返工合同」追加。上方 §1–§3 与 I-0…I-9 的已发表数字一律不回改;下列条目只更正口径与覆盖范围,不改动任何原判:r1 配置 INVALID、r2 totalQuality=missing、Fixture A 的 271.42775 ms 仅为 active 窗口原生端点 candidate、离线有界 drain 诊断闭合 0/3、A1 正式 UI E4 = OPEN / NOT PASS。

C-1 · r1 的设备指标不是「未请求」,而是「有设备观察值但配置 INVALID」

I-7 表格把三轮的「设备侧 CPU/内存/磁盘/网络峰值」统一记 unknown,并把原因写作「冻结的 startup-only 选择未被请求」。该口径只对 r2/r3 成立,对 r1 不成立,现按原始 metrics.csv 复算分列更正:

轮次metrics.csv 数据行质量列实际观察值
r1(配置 INVALID)54totalCPU、physicalFootprint、realMemory、virtualMemory、availableMemory、freeMemory、contextSwitch、interruptWakeup、diskRead、diskWrite 均为 candidate;network 为 candidate 与 missing 混合有值:cpuPercent 51 行(最大 185.630878)、totalCPUPercent 54 行(最大 100.0)
r2(有效)4713 个指标族全 missing无
r3(有效)5213 个指标族全 missing无

原因:r1 未选中 Startup Timing 组 ⇒ startupEnabled=false、26 指标、captureMode=none,其 metrics.csv 走的是完整 Registry 指标集路径,四族因此被真实请求并拿到设备观察值;r2/r3 走冻结的 startup-only 档位,四族确实未被请求,产品自记 valueQuality=missing。因此:

C-2 · Gate 3 的 100/100 一致性只能证明「封存之后到复核之时」

I-8 记「封存后全量复核 100/100 重算一致」。现补时序边界:封存清单 out/session-freeze.json 的生成时刻(17:27)晚于三份 out/ui-analyze-*.json(17:24–17:25)。故该结论只能证明:

它不能外推证明「会话采集结束 → 封存清单生成」这一更早区间未变,也不能外推证明封存清单所描述的更早任何时点。该更早区间未取证,记 unknown。

C-3 · 「Stop → 最终报告」耗时仍为 unknown,原因是缺同轴绝对时间戳

I-7 只交付了「UI 按压 Start → Stop」的区间长度与若干相对耗时,未交付「Stop 之后到最终报告落盘」的耗时。本轮不补造,理由如下:

结论:该项记 unknown。要闭合需(另批)由产品自身在 Stop 与 final 报告落盘两处各写一个同轴绝对时间戳。handoff requested→drainComplete 与 requested→stopAck 只有 r2/r3 有值(r1 未捕获 CoreProfile,未进入 stop-drain handoff 路径),且均为相对区间,不能替代上述端点。

C-4 · 本次文档与归档返工记录

Implementation Correction · 2026-09-25 · R2(r1 请求集口径与绝对时间字段)

本节按 Lead 独立 R1 审计(100c431)的「唯一 R2 最小返工合同」在 C-4 之后追加。C-1 / C-2 / C-3 的原始文字与全部已发表数字均不回改;下列两条只更正其表述,技术裁定与 unknown 结论不变。

R2-1 · r1 不是「完整 Registry 指标集路径」,而是「UI 默认 10 组请求的 26 项非 startup 配置」

C-1 把 r1 metrics.csv 的成因写作「走的是完整 Registry 指标集路径」。该表述不准确,更正为:

R2-2 · 承认 hostResources.window.first/last 是绝对 UTC 时刻;frameTimeMs 是时长

C-3 称 resource-and-timing.json「全文件唯一的绝对时间键」仅为 rounds[].startStop.uiPressStartUtc、rounds[].startStop.uiPressStopUtc 与 frameTimeMs。该表述有两处错误,更正为: