Skip to content

Build 74 独立验收阻塞项修复方案 ​

本文来自对 Build 74 commit c9a133d1fe8c07e5ac15633928c5c62c21e57dc1 与当前 UI worktree 的独立验收。

本轮只修验收阻塞,不提前进入 Build 75,不重做已经通过的 UI 信息架构,不修改 Startup,不修改 R8-Fix-11 的 Display fairness 参数。修复完成后必须重新做独立 E2,全部通过后才允许构建真机包。

0. 当前结论 ​

存在两个确定硬阻塞,另有一个负载敏感复验项。

必修 A:Device Network 聚合器缺少 cooperative fairness ​

Network source-side aggregation 的位置是正确的:

PerfowlNetworkMonitor → DeviceNetworkAggregateStream → Pmd3Subscription bounded queue

因此 Build 73 的 10576 source drop 风险已经从架构位置上被处理。

但是 DeviceNetworkAggregateStream 在 upstream 已有 backlog 时会连续执行 ready 的 anext 与 accumulator.consume,中间没有 scheduler handoff。

独立验收用 100,000 条同步可读 Network event 复现:

  • input = 100000
  • aggregate = 9
  • input reconciliation = 100000
  • wall ≈ 838.62ms
  • heartbeat samples = 1
  • heartbeat max delay ≈ 833.87ms

这说明当前实现可能把 queue overflow/drop 转成 event-loop starvation,必须修。

必修 B:UI Swift 测试无法编译 ​

当前 ScreenshotTimelineLayoutTests 使用 DeviceScreenshotQuality.allCases,但生产 enum 没有 CaseIterable,导致 swift test 在编译阶段失败。

这是测试实现问题,不是生产类型缺能力。

复验 C:GPU 4000 backlog 在高宿主负载下超过 500ms ​

独立复跑时 GPU backlog=4000,consumer drain≈639.6ms,hard window=500ms,status=timed-out。

但当时主机 load average≈62.87/39.94/30.07,同轮多个既有墙钟 benchmark 一起恶化。因此不得仅凭该次结果修改 GPU production closeout。先完成 A/B,再低负载复验。


1. Device Network cooperative fairness ​

1.1 保持不变的合同 ​

必须保持:

  • 聚合仍位于 generic Pmd3Subscription queue 之前;
  • 100ms host aggregation window 不变;
  • byte conservation 不变;
  • aggregate window 边界不因 fairness yield 改变;
  • 不重新输出每条 ConnectionUpdateEvent;
  • 不扩大全局 queue;
  • 不降低 source 数据率;
  • 不使用每事件无条件 sleep(0)。

Fairness 只改变 Host 何时把 event loop 让给其它 ready task,不能改变哪些 Network event 属于哪个 aggregate window,也不能改变最终 tx/rx byte sum。

1.2 新增 source-local fairness gate ​

在 DeviceNetworkAggregateStream._iterate() 内增加:

  • NETWORK_AGGREGATE_MAX_BURST_EVENTS = 128
  • NETWORK_AGGREGATE_MAX_ACTIVE_NS = 1_000_000,即 1ms

128 是 backlog starvation 的事件数 backstop;1ms active gate 是主要时间门禁。若 benchmark 证明 128 明显不合适,只允许在 64–256 内基于数据调整,不能凭感觉修改。

1.3 active-time 边界 ​

必须排除 upstream await。

错误做法是从 await source.anext 之前开始计时,因为这会把设备/DTX 等待重新算成 Perfowl active work,重复 R8-Fix-8 已经修掉的问题。

正确逻辑:

  1. await source.anext 完成;
  2. 再记录 active_start;
  3. 执行 accumulator.consume(item);
  4. 只把这段同步处理计入 burst_active_ns。

1.4 yield 顺序 ​

推荐逻辑:

  1. 取一条 upstream item;
  2. 记录本条 accumulator active time;
  3. 更新 burst event count 与 burst active time;
  4. 如果本条关闭 aggregate window,先 yield aggregate;
  5. 如果达到 128 events 或 1ms active-time,在下一次继续拉 upstream 之前 await asyncio.sleep(0);
  6. reset burst counters。

这样 aggregate 会先交给下游,ready consumer 能在下一次 upstream pull 前获得运行机会。

1.5 terminal / tail flush ​

现有 source terminal → accumulator.flush → tail aggregate exactly once 必须保留。

Fairness 不得造成:

  • tail aggregate 重复;
  • tail aggregate 遗失;
  • stop 后新开 window;
  • byte sum 改变。

2. Network fairness diagnostics ​

扩展 DeviceNetworkAggregationCensus:

  • networkFairnessYieldCount
  • networkFairnessYieldReasonCounts.active-time
  • networkFairnessYieldReasonCounts.event-limit
  • networkFairnessMaxBurstEventCount
  • networkFairnessMaxActiveBurstDurationMs
  • networkFairnessMaxSingleEventDurationMs

可选:

  • networkEventsOver1msCount
  • networkEventsOver5msCount

只保留 aggregate diagnostics,不为每条 Network event 写 timing raw。

yield reason 必须互斥。若 active-time 与 event-limit 同时命中,优先记 active-time。


3. Network E2 必增门禁 ​

现有 100k byte-conservation 测试继续保留,同时新增能稳定抓住本次缺陷的 scheduler test。

3.1 100k ready backlog ​

构造 upstream,其 100,000 个 event 都能立即返回,不人为 pace。

并行运行 5ms heartbeat。

必须:

  • input=100000
  • aggregateInputCount=100000
  • sourceDrop=0
  • sum(tx) exact
  • sum(rx) exact
  • fairnessYieldCount>0
  • maxBurstEventCount<=128

Scheduler 目标:

  • heartbeat sample count>=20
  • heartbeat P95<20ms
  • heartbeat Max<100ms

如果出现单个 OS 抢占离群点,要输出完整分布分析,不能直接把门槛放宽到数百毫秒。

3.2 30kHz paced multi-source ​

保留现有 multi-source 30k Network flood。

修复后必须:

  • Network sourceDrop=0
  • Display wake P95<20ms
  • heartbeat P95<100ms
  • heartbeat Max<250ms
  • task count stable

3.3 禁止测试规避 ​

禁止:

  • 降低 NETWORK_FLOOD_COUNT 直到不形成 backlog;
  • fake producer 每条 event 后 sleep;
  • 放宽 Display wake P95;
  • 放宽 heartbeat;
  • 删除 ready-backlog fixture。

4. UI 编译修复 ​

4.1 默认只改测试,不扩生产 enum ​

生产类型 DeviceScreenshotQuality 当前为 String + Codable + Hashable + Sendable,产品逻辑不需要枚举全部 case。

因此默认修复是删除 ScreenshotTimelineLayoutTests 对 allCases 的依赖。

如果测试意图只是证明 failed/cancelled 为可达状态,直接构造:

  • let failedQuality: DeviceScreenshotQuality = .failed
  • let cancelledQuality: DeviceScreenshotQuality = .cancelled

或继续使用测试后续已有的 .failed/.cancelled fixture。

只有未来真实生产功能需要遍历所有 case 时,才单独引入 CaseIterable。

4.2 删除 modeTabs 死代码 ​

独立验收确认 modeTabs/modeTab 已无调用点,实际 UI 已不显示“常规测试 / 深度分析 / 网络测试”,产品要求已经满足。

本轮顺手删除:

  • private var modeTabs
  • private func modeTab(...)

这是死代码清理,不改变 UI。

4.3 冻结已完成 UI ​

以下部分只做回归,不重构:

  • 顶部设备连接/断开 banner;
  • Scene 01 已移除;
  • Display Performance 只展示 FPS + Frame Time;
  • 两个 live series 点击显隐;
  • P95/Jitter/Refresh Rate 保留 report/data contract;
  • 指标列表只显示名称与含义;
  • 条件不满足时 picker disabled;
  • Wi-Fi per-device hydration;
  • discovery 缺席 grace;
  • Screenshot timeline 新布局。

5. UI E2 ​

必须先跑 swift test --disable-sandbox,要求编译成功且 0 failures。

专项至少覆盖:

  • ScreenshotTimelineLayoutTests
  • WorkbenchModelsTests
  • WorkbenchDisplayContractTests
  • DisplayPerformanceSwiftTests
  • DeviceFoundationNetworkStabilityTests
  • DeviceFoundationTests
  • DeviceConnectionServiceTests

还必须运行 git diff --check,并确认 UI worktree 没有遗漏的 untracked production/test 文件。

UI 修复完成后形成独立 commit,不能继续停留在未提交 worktree。


6. GPU closeout:先复验,条件修复 ​

6.1 暂不改 production 的原因 ​

4000 backlog 的 639.6ms 发生在主机 load≈63 时,同时旧 R8 timing tests 也一起恶化。

现有不带 500ms deadline 的语义测试仍证明:

  • backlog 可全部送达;
  • dropped=0;
  • immediate=False;
  • stream 自行结束;
  • flush exactly once。

因此先不改 GPU production。

6.2 受控复验 ​

Network fairness 与 UI 修好后,在以下条件复验 GPU:

  • host load average<10
  • 没有并行 swift test/xctest
  • 没有并行 Python full suite
  • 同一 test 连续 5 次

4000 backlog 要求:

  • 至少 4/5 次 <250ms
  • 全部 5 次 <500ms
  • consumerStatus=completed
  • timedOut=0
  • cancelled=0
  • dropped=0
  • flush=1

满足则不修改 GPU closeout。

6.3 若低负载仍失败 ​

只有受控条件下仍稳定超过 500ms 才进入 GPU follow-up。

先看 source-stage timing,定位耗时属于:

  • service queue dequeue
  • GPU decoder
  • Raw envelope build
  • append
  • projector
  • post-process

禁止先改 timeout。

如果已证明某 shape 是 control/heartbeat,可以在 decoder 前分类,并只保留 bounded protocol census,不进入完整 metric projection。

如果协议仍未证明,不允许为了 500ms 直接丢 unknown GPU backlog,也不允许 immediate=True 静默丢数据。


7. 重新验收顺序 ​

Gate 1:静态审计 ​

确认:

  • Network fairness 仍在 aggregate queue 之前;
  • active-time 不含 upstream await;
  • 100ms window 不变;
  • no per-event sleep(0);
  • no queue enlargement;
  • R8-Fix-11 constants untouched;
  • consumer-handoff=0;
  • 500ms closeout 未放宽。

Gate 2:Build 74 专项 ​

运行:

  • device network aggregation
  • network ready-backlog fairness
  • GPU forensics
  • multi-source load
  • source-stage timing
  • source-terminal closeout

全部 PASS。

Gate 3:R8 回归 ​

低负载再跑:

  • R8-Fix-11
  • R8-Fix-10
  • R8-Fix-9
  • Display pipeline
  • pump/filter/realtime fairness

旧 timing flake 如再次出现,要与 Build 73 baseline 同机交替,不能直接放宽 gate。

Gate 4:全量 ​

  • Python full
  • Swift full
  • VitePress
  • metric knowledge gate
  • git diff --check

8. Build 74 与 UI 合并 ​

当前 Build 74 是 clean commit c9a133d1...;UI 是基于该 commit 的独立未提交 worktree。

不要在 registered main 脏工作区直接拼接。

推荐:

  1. 在 Build 74 clean worktree 修 Network fairness;
  2. commit;
  3. UI worktree rebase/cherry-pick 到新的 Build 74 commit;
  4. 修 UI test compile + modeTabs dead code;
  5. commit UI;
  6. 从最终 exact clean commit 跑全量 E2;
  7. 双远端 push;
  8. 再交独立验收决定是否构建真机包。

9. 最终通过条件 ​

只有以下全部成立才进入 E4:

Network 100k ready backlog:

  • byte conservation exact
  • sourceDrop=0
  • heartbeat P95<20ms
  • heartbeat Max<100ms

Multi-source:

  • Display wake P95<20ms
  • heartbeat P95<100ms
  • heartbeat Max<250ms
  • sourceDrop=0

GPU:

  • 低负载受控 closeout 复验通过,或有新的证据驱动修复

UI:

  • swift test 编译成功
  • 0 failures
  • modeTabs dead code removed
  • 已完成 UI 功能不回退

R8:

  • pure Display fairness 不回退
  • direct waiter 保留
  • consumer-handoff=0

Global:

  • Python full PASS
  • Swift full PASS
  • VitePress PASS
  • knowledge gate PASS
  • git diff --check clean
  • exact clean commit

达到以上条件后才构建下一版真机包。


10. 禁止项 ​

本 follow-up 禁止:

  • 扩大全局 queue 解决 Network backlog;
  • 每条 Network event 无条件 sleep(0);
  • 改 100ms aggregate window 换 scheduler fairness;
  • 改 Device Network 1s 产品 sample clock;
  • 放宽 Display/heartbeat target;
  • 放宽 500ms consumer drain;
  • GPU immediate=True 丢 backlog;
  • GPU 未证明协议就丢 unknown/control;
  • 为 UI 测试无必要地扩生产 API;
  • 重写已完成 UI 信息架构;
  • 提前做 Build 75;
  • 修改 Startup;
  • 修改 R8-Fix-11 parser/filter/pump/realtime constants。

Implementation / Validation Update — 2026-09-23 ​

执行角色:Test AI(C 项 GPU drain 低负载定向复验 + A 项移植的独立复核;不开发 A、不重做 B) 审计基线:78a59be97f955c12ce3766256d803f61d3e54aeb集成 commit:1ec94623f3623d37be206f82e114a6b441547db5(A 项移植,未推送) 本批结论:partial · E2;judgement = pending-lead-ai

0. 三项目前的真实来源状态(Lead 已裁定,非本 AI 自评) ​

项状态来源
A Network cooperative fairness已由另一 AI 实现分支 build74-network-fairness,tip 57d4ad02f09e69a5f8601daaca15a5418ae9e0f7("fix(network): yield fairly while aggregating ready backlog",Co-Authored-By: Claude Opus 4.8)。双远程均未推送(git ls-remote build74-network-fairness origin/github 皆 absent)
B UI 编译 + modeTabs 死代码ALREADY INTEGRATED / FINAL REGRESSION PENDING已存在于 main 78a59be 与 57d4ad0;75108af 是其共同祖先。本批不重做、不 re-cherry-pick
C GPU drain 低负载复验本批完成,PASS(5/5)见 §3

本 AI 未重写 A(我的等价实现已撤销,备份于 /tmp/build74_followup_wip/,仅作对照证据);未修改 GPU 产品代码、500ms 门槛、队列、采样率或测试断言;未动 Network fairness / UI / Startup / C0 evaluator / Gate。

1. A 项:按路径精确移植(不整体合并旧分支) ​

集成 worktree 建在准确 HEAD 78a59be(.worktrees/build74-integration),仅 git checkout 57d4ad0 -- <两个文件>:

  • MacApp/Sidecar/perfowl_collector_core/device_network_aggregation.py
  • MacApp/Sidecar/tests/test_build74_network_aggregate_fairness.py

逐文件 git hash-object 与 57d4ad0 版本对照:两者均 IDENTICAL。 git status --short 恰为 2 条(M + A),与 57d4ad0 自身 --stat 范围一致(2 files / +280 −4),无第三个文件。未 merge、未 cherry-pick 整支、未改动旧分支。

实现要点(供 Lead 复核,非本 AI 设计):DeviceNetworkAggregateFairness 门禁,NETWORK_AGGREGATE_MAX_BURST_EVENTS=128、NETWORK_AGGREGATE_MAX_ACTIVE_NS=1_000_000,active-time 优先于 event-limit,只计 accumulator.consume() 同步耗时(排除 upstream await),诊断字段与 §2 同名。

独立 A/B 证据(本 AI 自建探针,旧驱动形状 inline,不 import 新常量):同机旧形状 heartbeat max 460.3 ms(另轮 393.3 ms)vs 新形状 3.5 ms(另轮 2.6 ms),两形状 bytesBalanced 均 True ⇒ 缺陷真实、修复有效、未破坏守恒。含于 /tmp/build74_followup_wip/probe_ready_backlog_starvation.py。

2. B 项:只读复核确认已被解决(未改任何 UI 文件) ​

检查结果
DeviceScreenshotQuality 是否实现 CaseIterable否(仍 String, Codable, Hashable, Sendable)— 符合 §4.1「不为测试便利扩生产 enum」
ScreenshotTimelineLayoutTests 是否依赖 allCases否,该文件完全不引用 Quality/allCases
modeTabs / modeTab 死代码已不存在(Sources/ + Tests/ 全仓 0 命中)
allCases 全仓剩余引用仅 PerfowlWorkbenchView.swift:269 的 SidebarTab.allCases(合法、无关)

结论:B 项在 78a59be 即已满足,无需改动。swift test 见 §3。

3. E2 验证结果(全部在集成 commit 1ec9462 上) ​

C 项 GPU drain 低负载复验(5 轮,逐轮独立进程,无并行 swift/pytest)

轮host load (1/5/15)drain ms500ms 窗statusrowsdroppedflush
15.17 / 7.79 / 9.4228.771内completed400101
25.13 / 7.70 / 9.3715.636内completed400101
35.12 / 7.65 / 9.3410.658内completed400101
44.95 / 7.58 / 9.3126.044内completed400101
54.95 / 7.49 / 9.2549.831内completed400101
  • 5/5 通过:min 10.658 / max 49.831 / mean 26.188 ms;距冻结 500ms 约 10–47× 余量。
  • 满足方案 §6.2 双条件:至少 4/5 < 250ms(5/5 实际 < 50ms)、全部 5 次 < 500ms。
  • consumerStatus=completed、timedOut=0、cancelled=0、dropped=0、flush=1、行数 4001(4000 backlog + device-info)逐轮守恒。
  • 进程 maxRSS ≈ 66–69 MB;单轮墙钟 1.1–2.2 s(含解释器启动)。
  • 结论:低负载下 4000 backlog drain 稳定远低于 500ms,不修改 GPU closeout。 历史 639.6ms 归因确认是 host load≈63 的负载产物。
  • 原始记录:/tmp/build74_c_gpu_drain/round_{1..5}_{stdout,stderr}.txt + 汇总 gpu_drain_results.json;脚本 gpu_drain_rounds.sh。
  • 至少一次 GPU terminal/closeout 专项回归:test_build74_closeout_source_terminal 5/5 OK(含 test_a drain 窗未变、test_d GPU terminal、test_e 无窗语义、test_b/test_c Network terminal)。

Python focused(集成 commit):test_build74_network_aggregate_fairness + device_network_aggregation + multi_source_event_loop + gpu_counter_forensics + source_stage_timing + closeout_source_terminal = 53/53 OK。

Swift(集成 commit):swift test --disable-sandbox = 编译成功,204 tests / 3 skipped / 0 failures(20.5 s)— 与方案 §5 预期一致(ScreenshotTimelineLayoutTests、DeviceFoundationNetworkStabilityTests 均在且通过)。

Python 全量对比(同条件 discover)

树结果
基线 78a59beRan 973 tests / OK
集成 1ec9462Ran 977 tests / FAILED (failures=1)

977 − 973 = +4,恰为 A 项新增文件 test_build74_network_aggregate_fairness.py 的 4 个测试 ⇒ 无其他测试被增删。

唯一失败:test_realtime_consumer_fairness.DisplayPipelineBenchmark.test_benchmark_shipping_policy_steady_120hz_7200_frames,断言 self.assertLess(burst["max"], 50.0) → AssertionError: 57.852034 not less than 50.0。

归因证据(判定为 host-load 计时 flake,非回归):

  1. 因果隔离:集成 commit 相对基线仅改 2 个文件(device_network_aggregation.py + 其新测试);该失败测试的 import 只有 contracts / display_performance / pmd3_backend / realtime,对 device_network_aggregation 0 引用(grep -c = 0)⇒ 不存在影响路径。
  2. base/ship 交错配对 4 轮:base(未改树)4/4 PASS(max 1.2–12.5 ms,自身即抖动 10×);ship 3/4 PASS,唯一 FAIL 出现在 1-min load 最高的一轮(69.839 ms)。抖动存在于两棵树。
  3. 同一测试另行单独运行可达 max=4.660 ms(远低于 50ms 门限)⇒ 偶发 OS 抢占离群,非系统性劣化。
  4. 该测试属本仓已记录的计时 flake 家族(DisplayPipelineBenchmark,见 .workbuddy/memory/MEMORY.md 门禁纪律节)。
  5. 未放宽任何阈值、未改测试断言、未重跑取巧;失败样本原样保留于 py_full_integration.txt。

⇒ 可归因回归 0;1 项待 Lead 独立复核(DisplayPipelineBenchmark 高负载离群)。不写"0 失败"。

4. 与本方案的偏差 ​

  1. A 项非本 AI 开发:按 Lead 裁定,A 已由另一 AI 在 build74-network-fairness(57d4ad0) 完成;本批只做基于 78a59be 的按路径移植 + 独立复核,不重写、不合并整支。我此前的等价实现已撤销(备份于 /tmp/build74_followup_wip/)以免与 A 冲突。
  2. B 项非本 AI 修复:只读复核确认已在 78a59be 满足(见 §2),未改 UI 文件、未 re-cherry-pick 75108af。
  3. GPU 复验轮数:方案 §6.2 建议 5 次,本批执行5 轮(≥ 要求的 3 轮),全部成功轮与失败样本均保留。
  4. 未执行:未推送(见 §5 遗留);未构建/签名/公证真机包(需 Lead 决定集成后构建);C 项未发现可复现低负载超时,故未进入 GPU follow-up 定位。

5. 遗留与门禁 ​

  • 未通过门禁:Python 全量 1 项 flake(DisplayPipelineBenchmark 高负载离群,已归因非回归,待 Lead 复核);因此全量门禁记 partial,不记全绿。
  • 集成 commit 未推送:1ec9462 仅在本地 .worktrees/build74-integration,未推 origin/github。**A 项原分支 57d4ad0 亦未被本 AI 推送或改动。**推送与最终集成形态由 Lead 裁定后进行。
  • git diff --check:集成 commit 干净(见 §6 复核命令)。
  • Phase C:Hybrid Total 保持 FROZEN;C0 Gate 保持 BLOCKED / NOT PASS;C1/C2 未授权未开始。本批未触碰 C0 evaluator / Gate。
  • 未宣布 Build 74 PASS,未进入下一阶段真机 E4。

6. Lead 可直接复核的命令与证据路径 ​

bash
# 集成 commit 与范围(应恰为 2 文件)
git -C .worktrees/build74-integration log -1 --format='%H %s'
git -C .worktrees/build74-integration diff --name-only 78a59be 1ec9462
git -C .worktrees/build74-integration diff --check 78a59be..1ec9462

# A 项移植字节一致性(两者应输出同一 hash)
git hash-object .worktrees/build74-integration/MacApp/Sidecar/perfowl_collector_core/device_network_aggregation.py
git rev-parse 57d4ad0:MacApp/Sidecar/perfowl_collector_core/device_network_aggregation.py

# C 项复现(低负载、逐轮独立进程)
bash /tmp/build74_c_gpu_drain/gpu_drain_rounds.sh 5

# 证据
/tmp/build74_c_gpu_drain/gpu_drain_results.json          # 5 轮机器可读汇总
/tmp/build74_c_gpu_drain/round_{1..5}_{stdout,stderr}.txt # 逐轮原始输出
/tmp/build74_c_gpu_drain/py_full_integration.txt          # 集成全量(含唯一失败原文)
/tmp/build74_c_gpu_drain/py_full_baseline.txt             # 基线全量(OK)
/tmp/build74_c_gpu_drain/paired_flake_probe.sh            # base/ship 交错配对探针
/tmp/build74_followup_wip/probe_ready_backlog_starvation.py # A 项 A/B 探针

Test AI 声明:以上仅为事实、原始结果与归因证据;A/B 的集成形态、是否推送 1ec9462、是否构建最新真机测试包,以及四栏最终裁定,均由 Lead AI 独立验收后决定。本批不宣布 Build 74 PASS。


Lead AI Independent Acceptance — 2026-09-23 ​

结论:BUILD74 E2 PASS / READY FOR TEST-PACKAGE BUILD。 本节只更新 Lead 验收,不覆盖上文 Test AI 原始结果或其中的 1 项历史负载敏感失败。

  • 精确基线 78a59be;集成 commit 1ec9462;Network 来源 57d4ad0。两文件逐 blob 一致,集成 worktree clean;共享主线 HEAD 未更改。
  • Lead focused A + GPU terminal 5/5 OK,独立 GPU 4000 backlog drain 35.139ms(0 dropped、flush=1)。
  • Lead 对唯一 Display benchmark 做低负载交错:base 4/4 / ship 4/4 PASS,均为 7200/7200、无丢帧;保留历史 57.852ms 失败,不改 Max 50ms 门槛。
  • Lead 完整 Python 977/977 PASS(129.000s),当前 shipping benchmark Max 3.176ms、P95 1.068ms、P99 1.680ms;Swift 204 tests / 3 skipped / 0 failures。
  • 知识门禁 66 contracts PASS,VitePress PASS(258 archive,build 34.38s;42 条文案风险 WARN、chunk-size WARN 未忽略)。
  • Build74 E2 Gate PASS;E4 尚未执行。下一阶段 从精确 1ec9462 构建测试包,完成最新 frozen Collector、Developer ID 签名、公证/staple、独立安装和哈希验证,再交给用户进行 iPhone 15 真机 E4。法务 GPL-3.0 与凭据未实证,不得宣称正式分发。Hybrid Total 继续冻结。

独立验收全文:artifacts/build74-lead-acceptance-20260923.md。


Project Owner E4 Handoff — 2026-09-24 ​

  • 产品 main / GitLab main / GitHub main 已统一到 1ec9462。
  • Build 74 internal beta 已按该 exact commit 重新冻结 Collector Core 并完成 Developer ID 签名;冻结测试 ZIP SHA-256 为 3a557cc0c0c666f90736c34fa9b633adb646a92a55ecfdae095c41f349a5dbc1。
  • 自动 Test AI 的 Device A 预检因指定设备未接入而保持 executedRounds=0 / fabricatedRounds=0,不是产品 FAIL。
  • Project Owner 决定后续自行执行真机 E4;手工测试依据:internal/build74-user-manual-e4-test-guide.md。
  • 环境可在保留 G2/SSO 实验和原始 Session 的前提下整理;产品事实源以 main 为准。
  • Build 74 状态:E2 PASS / E4 PENDING PROJECT OWNER TEST。
  • Phase C Hybrid Total 继续 FROZEN,C0/C1/C2 状态不变。

Perfowl · Performance Observer