外观
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-lifecycle | active`、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 存在性表混用。 |
| 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(无产品代码改动)
- 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 等价」。 - 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,不进入正负向统计。 - Gate 2 · 定向而非刷概率:先 App A 两轮、Fixture A 一轮,按 UI 正常操作,不调负载、录制时长门槛、Stop drain、过滤器或角色标记来追求 r3。每轮按原始字节分类:drain 完整链 / 只有 opener / 只有 closer / 全无 / 身份缺失或冲突 / 容量与 timeout;既要保留真实负向,也不预设三条事件。若三轮无可判定正向链,立即停止同构重复,交 Lead 决定是否进入单独的采集来源/时序研究;不擅自扩样到十几轮。
- 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。 - 正式 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 入口与环境前置
- 包与入口:只用已核实 SHA 的 Build 83 公证 ZIP(109,842,490 B,SHA-256
22ab40b54f1e9fddd381715851383262f11608c1ad4b00a24ef25d9cd12c750e)在独立目录解包并启动真正的 Perfowl SwiftUI App(CFBundleVersion=83、x86_64);codesign --verify --deep --strict、spctl、stapler validate在解包副本上均通过。App 可执行文件 SHA-2565c1b8aaeaa5d15f110d727fe05a501272786ad37441b4d0a24582a37ff05f28b;内置核心Contents/Resources/Tools/x86_64/perfowl_collector_core12,413,616 B,SHA-256fe4884286200d9b42edec2dc7d73985ab5340afede06e0300c3597c6384ade1d,与 Lead 先前核验副本逐字节一致。 - 设备与目标:Device A(
iPhone15,4/ iOS17.0/ build21A327/ USB)在线,设备档位与本方案冻结档一致;目标 App A 与 Fixture A 均已安装(原始标识只留在私有归档)。启动 6 秒后观察到 App 自带的pymobiledevice3设备枚举子进程,确认子进程来自包内工具而非系统路径。 - 真实 UI 入口:通过辅助功能标识(
perfowl.device.picker/perfowl.app.picker/perfowl.capture.toggle)驱动,逐轮记录设备行选择、App 行选择与 Start/Stop 按压(AXPress,axError=0),辅助功能授权在本轮驱动前已生效。录屏与截图证据可用。本轮入口是 SwiftUI 真机界面,不是直接驱动 core 的命令轮次。 - 环境阻塞(如实记录):本轮屏幕被锁屏 3 次(约 12:19 / 13:22 / 17:21),锁屏期间 App 窗口不可寻址;第 3 次锁屏时
caffeinate -d -i -s -u仍持有PreventUserIdleDisplaySleep且显示器电源为 USABLE,屏幕仍被锁 ⇒caffeinate不足以维持可用,锁源不在系统/显示器空闲休眠路径。每次驱动 UI 前必须先人工确认SCREEN_UNLOCKED。
I-1 · 三轮原始形态(Gate 1 冻结条件 + Gate 2 分类)
| 轮次 | 目标 | Gate 1 配置 | 请求指标 | capturePlanHash | CoreProfile blob | 会话规模 | IFR opener 所在窗口 | 形态标签 |
|---|---|---|---|---|---|---|---|---|
| A1-E4-UI r1 | App A | INVALID | 26 | 21201d158ebee4bf5aafc7bc8b4f6e239cb0943f31005eaeb3251e518e6ba3e7 | 无(captureMode=none) | 30 文件 / 12,188,834 B | 无 | all-absent |
| A1-E4-UI r2 | App A | valid | 12 | f9f5407724bdf97769f439a27ff4e87597fbfbdae77b5c8fc72b5bb9b79a8c3b | 112,388,828 B / 38 块 | 35 文件 / 113,237,637 B | 整份会话无 opener,有 20 条 closer | closer-only |
| A1-E4-UI r3 | Fixture A | valid | 12 | f9f5407724bdf97769f439a27ff4e87597fbfbdae77b5c8fc72b5bb9b79a8c3b | 73,563,656 B / 25 块 | 35 文件 / 74,418,337 B | **1 条 opener 位于 `startup-lifecycle | active`**;drain 内 0 条 opener、19 条 closer |
判定轴是字节流里的 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 的三层区别
- 原始 UI 产物:UI 会话把核心输出放在
<Session>/collector-core/(collector-core/manifest.json为perfowl.raw-session/1),会话根manifest.json是产品会话 manifest。App 自身写launch-trace-live.json与launch-trace-report.json:r2 43 键 / r3 45 键,均不含stopDrainLifecycleDiagnostics块。 - 出厂(App)报告:r2
status=partial、totalDurationMs=null、totalQuality=missing、requiredMissingPhases=["Initial Frame Rendering"];r3status=candidate、totalDurationMs=271.42775、totalQuality=candidate、totalSource=coreprofile-endpoint、phaseCoverageComplete=true。r3 的 Total =traceEndTimestampNs − launchStartTimestampNs = 271427750 ns,是report-layer 的 active 窗口原生端点配对候选,不证明跨工具端点准确性。 - 隔离 replay(离线 final):离线
finalize(stop_drain_diagnostic=True分支)只在真实字节隔离副本上运行,先做真字节复制(symlink 会被产品ReplayValidationError拒绝)。三轮全部offline_wrote_into_session=false、published_intact=true⇒ 未回写原会话、未改产品字节。stopDrainLifecycleDiagnostics只在离线分支产出 ⇒ UI 自动产物无该块、离线 final 有该块,两者必须分别标注。 - live vs final 主字段:r2 20/20、r3 20/20 相等。离线 final vs App final 主字段:r2 20/20 全等;r3 17/20,差异仅
decodedRecordCount(App final 699,407 vs 离线 1,148,197,因离线重扫范围不同)、liveComplete、liveRevision。
I-5 · 原始哈希(只读复算)
| 轮次 | raw-events.jsonl SHA-256 | CoreProfile blob SHA-256 | core-seal SHA-256 |
|---|---|---|---|
| r1 | e6098a5ff05811940bd65062f45ccf58ea94937e7e77d24c3a13da3b74d92b43 | — | 16aba1b0e5225fad193a21adc52c288e3948694a718ce2bb43bb2c08fa603b9d |
| r2 | 5cb2962de16bf7634a5ea74f6267c5f2c08054398deb8d5758b33f3047d06e47 | 8d5b95ba18a312c1a2413a85378eac429550ed4bd9c22aa2965ced9b9fc43bb2 | 9d9c8c2001fd3c4aa349f39d98ff60730e1819b5605c8d0971571866a104d8ad |
| r3 | 1b98ef5fae76e88ea6c827ad1a4a678ab2f17b7f51b51158896978733629fc0f | cd7191776c8a1f9e5c71cd819a46d841476c78078bcec6779d16c59be2ff5535 | 5bc38bb2dac601725c89fabe637e886cdb1c6ef8b042d801ef9cfded92d928dc |
三轮的 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,改列三项:
nativeTotalQualityCounts = {candidate: 1, missing: 1}(r1 未请求该指标,不计入)liveFinalTotalFieldsEqualCount:r1 = 0/0;r2 = 20/20;r3 = 20/20diagnosticClosedCount(离线 stop-drainchainObservedClosed=true轮数):0/3
I-7 · 启动至 Stop / 最终报告耗时 / 资源峰值
| 项 | r1 | r2 | r3 |
|---|---|---|---|
| UI 按压 Start→Stop (s) | 57.459739 | 54.078895 | 56.738987 |
产品 durationMonotonic (s) | 59.787392 | 50.677131 | 53.4672 |
handoff requested→drainComplete (s) | — | 1.116325569 | 1.629447819 |
handoff requested→stopAck (s) | — | 0.037236436 | 0.019608489 |
writerDrainDurationMs | 261.313432 | 0.034286 | 0.039521 |
checkpointMaxDurationMs | 502.622474 | 632.802779 | 528.164961 |
| Perfowl.app RSS 峰值 (MiB) | 303.4 | 337.5 | 205.7 |
| 包内核心 prewarm RSS 峰值 (MiB) | 88.6 | 181.5 | 192.9 |
| 包内核心 screenshot-worker RSS 峰值 (MiB) | 74.0 | 73.4 | 71.1 |
| 包内 pymobiledevice3 RSS 峰值 (MiB) | 85.7 | 84.6 | 84.8 |
| 承载 startup 指标的核心样本数 | 0 | 0 | 0 |
| 宿主机 CPU% 峰值 | unknown | unknown | unknown |
| 宿主机磁盘 I/O 峰值 | unknown | unknown | unknown |
| 设备侧 CPU/内存/磁盘/网络峰值 | unknown | unknown | unknown |
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) | 54 | totalCPU、physicalFootprint、realMemory、virtualMemory、availableMemory、freeMemory、contextSwitch、interruptWakeup、diskRead、diskWrite 均为 candidate;network 为 candidate 与 missing 混合 | 有值:cpuPercent 51 行(最大 185.630878)、totalCPUPercent 54 行(最大 100.0) |
| r2(有效) | 47 | 13 个指标族全 missing | 无 |
| r3(有效) | 52 | 13 个指标族全 missing | 无 |
原因:r1 未选中 Startup Timing 组 ⇒ startupEnabled=false、26 指标、captureMode=none,其 metrics.csv 走的是完整 Registry 指标集路径,四族因此被真实请求并拿到设备观察值;r2/r3 走冻结的 startup-only 档位,四族确实未被请求,产品自记 valueQuality=missing。因此:
- r1 的这四族不得与 r2/r3 并列解释成「未请求 / unknown」;r1 是有观察值的一轮,只因配置 INVALID 而不纳入可比 startup 样本。
- 宿主侧 CPU% 与磁盘 I/O 峰值三轮仍为
unknown(宿主程序策略拒绝ps,且未收proc_pid_rusage)——本项不受此次更正影响。 - 两侧都不补造 0。
C-2 · Gate 3 的 100/100 一致性只能证明「封存之后到复核之时」
I-8 记「封存后全量复核 100/100 重算一致」。现补时序边界:封存清单 out/session-freeze.json 的生成时刻(17:27)晚于三份 out/ui-analyze-*.json(17:24–17:25)。故该结论只能证明:
- 在
session-freeze.json生成之后、至本次复核重算之时,三轮原始 Session 的 30/35/35 个文件逐字节未变(重算缺文件 0、哈希不一致 0、字节不一致 0、mtime变化 0、未声明文件 0)。
它不能外推证明「会话采集结束 → 封存清单生成」这一更早区间未变,也不能外推证明封存清单所描述的更早任何时点。该更早区间未取证,记 unknown。
C-3 · 「Stop → 最终报告」耗时仍为 unknown,原因是缺同轴绝对时间戳
I-7 只交付了「UI 按压 Start → Stop」的区间长度与若干相对耗时,未交付「Stop 之后到最终报告落盘」的耗时。本轮不补造,理由如下:
out/resource-and-timing.json顶层键只有batch与rounds;全文件唯一的绝对时间键是rounds[].startStop.uiPressStartUtc、rounds[].startStop.uiPressStopUtc与帧时间frameTimeMs。rounds[].finalReport只含相对耗时:handoffRequestedToDrainCompleteSeconds、writerDrainDurationMs、checkpointMaxDurationMs等,不含与uiPressStopUtc同轴配对的绝对时间戳。- 可用的绝对时间源只有文件
mtime与辅助功能按压调用返回时刻;前者标记写盘完成,后者标记辅助功能调用返回,二者与「Stop 停止采集」以及「最终报告对外可见」都不是同一事件边界,相减得到的是无定义量。
结论:该项记 unknown。要闭合需(另批)由产品自身在 Stop 与 final 报告落盘两处各写一个同轴绝对时间戳。handoff requested→drainComplete 与 requested→stopAck 只有 r2/r3 有值(r1 未捕获 CoreProfile,未进入 stop-drain handoff 路径),且均为相对区间,不能替代上述端点。
C-4 · 本次文档与归档返工记录
- 已发布的
docs/architecture/perfowl-p4-build74-phase2-a1-e4-lead-audit-and-ui-verification-plan-2026-09-25-a1-e4-ui-update.html(源快照,SHA-2564bce9f34…)不回改;本次为同一源文档新增快照docs/architecture/perfowl-p4-build74-phase2-a1-e4-lead-audit-and-ui-verification-plan-2026-09-25-a1-e4-ui-update-r1.html,并只把site/devlog/index.md时间线当前节点的归档链接改指新快照。 - §2 F-4 的渲染缺陷(代码跨度内的字面双星号被继续套加粗正则,产出不匹配的
<code>与<strong>)在新快照渲染时作了一处可复现的局部转义修正;未修改通用渲染器site/scripts/render-archive.py,其永久修复仍另批。具体替换次数与源/初渲/修正后 SHA 记于本次交付回报。 site/devlog/index.md的 P2 行中,本批 implementation 更新由「证据」列尾移入「状态」列(列位修正,文字内容不变;既有历史段不回改)。
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 指标集路径」。该表述不准确,更正为:
- 原始 Session 只读复算:r1 的
collector-core/capture-plan.json记requestedMetricCount = **26**、capturePlan.policyVersion = "all-supported.v1";r2 与 r3 均为requestedMetricCount = **12**(冻结的 startup-only 档位)。 - 这 26 项来自产品 UI 的默认 10 组(
WorkbenchMetricCatalog.defaultSelection:CPU Usage、Memory Usage、Display Performance、Network、CPU Core Usage、Thread Count、CSwitch、Wakeups、Disk、GPU Usage)。逐组展开并集=26 项唯一指标(3 + 5 + 5 + 4 + 1 + 1 + 1 + 1 + 2 + 3),包含 CPU / 内存 / 磁盘 / 网络四族,不含任何 startup 指标(故 r1startupEnabled=false、无 CoreProfile blob)。 - 因此精确表述为:r1 走的是「UI 默认 10 组所请求的 26 项非 startup 配置,含这四族」,不是「完整 Registry」(本仓库 Registry 合同数为 66)。
- 其余原判不变:r1
metrics.csv54 行且四族为candidate观察值;r1 配置 INVALID、不纳入可比 startup 样本;r2(47 行)/ r3(52 行)四族确为未请求missing。
R2-2 · 承认 hostResources.window.first/last 是绝对 UTC 时刻;frameTimeMs 是时长
C-3 称 resource-and-timing.json「全文件唯一的绝对时间键」仅为 rounds[].startStop.uiPressStartUtc、rounds[].startStop.uiPressStopUtc 与 frameTimeMs。该表述有两处错误,更正为:
该文件另有绝对时刻字段
rounds[<label>].hostResources.window.first/.last,取值为 ISO-8601 UTC 时刻;三轮都有(逐轮取值留在私有证据,不写入公开材料)。frameTimeMs不是绝对时刻,而是rounds[].deviceMetrics.columnsWithNumericValues下的一个时长列(毫秒)。同时承认
uiPressStartUtc/uiPressStopUtc与hostResources.window.first/last都是真实的绝对 UTC 字段。但四者对目标耗时都不是已验证的事件端点:hostResources.window是宿主资源采样窗口的两端——设计上它开始于 Start 之前、结束于 Stop 之后,因此既不是「Stop 实际停止采集」的事件,也不是 final 报告落盘或对外可见的事件;uiPressStopUtc是辅助功能按压调用返回的时刻,不属于上述任一事件;- 文件
mtime标记的是写盘完成,同样不属于上述任一事件。
结论不变:没有经验证的同轴 Stop → final 两端时间戳,该耗时保持
unknown。不得把 mtime、辅助功能返回时刻或宿主采样窗口端点相减来「冒充」该耗时。要闭合仍需(另批)由产品在 Stop 与 final 报告落盘两处各写一个同轴绝对时间戳。