外观
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 已经修掉的问题。
正确逻辑:
- await source.anext 完成;
- 再记录 active_start;
- 执行 accumulator.consume(item);
- 只把这段同步处理计入 burst_active_ns。
1.4 yield 顺序
推荐逻辑:
- 取一条 upstream item;
- 记录本条 accumulator active time;
- 更新 burst event count 与 burst active time;
- 如果本条关闭 aggregate window,先 yield aggregate;
- 如果达到 128 events 或 1ms active-time,在下一次继续拉 upstream 之前 await asyncio.sleep(0);
- 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 脏工作区直接拼接。
推荐:
- 在 Build 74 clean worktree 修 Network fairness;
- commit;
- UI worktree rebase/cherry-pick 到新的 Build 74 commit;
- 修 UI test compile + modeTabs dead code;
- commit UI;
- 从最终 exact clean commit 跑全量 E2;
- 双远端 push;
- 再交独立验收决定是否构建真机包。
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.pyMacApp/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 ms | 500ms 窗 | status | rows | dropped | flush |
|---|---|---|---|---|---|---|---|
| 1 | 5.17 / 7.79 / 9.42 | 28.771 | 内 | completed | 4001 | 0 | 1 |
| 2 | 5.13 / 7.70 / 9.37 | 15.636 | 内 | completed | 4001 | 0 | 1 |
| 3 | 5.12 / 7.65 / 9.34 | 10.658 | 内 | completed | 4001 | 0 | 1 |
| 4 | 4.95 / 7.58 / 9.31 | 26.044 | 内 | completed | 4001 | 0 | 1 |
| 5 | 4.95 / 7.49 / 9.25 | 49.831 | 内 | completed | 4001 | 0 | 1 |
- 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_terminal5/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)
| 树 | 结果 |
|---|---|
基线 78a59be | Ran 973 tests / OK |
集成 1ec9462 | Ran 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,非回归):
- 因果隔离:集成 commit 相对基线仅改 2 个文件(
device_network_aggregation.py+ 其新测试);该失败测试的 import 只有contracts/display_performance/pmd3_backend/realtime,对device_network_aggregation0 引用(grep -c= 0)⇒ 不存在影响路径。 - 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)。抖动存在于两棵树。
- 同一测试另行单独运行可达
max=4.660 ms(远低于 50ms 门限)⇒ 偶发 OS 抢占离群,非系统性劣化。 - 该测试属本仓已记录的计时 flake 家族(
DisplayPipelineBenchmark,见.workbuddy/memory/MEMORY.md门禁纪律节)。 - 未放宽任何阈值、未改测试断言、未重跑取巧;失败样本原样保留于
py_full_integration.txt。
⇒ 可归因回归 0;1 项待 Lead 独立复核(DisplayPipelineBenchmark 高负载离群)。不写"0 失败"。
4. 与本方案的偏差
- A 项非本 AI 开发:按 Lead 裁定,A 已由另一 AI 在
build74-network-fairness(57d4ad0) 完成;本批只做基于78a59be的按路径移植 + 独立复核,不重写、不合并整支。我此前的等价实现已撤销(备份于/tmp/build74_followup_wip/)以免与 A 冲突。 - B 项非本 AI 修复:只读复核确认已在
78a59be满足(见 §2),未改 UI 文件、未 re-cherry-pick75108af。 - GPU 复验轮数:方案 §6.2 建议 5 次,本批执行5 轮(≥ 要求的 3 轮),全部成功轮与失败样本均保留。
- 未执行:未推送(见 §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;集成 commit1ec9462;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 状态不变。