The device gate: Redmi 2f7cbe2e, reboot-clean, paired A/B in one thermal window (arms interleaved, best-of-3 then best-of-2), rd12 + DirectGLES. inproc vs spawn client CPU p50 7.880/7.889 vs 7.876/7.869 (-0.15%) and 7.987/7.989 vs 7.992/8.009 (+0.16%) - a tie inside the 0.2-4.2% within- arm spread, sign flipping with arm order, recorded and not gated. monolith is ~30% dearer. 22/22 runner exits clean, 44/44 PINNED, zero Fatal. The three mandatory numbers: socket doorbell vs condvar is a tie too - client 121.1 waits/frame identical across transports, server 10 866-11 963 (inproc) vs 10 415-10 416 (spawn) waits/frame, and the contract's 'converting that into ~4 blocking reads may be cheaper' did not pay off; the only column where the socket is worse is clipark/f (6.07 vs 5.60/5.75). SEG_STAGE bytes/frame: 130.8 KB median / 8.01 MB steady (OpenRA), 816.2 KB / 1.53 MB (rd12). Records/frame post-chunking: 211/206 and 7 497/7 504. maxrec stays 1808 - the 8 MiB chunk budget is never reached. Both framings reported throughout (the startup window runs ~7x the steady state) rather than the flattering one. MEASUREMENTS.md gains section 12 with the full protocol and tables; the 6.3 'no post-chunking distribution exists' gap now points there. CURRENT_STAGE_PROGRESS.md marks gates 7/8 met and records the closeout work plus two structural limits (spawn client windowed fields are zero by construction - OnPresent runs in the server process - though its run totals are valid stores; the stats dump is role-derived). ROADMAP marks P6 closed in the stage table, the header and the milestone. Evidence: notes/p6/gate7-device-ab.md, gate8-doorbell-device.md, gate8-wire-counters.md, git-worktree-fix.md. check_doc_citations: 82 citations in the three documents, 0 problems.
13 KiB
P6 收官事实写入 ROADMAP.md —— 改动报告
日期 2026-09-22;工作树
C:\Users\geekerwan\AndroidStudioProjects\FoldCraftLauncher\MobileGL-disagg, 分支feat/disaggregated。只改docs/Disaggregated/ROADMAP.md一份文档,另两份(由并行代理负责) 未触碰;未git commit;未触碰工作树里已有的未提交代码改动。证据只读引用(未修改):
notes/p6/gate7-device-ab.md、notes/p6/gate8-doorbell-device.md、notes/p6/gate8-wire-counters.md、notes/p6/git-worktree-fix.md。
0 一句话
把 P6 的收官事实(门 7 / 门 8 已采、判读 tie、收尾四项落地)写进 ROADMAP.md,
6 行改动:顶部 blockquote、阶段表 P6 行的状态列 / 落地列 / 验收门列、里程碑列表两条、一处引用了
ServerMain.cpp「正在被门 8 的工作修改」的行内说明、一处写「门 8 的树上工作正在补」的开放问题。
其余全部逐字未动(含债务表整张、其余阶段行、P6.5「立即的下一项」整节)。
1 逐处改动(行号按改前 / 改后对照)
1.1 顶部状态 blockquote(第 3 行)
改前:`P6 全部包(a6 / c6 / lk / so / sm / cp / hs / dl / st / t6)已落地于 feat/disaggregated (头 16bfab10,2026-09-21);出口门第 1–6 项达成,第 7 项(真机配对 A/B 热窗口)与第 8 项 (三个强制性能数)尚未正式采集,故 P6 记为「实现完成、出口性能/设备数待补」,未宣布收官**。
改后:P6 已收官(2026-09-22):全部包已落地(头 16bfab10,2026-09-21),出口门第 1–6 项此前已达成;
第 7 项(Redmi 2f7cbe2e 的 reboot-clean 同热窗口配对 A/B)与第 8 项(三个强制性能数)已于 2026-09-22 采齐
——门 7 判读 tie(client CPU p50 差 −0.15% / +0.16%,均在臂内散布 0.2–4.2% 之内,符号随臂序翻转;
monolith 约贵 30%),门 8 三数齐;证据链 notes/p6/gate7-device-ab.md / gate8-doorbell-device.md /
gate8-wire-counters.md。
未动:同一 blockquote 里的 P5f 验收代码句、P5e 债句、CI / inproc 收官句;第 5 行(Magma run-ahead) 与第 7 行(终局改判)整句原样——这两行的「P6 / P7 全阶段状态不因此改变」与「P6.5 关键路径」结论 不受收官影响。
1.2 阶段表 P6 行(第 37 行)
- 状态列:
⏳ 全部包已落地(2026-09-21,头 16bfab10);出口门 1–6 达成,7/8 待采→✅ 已收官(2026-09-22),并保留十包落地信息。原「收官前另欠」三项改写为:server 进程PipeStats从未初始化已在收尾中修好;184 符号棘轮门与 hs 的LinkTerms/Refuse/ 指纹拆分未落地、移交 P6.5。 (只改「已在收尾中修好」这一处口径,未落地项原样保留——契约 §12.1 的棘轮门与 hs 三行确实仍未做。) - 落地什么列:原有十包链与 a6 / P6-ENDSTATE-REVIEW 引用逐字保留,追加收尾四项:
wire 计数器(
PipeWireCodec.cpp:878StageAllocate唯一收口、:1188EncodeRecord提交路径、 staged-blob 直方图、汇总行seg=/wrec=);ServerMain.cpp补PipeStats::Init()/Shutdown()(修前 0 条汇总行 / 修后 29 条、SSIM 1.0 不变);MOBILEGL_PIPE_STATS_FILE角色派生<base>.client.json/<base>.server.json;工具入库tools/device_bench/p6/{ab_session.py,render_ab.py,README.md}与tools/trace_replay/run_android_retrace_local.py(+19 行),pin_device.sh新增2f7cbe2e条目。 - 验收门列:
7/8 待采:……尚未正式记录→7/8 已采(2026-09-22)的达成摘要,逐字使用基线数字:- 门 7:Redmi
2f7cbe2e/ M332BF / SM8750 / Adreno 830v2、CPU 定频 little 1555200 / big 1958400、 GPU 钳 1050 MHz、rd12-in-world + DirectGLES、~1471 draws/帧;六臂交错 × best-of-3 = 18/18 runner 退出 0、36/36PINNED、0Fatal;inproc 7.880/7.889 vs spawn 7.876/7.869(−0.15%)、 第二会话 7.987/7.989 vs 7.992/8.009(+0.16%);判读 tie,如实记录、不设门;monolith 约贵 30%。 - 门 8①:client 121.1 waits/帧、5.6–6.1 parks/帧、两传输逐字相同(run total 30 401–30 407);
server inproc 10 866–11 963 / 5.0–6.2,spawn 10 415–10 416 / 4.66–4.90;
socket 阻塞读既不更便宜也不更贵(契约 §9 未兑现);spawn server waits 少 8.9–12.9% 归因 handoff 纪律;
唯一略差列
clipark/f6.07 vs 5.60/5.75。 - 门 8②③:OpenRA
seg130.8 KB median / 8.01 MB steady mean(含负载 8.07 MB)、记录 211 / 206; rd12seg816.2 KB median / 1.53 MB steady mean(含负载 10.79 MB、首帧 981 654 draws vs 稳态 ~1471、 run-wide mean 约 7× 稳态,两个读法都报)、记录 7 497 / 7 504;maxrec=1808与分块前相同。 - 证据链接三条按任务书给出的相对路径写入。
- 门 7:Redmi
1.3 里程碑列表(第 228–229 行)
采用任务书给的改写旧条方案(文件惯例是里程碑与阶段表的日期条目一一对应,新增一条会留下 「未宣布收官」与「已收官」两句并存):
- 第 228 行:「P6 全部包落地(2026-09-21)」→「P6 收官(2026-09-22)」。十包合入、三种传输
retrace 对上 golden、device-lost 闩 123 s → 5.7 s、
Session::Fail93→4 等历史事实逐字保留; 出口门句改为「1–6 ✅;门 7 / 8 于 2026-09-22 采齐」并写入 tie 判读、monolith 约贵 30%、 门 8 三数齐、G1 0/0/0/0 且.text逐字节相同,收尾为「P6 就此收官,未设性能门(只记录)」。 - 第 229 行「终局改判」条内,把「server 进程
PipeStats结构性零」标注为收尾中已修 (否则会与 1.2 的状态列自相矛盾)。该条其余内容与第 230 行「仍是方向……」「再基线检查点」 逐字未动。
1.4 两处「门 8 还在做」的残留说明(第 61、266 行)
这两处若不改,会与新的收官状态直接冲突(一句说门 8 还在改代码、一句说门 8 的量还在补):
- 第 61 行 P6.5 表格里
ServerMain.cpp的出处列:「正在被门 8 的工作修改,不引行号」→ 「门 8 的收尾修改已落入该文件,本表不引行号」。仍未引行号(该表本来就不引,保持原风格)。 - 第 266 行开放问题 11 末句:「MC in-world / Create 的占用分布仍未量(门 8 的树上工作正在补)」→
「(门 8 已给出两条负载的字节/帧与记录/帧,逐 blob 分布只在 integration 车道取到)」。
这一改与
gate8-wire-counters.md§6.5 / §7.1 一致:逐 blob 分布只从 integration 车道的 JSON dump 拿到, retrace 的 snapshot 模式因不走cleanUp→Destroy拿不到。该问题其余文字(含「仍未答」的 program archive 与draw_vborange 尾)逐字未动。
1.5 明确未改动(逐字保留)
- P6.5 行(第 38 行)与「立即的下一项」整节(第 51–158 行):其「今天还跑不了」「正在被门 8 的工作修改」 之类的 P6.5 语境与本次收官无关,除 §1.4 那一处外未动。
- 债务表(第 234–250 行)整张逐字未动,含「A3 指纹 → P6.5 wf / nd」「默认 32 MiB staging」 「max record bytes」等行。
- 其余阶段行(P0…P5f、Ph、P3b/P4b、P7…P13)逐字未动;P5c 历史节、审计清单表、开放问题 1–24 除 §1.4 那一句外逐字未动。
- 第 226 行「P5f 出口……P6 前提解除,实施未开始」是当时的事实陈述,保留(该条的历史价值高于 与今天的对照,且下行第 228 行已给出实施与收官时间线)。
2 与基线数字的一致性自查
| 事实 | 写入位置 | 与证据文档是否逐字一致 |
|---|---|---|
门 7:18/18 退出 0、36/36 PINNED、0 Fatal |
blockquote(概述)、阶段表、里程碑 | 是(gate7-device-ab.md §1 表) |
| 门 7:7.880/7.889 vs 7.876/7.869 = −0.15% | blockquote、阶段表 | 是(§2.2 / §2.3;臂内散布 0.2–4.2%) |
门 7 第二会话:4/4 OK、8/8 PINNED、0 Fatal、7.987/7.989 vs 7.992/8.009 = +0.16% |
阶段表 | 是(gate8-doorbell-device.md §1、§4) |
| monolith 约贵 30%(−29.8% / −29.9%) | blockquote、阶段表、里程碑 | 是(gate7-device-ab.md §2.4) |
| 门 8①:121.1 waits/帧、5.6–6.1 parks/帧、30 401–30 407 | 阶段表 | 是(两文档 §3 表;5.60/5.75 与 6.07/6.08) |
| 门 8①:server inproc 10 866–11 963 / spawn 10 415–10 416 | 阶段表 | 是(gate8-doorbell-device.md §3) |
门 8①:spawn server waits 少 8.9–12.9%、clipark 6.07 vs 5.60/5.75 |
阶段表 | 是(§3、§3.1、§7) |
| 门 8②③:OpenRA 130.8 KB / 8.01 MB、211 / 206 | 阶段表 | 是(gate8-wire-counters.md §6.4) |
| 门 8②③:rd12 816.2 KB / 1.53 MB、7 497 / 7 504、含负载 8.07 / 10.79 MB | 阶段表 | 是(§6.4) |
| rd12 首帧 981 654 draws、run-wide mean 约 7× 稳态 | 阶段表 | 是(§6.4 读法注意) |
maxrec=1808 与分块前相同、默认 8 MiB chunk 未被触发 |
阶段表 | 是(§6.4 / §7.2) |
| 收尾四项(878 / 1188 / ServerMain Init+Shutdown / 角色派生 / 工具与 pin 条目) | 阶段表落地列 | 是(gate8-wire-counters.md §3、§9.2、§9.7、§9.7.1) |
| 修前 0 条 / 修后 29 条汇总行、SSIM 1.0 不变 | 阶段表落地列 | 是(§9.4(c)) |
本板 GPU 钳 1050 MHz(写 0 读回 1、max_gpuclk 只读 1 050 000 000)、与 35d0befa 行不可比 |
阶段表状态列与验收门列 | 是(gate7-device-ab.md §1、§5.1 与 pin_device.sh 的 2f7cbe2e 行) |
未写入(任务书未列、且属于证据文档范围的数):负控 MOBILEGL_IPC_STAGE_MB=1 的
seg 运行总量逐字节相同 / wrec +0.11% / 同 A/B 下 tex +194%(未解释)、逐 blob 分布首测
(70 records、8 blobs、bucket 3–12)、G1 .text 10158850 与 symbols 27863。这些留在
notes/p6/gate8-wire-counters.md,ROADMAP.md 只在其开放问题 11 保留了「分块」的既有论述。
3 引用检查
在工作树根目录按任务书要求运行:
$ python scripts/check_doc_citations.py docs/Disaggregated/ROADMAP.md
check_doc_citations: 75 citations in 1 document(s) against HEAD, 0 problem(s)
rc=0
(改前同一条命令:74 citations … 0 problem(s);+1 是本轮新写入的 PipeWireCodec.cpp:1188。
该脚本覆盖 docs/Disaggregated:它按参数吃任意 markdown,仓库里就是靠
docs/Disaggregated/*.md 调用的。为完整性另跑了一次全域:
$ python scripts/check_doc_citations.py docs/Disaggregated/*.md docs/Disaggregated/notes/p6/*.md
check_doc_citations: 1257 citations in 21 document(s) against HEAD, 27 problem(s)
rc=0
那 27 条全部在只读证据文档里,与本轮改动无关,且分三类:
- 21 条 basename 歧义(
Init.cpp命中MobileGL/Init.cpp、MG_Backend/Init.cpp、MG_Impl/Init.cpp; 1 条Core.cpp)——脚本按 basename 解析时要求唯一。 - 5 条
path:line超出 HEAD 行数——PipeStats.h/PipeStats.cpp/ServerMain.cpp/PipeWireCodec.cpp的行号来自工作树(未提交的收尾改动),而脚本对HEAD解析。notes/p6/gate8-wire-counters.md§3 自己声明的就是「行号为改后内容」。 - 2 条
retrace_main.cpp第 258 / 1482 行的引用无此文件——该文件属于 apitrace 子模块的 vendored 源码, 不在git ls-tree -r HEAD的顶层路径集合里(脚本只解析仓库自身文件)。
按任务书要求,这些只读证据文档未改动,问题如实列出;ROADMAP.md 自身 0 problem。
4 边界与未做项
- 没有
git commit,也没有触碰工作树里已有的未提交改动 (MobileGL/MG_Remote/{Wire/PipeWireCodec.cpp,Server/ServerMain.cpp}、MG_Util/{Metrics/PipeStats.cpp,Metrics/PipeStats.h,Debug/Log.cpp,Debug/Log.h}、MG_Test/Util/PipeStatsTest.cpp、tools/device_bench/pin_device.sh、tools/trace_replay/run_android_retrace_local.py与新增的tools/device_bench/p6/)。 改动的只有docs/Disaggregated/ROADMAP.md(6 行)与本报告文件。 - 另两份文档未碰:
CURRENT_STAGE_PROGRESS.md(含 §2.1「收官前另欠」、§3「出口门 7、8 …… 待采集」) 与MEASUREMENTS.md由并行代理负责;本报告不引用它们的行号,ROADMAP.md里对CURRENT_STAGE_PROGRESS.md/MEASUREMENTS.md的既有链接逐字保留。注意:在它们被同一轮收官改完之前,ROADMAP.md说的「P6 已收官」与CURRENT_STAGE_PROGRESS.md§2.1 / §3 的「未宣布收官 / 7、8 待采」 会短暂并存,这是并行分工的中间态,不是本报告遗漏。 - 里程碑采用「改写旧条」而非「新增一条」(任务书允许二选一):这样同一列表里不存在
「未宣布收官」与「已收官」两句。若并行代理在
CURRENT_STAGE_PROGRESS.md里选择了另一种写法, 需要把两处措辞对齐时以ROADMAP.md第 228 行的口径为准。 git status里 12 条m子模块与 flatbuffers 的 6 条M是既有 stat 噪声 (见notes/p6/git-worktree-fix.md§7.1),与本轮改动无关,未处理。