From 8a445a309877712d45c6ca6873ca21d0f50cb417 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 22 Sep 2026 20:51:15 -0400 Subject: [PATCH] [docs] (P7): every cited feat/disaggregated commit is the rewritten one without the attribution trailer - 144 commits from 785fed0b0 onward were rewritten to drop the Co-Authored-By trailer the project forbids; origin/feat/disaggregated moved from 1135c664 to 3c80cd62 (same trees) - the old->new map is ~/w7/logs/sha-map-20260922.txt; every 7..40-hex citation in the Disaggregated docs and the MG_Remote contracts that matched an old SHA is replaced by the same-length prefix of its rewrite; no other content changes --- MobileGL/MG_Remote/CONTRACT-P6.md | 4 +- MobileGL/MG_Remote/CONTRACT-P7.md | 30 +++++++-------- docs/Disaggregated/CURRENT_STAGE_PROGRESS.md | 34 ++++++++--------- docs/Disaggregated/CURRENT_STAGE_STATUS.md | 38 +++++++++---------- docs/Disaggregated/MEASUREMENTS.md | 4 +- docs/Disaggregated/ROADMAP.md | 22 +++++------ docs/Disaggregated/notes/p34b/espryt-d1.md | 2 +- docs/Disaggregated/notes/p34b/espryt-d2.md | 2 +- .../notes/p34b/split-scenario-census.md | 6 +-- .../notes/p4a/p4a-results/gates-v1.md | 2 +- .../notes/p6/docs-closeout-measurements.md | 6 +-- .../notes/p6/docs-closeout-progress.md | 18 ++++----- .../notes/p6/docs-closeout-roadmap.md | 6 +-- .../Disaggregated/notes/p6/gate7-device-ab.md | 2 +- .../notes/p6/gate8-doorbell-device.md | 2 +- .../notes/p6/gate8-wire-counters.md | 2 +- .../notes/p6/git-worktree-fix.md | 4 +- docs/Disaggregated/notes/p6/lk-itemisation.md | 4 +- .../notes/p65/code-review-findings.md | 2 +- .../Disaggregated/notes/p65/evidence-index.md | 4 +- .../notes/p65/validation-status.md | 6 +-- .../notes/p65/wire-and-validation.md | 4 +- .../notes/p7/INTEGRATOR-DECISIONS-P7.md | 30 +++++++-------- .../Disaggregated/notes/p7/PLAN-PH-P34B-P7.md | 4 +- .../p7/device-window-1/00-session/README.md | 2 +- .../p7/device-window-1/CTS-base/README.md | 4 +- .../E0-attribution/divergent-cases.md | 2 +- .../E0-attribution/exclusions.md | 2 +- .../p7/device-window-1/F1-verify/README.md | 2 +- .../p7/device-window-1/W4-verify/README.md | 2 +- .../p7/device-window-1/W5-verify/README.md | 2 +- .../p7/device-window-1/X1-verify/README.md | 2 +- docs/Disaggregated/notes/p7/link-ratchet.md | 4 +- docs/Disaggregated/notes/p7/magma-a.md | 10 ++--- docs/Disaggregated/notes/p7/magma-b.md | 2 +- docs/Disaggregated/notes/p7/magma-b2.md | 6 +-- docs/Disaggregated/notes/p7/magma-b3.md | 2 +- docs/Disaggregated/notes/p7/magma-c.md | 8 ++-- .../notes/p7/magma-two-process-first-run.md | 2 +- docs/Disaggregated/notes/p7/verify-split.md | 4 +- .../notes/p7/x1-persistent-map-segv.md | 4 +- 41 files changed, 149 insertions(+), 149 deletions(-) diff --git a/MobileGL/MG_Remote/CONTRACT-P6.md b/MobileGL/MG_Remote/CONTRACT-P6.md index 7ef5552a..4d27a88f 100644 --- a/MobileGL/MG_Remote/CONTRACT-P6.md +++ b/MobileGL/MG_Remote/CONTRACT-P6.md @@ -4,7 +4,7 @@ Authority: this file, beside `CONTRACT-P5.md` (table 0, byte carriers, field own `CONTRACT-P5B.md` (the class-C slots), `CONTRACT-P5C.md` (rule E, the two named exemptions, SEG_EVENT, the guards), `CONTRACT-P5E.md` (rule F, the barriered predicate, the wait rule) and `CONTRACT-MAGMA-RUNAHEAD.md`. Where it disagrees with any of them this file is newer and wins; §10 -lists every such place. Base: `feat/disaggregated @ 785fed0b`. Every `file:line` was read at that +lists every such place. Base: `feat/disaggregated @ c25a7760`. Every `file:line` was read at that commit; paths are under `MobileGL/` unless they start with `docs/`. **How to change it.** Package `c6`'s file, edited by the integrator first. A P6 package @@ -701,7 +701,7 @@ owed to P13. Method and full symbol list: **Gate (landed, P7 wave 0 — ID-P7-7)**: `scripts/link_ratchet.py` recomputes this set from an explicit per-object partition on every `build-linux-split` run and fails on any symbol absent from -`scripts/data/link_ratchet_baseline.txt` — which stands at **186** on `78b7d6be`, the 184 plus +`scripts/data/link_ratchet_baseline.txt` — which stands at **186** on `e8b2c4bd`, the 184 plus P6.5's `Client::ClientSession::StartSpawned()` and `MG_State::GLState::ProgramArtifactsSchemaFingerprint()`, with the three backend buckets reproducing a6's 101 / 14 / 60 exactly — while a symbol that disappears is reported rather than failed, so progress never turns the build red diff --git a/MobileGL/MG_Remote/CONTRACT-P7.md b/MobileGL/MG_Remote/CONTRACT-P7.md index c72c0bb4..983b6f03 100644 --- a/MobileGL/MG_Remote/CONTRACT-P7.md +++ b/MobileGL/MG_Remote/CONTRACT-P7.md @@ -1,6 +1,6 @@ # CONTRACT-P7 — Magma(DirectVulkan)全量走完拆分路径 -权威:本文,与 `CONTRACT-P5.md`(表 0、字节载体、字段归属、R-1…R-17)、`CONTRACT-P5C.md`(规则 E、两个具名豁免、`SEG_EVENT`、守卫)、`CONTRACT-P5E.md`(规则 F、等待规则)、`CONTRACT-MAGMA-RUNAHEAD.md`、`CONTRACT-P6.md`(规则 G/H、死亡漏斗、§12 记录债)、`CONTRACT-P65.md`(两轴传输、布局指纹、`LinkTerms`)并列;与它们不一致处以本文为准,§10 逐条列出。基线:`feat/disaggregated @ 78b7d6be`。`file:line` 均在该提交上读取;路径在 `MobileGL/` 下,除非以 `docs/` 开头。 +权威:本文,与 `CONTRACT-P5.md`(表 0、字节载体、字段归属、R-1…R-17)、`CONTRACT-P5C.md`(规则 E、两个具名豁免、`SEG_EVENT`、守卫)、`CONTRACT-P5E.md`(规则 F、等待规则)、`CONTRACT-MAGMA-RUNAHEAD.md`、`CONTRACT-P6.md`(规则 G/H、死亡漏斗、§12 记录债)、`CONTRACT-P65.md`(两轴传输、布局指纹、`LinkTerms`)并列;与它们不一致处以本文为准,§10 逐条列出。基线:`feat/disaggregated @ e8b2c4bd`。`file:line` 均在该提交上读取;路径在 `MobileGL/` 下,除非以 `docs/` 开头。 **怎么改。** 集成者的文件。wave 2 的实现包(A / B / C / D / E / F,§9)需要改行时经集成者;包从第一天起就对着下面的行编译。 @@ -22,7 +22,7 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7 | 项 | 谁做了 | 证据 | |---|---|---| -| `DynamicBackendParameters` / `MGPCaps` / `RenderStateParameters` 定宽 + 布局指纹 | P6.5 wf(`fe27380a`) | `CONTRACT-P65.md` 「握手与布局」;`CONTRACT-P6.md:666` 仍记在 P7 名下,§10 更正 | +| `DynamicBackendParameters` / `MGPCaps` / `RenderStateParameters` 定宽 + 布局指纹 | P6.5 wf(`fe28bdb5`) | `CONTRACT-P65.md` 「握手与布局」;`CONTRACT-P6.md:666` 仍记在 P7 名下,§10 更正 | | server buffer consumers、Android 旋转 blit | `38919d45` | `notes/p5f/magma-inproc-fix.md` | | Magma run-ahead、GPU 延迟退休、VAO 身份碰撞 | `194382c9` | `notes/p5f/magma-runahead.md`;`MG_Backend/Init.cpp:101` `kMGPipeMagmaRunAheadReady = true` | | packed-float mip 原生 blit、resolve、占位图像、copy-image 端点、XFB 捕获 span、纹理回读 | `ed507b1a..d56c0e83`(随 `e1bf3677` 合入) | `WirePlaceholderImages.inc`、`WireFramebuffer.inc:634-636` | @@ -59,15 +59,15 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7 | 名 | 站点 | 判定 | 形状 | |---|---|---|---| | `uniform-buffer-byte-tail` | `UniformManager.cpp:2391` | **退役**(真机 MC 报告 §5 的活边界) | 拷贝窗口外扩到 4 字节边界进 transient slice,再 `vkCmdCopyBuffer` 对齐内部到正确子字目的;`CopyWireBufferRangeToSlice` 扩 | -| `copy-image-in-place` | `VulkanRenderer.cpp` | **已退役(wave 2-B,`9e126a14`)** | `srcImage == dstImage` 时单次转 `GENERAL`、两侧布局 GENERAL、一次写回;同 mip+layer 且矩形重叠 → decline(GL 未定义) | -| `mipmap-shader-format-or-shape`(真机 iterationt 的死因) | `WireFramebuffer.inc` | **半退役(wave 2-B,`c5fa52f9`)** | Fatal 行带上格式 / 尺寸 / aspect / 缺的 feature 位;image 不能作附件时经 scratch 走颜色 shader mip;仍无 shader 臂的形状**具名**拒绝 | -| **wire 回读竞态(曾被当作 OpenRA 真机 0.976494 的原因;真因是下一行)** | `WireFramebuffer.inc` / `VulkanRenderer.cpp` | **已修(wave 2-B,`64530ed2`)** | -| **wire 臂 completed-frame-serial floor 不健全(OpenRA 真机 0.976494 / 0.988998 的真因,ID-P7-33)** | `VulkanRenderer.cpp` `OnSubmitsCompletedUpTo`、`VkBufferManager.cpp` `WriteWireBuffer` | **已修(wave 2-B3,`6a92a10d` / `214cb2eb`)** | 一个 serial 两次提交(S1 pooled-fence 中帧 flush、S2 Present),逐记录退休把 floor 提前 → 帧 N 首次 `glBufferSubData` 走无序 host memcpy 被 S2(N-1) 的排队拷贝盖掉;floor 只升到可证 serial + 有读者在飞的 buffer 一律有序;计数 26→0,red-once `StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn;32 处静默出口具名(`WireDeclines.def`)。留:三处单 fence 退休站点的聚合等待(B4) | `ReadWirePixels` 在 pooled fence 下 flush 帧内 draw 但不等待,拷贝是后一次提交,二者只靠一条 barrier 相连,而 `UNDEFINED` / `PRESENT_SRC_KHR` 的源 scope 映射成 `TOP_OF_PIPE`+0 = 空 scope——刚 present 过的默认 framebuffer正是这个布局;修后回读等它读的那一帧(red-once:`fences=2` vs `1`,`completed=71` 不变)。真机验收 = 三次 `pm clear` 冷跑 1.0 | -| `vertex-layout` | `WireDraw.inc:245`、`VertexInputStateFactory.cpp:439-500` | **已拆分(wave 2-C,`8385a338`)** | `buffer-window` 一种保留为协议错(经 hook 的具名 Fatal,家族词暂留 `UnmigratedVerb`——改成更诚实的 `ProtocolCorruption` 要在 `MG_Pipe::MGPipeFatalFamily` 加一行 + 适配臂,§3.3 未花这笔,记 §12);其余**七**种形状/格式原因(含审计之后新增的 `offset-overflow`)改 monolith 的「屏蔽该属性继续画」,`BuildWireVertexInput` 出 `unsupportedAttribMask`;`vertex-format-conversion` 同包改 decline。`WireDraw.inc` 从此无 `@P7`(普查 15 → 13 处 / 3 文件) | -| `default-color-blit-shape` | `WireFramebuffer.inc` | **已退役(wave 2-B,`0a8a7a0c`)** | 恒等变换回落 `vkCmdBlitImage` 臂;非恒等旋转先 resolve/copy 进 scratch 2D RGBA 再 shader blit;四旋转之外 decline。顺手修出拒绝背后的活 bug:普通 blit 臂对 3D 源按 layer 寻址(z 0..1 读到 slice 0)。旋转半边只在真机可证 | -| `multisample-blit-shape` / `-aspect` | `WireFramebuffer.inc` | **已退役(wave 2-B2,`089fd495` / `22c2687d`)**:shape 走 scratch resolve + blit、MS 目的地具名 decline;aspect 走 `VK_KHR_depth_stencil_resolve` 或第三套烘焙 shader resolve(`WireMultisampleResolve.*`),无臂的采样数形状具名 decline;树上 `@P7` 拒绝站点 **0**(剩 19 行全是注释) | shape:resolve 进 scratch 单采样再 `vkCmdBlitImage` 缩放/翻转;aspect:MS 深/模板 → 单采样用 `VK_KHR_depth_stencil_resolve`(`DynamicBackendParameters` 里查扩展)或 `texelFetch(sampler2DMS)` 写 `gl_FragDepth` 的 shader resolve;单采样 → MS 尺寸不同 decline | +| `copy-image-in-place` | `VulkanRenderer.cpp` | **已退役(wave 2-B,`4f857aa5`)** | `srcImage == dstImage` 时单次转 `GENERAL`、两侧布局 GENERAL、一次写回;同 mip+layer 且矩形重叠 → decline(GL 未定义) | +| `mipmap-shader-format-or-shape`(真机 iterationt 的死因) | `WireFramebuffer.inc` | **半退役(wave 2-B,`c4be3800`)** | Fatal 行带上格式 / 尺寸 / aspect / 缺的 feature 位;image 不能作附件时经 scratch 走颜色 shader mip;仍无 shader 臂的形状**具名**拒绝 | +| **wire 回读竞态(曾被当作 OpenRA 真机 0.976494 的原因;真因是下一行)** | `WireFramebuffer.inc` / `VulkanRenderer.cpp` | **已修(wave 2-B,`76b74693`)** | +| **wire 臂 completed-frame-serial floor 不健全(OpenRA 真机 0.976494 / 0.988998 的真因,ID-P7-33)** | `VulkanRenderer.cpp` `OnSubmitsCompletedUpTo`、`VkBufferManager.cpp` `WriteWireBuffer` | **已修(wave 2-B3,`511c1f16` / `c9164f25`)** | 一个 serial 两次提交(S1 pooled-fence 中帧 flush、S2 Present),逐记录退休把 floor 提前 → 帧 N 首次 `glBufferSubData` 走无序 host memcpy 被 S2(N-1) 的排队拷贝盖掉;floor 只升到可证 serial + 有读者在飞的 buffer 一律有序;计数 26→0,red-once `StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn;32 处静默出口具名(`WireDeclines.def`)。留:三处单 fence 退休站点的聚合等待(B4) | `ReadWirePixels` 在 pooled fence 下 flush 帧内 draw 但不等待,拷贝是后一次提交,二者只靠一条 barrier 相连,而 `UNDEFINED` / `PRESENT_SRC_KHR` 的源 scope 映射成 `TOP_OF_PIPE`+0 = 空 scope——刚 present 过的默认 framebuffer正是这个布局;修后回读等它读的那一帧(red-once:`fences=2` vs `1`,`completed=71` 不变)。真机验收 = 三次 `pm clear` 冷跑 1.0 | +| `vertex-layout` | `WireDraw.inc:245`、`VertexInputStateFactory.cpp:439-500` | **已拆分(wave 2-C,`f1b04edf`)** | `buffer-window` 一种保留为协议错(经 hook 的具名 Fatal,家族词暂留 `UnmigratedVerb`——改成更诚实的 `ProtocolCorruption` 要在 `MG_Pipe::MGPipeFatalFamily` 加一行 + 适配臂,§3.3 未花这笔,记 §12);其余**七**种形状/格式原因(含审计之后新增的 `offset-overflow`)改 monolith 的「屏蔽该属性继续画」,`BuildWireVertexInput` 出 `unsupportedAttribMask`;`vertex-format-conversion` 同包改 decline。`WireDraw.inc` 从此无 `@P7`(普查 15 → 13 处 / 3 文件) | +| `default-color-blit-shape` | `WireFramebuffer.inc` | **已退役(wave 2-B,`583e12de`)** | 恒等变换回落 `vkCmdBlitImage` 臂;非恒等旋转先 resolve/copy 进 scratch 2D RGBA 再 shader blit;四旋转之外 decline。顺手修出拒绝背后的活 bug:普通 blit 臂对 3D 源按 layer 寻址(z 0..1 读到 slice 0)。旋转半边只在真机可证 | +| `multisample-blit-shape` / `-aspect` | `WireFramebuffer.inc` | **已退役(wave 2-B2,`452d33b5` / `51fa513d`)**:shape 走 scratch resolve + blit、MS 目的地具名 decline;aspect 走 `VK_KHR_depth_stencil_resolve` 或第三套烘焙 shader resolve(`WireMultisampleResolve.*`),无臂的采样数形状具名 decline;树上 `@P7` 拒绝站点 **0**(剩 19 行全是注释) | shape:resolve 进 scratch 单采样再 `vkCmdBlitImage` 缩放/翻转;aspect:MS 深/模板 → 单采样用 `VK_KHR_depth_stencil_resolve`(`DynamicBackendParameters` 里查扩展)或 `texelFetch(sampler2DMS)` 写 `gl_FragDepth` 的 shader resolve;单采样 → MS 尺寸不同 decline | | `depth-stencil-mipmap` | `WireFramebuffer.inc` | **已退役(wave 2-B,`227d8220`)** | DEPTH-only 走 `WireDepthMipmap.{vert,frag}` 烘焙程序((A));`MOBILEGL_BAKED_INTERNAL_SHADERS` 表驱动新鲜度门((D))覆盖树内全部烘焙头——首跑抓出 iterationRP witness 头过期;D\|S 合并 / 仅 stencil → decline | -| `uniform-buffer-byte-tail` → **已退役(wave 2-A,`5a14e5a1`)** | — | — | 见上行;真正可达的形状是 `size` 非 4 倍数(offset 非对齐在前端就 `GL_INVALID_VALUE`) | +| `uniform-buffer-byte-tail` → **已退役(wave 2-A,`450d3075`)** | — | — | 见上行;真正可达的形状是 `size` 非 4 倍数(offset 非对齐在前端就 `GL_INVALID_VALUE`) | | `texel-buffer-native-format` | `UniformManager.cpp` | **已 decline(wave 2-A)** | 零占位 view,fetch 读零;只在 Adreno 上有可观测(`GL_RGB32F` buffer texture) | | `unaligned-{texel,storage,atomic}-buffer-range` | `UniformManager.cpp` | **已具名 decline(wave 2-A)** | 跳过该绑定;可写 range 的 copyback 不做(分不出 readonly、录制点在 B/C 的 draw 尾,配方 `magma-a.md` §3.1);真正活的缺口是 `glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, …, 4, 4)`,Adreno 64 字节对齐 | | `storage-buffer-native-range` / `uniform-block-native-range` | `UniformManager.cpp` | **已钳制(wave 2-A)** | 钳到 `maxStorageBufferRange` / `maxUniformBufferRange` | @@ -76,13 +76,13 @@ P7 收官 = 五道出口门同时成立(§2–§7),而不是路线图 P7 | `vertex-format-conversion` | `WireDraw.inc:272` | decline | 可选:packed converter | | `buffer-legacy-arm` | `WireDraw.inc:14/:204` | 具名 Fatal 经 hook(`RoleViolation`) | 已是拒绝,只换漏斗 | -**3.3 普查门(wave 0 包 C)。** `scripts/ci/fatal_census.py` 的扫描根扩到 server 镜像(`MG_Remote`、`MG_Pipe`、`MG_Backend`、`MG_Impl/Pipe`、`MG_State`,MG_Test / MG_Benchmark / MG_IntegrationTest 除外);`abort_sites` 成为**向下棘轮**;每个 `Fatal{Word` 在 `FatalFamilies.def` 有行;`Refuse{Word}` 对 `protocol.fbs` `RefuseCode` 校验。baseline 数(wave 0 落地,`852e3c28`):**79 处 abort / 20 文件**(扩容前 4 / `MG_Remote` 一处),**43 个家族词**(补了 11 行 `.def`,`InitialBytesNotCarried` 并入 `UncarriedInitialBytes`),3 个 `Refuse{}` 词,0 无标记;`ResourceUnavailable` 投影到 `ServerCrashed` 而非 `SegmentMismatch`(段几何没错的时候不说段错了);Magma 三个 wire fatal 漏斗(`MagmaWireFatal` / `WireDescriptorFatal` / `WireBufferLegacyFatal`)经 `MG_Pipe` 的 `MGPipeSessionFailHook` 进 `SessionFail`,家族词保持 `UnmigratedVerb`(改名会作废自 P5b 起的拒绝普查计数);`Refuse{AuthenticationRequired}` 改为词表里的 `Authentication`。 +**3.3 普查门(wave 0 包 C)。** `scripts/ci/fatal_census.py` 的扫描根扩到 server 镜像(`MG_Remote`、`MG_Pipe`、`MG_Backend`、`MG_Impl/Pipe`、`MG_State`,MG_Test / MG_Benchmark / MG_IntegrationTest 除外);`abort_sites` 成为**向下棘轮**;每个 `Fatal{Word` 在 `FatalFamilies.def` 有行;`Refuse{Word}` 对 `protocol.fbs` `RefuseCode` 校验。baseline 数(wave 0 落地,`8bb6309a`):**79 处 abort / 20 文件**(扩容前 4 / `MG_Remote` 一处),**43 个家族词**(补了 11 行 `.def`,`InitialBytesNotCarried` 并入 `UncarriedInitialBytes`),3 个 `Refuse{}` 词,0 无标记;`ResourceUnavailable` 投影到 `ServerCrashed` 而非 `SegmentMismatch`(段几何没错的时候不说段错了);Magma 三个 wire fatal 漏斗(`MagmaWireFatal` / `WireDescriptorFatal` / `WireBufferLegacyFatal`)经 `MG_Pipe` 的 `MGPipeSessionFailHook` 进 `SessionFail`,家族词保持 `UnmigratedVerb`(改名会作废自 P5b 起的拒绝普查计数);`Refuse{AuthenticationRequired}` 改为词表里的 `Authentication`。 --- ## §4 出口门 4:184 符号棘轮下降 P7 的 101 个 -**4.1 定义(wave 0 包 R,`scripts/link_ratchet.py`)。** 在 disaggregated 构建的对象树上:按 `notes/p6/a6-link-experiment-data.md` 的路径规则把 `MobileGL.dir` 下对象分 SERVER / FRONTEND / SHARED;集合 = (SERVER 未定义) − (SERVER 已定义) − (SHARED 已定义) ∩ (FRONTEND 已定义)。baseline 存**符号列表**(`scripts/data/link_ratchet_baseline.txt`),`--assert-monotone` 只对新增符号红,消失只提示重基线(ID-P7-7)。基线数(`scripts/data/link_ratchet_baseline.txt`,`852e3c28`):**186** = `p7-magma` **101** / `p3b-p4b-espryt` **14** / `both-backends` **60** / `p6-core` 11——三个后端桶与 a6 的手数逐符号相同,多出的 2 个是 P6.5 的 `ClientSession::StartSpawned()` 与 `ProgramArtifactsSchemaFingerprint()`。Espryt 桶里 5 个是 `MG_Impl/Pipe/SlotAllocator.cpp.o` 定义的 `MG_Pipe::` 符号,按文件位置落在前端桶、只有 P13 的模块搬迁能清(标 `# P13`),所以 P3b/P4b 的可清数是 9 不是 14。`MG_Remote/FatalFunnel.cpp.o` 归 SHARED(两个角色都经它);`MG_Backend/Init.cpp.o` 按 a6 规则归 SERVER,虽然它引用 5 个 client-session 符号。CI 步骤在 `build-linux-split` 作业;baseline 由参考工具链生成,CI 的 `clang++-20` 内联决策可能让首轮红——三元规则:已列类的兄弟方法、无新引用对象 = 内联,重基线;新引用对象永远不是内联。**重基线(wave 2-B2,`ec46a550`):186 → 173** = `p7-magma` **88** / `p3b-p4b-espryt` 18 / `both-backends` 56 / `p6-core` 11;(B′) 清掉 13 个(`ProgramObject::*`、`SamplerObject::Set*`、`ShaderObject::*` 的编译/链接路径)。剩下的 88 不是「隐藏程序」而是 **monolith draw 路径**(`UniformManager.cpp.o` 引用 `TextureObjectBase`/`TextureObjectWithOneMipmap` 等 62 个、`VkSamplerManager.cpp.o` 引用 `SamplerObject` 14 个 getter、12 个单例),`SetupDraw` 在运行时才分支到 `SetupWireDraw`(ID-P7-5 保留该运行时)——`#if` 掉这些 monolith 臂与 (B′) 是同一种操作、属 wave 3,故不标 `# P13`;§4.2 的「降到 0」对 (B′) 单独不成立。 +**4.1 定义(wave 0 包 R,`scripts/link_ratchet.py`)。** 在 disaggregated 构建的对象树上:按 `notes/p6/a6-link-experiment-data.md` 的路径规则把 `MobileGL.dir` 下对象分 SERVER / FRONTEND / SHARED;集合 = (SERVER 未定义) − (SERVER 已定义) − (SHARED 已定义) ∩ (FRONTEND 已定义)。baseline 存**符号列表**(`scripts/data/link_ratchet_baseline.txt`),`--assert-monotone` 只对新增符号红,消失只提示重基线(ID-P7-7)。基线数(`scripts/data/link_ratchet_baseline.txt`,`8bb6309a`):**186** = `p7-magma` **101** / `p3b-p4b-espryt` **14** / `both-backends` **60** / `p6-core` 11——三个后端桶与 a6 的手数逐符号相同,多出的 2 个是 P6.5 的 `ClientSession::StartSpawned()` 与 `ProgramArtifactsSchemaFingerprint()`。Espryt 桶里 5 个是 `MG_Impl/Pipe/SlotAllocator.cpp.o` 定义的 `MG_Pipe::` 符号,按文件位置落在前端桶、只有 P13 的模块搬迁能清(标 `# P13`),所以 P3b/P4b 的可清数是 9 不是 14。`MG_Remote/FatalFunnel.cpp.o` 归 SHARED(两个角色都经它);`MG_Backend/Init.cpp.o` 按 a6 规则归 SERVER,虽然它引用 5 个 client-session 符号。CI 步骤在 `build-linux-split` 作业;baseline 由参考工具链生成,CI 的 `clang++-20` 内联决策可能让首轮红——三元规则:已列类的兄弟方法、无新引用对象 = 内联,重基线;新引用对象永远不是内联。**重基线(wave 2-B2,`3c2867d3`):186 → 173** = `p7-magma` **88** / `p3b-p4b-espryt` 18 / `both-backends` 56 / `p6-core` 11;(B′) 清掉 13 个(`ProgramObject::*`、`SamplerObject::Set*`、`ShaderObject::*` 的编译/链接路径)。剩下的 88 不是「隐藏程序」而是 **monolith draw 路径**(`UniformManager.cpp.o` 引用 `TextureObjectBase`/`TextureObjectWithOneMipmap` 等 62 个、`VkSamplerManager.cpp.o` 引用 `SamplerObject` 14 个 getter、12 个单例),`SetupDraw` 在运行时才分支到 `SetupWireDraw`(ID-P7-5 保留该运行时)——`#if` 掉这些 monolith 臂与 (B′) 是同一种操作、属 wave 3,故不标 `# P13`;§4.2 的「降到 0」对 (B′) 单独不成立。 **4.2 P7 的目标。** `--bucket` 归到 DirectVulkan 引用对象的那一桶(a6 的 101)降到 **0**。唯一还在构造前端 `SamplerObject` / `ShaderObject` / `ProgramObject` 的 DirectVulkan 站点是 `VulkanRenderer.cpp:4526-4583 / 4624-4684`(monolith 臂的隐藏 blit / 深度 mip 程序),其 early-return 是运行时而非 `#if`,所以符号仍被引用。降到 0 的路径:在 **disaggregated 构建里** monolith 臂也改用烘焙模块(§5.2 的 (B')),pull 构建的代码逐语句原样——G1 不动。若 wave 3 实测某桶符号无法在不动 pull `.text` 的前提下消失,按名记入 §12 并在 baseline 里 `# P13` 标注,不算门 4 失败。 @@ -109,7 +109,7 @@ verify 今天只在 monolith 注册(`MG_IntegrationTest/CMakeLists.txt:1684-17 ## §7 出口门 3 与 5:真机与 CTS **7.1 门 3 分母(ID-P7-4,设备窗口 #1 E0a 补正)。** `trace_cases.json` 的 CI split 子集(39)× DirectVulkan × `--use-pbuffer`,排除**在 monolith 臂上就红的 case**——它们按定义不是分离缺陷:`create-indirect`(OQ-17:`dev@81b17c0b` 起在 Adreno 830 上就坏)、`minecraft-1.21.11-main-menu`(trace 自身 UBO offset 不满足本机 32 字节对齐,`notes/p65/mainmenu-trace-difference.md`)、`minecraft-1.21.4-fabric-iris-photon-v1.3b-in-world`(Adreno 830 的 `vkCreateGraphicsPipelines` 对 photon 程序返回 `VK_ERROR_UNKNOWN`,`Renderer/PipelineFactory.cpp:660`,monolith SSIM 0.0089;桌面 lavapipe 绿;按 OQ-17 先例归 `dev` 侧独立条目);rd12 in-world 不在 `--matrix` 里。**分母 = 36**。`iterationrp` 带 `apk.yml:460-462` 的三个 Magma 旋钮。排除表随每次窗口更新于 `notes/p7/device-window-/E0-attribution/exclusions.md`。 -**7.2 门 3 判据(逐 case 对 monolith 臂,不是对 golden 的平 1.0)。** E0a 实测 monolith × DirectVulkan 对 golden 的 SSIM 在 0.996–1.000(iris 光影 case 最低 0.99617),只有 OpenRA 是 1.000000——golden 来自桌面,阈值吸收驱动差。所以门 3 = 同一 reboot-clean 会话内,对分母中每个 case:inproc **与** spawn(或 tcp)三遍**逐位相同**(零翻转),且每遍 `ssim vs golden` ≥ 该 case 阈值 **且与 monolith 臂同会话读数之差 ≤ 0.0005**(OpenRA 两臂都必须 1.000000、mismatch 0);`RUN_AHEAD=0` 对照臂一遍记录。证据目录 `docs/Disaggregated/notes/p7/device-window-/`。定位实验顺序 E0–E6 见计划 §3 wave 1。**状态(W4,p7w4 = `8c5dd6fc`,ID-P7-25)**:inproc 一遍 34/36 与 monolith 差 ≤ 0.0005;OpenRA 是与温度无关的约 50% 竞态(两张图,lockstep 第三张),验收改为 run-ahead 与 lockstep 各 6 遍全等 golden;bsl-esc-menu inproc OOM 待 spawn 臂。**状态(W5,p7w5 = `c89000f5`,ID-P7-34)**:OpenRA **27/27 golden**(inproc/spawn × run-ahead/lockstep × 冷/热 + FIF=8 + dump-armed)——项关闭;余 bsl-esc-menu(M2)与终局形式(p7w6:分母 36 三遍逐位 + spawn 臂同会话)。 +**7.2 门 3 判据(逐 case 对 monolith 臂,不是对 golden 的平 1.0)。** E0a 实测 monolith × DirectVulkan 对 golden 的 SSIM 在 0.996–1.000(iris 光影 case 最低 0.99617),只有 OpenRA 是 1.000000——golden 来自桌面,阈值吸收驱动差。所以门 3 = 同一 reboot-clean 会话内,对分母中每个 case:inproc **与** spawn(或 tcp)三遍**逐位相同**(零翻转),且每遍 `ssim vs golden` ≥ 该 case 阈值 **且与 monolith 臂同会话读数之差 ≤ 0.0005**(OpenRA 两臂都必须 1.000000、mismatch 0);`RUN_AHEAD=0` 对照臂一遍记录。证据目录 `docs/Disaggregated/notes/p7/device-window-/`。定位实验顺序 E0–E6 见计划 §3 wave 1。**状态(W4,p7w4 = `ae3f43ab`,ID-P7-25)**:inproc 一遍 34/36 与 monolith 差 ≤ 0.0005;OpenRA 是与温度无关的约 50% 竞态(两张图,lockstep 第三张),验收改为 run-ahead 与 lockstep 各 6 遍全等 golden;bsl-esc-menu inproc OOM 待 spawn 臂。**状态(W5,p7w5 = `713bea9a`,ID-P7-34)**:OpenRA **27/27 golden**(inproc/spawn × run-ahead/lockstep × 冷/热 + FIF=8 + dump-armed)——项关闭;余 bsl-esc-menu(M2)与终局形式(p7w6:分母 36 三遍逐位 + spawn 臂同会话)。 **7.3 门 5。** 块与 caselist(`tools/cts/caselists/`,取自 VK-GL-CTS `0b04c470e`,即设备上 glcts 的源):`KHR-GL46.texture_*`(1055)、`KHR-GL46.shader_image*`(125)、`KHR-GL46.packed_pixels`(4732)、`KHR-GL46.direct_state_access.*`(371)、**UBO 在 KHR 包里没有专属组**——取 GTF 模块 `GTF-GL46.gtf31.GL3Tests.uniform_buffer_object*`(90,设备 glcts 若未含 GTF 则该块记 unrun)、另加 `KHR-GL46.shader_storage_buffer_object`(124,簇 A 的 unaligned / native-range 拒绝实际打的是 SSBO range)。`KHR-GL46` 在 Android 跑器上未证实可开 4.6 core context:窗口先探针;不行则 `$BASE` 与 AFTER 都用 `gl33` 变体(texture 868 / packed_pixels 4732 / ubo 90;GL 3.3 无 shader image、无 DSA),**同一 API 版本比 0.5 pp**。先 monolith × DirectVulkan 基线入库 `tools/cts/baselines/`,迁移落地后 inproc × DirectVulkan 比对:每块 pass 率差 ≤ 0.5 pp(Pass/(Pass+Fail),NS 不入分母),**新增 crash = 0 单独硬红**。完整 caselist(~56k)在合 `dev` 前跑,不在关键路径。 --- @@ -157,11 +157,11 @@ verify 今天只在 monolith 注册(`MG_IntegrationTest/CMakeLists.txt:1684-17 ## §12 记录债 -- ~~Magma 两进程 client 在 `StateObjectDeathOps` 落地前 `ObjectDeaths=0`:`CtWireScenario` 死亡用例在 Magma 臂按名 skip(§2.3)。~~ **已退(wave 2-C,`04292f06`)**:两处 skip 守卫删除,死亡用例在三臂全绿;泄漏的是 **server 的 twin**(framebuffer 无 wire delete opcode,用例现在两边计数都读)。 +- ~~Magma 两进程 client 在 `StateObjectDeathOps` 落地前 `ObjectDeaths=0`:`CtWireScenario` 死亡用例在 Magma 臂按名 skip(§2.3)。~~ **已退(wave 2-C,`dce9953d`)**:两处 skip 守卫删除,死亡用例在三臂全绿;泄漏的是 **server 的 twin**(framebuffer 无 wire delete opcode,用例现在两边计数都读)。 - §5.4 的「白盒断言发出的是 `BufferSubDataResident(49)`」在本树**不可达**:resident 发射需要 GPU 常驻存储 → 需要 `AdoptPersistentMap` → split 下 T2 对每次采纳都 decline(`PipeApply.cpp:2331`),T0/T1 归 P11。本阶段证明到「server 按自己的表发布该位、client 镜像在双后端 × 三传输收到」为止;`rsd=` PipeStats 计数器在 P11 落地采纳档后会显示这些记录。 - §5.3 的 `g_programResourceCaches` 删除只在 disaggregated 构建:monolith 消费者已改读归档(red-once 在 monolith 臂也红),但归档成员必须 `#if MOBILEGL_BUILD_DISAGGREGATED` 才能守 G1,pull 构建保留旧缓存——钉子挪动那天一行改完,**P13**。 - 门 3 的「不确定」在 wave 1 E0 之前无法区分「同 case 多次结果不同」与「不同 case 各自低于阈值」;两个历史点值(0.988998 / 0.976494)无 per-case 归属。**已归属(W4,ID-P7-25)**:两个点值都是 OpenRA 同一帧里被静默丢掉的一段 draw(9836 / 14658 像素),run-ahead 与 spawn 臂都掷硬币;修复归 B3。 -- ~~`TextureViewAliasScenario.TheOwnerUploadDrainRunsAgainAfterADrawBoundary` 在三条 split 臂按名排除~~ **已退(wave 2-D3,`6eaaf492`)**:split 的 clean gate 改读 storage record(`IsDrawSyncCleanByRecord` 走 `Desc.ViewOf` 到 owner,与 Magma 的 `ResolveWireTextureStorage` 同形),排除删除,三臂 3 红 → 14/14;P5E §5.2 改写。留下的:该场景的 Magma 臂只在 informational 层;`KHR-GL46.texture_view.coherency` 无 split 读数(门 5)。 +- ~~`TextureViewAliasScenario.TheOwnerUploadDrainRunsAgainAfterADrawBoundary` 在三条 split 臂按名排除~~ **已退(wave 2-D3,`1e1f4bad`)**:split 的 clean gate 改读 storage record(`IsDrawSyncCleanByRecord` 走 `Desc.ViewOf` 到 owner,与 Magma 的 `ResolveWireTextureStorage` 同形),排除删除,三臂 3 红 → 14/14;P5E §5.2 改写。留下的:该场景的 Magma 臂只在 informational 层;`KHR-GL46.texture_view.coherency` 无 split 读数(门 5)。 - **OpenRA 调查裁判点名的 Magma 债(`notes/p7/device-window-1/W4-verify/README.md` §3b、`~/w7/notes/evidence/w4/judge.json`),B3 不动、记在这里**:`TryDrainFrameTransients` 的 wire-only 块 `CollectWireObjects(m_completedSubmitCounter, /*all=*/true)`(`VulkanRenderer.cpp:13526`)无视 `RetireWireObjects` 给未来对象打的 `submitIndex = m_submitCounter + 1` 标签(`WireDraw.inc:113-118, 175-194`);`HasPendingRecordedWork`(`:13435-13441`)看不见 pre-pass 命令流;`FlushWirePendingCommandsForTextureUpdate = !HasPendingRecordedWork() || FlushPendingCommands()`(`VulkanRenderer.h:148-152`)把「此刻没在录」当「没在飞」;`StagedTextureStore::AdoptRun` 在 extent 变化时不重置 `Bytes`/`Covered`(`StagedTextureStore.h:234-243` vs `:270-284`,一条单测即红);`FrameContext::WaitAndAcquireNextImage`(`FrameContext.cpp:303-312`)只凭槽 fence 释放中帧 flush 过的命令缓冲。本 trace 都不可达,但都是真债。 - **bsl-esc-menu-854 在 wire 臂上是内存缺陷不是排除项**(W4 §2/§3c):monolith 807 MiB 峰值通过;spawn 下 server 进程涨到 ~1.2 GiB 在 scudo 二级分配器 `internal map failure (Out of memory)` 死(系统尚余 8 GB → 是映射数或每进程上限,不是系统 OOM),client 同时 543 MiB;inproc 1.6 GiB 也死。**M1 已归因(主机 lavapipe,三臂同图)**:不是 store 的字节复制,是 split server **无界累积死 `VkBuffer`**——`RespecifyWireBuffer`(`VkBufferManager.cpp:189-224`)对每个 `glBufferData` 无条件 `DeferRelease` 进按帧槽分桶的 `m_deferredBufferReleases`,而桶只在 `BeginFrame`/`CollectAllDeferredReleases` 扫(`TryDrainFrameTransients` 与 present 路径),**pbuffer 回放整跑 server 只收到 1 条 present 记录**、drain 约每分钟成功两次 → 25 935 个活 VkBuffer(25 923 死)对 monolith 7 个,lavapipe 上每个一条 `memfd` 映射(27.4k → 41k),+12.2 MiB / 7.2 s,与真机 server 527 → 1162 MB 的爬升同量;轻例 `iris-bsl-in-world` 同形 1000×小(93 活 / 74 死)——随帧界之间的调用数增长,不是结构性。`StagedTextureStore` 是每层第二份拷贝(43 MiB)但平台;`PendingUploads` 0 字节(与 B3 无关);monolith 式条件 orphan 无效(6701 vs 6702)。附带:`CollectGarbage()`/`pruneWire`(`VulkanRenderer.cpp:6989`)在 `SetupDraw` 转 `SetupWireDraw` 之后、wire 臂从不执行。修复包 **M2**(`VkBufferManager.{h,cpp}`:按 serial 的 fence-gated 回收 + `MOBILEGL_IPC_WIRE_DEFERRED_MB` 水位线;red-once = 单帧内 N 次 respecify 后活 VkBuffer ≤ k×wire buffers)。**未答**:真机上是 `vm.max_map_count` 还是字节(采样器没记 maps 行数;Adreno 的 VMA 256 MiB 块推测是字节)。**「只有一条 present」已答(P-present 调查)**:不是 pbuffer、不是 client 决定——该 fixture 1 303 535 次调用里只有 **2 次 `eglSwapBuffers`**(call 1 301 789 与目标 call 1 303 534),harness 在目标 swap 上先快照后 `exit`(apitrace `retrace_main.cpp` 的 `frameComplete` → `mobilegl_apitrace_exit` 抛出(`tools/trace_replay/CMakeLists.txt:186-189` 的宏替换),在 apitrace `glretrace_egl.cpp` 的 `frame_complete` 里、`drawable->swapBuffers()` 之前解栈),所以到达 MobileGL 的 swap = 1、present 记录 = 1、`OnPresent` = 1;规则 `presents = (swaps with call_no ≤ target) − 1`(OpenRA 30 → 29,B3 测得 33 次 `BeginFrame` = 29 present + 起会 + drain)。client 的 `SwapBuffers → BackendObject::SwapEGLBuffers → Present()` 链无任何 surface-kind 分支,credit 只停不丢。结论:**server 侧任何挂在 present 上的回收都不能假设一帧有界**(一帧可以是 1.3 M 调用的 Iris 换包重编译),M2 的按 serial 回收正是这个形状;`TryDrainFrameTransients` 的两道闸 + 每 8 次的节流不是替代品。附带债:`BackendObject.cpp:385-388` 单活动面守卫对多 surface 的 client 会静默丢 present(本 trace 不触发)——该给 `MGLOG_E_ONCE`/计数。 - `MEASUREMENTS.md` §7.2 的同名比对自 P5b 起未重跑;「22 → texture readback」「3 → query」两行债务的关闭以 wave 3 的重跑为准。 diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index f493d9d6..9c6d795c 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -2,7 +2,7 @@ ## P6.5 第一波(2026-09-22) -实现、代码审查与主要正确性门已完成;**已落地并推送 `feat/disaggregated@fe27380a`(2026-09-22)**(原 +实现、代码审查与主要正确性门已完成;**已落地并推送 `feat/disaggregated@fe28bdb5`(2026-09-22)**(原 在 `codex/p65-all-tcp` 的 WIP + 本次审查修复 + 收尾文档一并合入)。完整 39 例 device golden 矩阵与全套 链路必测数按用户「本地代表性、CI 兜底」留 CI/后续,**尚未宣布阶段收官**。 @@ -46,9 +46,9 @@ `2f7cbe2e` reboot-clean、同热窗口配对 A/B)判读为 **tie**——`inproc` 与 `spawn` 的 client CPU/帧 差 −0.15%(会话 1)/ +0.16%(会话 2),都落在臂内散布之内,如实记录、不设门;门 8 的三个强制 性能数(socket 门铃 vs condvar、`SEG_STAGE` 字节/帧、chunking 后记录/帧)已采齐,逐数见 §2; -G1 pull 构建 **0/0/0/0** 且 `.text` 逐字节相同。测量期的源头:门 7 报告记 `98d0b96c`、门 8 的 -wire 计数器与真机第二轮记 `71aa9951`。分支 `feat/disaggregated` 其后又落地两个 P6.5 设计提交 -(`2d86e07a`、`2bd86664`),**现头 `2bd86664`,与 `origin` 同步**;**工作树另有未提交的 P6 收尾 +G1 pull 构建 **0/0/0/0** 且 `.text` 逐字节相同。测量期的源头:门 7 报告记 `75dd0cb1`、门 8 的 +wire 计数器与真机第二轮记 `94c130d6`。分支 `feat/disaggregated` 其后又落地两个 P6.5 设计提交 +(`872370ba`、`4e7bf0fe`),**现头 `4e7bf0fe`,与 `origin` 同步**;**工作树另有未提交的 P6 收尾 改动**(wire 计数器、`ServerMain` 的 `PipeStats` 武装、`MOBILEGL_PIPE_STATS_FILE` 角色派生、设备行 与工具入库、测试),见 §1.1。三种传输形态(`monolith` / `inproc` / `spawn`)在桌面(WSL lavapipe) 与真机(Redmi `2f7cbe2e`)上都跑通了真实 trace 的两进程 retrace,逐像素对上 golden。性能**只记录、 @@ -62,25 +62,25 @@ wire 计数器与真机第二轮记 `71aa9951`。分支 `feat/disaggregated` 其 | 包 | 落地什么 | 状态 / 证据 | |---|---|---| -| **a6** | 进程装配与链接边界的核验;198 行审计;184 符号的链接实验(server 不能不链 `MG_Impl`) | ✅ `785fed0b`;[`notes/p6/a6-audit-v1.md`](notes/p6/a6-audit-v1.md)、[`a6-link-experiment.md`](notes/p6/a6-link-experiment.md) | -| **c6** | 规范契约(21 条裁定)+ 数据面缝 `Transport/ILink.h` / `StreamLink.h`(声明不接线) | ✅ `0bbe41c2`;`CONTRACT-P6.md` | -| **lk** | `RingControl` 按写者重组 + 可证伪的 per-field 断言;数据面缝的 pre-flight | ✅ `a54ae47a`、`f4cbaa89` | -| **so** | `SocketTransport`(AF_UNIX SOCK_STREAM + SCM_RIGHTS),12 条 ITransport 契约用例 | ✅ `a3518361` | -| **sm** | 两个**独立启动**的进程(非 fork),靠 name 汇合、共享匿名段;D1c 的六谓词里 D10 需要的三个,四个「编进来却永不武装」的守卫接线 | ✅ `e156ea5f`、`207c31f6`、`743d1fac` | -| **cp** | EGL 控制帧跨进程并应答;`InitCapabilities` 上线(wire kind 11);真实 trace 两进程 retrace 逐像素通过 | ✅ `b0f4f8b7`、`ea9fc7fa` | -| **hs** | build stamp 从「静默空串」变成显式 present 标志入指纹;客户端补检 `abiMajor/Minor`;`Hello::pid` / `Welcome::serverPid` 携带真实 pid | ✅ `570ebde9` | -| **dl** | device-lost 闩(取自描述符的挂断,绝不取自超时);D5b「alive-but-silent」具名诊断;`MOBILEGL_IPC_RESPAWN` 具名拒绝;`Session::Fail` 漏斗(`FatalFamilies.def` 词表 + 90 站点归一 + `SessionFault` 帧向对端命名家族);Fatal 普查门 | ✅ `f6a0bd30`、`e7663512`、`e50463dc`、`f98f2067`、`5968863f`、`91d0cb78`、`16bfab10` | -| **st** | fb-slot memo 的具名 Fatal(`nullptr==nullptr` 读成缓存命中、返回未填槽的潜在崩溃,sm 关掉可达性、st 出声) | ✅ `743d1fac` | -| **t6** | `integration-spawn` 车道(102/102);集合一致做成结构性(一个宏两条臂)+ 校验门;per-role 日志 | ✅ `8cd00f42`、`b3155525` | +| **a6** | 进程装配与链接边界的核验;198 行审计;184 符号的链接实验(server 不能不链 `MG_Impl`) | ✅ `c25a7760`;[`notes/p6/a6-audit-v1.md`](notes/p6/a6-audit-v1.md)、[`a6-link-experiment.md`](notes/p6/a6-link-experiment.md) | +| **c6** | 规范契约(21 条裁定)+ 数据面缝 `Transport/ILink.h` / `StreamLink.h`(声明不接线) | ✅ `b6293957`;`CONTRACT-P6.md` | +| **lk** | `RingControl` 按写者重组 + 可证伪的 per-field 断言;数据面缝的 pre-flight | ✅ `99649a90`、`db62d674` | +| **so** | `SocketTransport`(AF_UNIX SOCK_STREAM + SCM_RIGHTS),12 条 ITransport 契约用例 | ✅ `5f846d96` | +| **sm** | 两个**独立启动**的进程(非 fork),靠 name 汇合、共享匿名段;D1c 的六谓词里 D10 需要的三个,四个「编进来却永不武装」的守卫接线 | ✅ `70c45ab9`、`11807ac7`、`e3bb6d8b` | +| **cp** | EGL 控制帧跨进程并应答;`InitCapabilities` 上线(wire kind 11);真实 trace 两进程 retrace 逐像素通过 | ✅ `5239ae0c`、`7e244b37` | +| **hs** | build stamp 从「静默空串」变成显式 present 标志入指纹;客户端补检 `abiMajor/Minor`;`Hello::pid` / `Welcome::serverPid` 携带真实 pid | ✅ `90f9a790` | +| **dl** | device-lost 闩(取自描述符的挂断,绝不取自超时);D5b「alive-but-silent」具名诊断;`MOBILEGL_IPC_RESPAWN` 具名拒绝;`Session::Fail` 漏斗(`FatalFamilies.def` 词表 + 90 站点归一 + `SessionFault` 帧向对端命名家族);Fatal 普查门 | ✅ `557dc2c1`、`8b13d8a8`、`3399b879`、`3a12a48a`、`4bb4d4fa`、`b46da700`、`77cbd176` | +| **st** | fb-slot memo 的具名 Fatal(`nullptr==nullptr` 读成缓存命中、返回未填槽的潜在崩溃,sm 关掉可达性、st 出声) | ✅ `e3bb6d8b` | +| **t6** | `integration-spawn` 车道(102/102);集合一致做成结构性(一个宏两条臂)+ 校验门;per-role 日志 | ✅ `15f5b54b`、`5fb54f03` | 配套:CI 的 `retrace-split` 从「1 case × 1 后端 × inproc」扩成「全 CI 矩阵 × 两后端 × inproc/spawn」, `split` 键改成 opt-out;Android CI 新增 `spawn-acceptance` 臂,真机 App 从 `nativeLibraryDir` 解析 -server 路径(`94e2f2e0`、`15bd9a67`、`1039502e`、`2afa0002`)。 +server 路径(`dc5bd935`、`d83fc664`、`53406749`、`7c8120cc`)。 ### 1.1 收尾(2026-09-22) -下列改动**在两轮测量(门 7 的 `98d0b96c` 头、门 8 的 `71aa9951` 头)之后落地、目前仍在工作树里未 -提交**(其后两个提交 `2d86e07a`、`2bd86664` 只改文档与 `Transport/StreamLink.h` 的注释,不含这些代码): +下列改动**在两轮测量(门 7 的 `75dd0cb1` 头、门 8 的 `94c130d6` 头)之后落地、目前仍在工作树里未 +提交**(其后两个提交 `872370ba`、`4e7bf0fe` 只改文档与 `Transport/StreamLink.h` 的注释,不含这些代码): - **wire 计数器**:`PipeStats` 新增 `ByteClass::StageSegmentBytes`(唯一收口点 `PipeWireCodec.cpp:878` `StageAllocate`)与 `CallClass::WireRecords`(`:1188` `EncodeRecord` 提交 diff --git a/docs/Disaggregated/CURRENT_STAGE_STATUS.md b/docs/Disaggregated/CURRENT_STAGE_STATUS.md index 5e4e4a55..7b73a835 100644 --- a/docs/Disaggregated/CURRENT_STAGE_STATUS.md +++ b/docs/Disaggregated/CURRENT_STAGE_STATUS.md @@ -4,19 +4,19 @@ **阶段:P7 DirectVulkan(Magma)全量迁移**,并行流 **P3b/P4b 深化(Espryt,wave 2-D)** 与 **Ph 小件(簇 F)**。计划 [`notes/p7/PLAN-PH-P34B-P7.md`](notes/p7/PLAN-PH-P34B-P7.md)(五波)。 -**更新:2026-09-22 夜** · `origin/feat/disaggregated` = `1135c664`(B3 + ID-P7-33/34);集成树 `~/w7/pipe` = `51c71d87`(B2 返工 r1 + B3 返工 + V1,未推:等 B2 r2 与 V1 门 / 审查,ID-P7-35/36)。 +**更新:2026-09-22 夜** · `origin/feat/disaggregated` = `3c80cd62`(B3 + ID-P7-33/34);集成树 `~/w7/pipe` = `75858bfd`(B2 返工 r1 + B3 返工 + V1,未推:等 B2 r2 与 V1 门 / 审查,ID-P7-35/36)。 ## 1. 出口门总览(CONTRACT-P7 §8 的 9 项分母) | # | 子系统 | 状态 | 证据 | |---|---|---|---| -| 1 | Magma 两进程车道三臂同数绿 | ✅ | `integration-magma-{split,spawn,tcp}` 96 / 75 / 71,full-split 535(pipe `a785d055`;tcp 少 6 条 = 六个 server 端旋钮条目的具名 parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`);OpenRA DirectVulkan inproc + spawn 回放 1.000000 且 0 条 `unsound-serial-complete`(B3 的新红条件已进 pipe 门) | +| 1 | Magma 两进程车道三臂同数绿 | ✅ | `integration-magma-{split,spawn,tcp}` 96 / 75 / 71,full-split 535(pipe `75a64ce0`;tcp 少 6 条 = 六个 server 端旋钮条目的具名 parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`);OpenRA DirectVulkan inproc + spawn 回放 1.000000 且 0 条 `unsound-serial-complete`(B3 的新红条件已进 pipe 门) | | 2 | §3.2 六个 `@P7` 退役 | ✅ | A(byte-tail、native-range、对齐 decline)、B(copy-image、default-color-blit、mip 半退役)、B2(multisample shape/aspect)、C(vertex-layout 拆分);树上 `@P7` 拒绝站点 **0** | -| 3 | `StateObjectDeathOps` | ✅ | C,`04292f06..7ed5da52` | +| 3 | `StateObjectDeathOps` | ✅ | C,`dce9953d..cf7ca59f` | | 4 | 烘焙 (A)(D) + (B′) | ✅ | B 深度 mip 烘焙;B2 disaggregated 构建的 monolith 臂改用烘焙模块 | | 5 | OQ-8 反射归档 `storageBlocks` | ✅ | C | | 6 | OQ-10 `kCapResidentSubData` 按 server 表发布 | ✅ | C | -| 7 | verify × split(门 2) | 🔄→✅ | **V1 已报告并 cherry-pick 到 pipe**(`e5477898..51c71d87`):monolith verify 1136 不变、`integration-verify-split` 1070(DirectGLES 533 / DirectVulkan 537,逐条 inproc 武装证明)、`VERIFY_CORRUPT` 10/10 红、`POISON_OMIT` 2/2 红(split 臂)、8 verify trace × DV × inproc 0 分歧;verify 只能 inproc(比对器要求推送态与 GL 上下文同进程);pipe 门 + fable 审查在跑 | +| 7 | verify × split(门 2) | 🔄→✅ | **V1 已报告并 cherry-pick 到 pipe**(`a1d17566..75858bfd`):monolith verify 1136 不变、`integration-verify-split` 1070(DirectGLES 533 / DirectVulkan 537,逐条 inproc 武装证明)、`VERIFY_CORRUPT` 10/10 红、`POISON_OMIT` 2/2 红(split 臂)、8 verify trace × DV × inproc 0 分歧;verify 只能 inproc(比对器要求推送态与 GL 上下文同进程);pipe 门 + fable 审查在跑 | | 8 | 真机 ssim 1.0(门 3,分母 36) | 🔄 | p7w4:34/36 与 monolith 差 ≤ 0.0005;**OpenRA 已关**(ID-P7-33/34:真因 = wire 臂 frame-serial floor 不健全,B3 修;p7w5 **27/27 golden**,[`W5-verify/`](notes/p7/device-window-1/W5-verify/README.md));**bsl-esc-menu** = server 死 VkBuffer 无界累积(ID-P7-32,**M2** 在修);终局形式(三遍逐位 + spawn 臂同会话)留 p7w6 | | 9 | CTS 五块 AFTER ≤ 0.5 pp(门 5) | ⏳ | `$BASE` 已取(`notes/p7/device-window-1/CTS-base/`);AFTER 在 wave 4 | @@ -26,25 +26,25 @@ | 波 / 包 | 内容 | 落地 | |---|---|---| -| wave 0 | Magma 两进程车道、`link_ratchet.py`、普查门扩容 + `MGPipeSessionFailHook`、设备跑器 `--matrix/--repeat/--archive-dir`、CTS caselists | `origin@8652bac0` | +| wave 0 | Magma 两进程车道、`link_ratchet.py`、普查门扩容 + `MGPipeSessionFailHook`、设备跑器 `--matrix/--repeat/--archive-dir`、CTS caselists | `origin@801f8eda` | | wave 1 | 设备窗口 #1(Redmi 2f7cbe2e,DirectVulkan):门 3 分母 36、E0–E7 归因、CTS `$BASE` | `notes/p7/device-window-1/` | -| X1 | persistent-map tracker 在 arm64 不认领 fault(bionic 指针标记 0xb4) | `0a41972b` | -| F1 | split 起会提到 `MG_State::Init()` 之前 + `Fatal{CapsBeforeFirstSnapshot}` | `5d698cb9..3c8082cc` | -| C | Magma `StateObjectDeathOps`、OQ-10、vertex-layout 拆分、OQ-8 `storageBlocks` | `04292f06..7ed5da52` | -| A | UBO/SSBO/texel 对齐与 native-range 行 | `5a14e5a1..9376bea3` | -| B | mip 形状半退役、深度 mip 烘焙、copy-image、default-color-blit、wire 回读 fence | `c5fa52f9..64530ed2` | -| D1 | XFB 两洞、回调 10→9、resolver 具名 stop、readback 三臂 | `e35a0973..8c5dd6fc` | -| D2 + 返工 | `TextureViewAlias`、TUS 门、memo 纯度门、`SubsystemDeps.def`、场景普查 | `9d857dc0..e7c5fc60`、`3cdaa5ee..c13ba36b` | -| D3 + 审查修复 | view 陈旧缺陷(clean gate 读 storage record)、D-K2 单一陈述 | `6eaaf492..25b586d0`、`f1f2a19e` | -| B2 | multisample 两处退役、AllocatorDebtScope ×2 删、(B′)、棘轮 173 | `089fd495..ec46a550` | -| B3 | **OpenRA 真因**:wire 臂 completed-frame-serial floor 不健全 → 有序路径 + 可证 floor + 32 处静默出口具名 | `f62ceec6..38112dc6`,`origin@1135c664` | -| B2 返工 r1 | tcp 五条 server 端旋钮条目改 split+spawn(parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`)、翻转 MS 深/模板 resolve 逐行镜像、缩放 / X 镜像 / 跨格式 decline、`MsFlip.` 用例 | pipe `475ab254..00f342c9`(审查 rework → r2 在跑,ID-P7-35) | -| B3 返工 | `WireDeclines.def` 53 行全站点 + 审计脚本、`StaleSerial.` parity 例外、注记 + `:273`/`:432`、`run_trace_case.cmake` 对 `unsound-serial-complete` 打红 | pipe `23eeed68..a785d055`(审查 land with fixes → 修复轮在跑,ID-P7-36) | -| V1 | `PipeRespecifyScope` 放宽、`integration-verify-split`(1070 条,双后端 inproc)、两负控 split 臂红、8 verify trace × DV × inproc 0 分歧、比对器 ReadPixels 窗口 oracle 改中性 pack | pipe `e5477898..51c71d87`(门 + 审查在跑) | +| X1 | persistent-map tracker 在 arm64 不认领 fault(bionic 指针标记 0xb4) | `4cbf78c2` | +| F1 | split 起会提到 `MG_State::Init()` 之前 + `Fatal{CapsBeforeFirstSnapshot}` | `df17c416..3179c497` | +| C | Magma `StateObjectDeathOps`、OQ-10、vertex-layout 拆分、OQ-8 `storageBlocks` | `dce9953d..cf7ca59f` | +| A | UBO/SSBO/texel 对齐与 native-range 行 | `450d3075..5937b4fc` | +| B | mip 形状半退役、深度 mip 烘焙、copy-image、default-color-blit、wire 回读 fence | `c4be3800..76b74693` | +| D1 | XFB 两洞、回调 10→9、resolver 具名 stop、readback 三臂 | `faf0a1f9..ae3f43ab` | +| D2 + 返工 | `TextureViewAlias`、TUS 门、memo 纯度门、`SubsystemDeps.def`、场景普查 | `da30c130..519445f9`、`b3334cf3..a2d7fbd7` | +| D3 + 审查修复 | view 陈旧缺陷(clean gate 读 storage record)、D-K2 单一陈述 | `1e1f4bad..00d02396`、`22761a69` | +| B2 | multisample 两处退役、AllocatorDebtScope ×2 删、(B′)、棘轮 173 | `452d33b5..3c2867d3` | +| B3 | **OpenRA 真因**:wire 臂 completed-frame-serial floor 不健全 → 有序路径 + 可证 floor + 32 处静默出口具名 | `76bbb6c3..9a494b6f`,`origin@3c80cd62` | +| B2 返工 r1 | tcp 五条 server 端旋钮条目改 split+spawn(parity 例外 `MAGMA_SERVER_ENV_KNOB_NO_TCP`)、翻转 MS 深/模板 resolve 逐行镜像、缩放 / X 镜像 / 跨格式 decline、`MsFlip.` 用例 | pipe `9fed478d..cc3c18c5`(审查 rework → r2 在跑,ID-P7-35) | +| B3 返工 | `WireDeclines.def` 53 行全站点 + 审计脚本、`StaleSerial.` parity 例外、注记 + `:273`/`:432`、`run_trace_case.cmake` 对 `unsound-serial-complete` 打红 | pipe `b8d10d07..75a64ce0`(审查 land with fixes → 修复轮在跑,ID-P7-36) | +| V1 | `PipeRespecifyScope` 放宽、`integration-verify-split`(1070 条,双后端 inproc)、两负控 split 臂红、8 verify trace × DV × inproc 0 分歧、比对器 ReadPixels 窗口 oracle 改中性 pack | pipe `a1d17566..75858bfd`(门 + 审查在跑) | ## 3. 真机(Redmi 2f7cbe2e,Adreno 830) -- 当前 APK:**p7w5**(`p7w5-c89000f5`,B3+B2+D3 之上)。验收 = OpenRA inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、FIF=8 ×3、dump-armed ×3 → **27/27 `ace2af04` / 1.000000 / 0 px**;iterationt ×2 + 26.3 逐位同 p7w4(ID-P7-34)。 +- 当前 APK:**p7w5**(`p7w5-713bea9a`,B3+B2+D3 之上)。验收 = OpenRA inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、FIF=8 ×3、dump-armed ×3 → **27/27 `ace2af04` / 1.000000 / 0 px**;iterationt ×2 + 26.3 逐位同 p7w4(ID-P7-34)。 - p7w4 结论([`W4-verify/README.md`](notes/p7/device-window-1/W4-verify/README.md)):OpenRA 是与温度无关的约 50% 竞态、只出三张图;调色板纹理逐字节正确;错像素 100% 落在 call 30376 一次 draw 的 quad 前缀里;机制由裁判裁定并由 B3 计数证实。 - bsl-esc-menu-854:monolith 807 MiB 过,spawn 的 server 1.2 GiB 死(scudo `internal map failure`);M1 归因 = 死 VkBuffer 无界累积(一帧 1.3 M 调用、整跑 2 次 swap);M2 修复中。 diff --git a/docs/Disaggregated/MEASUREMENTS.md b/docs/Disaggregated/MEASUREMENTS.md index e7c3f826..0e7e201a 100644 --- a/docs/Disaggregated/MEASUREMENTS.md +++ b/docs/Disaggregated/MEASUREMENTS.md @@ -616,7 +616,7 @@ P6(spawn transport)的实现包(a6 / c6 / lk / so / sm / cp / hs / dl / st | 跑法 | `--benchmark-repeats 3`(门 7)/ `2`(门 8),`--benchmark-tail-frames 200`,`--benchmark-no-finish`,best-of-3 / best-of-2 | | split 开关 | `MOBILEGL_IPC_ROLE_SPLIT_STATE=1`、`MOBILEGL_IPC_STRICT_ERRORS=1`、`MOBILEGL_IPC_RUN_AHEAD=1` | | stats | `MOBILEGL_PIPE_STATS=1`、`MOBILEGL_PIPE_STATS_PERIOD=120` | -| 源码头 | 门 7 会话 `98d0b96c`;门 8 两会话 `71aa9951` + §12.6 的收尾改动(工作树) | +| 源码头 | 门 7 会话 `75dd0cb1`;门 8 两会话 `94c130d6` + §12.6 的收尾改动(工作树) | | 臂的证明 | 每个 spawn 臂必须在**自己的**私有日志里出现 `Config: MOBILEGL_TRANSPORT=spawn` 与 `spawn ARMED - the server role runs in pid N`;`--transport` 在 `--benchmark` 模式下被 runner 忽略(会静默跑成 monolith),所以传输一律用显式 `--env MOBILEGL_TRANSPORT=…`,跑完按库自己的日志核对 | **主指标 = client GL 线程自身的逐线程 CPU ms/帧**(§9 的规则:内核对本 app 的 `sched_setaffinity` 请求不生效,进程总量会把两个时钟域混在一起),由设备在**尾 200 帧**上汇总;`fps` 与 wall p50/p95 并列记录,不作主指标。 @@ -773,7 +773,7 @@ P6(spawn transport)的实现包(a6 / c6 / lk / so / sm / cp / hs / dl / st - **spawn client 的窗口化字段仍不可信**,而且这一项是**结构**不是缺陷:要让 spawn client 推进窗口,得让 client 进程到达一次 `PipeStats::OnPresent`,而 client 的帧边界在 spawn 下是 `EmitPresent`(每条 present 记录一次)——接上去会与 backend 的帧边界重复计数。**不要顺手接**。 - **`MOBILEGL_IPC_STAGE_MB` 同时是 arena 大小与 chunk 预算的来源**,所以分块的净效果没有被单变量隔离(§12.5 的 `tex` +194%)。 -## 13. P3b/P4b wave 2-D 包 D2(`7ed5da52`,WSL 桌面 lavapipe/llvmpipe) +## 13. P3b/P4b wave 2-D 包 D2(`cf7ca59f`,WSL 桌面 lavapipe/llvmpipe) ### 13.1 上传形状金标(R-11 / D-D4,`TextureUploadShapeScenario` 由记录升为门) diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index da7c5f10..0309cf7c 100644 --- a/docs/Disaggregated/ROADMAP.md +++ b/docs/Disaggregated/ROADMAP.md @@ -1,6 +1,6 @@ # MGPipe 路线图 -> 状态:**P0、P0.5、P1、P2、P3a、P4a、P5、P5b、P5c、P5d、P5e、P5f 已收官**。P5f 于 2026-09-20 完成主机门、Redmi 六个 clean-boot 臂、跨模型族审查及修复验证;最终验收代码为 WSL `cfca93c7885fd8db1e881f91189ba59090ae9c52`(Windows `c42577a4` 等价)。证据见 [`notes/p5f/close-report.md`](notes/p5f/close-report.md)、[`close-review.md`](notes/p5f/close-review.md)、[`device-report.md`](notes/p5f/device-report.md)。**P6 已收官(2026-09-22)**:全部包(a6 / c6 / lk / so / sm / cp / hs / dl / st / t6)已落地于 `feat/disaggregated`(头 `16bfab10`,2026-09-21),出口门第 1–6 项此前已达成;**第 7 项**(Redmi `2f7cbe2e` 的 reboot-clean 同热窗口配对 A/B)与**第 8 项**(三个强制性能数)已于 2026-09-22 采齐——门 7 判读为 **tie**(inproc vs spawn 的 client CPU p50 差 −0.15% / +0.16%,均在臂内散布 0.2–4.2% 之内,符号随臂序翻转;monolith 基线约贵 30%),门 8 三数齐:门铃 A/B tie(`clipark` 略差)、`SEG_STAGE` 字节/帧、分块后记录/帧。证据 [`notes/p6/gate7-device-ab.md`](notes/p6/gate7-device-ab.md)、[`notes/p6/gate8-doorbell-device.md`](notes/p6/gate8-doorbell-device.md)、[`notes/p6/gate8-wire-counters.md`](notes/p6/gate8-wire-counters.md)。逐包状态、出口门逐项、证据见 [`CURRENT_STAGE_PROGRESS.md`](CURRENT_STAGE_PROGRESS.md);设计见 `ARCHITECTURE.md`。P5e 的历史性能与 E1 对照债保留在阶段行、[`P5E-RUNAHEAD.md`](P5E-RUNAHEAD.md) 和 `MEASUREMENTS.md`,不由 P5f 的新对照代为关闭。**CI / inproc 功能补齐已收官(2026-09-21)**:拆分主产物 + inproc 主验收、完整 retrace 双 transport、18 项 CI 门、双 ABI APK / AVD 全绿并合入 `feat/disaggregated`(`e1bf3677`),(原记 `CURRENT_STAGE_PROGRESS.md` §2.8;该文档已为 P6.5 重写,原文在 git 历史)。**2026-09-22 起进入 Ph / P3b-P4b / P7 统筹推进**:三行逐项审计、判定与波次见 [`notes/p7/PLAN-PH-P34B-P7.md`](notes/p7/PLAN-PH-P34B-P7.md),裁定见 [`notes/p7/INTEGRATOR-DECISIONS-P7.md`](notes/p7/INTEGRATOR-DECISIONS-P7.md)。 +> 状态:**P0、P0.5、P1、P2、P3a、P4a、P5、P5b、P5c、P5d、P5e、P5f 已收官**。P5f 于 2026-09-20 完成主机门、Redmi 六个 clean-boot 臂、跨模型族审查及修复验证;最终验收代码为 WSL `cfca93c7885fd8db1e881f91189ba59090ae9c52`(Windows `c42577a4` 等价)。证据见 [`notes/p5f/close-report.md`](notes/p5f/close-report.md)、[`close-review.md`](notes/p5f/close-review.md)、[`device-report.md`](notes/p5f/device-report.md)。**P6 已收官(2026-09-22)**:全部包(a6 / c6 / lk / so / sm / cp / hs / dl / st / t6)已落地于 `feat/disaggregated`(头 `77cbd176`,2026-09-21),出口门第 1–6 项此前已达成;**第 7 项**(Redmi `2f7cbe2e` 的 reboot-clean 同热窗口配对 A/B)与**第 8 项**(三个强制性能数)已于 2026-09-22 采齐——门 7 判读为 **tie**(inproc vs spawn 的 client CPU p50 差 −0.15% / +0.16%,均在臂内散布 0.2–4.2% 之内,符号随臂序翻转;monolith 基线约贵 30%),门 8 三数齐:门铃 A/B tie(`clipark` 略差)、`SEG_STAGE` 字节/帧、分块后记录/帧。证据 [`notes/p6/gate7-device-ab.md`](notes/p6/gate7-device-ab.md)、[`notes/p6/gate8-doorbell-device.md`](notes/p6/gate8-doorbell-device.md)、[`notes/p6/gate8-wire-counters.md`](notes/p6/gate8-wire-counters.md)。逐包状态、出口门逐项、证据见 [`CURRENT_STAGE_PROGRESS.md`](CURRENT_STAGE_PROGRESS.md);设计见 `ARCHITECTURE.md`。P5e 的历史性能与 E1 对照债保留在阶段行、[`P5E-RUNAHEAD.md`](P5E-RUNAHEAD.md) 和 `MEASUREMENTS.md`,不由 P5f 的新对照代为关闭。**CI / inproc 功能补齐已收官(2026-09-21)**:拆分主产物 + inproc 主验收、完整 retrace 双 transport、18 项 CI 门、双 ABI APK / AVD 全绿并合入 `feat/disaggregated`(`e1bf3677`),(原记 `CURRENT_STAGE_PROGRESS.md` §2.8;该文档已为 P6.5 重写,原文在 git 历史)。**2026-09-22 起进入 Ph / P3b-P4b / P7 统筹推进**:三行逐项审计、判定与波次见 [`notes/p7/PLAN-PH-P34B-P7.md`](notes/p7/PLAN-PH-P34B-P7.md),裁定见 [`notes/p7/INTEGRATOR-DECISIONS-P7.md`](notes/p7/INTEGRATOR-DECISIONS-P7.md)。 > **P5f 后续 Magma run-ahead 已完成**(`194382c9`,2026-09-20):主机真实排队、credit、负控及 Vulkan 同步验证通过,Redmi 同包 Magma 开/关与 GLES 三臂 FCL 世界实测通过。见 [报告](notes/p5f/magma-runahead.md)。P6 / P7 全阶段状态不因此改变。 @@ -34,11 +34,11 @@ | **P5d** `inproc` 性能专项 | ✅ `cb06538c`、`56a77348`、`1f8de61b` | 一二轮:persistent-map 推送三级臂(mprotect 脏页追踪 + 哈希抑制 + 绑定过滤 `PushDrawConsumers`)、barrier 批处理 `MOBILEGL_IPC_BATCH_WAITS` + 延期销毁队列、自旋时钟 64 合 1、零页注册 + shadow 页对齐分配。三轮(按符号化 profile 逐项切,四包 + 一份 lockstep 可行性研究):apply 空转轮询零锁(控制邮箱原子影子位)、`Doorbell::Wait` 校准自旋稳态不读时钟、wait/park 计数进 stats;`OnApplyThread()` 内联为线程指针比较、三个 scope 深度计数器退掉 `thread_local`;shadow 分配尺寸补页、追踪范围向外对齐、边块哈希消失、脏页排空修复;image unit 高水位、残余填充 memo、server stamp 常量表;`generate_mipmap` 不再免等(apply 读残余输入)、death 测试围栏 | 三轮设备(Redmi,CPU 定频):inproc **64.3 → 103-106 fps**(p50),client 线程 CPU 15.0 → 9.2 ms/帧、apply 12.4 → 7.0-7.4;monolith 同场景 115(120 Hz vsync 封顶的运行)/ 206(一次未封顶,渲染线程 5.0 ms/帧 大核);配对比较以逐线程 CPU/帧为主,见报告"数字"节;unit 2203/2203、`integration-split` 111/111(两条曾 flaky 的用例复跑 6/6);双生成器、include 闭包、dirty-surface、doc 引用绿。未完成:R-1 序列化(研究结论:留给 P3b/P4b 后的 P11 `gPipeInputs` 版本化)、线程放置(内核忽略亲和)、`SetHashSuppressor` 哈希等小项。报告:[`P5D-INPROC-PERFORMANCE.md`](P5D-INPROC-PERFORMANCE.md) | P5b | | **P5e** 退役 Espryt draw path 的 lockstep | ✅ **已收官(2026-09-19)**,附一条具名未决:E1 对照需按 ID-114 重新定义 | 契约 `MG_Remote/CONTRACT-P5E.md`(规则 F:**未设障**记录的 apply 不得读任何 client 内存;ID-84 限定它只约束未设障记录);裁定 **ID-80..136**(`~/w7/notes/p5e/INTEGRATOR-DECISIONS-P5E.md`)。**十二个包,三波**:wave 1 **c0e**(契约 + 线上行:`PipeCalls.def` 第五列 `WaitClass`、`set_program_bindings` opcode 80、`kCapRunAheadApply` 位 10 仅 DirectGLES 臂、`kDrawClientArrays`、子系统位 13、两个旋钮)→ **id**(registry 按 `{slot, gen}` 重键、by-handle resolver、分配器守卫);wave 2 **vi / sb / pg / tx2 / fb** 五个 per-draw 家族 ∥ **ra**(等待规则、present credit、`gPipeInputs` 变 server 角色内存),加 **fix1**(设备发现的 monolith 臂回归,ID-107);wave 3 **pa**(program 家族离开前端)、**mv**(multi-draw + 五个档位的门禁条目)、**gl**(门禁机制本身 + 两处潜伏崩溃)、**ra2**(翻开关后暴露的竞态)。**`kMGPipeP5eRunAheadReady` 与 `kMGPipeP5eClientWaitRuleLanded` 均已翻**。最大的那次迁移(逐 draw 的 `GetProgramForDraw`)**没有改动任何线上结构**:记录早就带着逐 link 的 `ProgramArchive`,缺的是仍去问前端对象的读者。报告 [`P5E-RUNAHEAD.md`](P5E-RUNAHEAD.md) | 出口门已逐条跑过(BRIEF-P5E §3,2026-09-19 在集成树上,run-ahead 已武装):**item 1** unit 在 strict 两臂均 **2256/2256**;**item 2/3** `integration-split` **179/179**、逐条普查零 `Fatal{`、`Admitted{` 恰为八行;**item 4(a)** `RUN_AHEAD=0` 作为配对对照 **179/179 绿**;**item 4(b)** `VERB_BARRIER=0` **变红**(车道 62/179);**item 4(c)** Magma 逐字记下 `run-ahead requested, server does not publish kCapRunAheadApply - running lockstep`,而 Espryt 对照记下 `run-ahead ARMED`;**item 5** 在集成树上重跑 red-once(ID-121 重排后的形式):倒掉 pa 的臂得 `GetProgramForDraw@DrawArrays`、倒掉 mv 的臂得 `GetBoundVertexArray@DrawArrays`,**恰好各一个具名对**,还原后各自转绿;**item 7** `MOBILEGL_IPC_AUDIT=1` **179/179**。**唯一未过的是 E1 对照脚本本身**(ID-122):已修掉它两个遮蔽性缺陷(选中了一个在本车道永远跑不起来的阳性对照用例;ctest 与日志助手对“谁被选中”意见不一致),但它索要的 `Fatal{BarrierViolation}` 在整次运行里 **出现 0 次**:`BATCH_WAITS` 默认值 1 下那个重叠不发生,而 run-ahead 武装后 `VERB_BARRIER=0` 还会顺手关掉 run-ahead(ID-114),它产生的那条臂**既不是 lockstep 也不是 run-ahead**。E1 需要重新定义它要证伪什么,不是再调阈值;在想清楚之前不动它的计数规则,否则只是换一种伪绿。G1 仍由 CI 断言(ID-123) | P5d | | **P5f** 一切状态上 wire | ✅ **已收官(2026-09-20)**;验收代码 Windows `c42577a4` / WSL `cfca93c7885f` | f0 普查、f1 双块、fc 控制帧、fe Espryt 字段、fm Magma record consumers、fs 静态世代/角色及 liveness、fr registry、fv 反向回调均已合并。字段归属 **41 RECORD_SUPPLIED / 6 APPLIER_DERIVED / 0 BARRIER_PULLED / 16 FATAL**;strict / dualblock 预期 marker 集合均空。控制帧与静态量工作已完成,不再列为 P6 待实现项 | unit **2310 = 2300 PASS + 10 skip**;GPU **1377** 零失败;ordinary / strict split **180 = 176 PASS + 4 skip**;双块 **212 = 206 PASS + 6 精确具名 skip**;双后端 RSP 门 **2 PASS / 0 skip**、逐帧 rsp=0。G1 `.text` 10806051、symbols 27815 恒等且 0/0/0/0;G2 3016 同名;G14 3646→3744 无删名。逐包与收官修复均有 red-once;Claude 异族终审 P1/P2 已修;Redmi 六 clean-boot 臂 **60 PASS / 6 skip / 0 failed**、36 个窗口 rsp=0。详见 [`close-report`](notes/p5f/close-report.md) | -| **P6** spawn transport | ✅ **已收官(2026-09-22)**;全部包已落地于 `feat/disaggregated`(头 `16bfab10`,2026-09-21),出口门第 1–6 项此前已达成,第 7/8 项于 2026-09-22 采齐。收官前核出的三项:server 进程侧 `PipeStats` 从未初始化(`srv=0 srvpark=0` 是结构性零,门 8 无 server 半边)**已在收尾中修好**;184 符号棘轮 CI 门(契约 §12.1)与契约 §2 分给 hs 的 `LinkTerms` / `Refuse` / 指纹拆分**未落地**,移交 P6.5(负控 S6 随之) | 十包全落地:**a6** 进程装配/链接边界审计 → **c6** 规范契约 + 数据面缝惰声明 → **lk** `RingControl` 按写者重组 → **so** `SocketTransport`(AF_UNIX SOCK_STREAM + SCM_RIGHTS,12 条契约用例)→ **sm** 两个独立启动的进程(非 fork,name 汇合、共享匿名段,四守卫接线)→ **cp** EGL 控制帧跨进程并应答(`InitCapabilities` wire kind 11)→ **hs** build stamp 显式 present 入指纹 + `abiMajor/Minor` 补检 + 真实 pid → **dl** device-lost 闩(取自描述符挂断绝不取自超时)+ `Session::Fail` 漏斗(`FatalFamilies.def` 词表 + 90 站点归一 + `SessionFault` 帧命名家族)+ Fatal 普查门 → **st** fb-slot memo 具名 Fatal → **t6** `integration-spawn` 车道(102/102)+ 名集合结构性一致门 + per-role 日志(`.client.log` / `.server.log`)。Android CI 新增 `spawn-acceptance` 臂,App 从 `nativeLibraryDir` 解析 server 路径。真机 Redmi `2f7cbe2e` 上 `OpenRA.DirectGLES` spawn ssim=1.0 连跑三次 + 6 case 绿;`DirectVulkan` 真机分离路径不确定分歧(inproc 与 spawn 同表现→ Magma × 真实 GPU,非 P6,桌面 lavapipe 为 1.0)。边界仍为 pbuffer / surfaceless / 离屏;真窗口归 P12。契约 [`MG_Remote/CONTRACT-P6.md`](../../MobileGL/MG_Remote/CONTRACT-P6.md);a6 产出 [`a6-audit-v1.md`](notes/p6/a6-audit-v1.md)、[`a6-link-experiment.md`](notes/p6/a6-link-experiment.md)(**server 不能不链 `MG_Impl`**:184 符号,P7 101 / P3b-P4b 14 / 共有 60 / P6 自己 6);终局重审 [`P6-ENDSTATE-REVIEW.md`](P6-ENDSTATE-REVIEW.md)。**收尾四项(2026-09-22,工作树未提交)**:wire 计数器——`PipeStats` 新增 `ByteClass::StageSegmentBytes`(`PipeWireCodec.cpp:878` `StageAllocate` 唯一收口)与 `CallClass::WireRecords`(`:1188` `EncodeRecord` 提交路径)+ staged-blob 直方图,汇总行新增 `seg=` / `wrec=`;`ServerMain.cpp` 补 `PipeStats::Init()` / `Shutdown()`(spawn server 此前从不武装计数器——修前 0 条汇总行、修后 29 条,SSIM 1.0 不变);`MOBILEGL_PIPE_STATS_FILE` 按角色派生 `.client.json` / `.server.json`(走 `RoleLogPath` 同一导出规则,基名不指向文件);工具入库 `tools/device_bench/p6/{ab_session.py,render_ab.py,README.md}` 与 `tools/trace_replay/run_android_retrace_local.py`(+19 行 `MOBILEGL_TRACE_PACKAGE`),`pin_device.sh` 新增 `2f7cbe2e` 条目(本板 GPU 钳 1050 MHz:`thermal_pwrlevel` 写 0 读回 1、`max_gpuclk` 只读 1 050 000 000;绝对值与 1100 MHz 时代的 `35d0befa` 行不可比)。 | 出口门(契约 §9)1–6 ✅:G1 pull 0/0/0/0、`.text` 恒 `0xa52203`;`integration-spawn` 与 split 名集合一致(可比 102==102)且同数绿;进程树运行时恰多一子进程、结束为零;每条 spawn 条目记子进程 pid 与 `transport=spawn`(`--require-spawn` 门);每包 red-once。**7/8 已采(2026-09-22)**:**门 7** 真机 reboot-clean 同热窗口配对 A/B(Redmi `2f7cbe2e` / M332BF / SM8750 / Adreno 830v2,CPU 定频 little 1555200 / big 1958400,GPU 钳 1050 MHz(本板 `thermal_pwrlevel` 写 0 读回 1、`max_gpuclk` 只读 1 050 000 000;绝对值与 1100 MHz 时代的 `35d0befa` 行不可比,只有同会话配对可比),`minecraft-1.21.4-rd12-odinlite-in-world` + DirectGLES,~1471 draws/帧;六臂交错 × best-of-3:18/18 runner 退出 0、36/36 pin check `PINNED`、0 `Fatal`;client CPU p50 ms/帧 inproc 7.880/7.889 vs spawn 7.876/7.869,均值 **−0.15%**,符号随臂序翻转,臂内散布 0.2–4.2%;第二会话 inproc/spawn 交错 × best-of-2:4/4 OK、8/8 `PINNED`、0 `Fatal`,7.987/7.989 vs 7.992/8.009 = **+0.16%**)——判读 **tie**(差值在臂内噪声内),如实记录、不设门;monolith 基线约贵 30%(−29.8% / −29.9%)。**门 8①** socket 门铃 vs inproc condvar:client 121.1 waits/帧、5.6–6.1 parks/帧,两传输逐字相同(run total 30 401–30 407);server inproc 10 866–11 963 waits/帧、5.0–6.2 parks/帧,spawn 10 415–10 416 waits/帧、4.66–4.90 parks/帧——socket 阻塞读**既不更便宜也不更贵**(契约 §9「阻塞读可能更便宜」未兑现),spawn server waits 少 8.9–12.9% 归因于 handoff 纪律而非门铃本身,唯一 socket 略差的列是 `clipark/f`(6.07 vs 5.60/5.75)。**门 8②③**(inproc,真实 trace retrace):`SEG_STAGE` 字节/帧 OpenRA 130.8 KB median / 8.01 MB steady mean(含启动负载 8.07 MB),rd12 816.2 KB median / 1.53 MB steady mean(含负载 10.79 MB,rd12 首帧 981 654 draws vs 稳态 ~1471,run-wide mean 约 7× 稳态,两个读法都报);分块后记录/帧 OpenRA 211 median / 206 mean,rd12 7 497 median / 7 504 mean;`maxrec=1808` 与分块前相同(默认 8 MiB chunk 预算在这些负载上从未被打到)。证据 [`notes/p6/gate7-device-ab.md`](notes/p6/gate7-device-ab.md) / [`notes/p6/gate8-doorbell-device.md`](notes/p6/gate8-doorbell-device.md) / [`notes/p6/gate8-wire-counters.md`](notes/p6/gate8-wire-counters.md) | -| **P6.5** 传输栈两轴化 + 跨机 | **第一波已落地**(`feat/disaggregated@fe27380a`,2026-09-22):全 TCP 控制 + StreamLink 数据,WSL client ↔ Redmi server。四切片代码审查无硬缺陷 + 两修复(`AcceptPair` 重试 `EINTR`/`ECONNABORTED`、supervisor 自设 `MOBILEGL_IPC_ROLE=server`,均 `MG_Remote` 门内 G1 不动,见 [`code-review-findings.md`](notes/p65/code-review-findings.md));固定制品(两端 stamp `p65-acceptfix-20260922`)再验收:unit 2399、integration-tcp loopback 102、**device-102 102 全 ARMED**、代表性 retrace OpenRA 1.0 全 ARMED。**残余(CI/后续)**:完整 39 例 device golden 矩阵 + 必测数。设计见本表下方「立即的下一项」节 | 包:**wf** wire 定宽与布局摘要——`wireFingerprint` = `PipeFields.def` 派生的逐成员 name / `offsetof` / `sizeof` 摘要 + 有序目录摘要 + 记录头布局 + 两个 blob codec 版本 + `kOpCount` + 字节序 / 指针宽度,**保留** `sizeof(MGPCaps)` / `sizeof(DynamicBackendParameters)`(wire 事实)、删 `sizeof(GLFunctionsTable)`;`buildFingerprint` 只在 `Dial == Fork` 下比较;`DynamicBackendParameters` / `MGPCaps` / `RenderStateParameters` 整块 blob 的定宽化(两端是不同编译器产的不同二进制,`long` / padding / 位域差异都是静默读错状态);`Refuse{code, detail, 对端值}` 控制消息,握手路径零 abort → **ct** 控制面端点种类(`fork` 继承 fd / `unix:` / `tcp://host:port`;`DialMode{No, Fork, Connect}` 与 `MGPipeShouldDial()` 按契约 §3 补齐;TCP keepalive 失败**作为传输层报告的挂断**进 dl 的闩,不是 apply 超时)→ **nd** 数据面协商(`LinkTerms{dataPlane, delivery, wireForm, maxReplyBytes, cmdWindowBytes, stageWindowBytes}` 入 Hello / Welcome,四个尺寸由 **server** 陈述;`dataPlane ∈ {SharedSegments, Stream}`;`auto` 的判据是**段实际交付成功**而不是地址判断,回落必须具名入日志与 stats;链路工厂在会话建立时选定一对,之后不变——缝是 setup-time 的,契约 §8.2)→ **sd** 共享段交付与控制面解耦(`ShmLink` 自带 AF_UNIX aux 汇合名、在 `Welcome` 里公布,`SCM_RIGHTS` 只走它;于是**控制面 TCP + 数据面共享段**在同机是合法配对;`ITransport` 收窄为纯控制帧,描述符传递归数据面)→ **sl** `StreamLink`(分块封帧;watermark 变消息且**规则逐字保留**——late-never-early、`>=` 不是 `==`、倒退是 Fatal;`appliedSeq` 修正案 + flush-on-idle;reply 变自带 seq 的消息,本链路上删 slot 池 / 取模 / stamp 自检;`SEG_STAGE` 变发送窗口,三个 cursor 要么完整复活要么不用、不留中间态;program archive 与 `draw_vbo` range 尾分片;`GetCaps` 两个 blobref 变消息;每方向每进程一条专用读线程)→ **t65** 车道。上层纯度:`SessionProducer` / `SessionConsumer` / `ServerLoop` / `PipeWireEncoder`、`ClientSession.cpp` 的 `kSegEvent` 挂载与 `ResourceTracker.h` 的 writeback 解析都只经 `ILink`。设计 `ARCHITECTURE.md` §11.9 | 门:inproc / spawn 车道结果数与逐线程 CPU 逐字不变(`ILink::ReserveRecord` 虚调用代价**实测**,`RingProducer::Reserve` 失去内联是具体风险);纯度 grep——`ShmLink` / `StreamLink` / `RingControl` / `ReplySlotPool` / `EventRingConsumer` / `m_shm.` 只出现在 `Transport/` 与其测试,上层零链路种类分支;**2×2 矩阵车道**(控制面 {unix, tcp} × 数据面 {shm, stream},loopback)名集合与 spawn 一致且同数绿,每条目记 `control=… data=…` 的 arm 证明(ID-124 的形状);跨机臂一条真 trace 逐像素;wf 三条 red-once(临时树里同宽成员互换 → 摘要变而 stamp 不变;`wireMajor = 99` → 两端具名拒绝、server exit 0、client 不回落 monolith;仅 stamp 不同的对端在 `Dial != Fork` 下连接成功——正控制);**必测数**:逐帧 `kWaitReply` 次数(`ResourceCreate` / `SetTextureParams` / 纹理半边 `ResourceSubData` 都在此列,TCP 上每次即一个 RTT)、`SEG_STAGE` 字节/帧对链路带宽、`PRESENT_CREDIT` 1..3 配对、混搭(tcp + shm)对(unix + shm)的逐线程 CPU 差 | -| **Ph** 不可信对端加固 + 配对 | **已审计(2026-09-22,`notes/p7/PLAN-PH-P34B-P7.md` §1.1)**:P6.5 已在 LAN 上跑 `tcp://0.0.0.0`,「P12 之前」的顺序陈述落后于树。必需小件(supervisor 命名子进程死亡、两处漏斗旁路、D11 五处上限、常量时间令牌 + 数据面绑定、`SEG_EVENT` 弃投闩)随 P7 波次推进;fuzz 臂 2 在 P7 之后;OQ-21 已裁定令牌足够(ID-P7-3)。**进展(2026-09-22 深夜)**:supervisor 命名子进程死亡 + 两处头层漏斗旁路已随 wave 0 落地(`origin@8652bac0`,`abort_sites` 79 成下行棘轮);其余小件是簇 **F** 包,**在跑**(常量时间令牌 / `Refuse{Authentication}` / ≥16 字节 + `tcp_supervisor_smoke.py` 接 CI → `Welcome.dataNonce` 数据面绑定 → PH-8 单测 → D11 五处 + PH-2 → PH-6 drop-with-latch → PH-1 (3)(4));逐日状态见 [`CURRENT_STAGE_STATUS.md`](CURRENT_STAGE_STATUS.md) | `Session::Fail` 的策略翻成每会话闩(**按 ID-P7-1 重定界**:98 处 `SessionFail` + 6 处 `WireLogFatal` 的字面翻转拒做——≥9 处返回引用没有诚实返回值;只对对端字节可达站点 latch-and-decline;P6 dl 收口到的是**两个漏斗 + 两处头层旁路**(`Server/StagedShadow.h`、`Server/StagedTextureStore.h`),不是一处;P6.5 fork-per-session 已给出「下一连接照常服务」);handle slot 预算(`BackendSlotTable` 的两条拒绝从 `MOBILEGL_ASSERT` 变 release 下的具名拒绝,杜绝静默 null twin);readback 尺寸门挪 server 侧且在 resize **之前**设绝对上限;`StagedTextureStore` 按该 level 宣告范围设界;`ArchiveVector` 按 `count * sizeof(element)` 设上限;`SEG_EVENT` 溢出不再能让一个不排空(或仅涓流排空)的对端在 30 秒内、乃至瞬间用 `Fatal{EventRingOverflow}` 打掉承载它的 server 进程(drop-with-latch,不等 PH-1,ID-P7-2;原文「60 秒」是两轮 30 s 的算术上界);**配对 / 认证**(`Hello` 带令牌与无令牌只 loopback **已由 P6.5 ct 落地**;欠常量时间比较、`Refuse{Authentication}` 入词表、≥16 字节、**数据面按 `Welcome.dataNonce` 绑定到已认证的控制连接**(今天 `AcceptPair` 按到达顺序配对、从不查 peer)、fork 前认证;OQ-21 裁定令牌足够、不做 TLS);段 / 窗口尺寸由 server 钳制(P6.5 nd 已陈述,欠一条钳制单测) | 非 loopback 监听在无令牌时具名拒绝(机制已在;名字入词表 + `tcp_supervisor_smoke.py` 接 CI 后算达成);畸形帧 / 超界计数 / 不排空对端的模糊臂下 server **不 abort、会话闩住、下一连接照常服务**(臂 1 机制已在、欠端到端脚本;臂 2 = PH-1 (3)(4) + D11;臂 3 = PH-6);`Session::Fail` 站点普查门扩到 server 镜像且 `abort_sites` 变棘轮(今天只扫 `MG_Remote`、站点数记了不比,wave 0);契约 §12.2 五处无界分配各一条 red-once(**五处全开**,不是两处) | -| **P3b / P4b** 深化(Espryt) | **已审计(2026-09-22,`notes/p7/PLAN-PH-P34B-P7.md` §1.2)**;Espryt 项与 P7 文件零重叠,作为 P7 的并行流(wave 2-D)推进。**D1 / D2 / D3 已落地(`origin@f1f2a19e`,2026-09-22)**:D1 = XFB 两洞(孤儿目标保留 varyings、回写事件切片)+ 回调 10→9 + 四个 resolver 具名启动期 stop + readback 家族三臂(+39/臂,readback 半边其实早已关,ID-P7-24);D2 + 返工 = `TextureViewAliasScenario`、`TextureUploadShape` 成门(散点内缩后零补丁 red-once)、`espryt_memo_purity.py`、`SubsystemDeps.def`(R-5)、12 场景 split 普查(+76/臂)(ID-P7-26/29);D3 = view 在 owner 上传后陈旧的产品缺陷修复(clean gate 读 storage record,三臂 3 红→14/14)+ D-K2 六处读者读同一张表(ID-P7-28/30)。**余**:R-3 另一半(`MGPSamplerView::Target` 谓词)、`KHR-GL46.texture_view.coherency` 的 split 读数、Iris trace 普查结果(wave 3)、CTS AFTER(wave 4);逐日状态见 [`CURRENT_STAGE_STATUS.md`](CURRENT_STAGE_STATUS.md) | view/属主发射游标**别名场景**(代码半已由 P4a `TextureEmit.h` 属主键控游标 + `TextureObjectView::ToOwner*` + P5e tx2 落地,欠验证);`g_fboTextureSyncList`(分离安全——记录臂先返回、退路是具名 Fatal;四个 resolver 改启动期具名 stop,文本删除受 P5e 裁定 1 约束归 P13);memo 重键**已落地**(P4a/P5f),补纯度 grep 门;~~XFB scatter 搬到 client~~(P5c/P5f 以 server staged shadow + `OnBufferWriteback` 落地;剩两处真洞:孤儿捕获目标被静默丢弃、回写事件无界——>128 KiB 即 `Fatal{EventRingOverflow}`);删 fragColor 重推导 workaround 与 `g_broadcastMemo*`(动 pull `.text`,归 P13,只改注释);raw-depth-fetch sampler 的 monolith 清理(可选);**回读收口**(pack 半已关:`set_pixel_pack_state` APPLIER_DERIVED + server 中性读 + client 侧 PACK-PBO 散射;readback 半开:`get-tex-image-shadow` / `copy-image-shadow-mirror` 非 monolith 下仍 abort、split 零覆盖);P4a 的 R-5(D-K2 规则合一处)/ R-11 必须,R-3 / R-4 / R-7 / R-10 可选;~~`ProgramArtifacts.h` 的 NDK 尺寸钉~~(P6.5 portable archive v2 + 布局指纹取代);链接实验分给它的 **14 个符号**(D12,棘轮落地后 Tier 1) | 纹理 / program 场景(split 三臂零覆盖,先普查首阻塞再注册);CTS `texture_*` / `shader_image_*` / `packed_pixels` + P4a 欠的 `direct_state_access.framebuffers*` 在 0.5 pp 内(caselist 入库 + monolith 基线 + delta 工具,今天三者皆无);每一个 Iris trace(CI 管道 P6 已建,欠当前头的结果与 `texture-remint-pull` 的 P9 例外表);`TextureUploadShapeScenario` 升级成门(Mali 增量无设备,按 Adreno 记录) | -| **P7** DirectVulkan(Magma)全量迁移 | **进行中;wave 0–2 已落地,40% 检查点 6/9 已过(2026-09-22,`origin@be636ee5` + 集成树上的 B3)**:审计 + 五波计划见 `notes/p7/PLAN-PH-P34B-P7.md` §1.3 / §3,规范 `MG_Remote/CONTRACT-P7.md`,裁定 `notes/p7/INTEGRATOR-DECISIONS-P7.md`(ID-P7-1..33)。**wave 0** 仪器(Magma 两进程车道三臂、`link_ratchet.py` 186 基线、普查门 79 站点下行棘轮 + `MGPipeSessionFailHook`、设备跑器 `--matrix/--repeat/--archive-dir`、CTS caselists)`origin@8652bac0`;**wave 1** 设备窗口 #1(门 3 分母 36、E0–E7 归因、CTS `$BASE` 五块);**wave 2** X1(arm64 persistent-map tracker 从不认领 fault)、F1(split 起会提前)、C(`StateObjectDeathOps`、OQ-8、OQ-10、vertex-layout 拆分)、A(对齐 / native-range)、B(mip 半退役、深度 mip 烘焙 (A)(D)、copy-image、default-color-blit、回读 fence)、B2(multisample shape/aspect、AllocatorDebtScope ×2 删、(B′)、棘轮 **186→173**)、B3(**OpenRA 真机分歧的真因**:wire 臂 completed-frame-serial floor 在中帧 pooled-fence 提交退休时无证据上升 → 帧首次 `glBufferSubData` 走无序 host memcpy;计数 26→0,spawn 臂 red-once;ID-P7-33)——**树上 `@P7` 拒绝站点归零、§3.2 六退役全成、Magma 三臂 95/74/76**。**真机**:p7w4 门 3 AFTER 34/36 与 monolith 差 ≤ 0.0005;OpenRA p7w5 **27/27 golden**(ID-P7-34,项关闭);bsl-esc-menu = server 死 VkBuffer 无界累积(一帧 1.3 M 调用,ID-P7-32,**M2** 在修)。**在跑**(2026-09-22 夜六包在 session limit 后重派为 `claude-opus-5-5`):V1(verify × split,门 2)、M2、F、E1(Iris 普查 + §7.2)、B3 返工(**已落地** pipe `23eeed68..a785d055`,审查 land with fixes,修复轮在跑,ID-P7-36)、V1(**已报告**:门 2 在主机成立,pipe 门 + 审查在跑)、B2 返工 r2(r1 审查 = rework:新用例落到 monolith 与 DirectGLES 条目、逐行拷贝 `bufferOffset` 对齐 VU,ID-P7-35)。**余**:B4(聚合等待 + §12 Magma 债)、wave 3(`MEASUREMENTS.md` §7.2 重跑、Iris 普查、棘轮 88 的 monolith draw 路径)、wave 4(CTS AFTER、门 3 终局三遍逐位 + spawn 臂)、wave 5(F 余片、fuzz 三臂、异模型整体审查)。逐日状态见 [`CURRENT_STAGE_STATUS.md`](CURRENT_STAGE_STATUS.md) | `38919d45` 已补实际游戏的 server buffer consumers 和 Android 旋转 blit([报告](notes/p5f/magma-inproc-fix.md));`194382c9` 又完成 Magma run-ahead、GPU 延迟退休与 VAO 身份碰撞修复([报告](notes/p5f/magma-runahead.md));`ed507b1a..d56c0e83` 29 个 DirectVulkan 提交的 shape 波(随 `e1bf3677` 合入,本行此前未记)已退役 packed-float mip 原生 blit(`5310ff62`)、resolve(`ec4ca06d`)、占位图像(`WirePlaceholderImages.inc`)、copy-image 端点、XFB 捕获 span、纹理回读;`70fb6689` 链关闭 inproc RD32 性能回归(86.85→116.73 fps)。其余工作(2026-09-22 审计改判):~~`SetupDrawSnapshot` 探测字段塌成 dirty mask~~ 与 ~~`VertexInputStateFactory` 内容寻址 CSO~~ **本阶段拒做**(`SetupDraw` 在非 monolith 传输下分支到 `SetupWireDraw`,monolith 快照机制在 split 下不跑;无性能门;ID-P7-5);占位纹理原生化**已落地**(缺 split 车道条目);具名 UBO host payload(D-B8)走了直绑常驻 `VkBuffer` range 的备选,欠一次测量 + 裁定关 OQ-6;内部 shader 烘焙**半已落地**(颜色 blit `WireColorBlitSpirv.h`,仅 split 臂),欠深度 mip 烘焙 + `MOBILEGL_BAKED_INTERNAL_SHADERS` 新鲜度门(0 处);D18 按 ID-P7-6 读法一句闭。**新增必须项**:Magma `StateObjectDeathOps`(六处特判)、OQ-8 归档 `storageBlocks`(`MagmaProgramSource::EnsureStorageBlocks` 每 draw 重跑 SPIRV-Reflect)、OQ-10 `kCapResidentSubData` 从未发布(split 下双后端退回就地 memcpy)、两处 `MagmaP7AllocatorDebtScope`。**P6 真机发现(2026-09-22 归此)**:`DirectVulkan` 分离路径在 Redmi 上两次观测 0.988998 / 0.976494(inproc 与 spawn 同表现,pbuffer monolith 1.0;case 归属、重复次数未记录,原始证据不在树内;取自 run-ahead ARMED 下,**lockstep 对照从未在 golden 口径下跑过**——wave 1 的 E1)——Magma × 真实 GPU;树上 `@P7` 具名拒绝**实为 15 处 / 4 文件**(`multisample-blit-shape` / `-aspect`、`depth-stencil-mipmap`(已窄化到 D\|S 合并)、`vertex-layout`、`vertex-format-conversion`、`texel-buffer-native-format`、`unaligned-{texel,storage,atomic}-buffer-range`、`storage-buffer-native-range`、`uniform-block-native-range`、`uniform-buffer-byte-tail` / `-dynamic-offset`、`copy-image-in-place`、`default-color-blit-shape`;外加 Magma 无 `StateObjectDeathOps` 与 `buffer-legacy-arm`),**全部是绕过 `Session::Fail` 与普查门的裸 abort**;必须退役 `.6/.8/.9/.11/.12/.13`,其余改 decline 即可;链接实验分给 P7 的 **101 个符号**(D12)。`DynamicBackendParameters` 定宽重写**不再是 P7 的**——它是跨平台 wire 的前提,归 P6.5 wf | 集成 + trace 在 Magma 的 push 与 split 下全绿(inproc 半已是硬门;**spawn / TCP 臂今天 DirectVulkan 条目为 0**——四条 split 臂硬编码 `MOBILEGL_BACKEND_TYPE=DirectGLES`,wave 0 补后端维度);verify 零分歧(verify 今天只注册 monolith,verify+split 撞旧 `PipeRespecifyScope` 断言,先清);真机 DirectVulkan split ssim 回到 1.0(分母排除 rd12 in-world 与 create-indirect,ID-P7-4;必须带 `RUN_AHEAD=0` 对照臂);184 符号棘轮(契约 §12.1)下降 P7 的 101 个——原 "`nm -D libMobileGLServer.so \| grep glslang` 为空" 不可达,D12 裁定 server 镜像就是整个 `libMobileGL.so`;仪器 `scripts/link_ratchet.py`(存符号列表、只对新增红)归 wave 0;CTS 五块(`texture_*` / `shader_image_*` / `packed_pixels` / `direct_state_access.*` / `uniform_buffer_object*`)先立 monolith×DirectVulkan 基线再比 inproc,≤0.5 pp 且新 crash = 0 单独硬红。**再基线检查点:中点完成子系统 < 40% 立即重定基线**(分母 = `notes/p7/PLAN-PH-P34B-P7.md` §4 的 9 项) | +| **P6** spawn transport | ✅ **已收官(2026-09-22)**;全部包已落地于 `feat/disaggregated`(头 `77cbd176`,2026-09-21),出口门第 1–6 项此前已达成,第 7/8 项于 2026-09-22 采齐。收官前核出的三项:server 进程侧 `PipeStats` 从未初始化(`srv=0 srvpark=0` 是结构性零,门 8 无 server 半边)**已在收尾中修好**;184 符号棘轮 CI 门(契约 §12.1)与契约 §2 分给 hs 的 `LinkTerms` / `Refuse` / 指纹拆分**未落地**,移交 P6.5(负控 S6 随之) | 十包全落地:**a6** 进程装配/链接边界审计 → **c6** 规范契约 + 数据面缝惰声明 → **lk** `RingControl` 按写者重组 → **so** `SocketTransport`(AF_UNIX SOCK_STREAM + SCM_RIGHTS,12 条契约用例)→ **sm** 两个独立启动的进程(非 fork,name 汇合、共享匿名段,四守卫接线)→ **cp** EGL 控制帧跨进程并应答(`InitCapabilities` wire kind 11)→ **hs** build stamp 显式 present 入指纹 + `abiMajor/Minor` 补检 + 真实 pid → **dl** device-lost 闩(取自描述符挂断绝不取自超时)+ `Session::Fail` 漏斗(`FatalFamilies.def` 词表 + 90 站点归一 + `SessionFault` 帧命名家族)+ Fatal 普查门 → **st** fb-slot memo 具名 Fatal → **t6** `integration-spawn` 车道(102/102)+ 名集合结构性一致门 + per-role 日志(`.client.log` / `.server.log`)。Android CI 新增 `spawn-acceptance` 臂,App 从 `nativeLibraryDir` 解析 server 路径。真机 Redmi `2f7cbe2e` 上 `OpenRA.DirectGLES` spawn ssim=1.0 连跑三次 + 6 case 绿;`DirectVulkan` 真机分离路径不确定分歧(inproc 与 spawn 同表现→ Magma × 真实 GPU,非 P6,桌面 lavapipe 为 1.0)。边界仍为 pbuffer / surfaceless / 离屏;真窗口归 P12。契约 [`MG_Remote/CONTRACT-P6.md`](../../MobileGL/MG_Remote/CONTRACT-P6.md);a6 产出 [`a6-audit-v1.md`](notes/p6/a6-audit-v1.md)、[`a6-link-experiment.md`](notes/p6/a6-link-experiment.md)(**server 不能不链 `MG_Impl`**:184 符号,P7 101 / P3b-P4b 14 / 共有 60 / P6 自己 6);终局重审 [`P6-ENDSTATE-REVIEW.md`](P6-ENDSTATE-REVIEW.md)。**收尾四项(2026-09-22,工作树未提交)**:wire 计数器——`PipeStats` 新增 `ByteClass::StageSegmentBytes`(`PipeWireCodec.cpp:878` `StageAllocate` 唯一收口)与 `CallClass::WireRecords`(`:1188` `EncodeRecord` 提交路径)+ staged-blob 直方图,汇总行新增 `seg=` / `wrec=`;`ServerMain.cpp` 补 `PipeStats::Init()` / `Shutdown()`(spawn server 此前从不武装计数器——修前 0 条汇总行、修后 29 条,SSIM 1.0 不变);`MOBILEGL_PIPE_STATS_FILE` 按角色派生 `.client.json` / `.server.json`(走 `RoleLogPath` 同一导出规则,基名不指向文件);工具入库 `tools/device_bench/p6/{ab_session.py,render_ab.py,README.md}` 与 `tools/trace_replay/run_android_retrace_local.py`(+19 行 `MOBILEGL_TRACE_PACKAGE`),`pin_device.sh` 新增 `2f7cbe2e` 条目(本板 GPU 钳 1050 MHz:`thermal_pwrlevel` 写 0 读回 1、`max_gpuclk` 只读 1 050 000 000;绝对值与 1100 MHz 时代的 `35d0befa` 行不可比)。 | 出口门(契约 §9)1–6 ✅:G1 pull 0/0/0/0、`.text` 恒 `0xa52203`;`integration-spawn` 与 split 名集合一致(可比 102==102)且同数绿;进程树运行时恰多一子进程、结束为零;每条 spawn 条目记子进程 pid 与 `transport=spawn`(`--require-spawn` 门);每包 red-once。**7/8 已采(2026-09-22)**:**门 7** 真机 reboot-clean 同热窗口配对 A/B(Redmi `2f7cbe2e` / M332BF / SM8750 / Adreno 830v2,CPU 定频 little 1555200 / big 1958400,GPU 钳 1050 MHz(本板 `thermal_pwrlevel` 写 0 读回 1、`max_gpuclk` 只读 1 050 000 000;绝对值与 1100 MHz 时代的 `35d0befa` 行不可比,只有同会话配对可比),`minecraft-1.21.4-rd12-odinlite-in-world` + DirectGLES,~1471 draws/帧;六臂交错 × best-of-3:18/18 runner 退出 0、36/36 pin check `PINNED`、0 `Fatal`;client CPU p50 ms/帧 inproc 7.880/7.889 vs spawn 7.876/7.869,均值 **−0.15%**,符号随臂序翻转,臂内散布 0.2–4.2%;第二会话 inproc/spawn 交错 × best-of-2:4/4 OK、8/8 `PINNED`、0 `Fatal`,7.987/7.989 vs 7.992/8.009 = **+0.16%**)——判读 **tie**(差值在臂内噪声内),如实记录、不设门;monolith 基线约贵 30%(−29.8% / −29.9%)。**门 8①** socket 门铃 vs inproc condvar:client 121.1 waits/帧、5.6–6.1 parks/帧,两传输逐字相同(run total 30 401–30 407);server inproc 10 866–11 963 waits/帧、5.0–6.2 parks/帧,spawn 10 415–10 416 waits/帧、4.66–4.90 parks/帧——socket 阻塞读**既不更便宜也不更贵**(契约 §9「阻塞读可能更便宜」未兑现),spawn server waits 少 8.9–12.9% 归因于 handoff 纪律而非门铃本身,唯一 socket 略差的列是 `clipark/f`(6.07 vs 5.60/5.75)。**门 8②③**(inproc,真实 trace retrace):`SEG_STAGE` 字节/帧 OpenRA 130.8 KB median / 8.01 MB steady mean(含启动负载 8.07 MB),rd12 816.2 KB median / 1.53 MB steady mean(含负载 10.79 MB,rd12 首帧 981 654 draws vs 稳态 ~1471,run-wide mean 约 7× 稳态,两个读法都报);分块后记录/帧 OpenRA 211 median / 206 mean,rd12 7 497 median / 7 504 mean;`maxrec=1808` 与分块前相同(默认 8 MiB chunk 预算在这些负载上从未被打到)。证据 [`notes/p6/gate7-device-ab.md`](notes/p6/gate7-device-ab.md) / [`notes/p6/gate8-doorbell-device.md`](notes/p6/gate8-doorbell-device.md) / [`notes/p6/gate8-wire-counters.md`](notes/p6/gate8-wire-counters.md) | +| **P6.5** 传输栈两轴化 + 跨机 | **第一波已落地**(`feat/disaggregated@fe28bdb5`,2026-09-22):全 TCP 控制 + StreamLink 数据,WSL client ↔ Redmi server。四切片代码审查无硬缺陷 + 两修复(`AcceptPair` 重试 `EINTR`/`ECONNABORTED`、supervisor 自设 `MOBILEGL_IPC_ROLE=server`,均 `MG_Remote` 门内 G1 不动,见 [`code-review-findings.md`](notes/p65/code-review-findings.md));固定制品(两端 stamp `p65-acceptfix-20260922`)再验收:unit 2399、integration-tcp loopback 102、**device-102 102 全 ARMED**、代表性 retrace OpenRA 1.0 全 ARMED。**残余(CI/后续)**:完整 39 例 device golden 矩阵 + 必测数。设计见本表下方「立即的下一项」节 | 包:**wf** wire 定宽与布局摘要——`wireFingerprint` = `PipeFields.def` 派生的逐成员 name / `offsetof` / `sizeof` 摘要 + 有序目录摘要 + 记录头布局 + 两个 blob codec 版本 + `kOpCount` + 字节序 / 指针宽度,**保留** `sizeof(MGPCaps)` / `sizeof(DynamicBackendParameters)`(wire 事实)、删 `sizeof(GLFunctionsTable)`;`buildFingerprint` 只在 `Dial == Fork` 下比较;`DynamicBackendParameters` / `MGPCaps` / `RenderStateParameters` 整块 blob 的定宽化(两端是不同编译器产的不同二进制,`long` / padding / 位域差异都是静默读错状态);`Refuse{code, detail, 对端值}` 控制消息,握手路径零 abort → **ct** 控制面端点种类(`fork` 继承 fd / `unix:` / `tcp://host:port`;`DialMode{No, Fork, Connect}` 与 `MGPipeShouldDial()` 按契约 §3 补齐;TCP keepalive 失败**作为传输层报告的挂断**进 dl 的闩,不是 apply 超时)→ **nd** 数据面协商(`LinkTerms{dataPlane, delivery, wireForm, maxReplyBytes, cmdWindowBytes, stageWindowBytes}` 入 Hello / Welcome,四个尺寸由 **server** 陈述;`dataPlane ∈ {SharedSegments, Stream}`;`auto` 的判据是**段实际交付成功**而不是地址判断,回落必须具名入日志与 stats;链路工厂在会话建立时选定一对,之后不变——缝是 setup-time 的,契约 §8.2)→ **sd** 共享段交付与控制面解耦(`ShmLink` 自带 AF_UNIX aux 汇合名、在 `Welcome` 里公布,`SCM_RIGHTS` 只走它;于是**控制面 TCP + 数据面共享段**在同机是合法配对;`ITransport` 收窄为纯控制帧,描述符传递归数据面)→ **sl** `StreamLink`(分块封帧;watermark 变消息且**规则逐字保留**——late-never-early、`>=` 不是 `==`、倒退是 Fatal;`appliedSeq` 修正案 + flush-on-idle;reply 变自带 seq 的消息,本链路上删 slot 池 / 取模 / stamp 自检;`SEG_STAGE` 变发送窗口,三个 cursor 要么完整复活要么不用、不留中间态;program archive 与 `draw_vbo` range 尾分片;`GetCaps` 两个 blobref 变消息;每方向每进程一条专用读线程)→ **t65** 车道。上层纯度:`SessionProducer` / `SessionConsumer` / `ServerLoop` / `PipeWireEncoder`、`ClientSession.cpp` 的 `kSegEvent` 挂载与 `ResourceTracker.h` 的 writeback 解析都只经 `ILink`。设计 `ARCHITECTURE.md` §11.9 | 门:inproc / spawn 车道结果数与逐线程 CPU 逐字不变(`ILink::ReserveRecord` 虚调用代价**实测**,`RingProducer::Reserve` 失去内联是具体风险);纯度 grep——`ShmLink` / `StreamLink` / `RingControl` / `ReplySlotPool` / `EventRingConsumer` / `m_shm.` 只出现在 `Transport/` 与其测试,上层零链路种类分支;**2×2 矩阵车道**(控制面 {unix, tcp} × 数据面 {shm, stream},loopback)名集合与 spawn 一致且同数绿,每条目记 `control=… data=…` 的 arm 证明(ID-124 的形状);跨机臂一条真 trace 逐像素;wf 三条 red-once(临时树里同宽成员互换 → 摘要变而 stamp 不变;`wireMajor = 99` → 两端具名拒绝、server exit 0、client 不回落 monolith;仅 stamp 不同的对端在 `Dial != Fork` 下连接成功——正控制);**必测数**:逐帧 `kWaitReply` 次数(`ResourceCreate` / `SetTextureParams` / 纹理半边 `ResourceSubData` 都在此列,TCP 上每次即一个 RTT)、`SEG_STAGE` 字节/帧对链路带宽、`PRESENT_CREDIT` 1..3 配对、混搭(tcp + shm)对(unix + shm)的逐线程 CPU 差 | +| **Ph** 不可信对端加固 + 配对 | **已审计(2026-09-22,`notes/p7/PLAN-PH-P34B-P7.md` §1.1)**:P6.5 已在 LAN 上跑 `tcp://0.0.0.0`,「P12 之前」的顺序陈述落后于树。必需小件(supervisor 命名子进程死亡、两处漏斗旁路、D11 五处上限、常量时间令牌 + 数据面绑定、`SEG_EVENT` 弃投闩)随 P7 波次推进;fuzz 臂 2 在 P7 之后;OQ-21 已裁定令牌足够(ID-P7-3)。**进展(2026-09-22 深夜)**:supervisor 命名子进程死亡 + 两处头层漏斗旁路已随 wave 0 落地(`origin@801f8eda`,`abort_sites` 79 成下行棘轮);其余小件是簇 **F** 包,**在跑**(常量时间令牌 / `Refuse{Authentication}` / ≥16 字节 + `tcp_supervisor_smoke.py` 接 CI → `Welcome.dataNonce` 数据面绑定 → PH-8 单测 → D11 五处 + PH-2 → PH-6 drop-with-latch → PH-1 (3)(4));逐日状态见 [`CURRENT_STAGE_STATUS.md`](CURRENT_STAGE_STATUS.md) | `Session::Fail` 的策略翻成每会话闩(**按 ID-P7-1 重定界**:98 处 `SessionFail` + 6 处 `WireLogFatal` 的字面翻转拒做——≥9 处返回引用没有诚实返回值;只对对端字节可达站点 latch-and-decline;P6 dl 收口到的是**两个漏斗 + 两处头层旁路**(`Server/StagedShadow.h`、`Server/StagedTextureStore.h`),不是一处;P6.5 fork-per-session 已给出「下一连接照常服务」);handle slot 预算(`BackendSlotTable` 的两条拒绝从 `MOBILEGL_ASSERT` 变 release 下的具名拒绝,杜绝静默 null twin);readback 尺寸门挪 server 侧且在 resize **之前**设绝对上限;`StagedTextureStore` 按该 level 宣告范围设界;`ArchiveVector` 按 `count * sizeof(element)` 设上限;`SEG_EVENT` 溢出不再能让一个不排空(或仅涓流排空)的对端在 30 秒内、乃至瞬间用 `Fatal{EventRingOverflow}` 打掉承载它的 server 进程(drop-with-latch,不等 PH-1,ID-P7-2;原文「60 秒」是两轮 30 s 的算术上界);**配对 / 认证**(`Hello` 带令牌与无令牌只 loopback **已由 P6.5 ct 落地**;欠常量时间比较、`Refuse{Authentication}` 入词表、≥16 字节、**数据面按 `Welcome.dataNonce` 绑定到已认证的控制连接**(今天 `AcceptPair` 按到达顺序配对、从不查 peer)、fork 前认证;OQ-21 裁定令牌足够、不做 TLS);段 / 窗口尺寸由 server 钳制(P6.5 nd 已陈述,欠一条钳制单测) | 非 loopback 监听在无令牌时具名拒绝(机制已在;名字入词表 + `tcp_supervisor_smoke.py` 接 CI 后算达成);畸形帧 / 超界计数 / 不排空对端的模糊臂下 server **不 abort、会话闩住、下一连接照常服务**(臂 1 机制已在、欠端到端脚本;臂 2 = PH-1 (3)(4) + D11;臂 3 = PH-6);`Session::Fail` 站点普查门扩到 server 镜像且 `abort_sites` 变棘轮(今天只扫 `MG_Remote`、站点数记了不比,wave 0);契约 §12.2 五处无界分配各一条 red-once(**五处全开**,不是两处) | +| **P3b / P4b** 深化(Espryt) | **已审计(2026-09-22,`notes/p7/PLAN-PH-P34B-P7.md` §1.2)**;Espryt 项与 P7 文件零重叠,作为 P7 的并行流(wave 2-D)推进。**D1 / D2 / D3 已落地(`origin@22761a69`,2026-09-22)**:D1 = XFB 两洞(孤儿目标保留 varyings、回写事件切片)+ 回调 10→9 + 四个 resolver 具名启动期 stop + readback 家族三臂(+39/臂,readback 半边其实早已关,ID-P7-24);D2 + 返工 = `TextureViewAliasScenario`、`TextureUploadShape` 成门(散点内缩后零补丁 red-once)、`espryt_memo_purity.py`、`SubsystemDeps.def`(R-5)、12 场景 split 普查(+76/臂)(ID-P7-26/29);D3 = view 在 owner 上传后陈旧的产品缺陷修复(clean gate 读 storage record,三臂 3 红→14/14)+ D-K2 六处读者读同一张表(ID-P7-28/30)。**余**:R-3 另一半(`MGPSamplerView::Target` 谓词)、`KHR-GL46.texture_view.coherency` 的 split 读数、Iris trace 普查结果(wave 3)、CTS AFTER(wave 4);逐日状态见 [`CURRENT_STAGE_STATUS.md`](CURRENT_STAGE_STATUS.md) | view/属主发射游标**别名场景**(代码半已由 P4a `TextureEmit.h` 属主键控游标 + `TextureObjectView::ToOwner*` + P5e tx2 落地,欠验证);`g_fboTextureSyncList`(分离安全——记录臂先返回、退路是具名 Fatal;四个 resolver 改启动期具名 stop,文本删除受 P5e 裁定 1 约束归 P13);memo 重键**已落地**(P4a/P5f),补纯度 grep 门;~~XFB scatter 搬到 client~~(P5c/P5f 以 server staged shadow + `OnBufferWriteback` 落地;剩两处真洞:孤儿捕获目标被静默丢弃、回写事件无界——>128 KiB 即 `Fatal{EventRingOverflow}`);删 fragColor 重推导 workaround 与 `g_broadcastMemo*`(动 pull `.text`,归 P13,只改注释);raw-depth-fetch sampler 的 monolith 清理(可选);**回读收口**(pack 半已关:`set_pixel_pack_state` APPLIER_DERIVED + server 中性读 + client 侧 PACK-PBO 散射;readback 半开:`get-tex-image-shadow` / `copy-image-shadow-mirror` 非 monolith 下仍 abort、split 零覆盖);P4a 的 R-5(D-K2 规则合一处)/ R-11 必须,R-3 / R-4 / R-7 / R-10 可选;~~`ProgramArtifacts.h` 的 NDK 尺寸钉~~(P6.5 portable archive v2 + 布局指纹取代);链接实验分给它的 **14 个符号**(D12,棘轮落地后 Tier 1) | 纹理 / program 场景(split 三臂零覆盖,先普查首阻塞再注册);CTS `texture_*` / `shader_image_*` / `packed_pixels` + P4a 欠的 `direct_state_access.framebuffers*` 在 0.5 pp 内(caselist 入库 + monolith 基线 + delta 工具,今天三者皆无);每一个 Iris trace(CI 管道 P6 已建,欠当前头的结果与 `texture-remint-pull` 的 P9 例外表);`TextureUploadShapeScenario` 升级成门(Mali 增量无设备,按 Adreno 记录) | +| **P7** DirectVulkan(Magma)全量迁移 | **进行中;wave 0–2 已落地,40% 检查点 6/9 已过(2026-09-22,`origin@b089e0de` + 集成树上的 B3)**:审计 + 五波计划见 `notes/p7/PLAN-PH-P34B-P7.md` §1.3 / §3,规范 `MG_Remote/CONTRACT-P7.md`,裁定 `notes/p7/INTEGRATOR-DECISIONS-P7.md`(ID-P7-1..33)。**wave 0** 仪器(Magma 两进程车道三臂、`link_ratchet.py` 186 基线、普查门 79 站点下行棘轮 + `MGPipeSessionFailHook`、设备跑器 `--matrix/--repeat/--archive-dir`、CTS caselists)`origin@801f8eda`;**wave 1** 设备窗口 #1(门 3 分母 36、E0–E7 归因、CTS `$BASE` 五块);**wave 2** X1(arm64 persistent-map tracker 从不认领 fault)、F1(split 起会提前)、C(`StateObjectDeathOps`、OQ-8、OQ-10、vertex-layout 拆分)、A(对齐 / native-range)、B(mip 半退役、深度 mip 烘焙 (A)(D)、copy-image、default-color-blit、回读 fence)、B2(multisample shape/aspect、AllocatorDebtScope ×2 删、(B′)、棘轮 **186→173**)、B3(**OpenRA 真机分歧的真因**:wire 臂 completed-frame-serial floor 在中帧 pooled-fence 提交退休时无证据上升 → 帧首次 `glBufferSubData` 走无序 host memcpy;计数 26→0,spawn 臂 red-once;ID-P7-33)——**树上 `@P7` 拒绝站点归零、§3.2 六退役全成、Magma 三臂 95/74/76**。**真机**:p7w4 门 3 AFTER 34/36 与 monolith 差 ≤ 0.0005;OpenRA p7w5 **27/27 golden**(ID-P7-34,项关闭);bsl-esc-menu = server 死 VkBuffer 无界累积(一帧 1.3 M 调用,ID-P7-32,**M2** 在修)。**在跑**(2026-09-22 夜六包在 session limit 后重派为 `claude-opus-5-5`):V1(verify × split,门 2)、M2、F、E1(Iris 普查 + §7.2)、B3 返工(**已落地** pipe `b8d10d07..75a64ce0`,审查 land with fixes,修复轮在跑,ID-P7-36)、V1(**已报告**:门 2 在主机成立,pipe 门 + 审查在跑)、B2 返工 r2(r1 审查 = rework:新用例落到 monolith 与 DirectGLES 条目、逐行拷贝 `bufferOffset` 对齐 VU,ID-P7-35)。**余**:B4(聚合等待 + §12 Magma 债)、wave 3(`MEASUREMENTS.md` §7.2 重跑、Iris 普查、棘轮 88 的 monolith draw 路径)、wave 4(CTS AFTER、门 3 终局三遍逐位 + spawn 臂)、wave 5(F 余片、fuzz 三臂、异模型整体审查)。逐日状态见 [`CURRENT_STAGE_STATUS.md`](CURRENT_STAGE_STATUS.md) | `38919d45` 已补实际游戏的 server buffer consumers 和 Android 旋转 blit([报告](notes/p5f/magma-inproc-fix.md));`194382c9` 又完成 Magma run-ahead、GPU 延迟退休与 VAO 身份碰撞修复([报告](notes/p5f/magma-runahead.md));`ed507b1a..d56c0e83` 29 个 DirectVulkan 提交的 shape 波(随 `e1bf3677` 合入,本行此前未记)已退役 packed-float mip 原生 blit(`5310ff62`)、resolve(`ec4ca06d`)、占位图像(`WirePlaceholderImages.inc`)、copy-image 端点、XFB 捕获 span、纹理回读;`70fb6689` 链关闭 inproc RD32 性能回归(86.85→116.73 fps)。其余工作(2026-09-22 审计改判):~~`SetupDrawSnapshot` 探测字段塌成 dirty mask~~ 与 ~~`VertexInputStateFactory` 内容寻址 CSO~~ **本阶段拒做**(`SetupDraw` 在非 monolith 传输下分支到 `SetupWireDraw`,monolith 快照机制在 split 下不跑;无性能门;ID-P7-5);占位纹理原生化**已落地**(缺 split 车道条目);具名 UBO host payload(D-B8)走了直绑常驻 `VkBuffer` range 的备选,欠一次测量 + 裁定关 OQ-6;内部 shader 烘焙**半已落地**(颜色 blit `WireColorBlitSpirv.h`,仅 split 臂),欠深度 mip 烘焙 + `MOBILEGL_BAKED_INTERNAL_SHADERS` 新鲜度门(0 处);D18 按 ID-P7-6 读法一句闭。**新增必须项**:Magma `StateObjectDeathOps`(六处特判)、OQ-8 归档 `storageBlocks`(`MagmaProgramSource::EnsureStorageBlocks` 每 draw 重跑 SPIRV-Reflect)、OQ-10 `kCapResidentSubData` 从未发布(split 下双后端退回就地 memcpy)、两处 `MagmaP7AllocatorDebtScope`。**P6 真机发现(2026-09-22 归此)**:`DirectVulkan` 分离路径在 Redmi 上两次观测 0.988998 / 0.976494(inproc 与 spawn 同表现,pbuffer monolith 1.0;case 归属、重复次数未记录,原始证据不在树内;取自 run-ahead ARMED 下,**lockstep 对照从未在 golden 口径下跑过**——wave 1 的 E1)——Magma × 真实 GPU;树上 `@P7` 具名拒绝**实为 15 处 / 4 文件**(`multisample-blit-shape` / `-aspect`、`depth-stencil-mipmap`(已窄化到 D\|S 合并)、`vertex-layout`、`vertex-format-conversion`、`texel-buffer-native-format`、`unaligned-{texel,storage,atomic}-buffer-range`、`storage-buffer-native-range`、`uniform-block-native-range`、`uniform-buffer-byte-tail` / `-dynamic-offset`、`copy-image-in-place`、`default-color-blit-shape`;外加 Magma 无 `StateObjectDeathOps` 与 `buffer-legacy-arm`),**全部是绕过 `Session::Fail` 与普查门的裸 abort**;必须退役 `.6/.8/.9/.11/.12/.13`,其余改 decline 即可;链接实验分给 P7 的 **101 个符号**(D12)。`DynamicBackendParameters` 定宽重写**不再是 P7 的**——它是跨平台 wire 的前提,归 P6.5 wf | 集成 + trace 在 Magma 的 push 与 split 下全绿(inproc 半已是硬门;**spawn / TCP 臂今天 DirectVulkan 条目为 0**——四条 split 臂硬编码 `MOBILEGL_BACKEND_TYPE=DirectGLES`,wave 0 补后端维度);verify 零分歧(verify 今天只注册 monolith,verify+split 撞旧 `PipeRespecifyScope` 断言,先清);真机 DirectVulkan split ssim 回到 1.0(分母排除 rd12 in-world 与 create-indirect,ID-P7-4;必须带 `RUN_AHEAD=0` 对照臂);184 符号棘轮(契约 §12.1)下降 P7 的 101 个——原 "`nm -D libMobileGLServer.so \| grep glslang` 为空" 不可达,D12 裁定 server 镜像就是整个 `libMobileGL.so`;仪器 `scripts/link_ratchet.py`(存符号列表、只对新增红)归 wave 0;CTS 五块(`texture_*` / `shader_image_*` / `packed_pixels` / `direct_state_access.*` / `uniform_buffer_object*`)先立 monolith×DirectVulkan 基线再比 inproc,≤0.5 pp 且新 crash = 0 单独硬红。**再基线检查点:中点完成子系统 < 40% 立即重定基线**(分母 = `notes/p7/PLAN-PH-P34B-P7.md` §4 的 9 项) | | **P8** emulation 下放 + 索引宿主镜像 + 协议广度 | 待排 | `MG_Impl/Pipe/HostResolve.cpp`(~~client 数组范围~~ 已由 `beba0256` 落地为 owned buffer;最大索引扫描、`*IndirectCount` 解析,逐站点 reconcile);`Server/IndexHostMirror` **待重裁**(树里 0 处;a6 §6 实测宿主索引 span 无 producer、client 索引已是 owned buffer——按 `kCapNeedsHostIndexBytes` 的真实消费者重新裁定,不照抄 `ARCHITECTURE.md` §10.3);multi-draw client indices(`MultiDrawElements+CLIENT_INDICES` 仍具名拒绝);CopyImage 镜像搬到 client;viewport-array 回放验证;`generate_mipmap` 计划 + CPU 回退纹素;`texture-remint-pull` 仿真下放(15 处具名拒绝);大 blob carrier 只剩 **program archive 与 `draw_vbo` range 尾**(a6 §6;与 P6.5 sl 共用同一分片);`kCapDriverOrderedXfbCapture`(0 处);~~无 present fence tick~~ 只记在 P10 | `'^DirectGLES\.Split\.'` 与 `'^DirectGLES\.'` 逐名相同;trace split 双后端 SSIM ≥ 0.99 含两个 `coherent_as_flush` fixture;`ClientArrayAfterComputeWriteScenario`;`create-indirect` 上 `roundtrips-per-frame` 读零;`index-mirror-bytes` 逐用例发布 | | **P9** 反向通道 | 待排,**P6.5 之后**(2026-09-22 重定范围) | **异步 reply 语义**,机制建立在 P6.5 的消息式 reply 之上(不再造 `SEG_REPLY` slot 池——池今天就有,stream 链路会删它);2 MiB reply cap 与 chunked readback(契约 §10.2.3 从 P6 改判至此,ID-47);PACK-PBO 回读 fire-and-forget + client 侧 `MarkGpuWritten`(ID-57,P6 未做);十个回调里未武装的四个:`OnTextureWriteback`、`OnTexturePullRequest`、`OnMipLevelsGenerated`、`OnLog` 分级(`OnXfbScatterReady` 是零生产者、零消费者、无 EventKind 的死声明——随 P3b/P4b 删除,`kMGPipeCallbackCount` 10→9;`ClientSession.cpp:429`;`OnBufferWriteback` / `OnGpuWritten` / `OnSurfaceChanged` / `OnGlError` / `OnCapsInvalidated` 已武装);`OnGpuWritten` 收窄;`OnBufferWriteback` 批处理 + epoch 排序;`OnGlError` 有序(CONTRACT-P5C §4.2);纹理拉取四条缓解 + 终止符;XFB 命名空间(`DeleteTransformFeedback` 的 server 侧泄漏——按裁定无行、最后两个 class-C 之一)。~~`SEG_EVENT` 溢出策略~~ 机制已由 P5e 落地(`ARCHITECTURE.md` §11.7),剩余的"不排空对端杀宿主"归 Ph | 回读 / XFB 场景在 split 下绿;`TextureRemintPullScenario`(含无解用例);拉取计数逐 trace 发布;两条故障注入 | | **P10** sync / query / present 节奏 | 待排 | ~~client 铸造 query handle~~(已是:`QueryCreate` 为 `kWaitNone`);轮询入口成门铃点 + `MOBILEGL_IPC_POLL_ESCALATE`(0 处;TCP 上是首要杠杆之一);DirectGLES 的 fence 完成度来自逐 fence 退休(`g_completedFrameSerial` 仍只在 `Present` 前进;Magma 那半已由 run-ahead 落地);非 present fence tick(唯一记载处);`present` 1:1(已是);~~credit 默认 1~~(已是默认,`ConfigLoader.cpp:414`);**`PRESENT_CREDIT > 1` 从未量过**(重审 §8.7)——带延迟链路上的首要杠杆,inproc 臂上即可取;roundtrip 计数器与输入延迟直方图(今天只有 `MapPersistentRoundtrips`);`SetSwapInterval`(最后一个手写 class-C,`EmitTables.cpp:1665`) | query / XFB / `AsyncCompile` 场景在 split 下绿;trace 上 draw / state / upload 路径 roundtrip 读零;零 timeout 轮询有界退出;credit 1..3 在 TCP loopback 与跨机臂上的配对记录;配对 A/B 记录 | @@ -50,7 +50,7 @@ CTS 周转单独计价(`gl44to46` 约 56,271 例):逐阶段只跑该阶段 ## 立即的下一项:P6.5 第一波 —— 全 TCP 传输(client 在 WSL,server 在 adb 设备) -> 状态:**已实现并落地推送 `feat/disaggregated@fe27380a`(2026-09-22),代码审查完成(无硬缺陷 + 两修复),固定制品代表性再验收通过。** 主机 unit 2399、integration-tcp loopback 102、Redmi **device-102 102 全 ARMED**、代表性 retrace OpenRA 1.0 全 ARMED;G1 与真实断线门通过。完整 39 例 device golden 矩阵与余下链路必测数按「本地代表性、CI 兜底」留 CI/后续,**尚未宣布阶段收官**;逐项见 [`CURRENT_STAGE_PROGRESS.md`](CURRENT_STAGE_PROGRESS.md) 与 [`notes/p65/`](notes/p65/)。目标形态:x86_64 的 WSL 进程作为 client,Redmi `2f7cbe2e`(aarch64,Adreno)上的 server 进程作为 server,两者在同一局域网内经 **TCP** 连接;`integration` 全部用例与 CI retrace 的 split 子集在这条链路上跑通并对上 golden。本节是 P6.5 行的第一波,只做「控制面 TCP + 数据面 stream」这一对;同机的「TCP 控制 + 共享段数据」混搭(nd `auto` / sd)是第二波,本节不做。 +> 状态:**已实现并落地推送 `feat/disaggregated@fe28bdb5`(2026-09-22),代码审查完成(无硬缺陷 + 两修复),固定制品代表性再验收通过。** 主机 unit 2399、integration-tcp loopback 102、Redmi **device-102 102 全 ARMED**、代表性 retrace OpenRA 1.0 全 ARMED;G1 与真实断线门通过。完整 39 例 device golden 矩阵与余下链路必测数按「本地代表性、CI 兜底」留 CI/后续,**尚未宣布阶段收官**;逐项见 [`CURRENT_STAGE_PROGRESS.md`](CURRENT_STAGE_PROGRESS.md) 与 [`notes/p65/`](notes/p65/)。目标形态:x86_64 的 WSL 进程作为 client,Redmi `2f7cbe2e`(aarch64,Adreno)上的 server 进程作为 server,两者在同一局域网内经 **TCP** 连接;`integration` 全部用例与 CI retrace 的 split 子集在这条链路上跑通并对上 golden。本节是 P6.5 行的第一波,只做「控制面 TCP + 数据面 stream」这一对;同机的「TCP 控制 + 共享段数据」混搭(nd `auto` / sd)是第二波,本节不做。 ### 1 设计时的树上基线(实现前快照) @@ -227,9 +227,9 @@ P5c 当时移交的对象类 BARRIER-PULLED、transport registry 前端键、EGL - **P5b 出口(2026-09-16,已达成)**:主机全门 `348d22a4` complete;79 trace 72/6/1;设备源头 `82683d4a`(APK `p5bcodex2`)Redmi 正确性 8/8——四条 A/B trace 双后端首次在设备上 inproc 渲染;barrier tax 首测 split−push 逐线程 CPU p50 +5.9% – +18.2%。 - **P5f 出口(2026-09-20)**:双块和 strict 空棘轮、逐帧 rsp=0、零 BARRIER_PULLED、主机全门、异模型族审查修复和 Redmi 六 clean-boot 臂全部完成;P6 前提解除,实施未开始。 - **CI / inproc 收尾出口(2026-09-21)**:`feat/disaggregated` 主产物拆分编译 + inproc 主验收全绿——unit 2328 零失败、`integration-gpu` 双 transport 各 1455 零失败、retrace 77 例 monolith 77/77 且 inproc 的唯一间歇项(`bsl-esc-menu-854` DirectVulkan,lavapipe 固有 texture-handle 注册停顿越过旧 30 s barrier 预算)在预算修正为 120 s 后隔离 10/10 绿、18 项 CI 门全绿、双 ABI APK 与 AVD 生命周期验证通过;合入头 `e1bf3677`,最终矩阵以远端 CI 为准。 -- **P6 收官(2026-09-22)**:a6/c6/lk/so/sm/cp/hs/dl/st/t6 十包于 2026-09-21 合入 `feat/disaggregated`(头 `16bfab10`);三种传输(monolith/inproc/spawn)桌面与真机两进程 retrace 逐像素对上 golden;device-lost 闩把杀 server 从 123 s 错误 `BarrierTimeout` 变 5.7 s 正确 `DEVICE LOST`;`Session::Fail` 漏斗把裸 abort 93→4。出口门 1–6 ✅;**门 7 / 8 于 2026-09-22 采齐**:真机 reboot-clean 同热窗口配对 A/B 六臂 18/18 runner 退出 0、36/36 `PINNED`、0 `Fatal`,inproc vs spawn 的 client CPU p50 差 −0.15%(第二会话 +0.16%)——**判读 tie**(臂内散布 0.2–4.2%),monolith 基线约贵 30%;门 8 三数齐(门铃 A/B tie、`SEG_STAGE` 字节/帧、分块后记录/帧);G1 符号 0/0/0/0 且 `.text` 逐字节相同。**P6 就此收官,未设性能门**(只记录)。逐项见 `CURRENT_STAGE_PROGRESS.md`。 +- **P6 收官(2026-09-22)**:a6/c6/lk/so/sm/cp/hs/dl/st/t6 十包于 2026-09-21 合入 `feat/disaggregated`(头 `77cbd176`);三种传输(monolith/inproc/spawn)桌面与真机两进程 retrace 逐像素对上 golden;device-lost 闩把杀 server 从 123 s 错误 `BarrierTimeout` 变 5.7 s 正确 `DEVICE LOST`;`Session::Fail` 漏斗把裸 abort 93→4。出口门 1–6 ✅;**门 7 / 8 于 2026-09-22 采齐**:真机 reboot-clean 同热窗口配对 A/B 六臂 18/18 runner 退出 0、36/36 `PINNED`、0 `Fatal`,inproc vs spawn 的 client CPU p50 差 −0.15%(第二会话 +0.16%)——**判读 tie**(臂内散布 0.2–4.2%),monolith 基线约贵 30%;门 8 三数齐(门铃 A/B tie、`SEG_STAGE` 字节/帧、分块后记录/帧);G1 符号 0/0/0/0 且 `.text` 逐字节相同。**P6 就此收官,未设性能门**(只记录)。逐项见 `CURRENT_STAGE_PROGRESS.md`。 - **终局改判(2026-09-22)**:AVF pVM / `AF_VSOCK` 终局撤回,改为 TCP 跨机跨平台 + 控制面 × 数据面两轴传输栈;P6.5 上关键路径,Ph 前置于 P12 的非 loopback 监听;P6 核出三项漏项(server 进程 `PipeStats` 结构性零——收尾中已修、184 棘轮门、hs 的三行契约未落地)与 `CURRENT_STAGE_PROGRESS.md` 里一条错误的 S6 陈述(已改);class-C 已归零到两个(`SetSwapInterval`、`DeleteTransformFeedback`)。 -- **P7 wave 2 落地(2026-09-22)**:X1 / F1 / C / A / B / D1 / D2 / D3 / B2 / B3 十包合入 `feat/disaggregated`(`origin@be636ee5`,B3 在集成树上待推),每包八车道全绿、G1 恒等、每包一条两进程臂 red-once、每包一次 fable 聚焦审查;子系统分母 **6/9** 于 B2 落地时越过 40% 中点,不触发重定基线。真机 p7w4:门 3 34/36 与 monolith 同;OpenRA 的两个历史点值(0.976494 / 0.988998)被证明是同一帧一次 draw 的顶点前缀撕裂——wire 臂的 frame-serial floor 不健全,B3 关闭;bsl-esc-menu 是 server 死 VkBuffer 无界累积,M2 在修。 +- **P7 wave 2 落地(2026-09-22)**:X1 / F1 / C / A / B / D1 / D2 / D3 / B2 / B3 十包合入 `feat/disaggregated`(`origin@b089e0de`,B3 在集成树上待推),每包八车道全绿、G1 恒等、每包一条两进程臂 red-once、每包一次 fable 聚焦审查;子系统分母 **6/9** 于 B2 落地时越过 40% 中点,不触发重定基线。真机 p7w4:门 3 34/36 与 monolith 同;OpenRA 的两个历史点值(0.976494 / 0.988998)被证明是同一帧一次 draw 的顶点前缀撕裂——wire 臂的 frame-serial floor 不健全,B3 关闭;bsl-esc-menu 是 server 死 VkBuffer 无界累积,M2 在修。 - 仍是方向、不据此伪造新日历:全功能 split(P8 之后)、纯度门在非 verify 构建上转绿(P13)。 再基线检查点仅剩一条:**P7 中点完成子系统 < 40% 立即重定基线**(P3a 的检查点发现不了 Magma 特有的超期)。 @@ -243,7 +243,7 @@ P5c 当时移交的对象类 BARRIER-PULLED、transport registry 前端键、EGL | `SEG_REPLY` 2 MiB 单槽 payload cap | → **P9**(契约 §10.2.3 改判,ID-47);stream 链路上 reply 本就是消息,cap 变成 P6.5 nd 的 `maxReplyBytes` 窗口 | | `GetCaps` 的两个 blobref | 目前不骑 record;一旦运输,必须有 server→client carrier rule,不能套 `SEG_STAGE` | | PACK-PBO readback | P5 曾具名拒绝;`70df57bb`(2026-09-20)起 **client 侧已实现**(bounce 紧凑 reply + 按 PACK 步长逐行 `UploadSubData`,`EmitTables.cpp`;`glGetTexImage` 同形且按 `MaxReplyBytes` 分块);剩余只是 fire-and-forget(`MarkReadPixelsPackBuffer` 全仓无生产调用者)→ **P9**(ID-57) | -| ABI fingerprint | **已由 P6.5 wf / nd 落地(`fe27380a`)**:`wireFingerprint` 布局摘要 + `buildFingerprint` 拆分(只在 `Dial==Fork` 或 `MOBILEGL_IPC_REQUIRE_SAME_BUILD=1` 下比较)、`LinkTerms` 四个尺寸由 server 陈述、`DynamicBackendParameters` 定宽;`CONTRACT-P6.md:666` 仍把定宽记在 P7 名下,待改 | +| ABI fingerprint | **已由 P6.5 wf / nd 落地(`fe28bdb5`)**:`wireFingerprint` 布局摘要 + `buildFingerprint` 拆分(只在 `Dial==Fork` 或 `MOBILEGL_IPC_REQUIRE_SAME_BUILD=1` 下比较)、`LinkTerms` 四个尺寸由 server 陈述、`DynamicBackendParameters` 定宽;`CONTRACT-P6.md:666` 仍把定宽记在 P7 名下,待改 | | 默认 32 MiB staging | 目标负载单次 128 MiB 上传装不进默认 stage;**内容侧分块已落地**(buffer 范围走查 `1e7c372e`、纹理整宽 slab `9469d48e`,预算 `MGPipeStageChunkBytes()` = 默认 segment/4 = 8 MiB),故普查 / Redmi 的显式 256 MiB profile 不再是这两条路径的必需;未接入分片的 record 类型与专用 carrier 仍归 P8(开放问题 11) | | P5b 的 inproc 依赖 | 历史的 scoped client binding、mip registry 查询与 FBO death mailbox 已经 P5c/P5f 改为记录、句柄和控制/事件路径;P6 核验并装配已有载体,不再重做这些迁移 | | 未迁移与仿真路径 | **class-C 已归零到两个**(2026-09-22 核):`EmitTables.cpp` 的 `MGR_UNMIGRATED_*` 列表全空,只剩手写的 `SetSwapInterval`(P10)与按裁定无行的 `DeleteTransformFeedback`(P9);契约 §11 / SPAWN-PLAN §8 的"511 class-C entries"是 P5 joint 树上的旧普查(`notes/p6/census-classC.md`),不是当前数;~~client vertex arrays~~(已实现:`beba0256` 起 wire 复制到 owned buffer 并保留 baseVertex/baseInstance/drawID,本轮补齐 monolith 臂 `62bfe461..e258a822`)、multi-draw client indices、RGB 三通道 CPU mip、renderbuffer copy endpoint、未绑定 named clear、`texture-remint-pull` 仿真保留具名拒绝 → P8 / P9;Magma split compute / image 的“82 个错答”是 P5b 历史普查计数,不是当前失败清单;P5f 后续已补应用 buffer consumers 与 Android 旋转 blit,Magma inproc 已能运行所测 MC 世界;后续 run-ahead 已完成([报告](notes/p5f/magma-runahead.md));XFB、部分不对齐范围、placeholder/native-format 及进一步性能工作仍归 P7([报告](notes/p5f/magma-inproc-fix.md)) | **P5e 补 → CI 收尾更正**:client vertex arrays 曾是 run-ahead 下的具名拒绝(ID-82)与预期红车道 `integration-clientarrays-split`(ID-134);`beba0256` 起已实现,`347bb90c` 已把该车道翻转为**硬绿门**并纳入主 GPU/split 标签,本轮补齐 monolith 臂(`62bfe461..e258a822`);staging 仍归 P8 @@ -263,7 +263,7 @@ P0 已回答的不再列出(spike A 的域、spike B 的分档、`posix_spawn` 5. **无存储的 capability。** 已答(P2):`FramebufferSrgb`、`DepthClamp`、`TextureCubeMapSeamless` 三个都补了真存储,`sizeof(RenderStateParameters)` 仍 1168。 6. **具名 UBO host payload 的形状(D-B8)。** Magma 在 26.3 世界每帧重打包 331 KB 具名 UBO 字节,Espryt 为 0。要么冻结第二变长尾形状,要么走备选(Magma 直接描述符绑定常驻 `VkBuffer` range,独立 `dev` PR)。P7。 7. **`MG_Util` 的切割缝。** server 需要 SPIRV-Cross / ESSL 转译缓存 / 格式处理器 / POST 探针,client 需要 glslang 与反射层;`MG_Util` 内部是否有干净的 Transpile-vs-Reflect 缝未审计。P7。 -8. **一份反射归档能否服务三个消费者。** Espryt 那一半已答(P4a):能且不需要复制。Magma 的第一个消费者已由 P5f fm 答:`MagmaProgramSource` 全部从 wire `ProgramArchive` 取,无前端对象、无复制。第二个(storage block 表)今天是**否**且变差了:split 下 `MagmaProgramSource::EnsureStorageBlocks` **每 draw** 重跑 SPIRV-Reflect(monolith 臂 `DirectVulkan.cpp:177-200` 至少有持久缓存);答案是往 `LinkArtifacts` 加有序 `storageBlocks`(数据已在 `blockReflection` 里),两个消费者都改读它。**已答(P7 wave 2-C,`04292f06..7ed5da52`)**:`storageBlocks` 入归档、两个消费者改读、每 draw SPIRV-Reflect 4→0;`g_programResourceCaches` 的 monolith 半边归 P13(G1)。 +8. **一份反射归档能否服务三个消费者。** Espryt 那一半已答(P4a):能且不需要复制。Magma 的第一个消费者已由 P5f fm 答:`MagmaProgramSource` 全部从 wire `ProgramArchive` 取,无前端对象、无复制。第二个(storage block 表)今天是**否**且变差了:split 下 `MagmaProgramSource::EnsureStorageBlocks` **每 draw** 重跑 SPIRV-Reflect(monolith 臂 `DirectVulkan.cpp:177-200` 至少有持久缓存);答案是往 `LinkArtifacts` 加有序 `storageBlocks`(数据已在 `blockReflection` 里),两个消费者都改读它。**已答(P7 wave 2-C,`dce9953d..cf7ca59f`)**:`storageBlocks` 入归档、两个消费者改读、每 draw SPIRV-Reflect 4→0;`g_programResourceCaches` 的 monolith 半边归 P13(G1)。 9. **viewport-array 回放能否塞进一次 `draw_vbo`**:各遍之间观察到的状态是否与今天一致未验证。P8。 10. **`ResidentSubData` 的不对称。** 已答一半(2026-09-22 核):**Magma 的实现已补**(`VkBufferManager.cpp:123` monolith 表、`:148` wire 表,`fff9d639f`)。**仍未答:`kCapResidentSubData` 从未被 server 发布**——`MG_Backend/Init.cpp:192-219` 是全树唯一的 `SetCapabilityBits` 生产调用点,只 OR 了 XFB、三个 query 位与 run-ahead 位;于是 `PipeFill.cpp:848` 在 split 下恒 false,**两个后端在拆分模式下都退回 `BufferObject.cpp:711-716` 的就地 memcpy**,Magma 的实现在 split 里是死代码。**已答(P7 wave 2-C,ID-P7-20)**:`InitServerRoleCommon` 按 server 自己的 wire 资源表发布 `kCapResidentSubData`,镜像收到即验收;白盒「发出的是 opcode 49」在 P11 采纳档落地前不可达(§5.4 债)。 11. **`SEG_STAGE` 的上限。** 内容侧已答(2026-09-20):**分块已实现**——buffer 范围走查(`1e7c372e`)与纹理整宽 slab(`9469d48e`)按 `MGPipeStageChunkBytes()`(默认 32 MiB 的 1/4 = 8 MiB)切成多条 `resource_subdata`,所以单次 128 MiB 上传不再需要显式 `MOBILEGL_IPC_STAGE_MB=256`;单片仍超 arena 或该 record 类型未接入分片时仍是 `Fatal{RingOverrun, "SEG_STAGE"}` 兜底。**仍未答(2026-09-22 收窄)**:a6 §6 实测没走查的只剩 **program archive**(唯一无界 blob)与 **`draw_vbo` 的 `NumDraws*12` range 尾**;宿主索引 span 无 producer(划掉),`set_global_constants` 有走查。二者的分片是 P6.5 sl 与 P8 共用的同一件事,stream 发送窗口对着它们定尺。MC in-world / Create 的占用分布仍未量(门 8 已给出两条负载的字节/帧与记录/帧,逐 blob 分布只在 integration 车道取到)。 diff --git a/docs/Disaggregated/notes/p34b/espryt-d1.md b/docs/Disaggregated/notes/p34b/espryt-d1.md index c3e5da95..8106863b 100644 --- a/docs/Disaggregated/notes/p34b/espryt-d1.md +++ b/docs/Disaggregated/notes/p34b/espryt-d1.md @@ -1,7 +1,7 @@ # espryt D1 — the Espryt (DirectGLES) stream, part 1 P3b/P4b items landing under the P7 program (`notes/p7/PLAN-PH-P34B-P7.md` §1.2 rows XFB / -回读 / `g_fboTextureSyncList`, §3 wave 2-D). Base `feat/disaggregated@665cfefc`, branch +回读 / `g_fboTextureSyncList`, §3 wave 2-D). Base `feat/disaggregated@ec3ba00a`, branch `p7/espryt-d1`. Per-slice red-once notes (R-16). A slice is not done until the case it adds has been seen RED diff --git a/docs/Disaggregated/notes/p34b/espryt-d2.md b/docs/Disaggregated/notes/p34b/espryt-d2.md index e1157254..5e1b7df1 100644 --- a/docs/Disaggregated/notes/p34b/espryt-d2.md +++ b/docs/Disaggregated/notes/p34b/espryt-d2.md @@ -1,7 +1,7 @@ # P3b/P4b wave 2-D package D2 — the Espryt stream, part 2 The verification gates P3b/P4b owes, plus the texture / program split-scenario census. -Base `7ed5da52` (`feat/disaggregated`), worktree `~/w7/p7-espryt-d2`, branch `p7/espryt-d2`. +Base `cf7ca59f` (`feat/disaggregated`), worktree `~/w7/p7-espryt-d2`, branch `p7/espryt-d2`. Package D1 owns `MG_Backend/DirectGLES/{DirectGLES.cpp,Managers.cpp}`, the XFB/readback scenarios and their split-arm registrations. Nothing here touches those; every diff --git a/docs/Disaggregated/notes/p34b/split-scenario-census.md b/docs/Disaggregated/notes/p34b/split-scenario-census.md index 9f894f0a..890d5c7d 100644 --- a/docs/Disaggregated/notes/p34b/split-scenario-census.md +++ b/docs/Disaggregated/notes/p34b/split-scenario-census.md @@ -3,7 +3,7 @@ `PLAN-PH-P34B-P7.md` §1.2, row **门:纹理 / program 场景 split 覆盖**: "~20 个候选场景…先在 inproc 跑一遍记首阻塞,按 P7/P8/P9 归属决定注册或具名排除". -Head `7ed5da52`, build `~/w7/p7-espryt-d2/build-split` (Release, clang, lavapipe ICD, WSL +Head `cf7ca59f`, build `~/w7/p7-espryt-d2/build-split` (Release, clang, lavapipe ICD, WSL desktop). Every candidate was run under `MOBILEGL_TRANSPORT=inproc` first; the ones that passed were then registered through `mgl_itest_register_split_arms` and re-run under all three transports, which is the reading in the table. @@ -28,14 +28,14 @@ un-exclusion makes it 77 on the integration tree, one per arm). The raw diff against that baseline reports **77** per arm at D2's head, not 76. The extra one is `DirectGLES..Ct.CtWireScenario.TheServerPublishesTheResidentSubDataCapabilityFromItsOwnTable`, -registered by the pre-existing `foreach(ctCase ...)` loop and added by `b56d70177` ("the server +registered by the pre-existing `foreach(ctCase ...)` loop and added by `1255caa2f` ("the server publishes kCapResidentSubData off its own wire resource table") — one of the five P7 commits between the `p7-before` baseline and this package's base. No file under `CtWireScenario` is touched here. An earlier draft of this note said "+37 entries per split arm". That number came from differencing against `~/w7/pipe/build-split`, which is the integrator's LIVE build directory and -had already moved past this package's base (`7ed5da52` -> `8c5dd6fc`); it matched nothing and is +had already moved past this package's base (`cf7ca59f` -> `ae3f43ab`); it matched nothing and is withdrawn. The split-arm registration count recorded for the tier-2 Magma replay went from 33 to 46. diff --git a/docs/Disaggregated/notes/p4a/p4a-results/gates-v1.md b/docs/Disaggregated/notes/p4a/p4a-results/gates-v1.md index ff56177b..d6d84f5a 100644 --- a/docs/Disaggregated/notes/p4a/p4a-results/gates-v1.md +++ b/docs/Disaggregated/notes/p4a/p4a-results/gates-v1.md @@ -446,7 +446,7 @@ run against the finished code): |---|---| | `ctest --test-dir build-verify -R 'HandleRecycle'` | the six ABA cases' `Handles` arm and the seven leak cases **arm themselves** when D and E land. The leak cases are the phase's only defence against P3a's C-1 shape, on both backends | | `ctest --test-dir build-push -R 'ObjectSubsystemControl'` and `MOBILEGL_PIPE_PUSH=0x9ff ctest -R 'ObjectSubsystemControl'` | both cases SKIP today; the On/Off A/B arms when B and C land, the refusal when D lands. The refusal lane already pins `0x9ff` itself, so D.3's separate `0x9ff` invocation is a second reading of the same thing rather than the only one | -| `ctest --test-dir build-push -R 'TextureUploadShape'` | ~~the client half (`ctu=`) is zero today; once B lands, the `ctu == emit` assertion is live~~ **DONE, P3b/P4b wave 2-D (R-11).** The client emitter landed (`MG_Impl/Pipe/TextureEmit.h`'s `EmitOneLevel`), the `ctu == emit` comparison is live, and the scenario is now a GATE against a gold row rather than a record. The workload gained a third texture written through a `glTextureView`, so the numbers are not comparable to the P4a baseline `emit=6 box=6 rect=0 jobs=6`: the row measured on `7ed5da52` is **`emit=9 box=9 rect=0 jobs=9`, client emitter 9**, identical on monolith / inproc / spawn / tcp. See `notes/p34b/espryt-d2.md` | +| `ctest --test-dir build-push -R 'TextureUploadShape'` | ~~the client half (`ctu=`) is zero today; once B lands, the `ctu == emit` assertion is live~~ **DONE, P3b/P4b wave 2-D (R-11).** The client emitter landed (`MG_Impl/Pipe/TextureEmit.h`'s `EmitOneLevel`), the `ctu == emit` comparison is live, and the scenario is now a GATE against a gold row rather than a record. The workload gained a third texture written through a `glTextureView`, so the numbers are not comparable to the P4a baseline `emit=6 box=6 rect=0 jobs=6`: the row measured on `cf7ca59f` is **`emit=9 box=9 rect=0 jobs=9`, client emitter 9**, identical on monolith / inproc / spawn / tcp. See `notes/p34b/espryt-d2.md` | | `bash scripts/p4a_descriptor_negative_control.sh build-push` | exits 2 today because both emit headers are the contract's stubs. It becomes a real G7 control the moment B and C fill them in, and it is **not** a CI lane (it rebuilds the library up to four times) | | `bash scripts/p4a_untouched_regions.sh 37da3c3a HEAD` | this is the gate D and E can break. It is rc 0 here because nothing on the list has been touched yet | | `ctest --test-dir build-push -R 'TextureParamsWithoutASamplerView'` | green here; after `esprytobj` it is the regression net that says the parameter sync did not move onto the sampler view | diff --git a/docs/Disaggregated/notes/p6/docs-closeout-measurements.md b/docs/Disaggregated/notes/p6/docs-closeout-measurements.md index 565147ee..dcd4615d 100644 --- a/docs/Disaggregated/notes/p6/docs-closeout-measurements.md +++ b/docs/Disaggregated/notes/p6/docs-closeout-measurements.md @@ -4,9 +4,9 @@ > 报告文件:本文件。任务书要求「只改你负责的那一份文档,另外两份由并行代理负责」—— > 另一个代理的文档(`CURRENT_STAGE_PROGRESS.md`)与第三份**没有被触碰**。 > 工作树:`feat/disaggregated`,**未 `git commit`**,未动任何既有未提交改动。 -> **头号勘误**:任务书写的分支头是 `71aa9951`,而写报告时 `git rev-parse HEAD` 读到的是 -> `2bd86664`(`71aa9951` 是它的祖先,另有 `2d86e07a` 一个提交夹在中间,两者都是 P6.5 的文档/传输 -> 提交,不涉及本次改动)。任务书同时把 `71aa9951` 标为门 8 的源码头——本文件里的源码头就是这样记的, +> **头号勘误**:任务书写的分支头是 `94c130d6`,而写报告时 `git rev-parse HEAD` 读到的是 +> `4e7bf0fe`(`94c130d6` 是它的祖先,另有 `872370ba` 一个提交夹在中间,两者都是 P6.5 的文档/传输 +> 提交,不涉及本次改动)。任务书同时把 `94c130d6` 标为门 8 的源码头——本文件里的源码头就是这样记的, > 与分支头无关。 ## 0 一句话 diff --git a/docs/Disaggregated/notes/p6/docs-closeout-progress.md b/docs/Disaggregated/notes/p6/docs-closeout-progress.md index e505df2e..37b4e97c 100644 --- a/docs/Disaggregated/notes/p6/docs-closeout-progress.md +++ b/docs/Disaggregated/notes/p6/docs-closeout-progress.md @@ -1,9 +1,9 @@ # docs-closeout-progress — `CURRENT_STAGE_PROGRESS.md` 的 P6 收官写入报告 2026-09-22。工作树 `C:/Users/geekerwan/AndroidStudioProjects/FoldCraftLauncher/MobileGL-disagg`, -分支 `feat/disaggregated`,**现头 `2bd86664`**,与 `origin/feat/disaggregated` 同步。任务书给的 -头 `71aa9951` 是**两轮测量的源头**(门 7 报告记 `98d0b96c`、门 8 的 wire 计数器与真机第二轮记 -`71aa9951`);它之后分支又落了两个 P6.5 设计提交(`2d86e07a`、`2bd86664`),非本报告所加。 +分支 `feat/disaggregated`,**现头 `4e7bf0fe`**,与 `origin/feat/disaggregated` 同步。任务书给的 +头 `94c130d6` 是**两轮测量的源头**(门 7 报告记 `75dd0cb1`、门 8 的 wire 计数器与真机第二轮记 +`94c130d6`);它之后分支又落了两个 P6.5 设计提交(`872370ba`、`4e7bf0fe`),非本报告所加。 **只改了一份文档**:`docs/Disaggregated/CURRENT_STAGE_PROGRESS.md`。未 commit。工作树里既有的 未提交改动(`MobileGL/MG_Remote/**`、`MobileGL/MG_Util/**`、`tools/device_bench/pin_device.sh`、 @@ -38,17 +38,17 @@ P6.5、Ph、P12、seq/op 五条**逐字保留**(仅 `DirectVulkan` 条尾加 ### 1.1 头部状态段 旧:「状态(2026-09-21):P6 全部包已落地(a6…t6),出口门第 1–6 项达成;第 7 项…第 8 项…尚未 -正式采集,因此 P6 记为「实现完成、出口性能/设备数待补」,**未宣布收官**。分支 … 头 `16bfab10`」 +正式采集,因此 P6 记为「实现完成、出口性能/设备数待补」,**未宣布收官**。分支 … 头 `77cbd176`」 新:`P6 已收官(2026-09-22)`,并把分支头写成**三层事实**,因为任务书要求"照实说"而 -`71aa9951` 已不是树头: +`94c130d6` 已不是树头: -- 门 7 报告头 `98d0b96c`(`gate7-device-ab.md:3`)、门 8 第二轮头 `71aa9951` +- 门 7 报告头 `75dd0cb1`(`gate7-device-ab.md:3`)、门 8 第二轮头 `94c130d6` (`gate8-doorbell-device.md:3`、`gate8-wire-counters.md:3`)——**测量期的源头**; -- 其后两个提交 `2d86e07a`、`2bd86664` 是 P6.5 设计(已核实:`2d86e07a` 的 diff 只含 +- 其后两个提交 `872370ba`、`4e7bf0fe` 是 P6.5 设计(已核实:`872370ba` 的 diff 只含 `CONTRACT-P6.md` / `StreamLink.h`(+5 行注释) / `ARCHITECTURE.md` / `CURRENT_STAGE_PROGRESS.md` / - `P6-ENDSTATE-REVIEW.md` / `ROADMAP.md`;`2bd86664` 只含 `ROADMAP.md`); -- 现头 `2bd86664`,与 `origin` 同步(`git rev-parse origin/feat/disaggregated` = `2bd86664…`); + `P6-ENDSTATE-REVIEW.md` / `ROADMAP.md`;`4e7bf0fe` 只含 `ROADMAP.md`); +- 现头 `4e7bf0fe`,与 `origin` 同步(`git rev-parse origin/feat/disaggregated` = `4e7bf0fe…`); **工作树另有未提交的 P6 收尾改动**,指向 §1.1。 ### 1.2 §1.1 收尾(2026-09-22) diff --git a/docs/Disaggregated/notes/p6/docs-closeout-roadmap.md b/docs/Disaggregated/notes/p6/docs-closeout-roadmap.md index 00ebd800..f014dd31 100644 --- a/docs/Disaggregated/notes/p6/docs-closeout-roadmap.md +++ b/docs/Disaggregated/notes/p6/docs-closeout-roadmap.md @@ -23,10 +23,10 @@ ### 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 项 +(头 77cbd176,2026-09-21);出口门第 1–6 项达成,第 7 项(真机配对 A/B 热窗口)与第 8 项 (三个强制性能数)尚未正式采集,故 P6 记为「实现完成、出口性能/设备数待补」,未宣布收官**。 -**改后**:`P6 已收官(2026-09-22)`:全部包已落地(头 `16bfab10`,2026-09-21),出口门第 1–6 项此前已达成; +**改后**:`P6 已收官(2026-09-22)`:全部包已落地(头 `77cbd176`,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` / @@ -38,7 +38,7 @@ monolith 约贵 30%),门 8 三数齐;证据链 `notes/p6/gate7-device-ab.m ### 1.2 阶段表 P6 行(第 37 行) -- **状态列**:`⏳ 全部包已落地(2026-09-21,头 16bfab10);出口门 1–6 达成,7/8 待采` → +- **状态列**:`⏳ 全部包已落地(2026-09-21,头 77cbd176);出口门 1–6 达成,7/8 待采` → `✅ 已收官(2026-09-22)`,并保留十包落地信息。原「收官前另欠」三项改写为:server 进程 `PipeStats` 从未初始化**已在收尾中修好**;184 符号棘轮门与 hs 的 `LinkTerms` / `Refuse` / 指纹拆分**未落地、移交 P6.5**。 (只改「已在收尾中修好」这一处口径,未落地项原样保留——契约 §12.1 的棘轮门与 hs 三行确实仍未做。) diff --git a/docs/Disaggregated/notes/p6/gate7-device-ab.md b/docs/Disaggregated/notes/p6/gate7-device-ab.md index d1ac5b26..fe27b17d 100644 --- a/docs/Disaggregated/notes/p6/gate7-device-ab.md +++ b/docs/Disaggregated/notes/p6/gate7-device-ab.md @@ -1,6 +1,6 @@ # Gate 7 — Redmi `2f7cbe2e` paired A/B, and gate 8 item 1 (the doorbell) -2026-09-22, branch `feat/disaggregated`, source head `98d0b96c`. `CONTRACT-P6.md` §9 items 7 and 8-①. +2026-09-22, branch `feat/disaggregated`, source head `75dd0cb1`. `CONTRACT-P6.md` §9 items 7 and 8-①. Everything below was measured on one reboot-clean thermal window on Redmi `M332BF` (`2f7cbe2e`, SM8750, Adreno 830v2) from a **snapshot of the worktree** (`C:/Users/geekerwan/p6-snap/MobileGL-disagg`), diff --git a/docs/Disaggregated/notes/p6/gate8-doorbell-device.md b/docs/Disaggregated/notes/p6/gate8-doorbell-device.md index 95fbaab6..5e0f5bda 100644 --- a/docs/Disaggregated/notes/p6/gate8-doorbell-device.md +++ b/docs/Disaggregated/notes/p6/gate8-doorbell-device.md @@ -1,6 +1,6 @@ # Gate 8 item ① — the doorbell, measured on the device (server half included) -2026-09-22, branch `feat/disaggregated`, source head `71aa9951`. `CONTRACT-P6.md` §9 item 8-①. +2026-09-22, branch `feat/disaggregated`, source head `94c130d6`. `CONTRACT-P6.md` §9 item 8-①. The number this item asks for is the socket doorbell's cost against `inproc`'s condvar. The previous session (`gate7-device-ab.md`) delivered the **client** half of that ledger and reported the diff --git a/docs/Disaggregated/notes/p6/gate8-wire-counters.md b/docs/Disaggregated/notes/p6/gate8-wire-counters.md index 6f26681a..2aadb45c 100644 --- a/docs/Disaggregated/notes/p6/gate8-wire-counters.md +++ b/docs/Disaggregated/notes/p6/gate8-wire-counters.md @@ -1,6 +1,6 @@ # gate8-wire-counters — 门 8 的两个 wire 计数器、首采,与 spawn server 侧的 wait 账 -> 头 `71aa9951`(`git rev-parse HEAD`,写报告时读取;工作树另有并行 agent 在修子模块指针,未 commit)。 +> 头 `94c130d6`(`git rev-parse HEAD`,写报告时读取;工作树另有并行 agent 在修子模块指针,未 commit)。 > 环境:`wsl -d Ubuntu`,clang-20 / Ninja / Release / `MOBILEGL_BUILD_TYPE=Release`, > 快照 `~/w7/p6-gate8-src`(从 Windows 工作树 copy,见 §1),构建目录 `~/w7/p6-gate8-build`。 > 交付内容: diff --git a/docs/Disaggregated/notes/p6/git-worktree-fix.md b/docs/Disaggregated/notes/p6/git-worktree-fix.md index e43f623c..09797de4 100644 --- a/docs/Disaggregated/notes/p6/git-worktree-fix.md +++ b/docs/Disaggregated/notes/p6/git-worktree-fix.md @@ -266,7 +266,7 @@ Changes to be committed: | `git -C MobileGL status -sb` | 与修复前**逐字节相同**(12 个未初始化 `-` 不变) | | `git -C MobileGL submodule status` | 与修复前**逐字节相同** | | `git -C FoldCraftLauncher status -sb` | 与修复前**逐字节相同**(含原有的 `M .gitmodules`、`UU FCLauncher.java` 等,均非本次产生) | -| 各仓库 HEAD | `MobileGL` = `fff9d639`、`MobileGL-disagg` = `71aa9951`、超项目 = `6d733f6f`,**均未移动** | +| 各仓库 HEAD | `MobileGL` = `fff9d639`、`MobileGL-disagg` = `94c130d6`、超项目 = `6d733f6f`,**均未移动** | 被改到的共享 admin 目录的 **index、HEAD、objects 全部未动**(只删了 `core.worktree` 配置项,以及给 flatbuffers 补建新 admin)。 @@ -319,7 +319,7 @@ Changes to be committed: - **没有回滚或修改任何源码**。`MobileGL/MG_Util/Metrics/PipeStats.{h,cpp}`、`MobileGL/MG_Util/Metrics/PipeStatsTest.cpp`、 `MobileGL/MG_Remote/Wire/PipeWireCodec.cpp`、`tools/device_bench/pin_device.sh` 的工作区改动是并行代理的合法产物, 本修复只读不写(只在 `git add`/`reset` 往返里短暂进过索引,已验证索引被跟踪内容 md5 与修复前一致)。 -- **没有新增/移动任何提交**:`MobileGL-disagg` 仍停在 `71aa9951`,与 `origin/feat/disaggregated` 同步; +- **没有新增/移动任何提交**:`MobileGL-disagg` 仍停在 `94c130d6`,与 `origin/feat/disaggregated` 同步; `dev` 工作树仍在 `fff9d639`;超项目仍在 `6d733f6f`。 - **没有改分支**:`feat/disaggregated` 原样。 - **没有动 `3rdparty/*` 里的文件内容**(flatbuffers 的 admin 是建在 `.git/modules/...` 下的新 git 目录, diff --git a/docs/Disaggregated/notes/p6/lk-itemisation.md b/docs/Disaggregated/notes/p6/lk-itemisation.md index 310fa8b0..a0a8a1e6 100644 --- a/docs/Disaggregated/notes/p6/lk-itemisation.md +++ b/docs/Disaggregated/notes/p6/lk-itemisation.md @@ -1,5 +1,5 @@ # lk — 开工前的逐文件清单 -> 头 `0bbe41c2`。`CONTRACT-P6.md` §8.5 要求 `lk` 在开工前发布这份清单,理由是早先一份草案的棘轮基线 +> 头 `b6293957`。`CONTRACT-P6.md` §8.5 要求 `lk` 在开工前发布这份清单,理由是早先一份草案的棘轮基线 > 差了三倍,而**装在错误数字上的棘轮第一次 CI 就会因为和泄漏无关的理由变红**。 > 全部计数由 `grep -rn -E` 在本头机械产出,口径写在每节标题下。 @@ -59,7 +59,7 @@ ## C 实际结果(重组落地后补记) 两个口径在本文里曾经打架:表 B 的 41(受体限定为 `control|m_control|ctrl`)与 -`a54ae47a` 提交信息里的 44(受体不限)。**以表 B 的口径为准**,差额是三处受体不是 +`99649a90` 提交信息里的 44(受体不限)。**以表 B 的口径为准**,差额是三处受体不是 控制页对象的匹配;而实际改写时受体集合还要再宽一档,因为测试里普遍写作 `session.Control()->appliedSeq` / `owner.CmdControl()->appliedSeq`。 diff --git a/docs/Disaggregated/notes/p65/code-review-findings.md b/docs/Disaggregated/notes/p65/code-review-findings.md index 84634c7e..65570535 100644 --- a/docs/Disaggregated/notes/p65/code-review-findings.md +++ b/docs/Disaggregated/notes/p65/code-review-findings.md @@ -1,6 +1,6 @@ # P6.5 第一波 代码审查(4 切片,2026-09-22) -审查对象:`codex/p65-all-tcp` HEAD `52ffc6a7` + 未提交工作树(含 archive v2 / Present-glFlush 尾批 / 取消 / half-close 修复)。 +审查对象:`codex/p65-all-tcp` HEAD `018fab0f` + 未提交工作树(含 archive v2 / Present-glFlush 尾批 / 取消 / half-close 修复)。 四个并行 Opus 审查各读设计(ROADMAP §51–116)后逐文件核验。**结论:数据面、wire 布局、握手三块无硬正确性缺陷;实现整体谨慎、扎实。** 下表按严重度排序,两项已修,其余记为跟进。 | 严重度 | 发现 | 出处 | 处置 | diff --git a/docs/Disaggregated/notes/p65/evidence-index.md b/docs/Disaggregated/notes/p65/evidence-index.md index 9bba1bab..ba798091 100644 --- a/docs/Disaggregated/notes/p65/evidence-index.md +++ b/docs/Disaggregated/notes/p65/evidence-index.md @@ -12,9 +12,9 @@ ## 源码与制品身份 -- 基线:远端 `feat/disaggregated` 的 `e6c51d0711595f579decfaf78c1f5b0040ccd7fe`。 +- 基线:远端 `feat/disaggregated` 的 `9043442454ae38568315ddf2b1c1814b183aa235`。 最后一次 fetch 已确认没有更新;该提交是当前分支的祖先。 -- 开发工作树:`codex/p65-all-tcp`,HEAD `52ffc6a7` 加未提交修改。 +- 开发工作树:`codex/p65-all-tcp`,HEAD `018fab0f` 加未提交修改。 用户纠正提交偏好之前已有的两个本地提交随后只做了 rebase;之后未创建开发提交、未 push。 - 两端显式 build stamp:`410dfa94c3d92241e9ec01ddbba1bb911eb60d4b`。 它是本轮共享的构建标识,不代表当前 HEAD 或一份已提交的最终源码。 diff --git a/docs/Disaggregated/notes/p65/validation-status.md b/docs/Disaggregated/notes/p65/validation-status.md index ecbc321c..7c939c95 100644 --- a/docs/Disaggregated/notes/p65/validation-status.md +++ b/docs/Disaggregated/notes/p65/validation-status.md @@ -4,8 +4,8 @@ 但当时实际为 lockstep,不能充作 run-ahead 验收。首 caps race 修复后的 READY7 已取得主机 TCP 及 Redmi 各 **102 PASS / 0 FAIL / 0 SKIP**,每条实际 ARMED;正式 trace 矩阵与同模式性能数仍待补。 -当前源码基线为 `origin/feat/disaggregated@e6c51d07`,开发树 `codex/p65-all-tcp` 的 -HEAD 为 `52ffc6a7` 加未提交工作。两端曾共享的显式 `MOBILEGL_BUILD_STAMP` 是 +当前源码基线为 `origin/feat/disaggregated@90434424`,开发树 `codex/p65-all-tcp` 的 +HEAD 为 `018fab0f` 加未提交工作。两端曾共享的显式 `MOBILEGL_BUILD_STAMP` 是 `410dfa94c3d92241e9ec01ddbba1bb911eb60d4b`,**它不是当前 HEAD**;后续 rebase 没有改变当时的 生产字节,因此保留了这一制品标识。不能拿匹配的显式 stamp 替代每组产物 SHA、实际 arming 状态和运行证据,也不能把较早制品的绿移记到新的修复头。 @@ -131,7 +131,7 @@ link seam 的七个负控与生产 ownership 门已接入 `test.yml`,结果见 设备为 Redmi `2f7cbe2e`,aarch64 / Adreno 830,IP `192.168.21.181`。 已安装并启动 trace flavour 的前台 Service,supervisor 监听 `tcp://0.0.0.0:40613`, 两端令牌一致;使用显式设置的 `MOBILEGL_BUILD_STAMP`,不依赖 APK 的 `nogit` 文件名。 -当前沿用的 `410dfa94...` 是共享制品标识,不是当前 `52ffc6a7` 源码 HEAD。 +当前沿用的 `410dfa94...` 是共享制品标识,不是当前 `018fab0f` 源码 HEAD。 已经收到真实 Welcome 与 Adreno caps,wire/build 指纹均接受。 此前安装的 traceDebug 原生实际只有 `-g`、没有优化,以上只作功能诊断,不能作为 release 性能数。 后续功能复验已使用原生 `-O2/NDEBUG` 的 debuggable traceRelease APK,并保持受信任签名; diff --git a/docs/Disaggregated/notes/p65/wire-and-validation.md b/docs/Disaggregated/notes/p65/wire-and-validation.md index d04ac714..781ab99c 100644 --- a/docs/Disaggregated/notes/p65/wire-and-validation.md +++ b/docs/Disaggregated/notes/p65/wire-and-validation.md @@ -1,6 +1,6 @@ # P6.5 wire、计量与主机验证记录 -基线是 `origin/feat/disaggregated@2ec8e7f4`,实现树是 `410dfa94c3d92241e9ec01ddbba1bb911eb60d4b` 加本轮未提交修改。没有推送。以下数字注明采集边界,不代表整个 P6.5 已收官;设备、完整 integration 与最终阶段审查另记。 +基线是 `origin/feat/disaggregated@35b3283b`,实现树是 `410dfa94c3d92241e9ec01ddbba1bb911eb60d4b` 加本轮未提交修改。没有推送。以下数字注明采集边界,不代表整个 P6.5 已收官;设备、完整 integration 与最终阶段审查另记。 ## wire 事实与握手 @@ -27,7 +27,7 @@ Hello/Welcome 新字段采用 append;保留旧 FlatBuffers 字段槽。`wireFi - 真正复制到临时树后,互换 `MGPRange::Offset`/`Size` 两个同宽 `Uint64` 成员;成员布局摘要由 `4304347197452401705` 变为 `6038841773737773369`,两次使用同一未改动 build header。证据 `/tmp/p65-wire-control-ehave5w9/{before.s,after.s}`。生产树没有被临时改坏。 - `SessionHandshakeTest` 的生产 Accept 路径测试了 major=99、错误 wire 摘要的具名 Refuse、空 union 拒绝、Connect 异 build 成功、Fork 异 build 拒绝、Connect 强制同 build 拒绝;9/9 通过。 -- 真实 TCP supervisor 的开发期控制 `/home/swung/p65-supervisor-smoke/protocol-controls.json` 记录 major=99 → code 1、错误布局 → code 2、不同 build 的 Connect → Welcome、强制同 build → code 3,并验证拒绝后 supervisor 仍活着。该记录采于 rebase 前的 `2bd86664` 开发产物;不能据此冒称最新产物的所有进程退出条件均已重新取证。最终 control 复跑由阶段主报告记载。 +- 真实 TCP supervisor 的开发期控制 `/home/swung/p65-supervisor-smoke/protocol-controls.json` 记录 major=99 → code 1、错误布局 → code 2、不同 build 的 Connect → Welcome、强制同 build → code 3,并验证拒绝后 supervisor 仍活着。该记录采于 rebase 前的 `4e7bf0fe` 开发产物;不能据此冒称最新产物的所有进程退出条件均已重新取证。最终 control 复跑由阶段主报告记载。 ## G1 与生成器 diff --git a/docs/Disaggregated/notes/p7/INTEGRATOR-DECISIONS-P7.md b/docs/Disaggregated/notes/p7/INTEGRATOR-DECISIONS-P7.md index 9cde7bb7..4b2c4688 100644 --- a/docs/Disaggregated/notes/p7/INTEGRATOR-DECISIONS-P7.md +++ b/docs/Disaggregated/notes/p7/INTEGRATOR-DECISIONS-P7.md @@ -19,24 +19,24 @@ | ID-P7-13 | 2026-09-22 | iris-photon 归 `dev` 侧独立条目(Adreno 830 的 `vkCreateGraphicsPipelines` 对 photon 程序返回 `VK_ERROR_UNKNOWN`,`PipelineFactory.cpp:660`,monolith SSIM 0.0089,lavapipe 绿);不进 P7 出口门。 | OQ-17 先例:monolith 级的 Magma × Adreno 失败不是分离缺陷;拆分不借机顺手修。 | `exclusions.md` | | ID-P7-14 | 2026-09-22 | wave 0 三个包的命名/分桶裁定一并批准:C——`ResourceUnavailable`→`ServerCrashed`(不是 `SegmentMismatch`)、Magma 漏斗家族词保持 `UnmigratedVerb`、`Refuse{ProtocolMismatch}` / `Refuse{InitialCapsSnapshot}` 进 `LOCAL_REFUSAL_WORDS` 允许表;R——`FatalFunnel.cpp.o` 归 SHARED、`MG_Backend/Init.cpp.o` 按 a6 归 SERVER、Espryt 桶地板 5(`MG_Pipe::` 槽分配器符号,`# P13`)、P3b/P4b 可清数 9;L——`MagmaRunAheadScenario` / `MagmaWireCacheScenario` 只注册 inproc 臂(`MAGMA_INPROC_ONLY`),跨进程 hold / peek 记债;六处 `MGL_ITEST_MAGMA_*_ENVIRONMENT` 改用 `VULKAN_ENV`。 | 各包报告里的理由成立;改名会作废历史普查计数;一致性胜过「含义不变」。 | `scripts/ci/fatal_census.py`、`link_ratchet.py`、`spawn_lane_parity.py`、CMake | | ID-P7-15 | 2026-09-22 | 新增 wave 2 包 **X1**(inproc 下 GL 线程 memcpy 写进不可写映射的 SIGSEGV)进 P7 出口门 3 关键路径;其两条残余(屏蔽 SIGSEGV 的非 GL 线程写者、`RefaultOfANonWriteAccess`)与「P5d 的 Adreno mprotect 臂数字存疑」记 `CONTRACT-P7.md` §12,不阻塞 P7。 | 26.3 在门 3 分母里;机制是 bionic 指针标记 0xb4 与内核 `si_addr` 比较,与后端、run-ahead、persistent push 无关(E1/E4a/E4b)。 | `PersistentMapTracker.cpp`、`notes/p7/x1-persistent-map-segv.md` | -| ID-P7-16 | 2026-09-22 | 出口门 5 = **五个可测块**(texture 1055 / shader-image 125 / packed-pixels 4732 / dsa 371 / ssbo 124),UBO 块(GTF 模块)在本 CTS 提交 `0b04c470e` 无 kc-cts 不可运行,记 unrun;API 版本 **KHR-GL46**(设备探针列出 697 例,`mgprobe` PASS 含 default_fb=ok);`$BASE` 用 pre-wave-2 库 `p7w1-d260f110`,AFTER 同版本同 caselist。 | 设备探针结果;caselists README 已预告 GTF 缺席。 | `tools/cts/caselists/`、`notes/p7/device-window-1/CTS-base/` | +| ID-P7-16 | 2026-09-22 | 出口门 5 = **五个可测块**(texture 1055 / shader-image 125 / packed-pixels 4732 / dsa 371 / ssbo 124),UBO 块(GTF 模块)在本 CTS 提交 `0b04c470e` 无 kc-cts 不可运行,记 unrun;API 版本 **KHR-GL46**(设备探针列出 697 例,`mgprobe` PASS 含 default_fb=ok);`$BASE` 用 pre-wave-2 库 `p7w1-9be62cbc`,AFTER 同版本同 caselist。 | 设备探针结果;caselists README 已预告 GTF 缺席。 | `tools/cts/caselists/`、`notes/p7/device-window-1/CTS-base/` | | ID-P7-17 | 2026-09-22 | E2(present credit 扫描)与 E0b 的 ARMED 三遍确定性**不单独跑**:E1 已证明 run-ahead 整条线出局(OpenRA lockstep 仍 0.989、崩溃 case 照崩),确定性在 F1 修复后的复测里按 §7.2 一起做。 | runbook §5 的判别规则;设备时间省给 wave 2 复测与 CTS。 | `E1-lockstep/README.md` | -| ID-P7-18 | 2026-09-22 | F1 落地(`5d698cb9`):split 起会提到 `MG_State::Init()` 之前(`InitSplitRolesBeforeState()`),`CapsMirror::ServerConsumes` 不再从 placeholder 作答(他线程 bring-up 在飞时等 250 ms,否则 `Fatal{CapsBeforeFirstSnapshot}`);**批准** `MG_Config::SplitTransportRequestedByConfig` 作为该门的武装闩——任何绕过 `MG_ConfigLoader::Init()` 手设 `Transport` 再造前端对象的生产路径都会退回 placeholder 作答,今天只有 `ServerLoopTest` 这么做且写了理由。 | 发射者是确定性的(11 个默认纹理在起会前 `resource_create`),主机也发生;不做「把警告调轻 / callMask 全 1」。 | `MobileGL/Init.cpp`、`MG_Backend/Init.cpp`、`CapsMirror.{h,cpp}`、`ClientSession.cpp` | -| ID-P7-20 | 2026-09-22 | wave 2-C 落地(`04292f06..205793ca`)并批准其五条:§5.4 白盒(opcode 49 上 wire)在 P11 采纳档落地前不可达,以「server 按表发布 + 镜像收到」为验收;`g_programResourceCaches` 的 monolith 删除归 P13(G1);`buffer-window` 家族词暂留 `UnmigratedVerb`(改 `ProtocolCorruption` 记 §12);`vertex-layout` 屏蔽原因是七种不是六种;死亡缺口是 server twin 泄漏而非 client slot 泄漏(framebuffer 用例两边计数)。`p7_worktree.sh` 补 `MOBILEGL_ITEST_VK_ICD` 钉。 | 各条理由见 `notes/p7/magma-c.md`。 | `CONTRACT-P7.md` §3.2/§12、`p7_worktree.sh` | -| ID-P7-21 | 2026-09-22 | wave 2-A 落地(`5a14e5a1..2f48ccf4`)并批准:`uniform-buffer-byte-tail` 退役(外扩到字边界读进 staging,一次子字拷贝进 padded block);两处 native-range **钳制**;三处 unaligned-*-range 与 `texel-buffer-native-format` 具名 decline(可写 range 的 copyback 不做——该站点分不出 readonly,且录制点在 B/C 的 draw/dispatch 尾;配方在 `magma-a.md` §3.1);两条算术不变量(`*-offset-overflow`)留作 hook 经过的具名 Fatal、不再带 `@P7`。审计写的「offset = alignment + 1」测试**不可达**(前端对非对齐 offset 报 `GL_INVALID_VALUE`),真正活的缺口是 `glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, …, 4, 4)`(GL 只强制 `offset % 4`)。 | `notes/p7/magma-a.md`;`@P7` 树上只剩 B 的 5 处(`WireFramebuffer.inc` 4 + `VulkanRenderer.cpp` 1)。 | `UniformManager.cpp`、`F1WireScenario`、`CONTRACT-P7.md` §3.2 | +| ID-P7-18 | 2026-09-22 | F1 落地(`df17c416`):split 起会提到 `MG_State::Init()` 之前(`InitSplitRolesBeforeState()`),`CapsMirror::ServerConsumes` 不再从 placeholder 作答(他线程 bring-up 在飞时等 250 ms,否则 `Fatal{CapsBeforeFirstSnapshot}`);**批准** `MG_Config::SplitTransportRequestedByConfig` 作为该门的武装闩——任何绕过 `MG_ConfigLoader::Init()` 手设 `Transport` 再造前端对象的生产路径都会退回 placeholder 作答,今天只有 `ServerLoopTest` 这么做且写了理由。 | 发射者是确定性的(11 个默认纹理在起会前 `resource_create`),主机也发生;不做「把警告调轻 / callMask 全 1」。 | `MobileGL/Init.cpp`、`MG_Backend/Init.cpp`、`CapsMirror.{h,cpp}`、`ClientSession.cpp` | +| ID-P7-20 | 2026-09-22 | wave 2-C 落地(`dce9953d..074a0727`)并批准其五条:§5.4 白盒(opcode 49 上 wire)在 P11 采纳档落地前不可达,以「server 按表发布 + 镜像收到」为验收;`g_programResourceCaches` 的 monolith 删除归 P13(G1);`buffer-window` 家族词暂留 `UnmigratedVerb`(改 `ProtocolCorruption` 记 §12);`vertex-layout` 屏蔽原因是七种不是六种;死亡缺口是 server twin 泄漏而非 client slot 泄漏(framebuffer 用例两边计数)。`p7_worktree.sh` 补 `MOBILEGL_ITEST_VK_ICD` 钉。 | 各条理由见 `notes/p7/magma-c.md`。 | `CONTRACT-P7.md` §3.2/§12、`p7_worktree.sh` | +| ID-P7-21 | 2026-09-22 | wave 2-A 落地(`450d3075..2207b6d9`)并批准:`uniform-buffer-byte-tail` 退役(外扩到字边界读进 staging,一次子字拷贝进 padded block);两处 native-range **钳制**;三处 unaligned-*-range 与 `texel-buffer-native-format` 具名 decline(可写 range 的 copyback 不做——该站点分不出 readonly,且录制点在 B/C 的 draw/dispatch 尾;配方在 `magma-a.md` §3.1);两条算术不变量(`*-offset-overflow`)留作 hook 经过的具名 Fatal、不再带 `@P7`。审计写的「offset = alignment + 1」测试**不可达**(前端对非对齐 offset 报 `GL_INVALID_VALUE`),真正活的缺口是 `glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, …, 4, 4)`(GL 只强制 `offset % 4`)。 | `notes/p7/magma-a.md`;`@P7` 树上只剩 B 的 5 处(`WireFramebuffer.inc` 4 + `VulkanRenderer.cpp` 1)。 | `UniformManager.cpp`、`F1WireScenario`、`CONTRACT-P7.md` §3.2 | | ID-P7-22 | 2026-09-22 | S1(`IterationRPProgram203Scenario` exposure texel 差一个)**改判为环境敏感而非 tcp 专属**:A 在未钉 ICD 的树上 inproc 也 3/3 红、pipe(钉 lavapipe ICD)inproc 绿、L 只在 tcp 红。记为 §12 债,归 P6.5 StreamLink × Magma 交叉项的主人(未派);helper 已钉 ICD 免再混淆。 | 三棵树三种结果,唯一变量是 ICD 配置与臂。 | `CONTRACT-P7.md` §12 | -| ID-P7-23 | 2026-09-22 | wave 2-B 落地五片(`c5fa52f9..64530ed2`):mip 形状拒绝半退役 + 具名、深度 mip 烘焙 (A)(D)、copy-image-in-place、default-color-blit(含 3D 源 blit 寻址 bug)、**wire 回读竞态修复**(OpenRA 真机分歧的机制,主机用 fence 计数 red-once,因为本机布局是 GENERAL 撞不上空 scope)。B 未做的三项(multisample-blit ×2、AllocatorDebtScope ×2、B′ 棘轮下降)另派 **B2**。`WireColorBlit.inc` / `VulkanRenderer.h` 在簇内顺手改,批准。 | `notes/p7/magma-b.md`。 | `WireFramebuffer.inc`、`VulkanRenderer.{cpp,h}`、`WireDepthMipmap.*`、`scripts/bake_internal_shaders.py`(若有) | -| ID-P7-24 | 2026-09-22 | wave 2-D1 落地(`e35a0973..92f467ab`):XFB 孤儿目标保留 varyings、回写事件按 `EventRingCapacityBytes/4` 切片、`OnXfbScatterReady` 删除(回调 10→9,`ARCHITECTURE.md` §8.1/§8.5 改成树的样子)、四个 resolver 在有传输时具名启动期 stop、readback 家族三臂武装(+39 例/臂)。**readback 半边其实早已关**:首跑 65/65,`copy-image-shadow-mirror` 自 P5b i1 起有传输 `return`,`get-tex-image-shadow` 从 wire 路径不可达(server 经 `ReadTextureImageWire` 答)——P3b/P4b 行的「readback 开」是从未在传输下跑过的假设,不是缺陷;仍改成 rule-I decline 作纵深防御。`p7_worktree.sh` 改为非递归子模块 + 显式 `include/ska`。 | `notes/p34b/espryt-d1.md`。 | `DirectGLES.cpp`、`Managers.{h,cpp}`、`MGPipeCallbacks.h`、`ServerSession.cpp`、CMake | -| ID-P7-25 | 2026-09-22 | W4 真机复验(p7w4 = `8c5dd6fc`,`device-window-1/W4-verify/`):iterationt ×2 通过(B 的 mip 退役兑现);门 3 AFTER 矩阵 **34/36 与 monolith 差 ≤ 0.0005**,未过的只剩 OpenRA 与 bsl-esc-menu(inproc OOM,待 spawn 臂)。**ID-P7-19 的「冷驱动缓存」读法撤回**:16 遍显示 run-ahead 臂是与温度、`IPC_AUDIT`、`FIF=1` 都无关的每次约 50% 的竞态,且只产生两张图(`ace2af04` = golden、`fb75d412` = 14658 像素错,与 B 修复前逐字节相同);lockstep 确定性地给第三张 `4e5ba514`(0.988998 = E1)。B 的回读 fence 修复保留(真洞)但不是本分歧的机制。**门 3 对 OpenRA 的验收改为** run-ahead 与 lockstep 各 6 遍全 `ace2af04`,冷热各半。归因交 B3(四镜头调查 + 裁判)。D2 落地时顺手:`SubsystemDepsTest` 在 pull 构建下调用 push-only 的 resolver 使 `build-linux` 编不过而 `.so` 陈旧、G1 看似恒等——门脚本改为对 `linux build rc≠0` 硬红(ID-P7-11 的第二次)。 | 16 遍的表在 `W4-verify/README.md` §3;目标调用 31249 是 `glXSwapBuffers`,快照在 swap 前经普通 `glReadPixels` 入流,present 是 class-B 记录,没有旁路。 | `W4-verify/README.md`、`CONTRACT-P7.md` §7.2、`SubsystemDepsTest.cpp`、`p7-gate-*-inner.sh` | -| ID-P7-26 | 2026-09-22 | wave 2-D2 落地(`9d857dc0..e7c5fc60` + pull 构建修复 `6da19f71`);fable 审查判「带修复落地」,修复 1/2/4(TUS 散点工作负载的 union box 盖满整层所以 `rect=0` 是几何不是 unpack-ring 策略——`CoversWholeLevel`;`espryt_memo_purity.py` 对改名家族 fail-open、`LEGACY_MEMOS` 默认 ON 的措辞、`FRONTEND` 无词界;普查数 71→72、+37→+76、每片 Gates 行)交 D2 返工一轮,修复 3(排除用例的契约行)由集成者记 §12。**批准** D2 触及 `MG_Pipe/*`(`SubsystemDeps.def`、`MGPipe.h` 表)与 `CONTRACT-P5.md`:在 §9 D 簇清单之外,但正是计划 R-5/R-3 行点名的文件。审查确认:产品代码零 abort/Fatal/MGLOG 新增、`MG_Backend/` 零触及、G1 恒等、`SubsystemDeps.def` 与 `PipeFill.cpp:1487-1518` / 六个 resolver 逐行一致。 | 审查报告全文在 agent 记录;要点已入本行与 §12。 | `TextureUploadShapeScenario.cpp`、`espryt_memo_purity.py`、`split-scenario-census.md`、`CONTRACT-P7.md` §12 | +| ID-P7-23 | 2026-09-22 | wave 2-B 落地五片(`c4be3800..76b74693`):mip 形状拒绝半退役 + 具名、深度 mip 烘焙 (A)(D)、copy-image-in-place、default-color-blit(含 3D 源 blit 寻址 bug)、**wire 回读竞态修复**(OpenRA 真机分歧的机制,主机用 fence 计数 red-once,因为本机布局是 GENERAL 撞不上空 scope)。B 未做的三项(multisample-blit ×2、AllocatorDebtScope ×2、B′ 棘轮下降)另派 **B2**。`WireColorBlit.inc` / `VulkanRenderer.h` 在簇内顺手改,批准。 | `notes/p7/magma-b.md`。 | `WireFramebuffer.inc`、`VulkanRenderer.{cpp,h}`、`WireDepthMipmap.*`、`scripts/bake_internal_shaders.py`(若有) | +| ID-P7-24 | 2026-09-22 | wave 2-D1 落地(`faf0a1f9..ba81453f`):XFB 孤儿目标保留 varyings、回写事件按 `EventRingCapacityBytes/4` 切片、`OnXfbScatterReady` 删除(回调 10→9,`ARCHITECTURE.md` §8.1/§8.5 改成树的样子)、四个 resolver 在有传输时具名启动期 stop、readback 家族三臂武装(+39 例/臂)。**readback 半边其实早已关**:首跑 65/65,`copy-image-shadow-mirror` 自 P5b i1 起有传输 `return`,`get-tex-image-shadow` 从 wire 路径不可达(server 经 `ReadTextureImageWire` 答)——P3b/P4b 行的「readback 开」是从未在传输下跑过的假设,不是缺陷;仍改成 rule-I decline 作纵深防御。`p7_worktree.sh` 改为非递归子模块 + 显式 `include/ska`。 | `notes/p34b/espryt-d1.md`。 | `DirectGLES.cpp`、`Managers.{h,cpp}`、`MGPipeCallbacks.h`、`ServerSession.cpp`、CMake | +| ID-P7-25 | 2026-09-22 | W4 真机复验(p7w4 = `ae3f43ab`,`device-window-1/W4-verify/`):iterationt ×2 通过(B 的 mip 退役兑现);门 3 AFTER 矩阵 **34/36 与 monolith 差 ≤ 0.0005**,未过的只剩 OpenRA 与 bsl-esc-menu(inproc OOM,待 spawn 臂)。**ID-P7-19 的「冷驱动缓存」读法撤回**:16 遍显示 run-ahead 臂是与温度、`IPC_AUDIT`、`FIF=1` 都无关的每次约 50% 的竞态,且只产生两张图(`ace2af04` = golden、`fb75d412` = 14658 像素错,与 B 修复前逐字节相同);lockstep 确定性地给第三张 `4e5ba514`(0.988998 = E1)。B 的回读 fence 修复保留(真洞)但不是本分歧的机制。**门 3 对 OpenRA 的验收改为** run-ahead 与 lockstep 各 6 遍全 `ace2af04`,冷热各半。归因交 B3(四镜头调查 + 裁判)。D2 落地时顺手:`SubsystemDepsTest` 在 pull 构建下调用 push-only 的 resolver 使 `build-linux` 编不过而 `.so` 陈旧、G1 看似恒等——门脚本改为对 `linux build rc≠0` 硬红(ID-P7-11 的第二次)。 | 16 遍的表在 `W4-verify/README.md` §3;目标调用 31249 是 `glXSwapBuffers`,快照在 swap 前经普通 `glReadPixels` 入流,present 是 class-B 记录,没有旁路。 | `W4-verify/README.md`、`CONTRACT-P7.md` §7.2、`SubsystemDepsTest.cpp`、`p7-gate-*-inner.sh` | +| ID-P7-26 | 2026-09-22 | wave 2-D2 落地(`da30c130..519445f9` + pull 构建修复 `c2cc3a96`);fable 审查判「带修复落地」,修复 1/2/4(TUS 散点工作负载的 union box 盖满整层所以 `rect=0` 是几何不是 unpack-ring 策略——`CoversWholeLevel`;`espryt_memo_purity.py` 对改名家族 fail-open、`LEGACY_MEMOS` 默认 ON 的措辞、`FRONTEND` 无词界;普查数 71→72、+37→+76、每片 Gates 行)交 D2 返工一轮,修复 3(排除用例的契约行)由集成者记 §12。**批准** D2 触及 `MG_Pipe/*`(`SubsystemDeps.def`、`MGPipe.h` 表)与 `CONTRACT-P5.md`:在 §9 D 簇清单之外,但正是计划 R-5/R-3 行点名的文件。审查确认:产品代码零 abort/Fatal/MGLOG 新增、`MG_Backend/` 零触及、G1 恒等、`SubsystemDeps.def` 与 `PipeFill.cpp:1487-1518` / 六个 resolver 逐行一致。 | 审查报告全文在 agent 记录;要点已入本行与 §12。 | `TextureUploadShapeScenario.cpp`、`espryt_memo_purity.py`、`split-scenario-census.md`、`CONTRACT-P7.md` §12 | | ID-P7-27 | 2026-09-22 | bsl-esc-menu-854 **不排除**:monolith 807 MiB 通过、spawn 的 server 进程 ~1.2 GiB 死于 scudo `internal map failure`(client 543 MiB、系统余 8 GB)、inproc 1.6 GiB 死——wire 臂的内存缺陷(≈2.1× 字节或映射数上限),派 **M1** 归因(host 复测、逐 store 归因、泄漏/平台、`max_map_count`),修复包随归因定分区。 | `W4-verify/README.md` §3c 的采样表;ID-P7-12 的规则是「monolith 自己红才排除」。 | `CONTRACT-P7.md` §12 | -| ID-P7-28 | 2026-09-22 | wave 2-D3 落地(`6eaaf492 de6fb063 25b586d0`;其 `8274dcab` 与集成者的 `6da19f71` 重复,不取):view 陈旧缺陷取「谓词解析到 storage record」而非反向索引(删除顺序:反向索引要在 view 死亡时剪枝,否则 owner 上传会推到被回收给无关纹理的槽——静默跨纹理串号;且把可变状态放进两后端共读的 `MG_Pipe`);删除顺序由构造保证(`TextureObjectView::m_storageOwner` 强 `SharedPtr`,`resource_destroy` 在析构发出,`TextureObject.cpp:63`)。D-K2 「两处一行」实为六处读者,全部改读 `SubsystemDeps.def`,client 侧参数按 `kMGPipeP4aFamilySubsystems` 掩码(bit 8 的 vertex-input 发射归 P3a 规则,`TextureEmit.EveryDKTwoDependencyRowGatesItsOwnFamilyAndTheMirrorPairsStayLive` 抓到);**批准**「`SubsystemDepsTest` 从比两份副本变成比两个读者」的减弱,编译期一半(`MGPipe.h:225/:230`)承担。门:pull rc 0、`.text` 0xa52203、nm 0/0;unit 2426 / split 303 / spawn 219 / tcp 222 / magma 88/67/69 / full 530;census 79、ratchet 186、parity 0。门脚本模板自此对 `linux build rc≠0` 打 `GATE-RED`。 | `notes/p34b/espryt-d3.md`;两处基线引文更正(KHR-GL46 非 GL43;`texture_view` 1/7 红是 `view_sampling` 不是 `coherency`)。 | `Managers.{h,cpp}`、`PipeFill.cpp`、`DirectGLES.cpp`、`SubsystemDeps.def`、`CONTRACT-P5E.md` §5.2、`CONTRACT-P7.md` §12 | -| ID-P7-29 | 2026-09-22 | wave 2-D2 返工落地(`3cdaa5ee ec56644f 623d6641 c13ba36b`,叠在 D3 之上;`SubsystemDepsTest` 取 D2 版守卫 + 两条注记,`split-scenario-census.md` 与 D3 的附记手工合并):TUS 散点内缩后 gold 不变(`emit=9 box=9 rect=0 jobs=9` 四臂同)但对象对了——**零补丁 red-once** `MOBILEGL_ESPRYT_DISABLE_UNPACK_RING=1` 给 `box=3 rect=6 jobs=183`(两张散点纹理都动,26 像素例仍绿);顺带抓到 `ASSERT_TRUE(clientWindow.found)` 被「counters ON」横幅满足的假读,改为带 `tex[]` 的窗口;`espryt_memo_purity.py` 锚点/allow 活性断言后 6 条 allow 剩 1;`+76`/72 数字改正、每片 Gates 表。门:pull rc 0、G1 恒等、unit 2426 / split 303 / spawn 219 / tcp 222(`F1WireScenario.TextureReadbackRejectsPackedDestinationOverflowBeforeWriting` 首跑 1 红、rerun 绿——tcp 车道已知 flake 形状,非本包文件)/ magma 88/67/69 / full 530。 | D2 报告;tcp flake 记 §12 的既有条。 | `TextureUploadShapeScenario.cpp`、`PipeStatsWindow.h`、`espryt_memo_purity.py`、`test.yml`、`split-scenario-census.md`、`MEASUREMENTS.md` §13.1 | +| ID-P7-28 | 2026-09-22 | wave 2-D3 落地(`1e1f4bad 1c36987e 00d02396`;其 `8274dcab` 与集成者的 `c2cc3a96` 重复,不取):view 陈旧缺陷取「谓词解析到 storage record」而非反向索引(删除顺序:反向索引要在 view 死亡时剪枝,否则 owner 上传会推到被回收给无关纹理的槽——静默跨纹理串号;且把可变状态放进两后端共读的 `MG_Pipe`);删除顺序由构造保证(`TextureObjectView::m_storageOwner` 强 `SharedPtr`,`resource_destroy` 在析构发出,`TextureObject.cpp:63`)。D-K2 「两处一行」实为六处读者,全部改读 `SubsystemDeps.def`,client 侧参数按 `kMGPipeP4aFamilySubsystems` 掩码(bit 8 的 vertex-input 发射归 P3a 规则,`TextureEmit.EveryDKTwoDependencyRowGatesItsOwnFamilyAndTheMirrorPairsStayLive` 抓到);**批准**「`SubsystemDepsTest` 从比两份副本变成比两个读者」的减弱,编译期一半(`MGPipe.h:225/:230`)承担。门:pull rc 0、`.text` 0xa52203、nm 0/0;unit 2426 / split 303 / spawn 219 / tcp 222 / magma 88/67/69 / full 530;census 79、ratchet 186、parity 0。门脚本模板自此对 `linux build rc≠0` 打 `GATE-RED`。 | `notes/p34b/espryt-d3.md`;两处基线引文更正(KHR-GL46 非 GL43;`texture_view` 1/7 红是 `view_sampling` 不是 `coherency`)。 | `Managers.{h,cpp}`、`PipeFill.cpp`、`DirectGLES.cpp`、`SubsystemDeps.def`、`CONTRACT-P5E.md` §5.2、`CONTRACT-P7.md` §12 | +| ID-P7-29 | 2026-09-22 | wave 2-D2 返工落地(`b3334cf3 0f3b8272 394df892 a2d7fbd7`,叠在 D3 之上;`SubsystemDepsTest` 取 D2 版守卫 + 两条注记,`split-scenario-census.md` 与 D3 的附记手工合并):TUS 散点内缩后 gold 不变(`emit=9 box=9 rect=0 jobs=9` 四臂同)但对象对了——**零补丁 red-once** `MOBILEGL_ESPRYT_DISABLE_UNPACK_RING=1` 给 `box=3 rect=6 jobs=183`(两张散点纹理都动,26 像素例仍绿);顺带抓到 `ASSERT_TRUE(clientWindow.found)` 被「counters ON」横幅满足的假读,改为带 `tex[]` 的窗口;`espryt_memo_purity.py` 锚点/allow 活性断言后 6 条 allow 剩 1;`+76`/72 数字改正、每片 Gates 表。门:pull rc 0、G1 恒等、unit 2426 / split 303 / spawn 219 / tcp 222(`F1WireScenario.TextureReadbackRejectsPackedDestinationOverflowBeforeWriting` 首跑 1 红、rerun 绿——tcp 车道已知 flake 形状,非本包文件)/ magma 88/67/69 / full 530。 | D2 报告;tcp flake 记 §12 的既有条。 | `TextureUploadShapeScenario.cpp`、`PipeStatsWindow.h`、`espryt_memo_purity.py`、`test.yml`、`split-scenario-census.md`、`MEASUREMENTS.md` §13.1 | | ID-P7-30 | 2026-09-22 | D3 的 fable 审查判「带修复落地」,两处修复由集成者直接落在 pipe:(1) `SubsystemDeps.def` 第 1/6 行(bit 8 / bit 13 各 requires bit 7)自 D3 起是活行为、却无任何钉子(`MGPipe.h` 的 static_assert 只钉纹理行/程序行/0x7ff/0x1fff,`SubsystemDepsTest` 只扫四个 P4a resolver)——加两条 `static_assert`;(2) 「删除顺序由构造保证」的说法在常见情形下反了:`m_storageOwner` 是派生类成员、destroy 从基类析构发出,view 持有 owner 最后一个引用时 wire 上先 `resource_destroy(owner)` 后 `(view)`,一次 apply 内 view 记录活着而 `ViewOf` 指向已释放槽——保证是 walk 的 `Live`/`Gen` 检查,不是顺序;`Managers.h`、`CONTRACT-P5E.md` §5.2、`espryt-d3.md` 三处改写,call-site 计数「五→四」改「四→三」。审查确认:门代数对非 view 逐字节同旧;G1 每处改动都在 `PIPE_PUSH`/`BUILD_DISAGGREGATED` 守卫内;red-once 在 tcp 臂真跑真红;引文(KHR-GL46、`view_sampling`)属实。**批准** D3 改 `CONTRACT-P5E.md` §5.2(既非 R-5 也非 R-3,但是 D2 普查行点名的修正)。 | 审查报告;`~/w7/pipe` 上 `range-diff` 三个提交 `=`。 | `MGPipe.h`、`Managers.h`、`CONTRACT-P5E.md`、`espryt-d3.md` | -| ID-P7-31 | 2026-09-22 | wave 2-B2 落地(`089fd495 22c2687d 824eac05 ec46a550`):multisample-blit-shape / -aspect 退役(scratch resolve + 第三套烘焙 resolve shader;MS 目的地与无臂采样数具名 decline),`MagmaP7AllocatorDebtScope` 两处删除(P7 基线只剩两处——P5e 裁定 12 的四处里 P5f fv/fm 已去两处;类型留作 `RemoteClientTest` 负控),(B′) disaggregated 构建的 monolith 臂改用烘焙模块,棘轮 **186 → 173 重基线**(p7-magma 101 → 88,余 88 = monolith draw 路径,按 ID-P7-5 留运行时分支、不标 `# P13`,归 wave 3)。**`@P7` 拒绝站点归零**(§3.2 六个退役全部完成 → 子系统分母 (2) 成)。门:pull rc 0、G1 恒等;unit 2429 / split 303 / spawn 219 / tcp 222 / magma **93/72/74** / full 533;census 79、parity 0。**批准** B2 的「decline 的 GL 错误骑在后一次回复上、场景里 `glFinish()` 是承重的」记入 §12 作为 wire 错误归属的已知形状。真机待验:旋转面上的缩放 MS blit、Adreno 830 是否带 `VK_KHR_depth_stencil_resolve`(决定默认臂)、(B′) 烘焙 blit 几何在 ROTATE_90/180/270 下的等价(从未执行)。**fable 审查:带修复落地**——(1) tcp 臂的 `MsResolve1` 条目空转(knob 进的是 client 的 ctest ENVIRONMENT,tcp 的 server 是车道级 fixture 从自己的 `os.environ` 起,`tcp_server_fixture.py:60-68`;B 的 `FORCE_SHADER_MIPMAP`/`FORCE_DEFAULT_BLIT_SCRATCH` tcp 条目同病)→ 按 ID-P7-14 `MAGMA_INPROC_ONLY` 先例做 parity 例外只注册 split+spawn;(2) 翻转/缩放的 MS 深度/模板 resolve 仍 `MagmaWireFatal("multisample-depth-resolve-region")`(`WireFramebuffer.inc:437-443`)——颜色臂已处理翻转、深度却杀会话 → 缩放具名 decline、翻转逐行反向 copy-out;(3) 车道基线归因句改正(+4 = A 与 C 各 +2,都在 B 之前落地)。三项交 B2 返工一轮。审查确认:scratch 生命周期经 `RetireWireObjects` 标签正确、shader resolve 取样 0、无臂路径 decline 无 abort、B′ 每行在守卫内 pull 类布局不变、棘轮 13 去 + 5 重分类属实、bake `--check` fail-closed。§12 待记三条(缩放第二腿未裁剪、`multisample-resolve-region` 对超出读缓冲的源仍 Fatal、1→N 同矩形 decline 了合法形状)。 | `notes/p7/magma-b2.md`。 | `WireFramebuffer.inc`、`WireMultisampleResolve.*`、`VulkanRenderer.cpp`、`scripts/data/link_ratchet_baseline.txt`、`CONTRACT-P7.md` §3.2/§4.1 | +| ID-P7-31 | 2026-09-22 | wave 2-B2 落地(`452d33b5 51fa513d a50d50df 3c2867d3`):multisample-blit-shape / -aspect 退役(scratch resolve + 第三套烘焙 resolve shader;MS 目的地与无臂采样数具名 decline),`MagmaP7AllocatorDebtScope` 两处删除(P7 基线只剩两处——P5e 裁定 12 的四处里 P5f fv/fm 已去两处;类型留作 `RemoteClientTest` 负控),(B′) disaggregated 构建的 monolith 臂改用烘焙模块,棘轮 **186 → 173 重基线**(p7-magma 101 → 88,余 88 = monolith draw 路径,按 ID-P7-5 留运行时分支、不标 `# P13`,归 wave 3)。**`@P7` 拒绝站点归零**(§3.2 六个退役全部完成 → 子系统分母 (2) 成)。门:pull rc 0、G1 恒等;unit 2429 / split 303 / spawn 219 / tcp 222 / magma **93/72/74** / full 533;census 79、parity 0。**批准** B2 的「decline 的 GL 错误骑在后一次回复上、场景里 `glFinish()` 是承重的」记入 §12 作为 wire 错误归属的已知形状。真机待验:旋转面上的缩放 MS blit、Adreno 830 是否带 `VK_KHR_depth_stencil_resolve`(决定默认臂)、(B′) 烘焙 blit 几何在 ROTATE_90/180/270 下的等价(从未执行)。**fable 审查:带修复落地**——(1) tcp 臂的 `MsResolve1` 条目空转(knob 进的是 client 的 ctest ENVIRONMENT,tcp 的 server 是车道级 fixture 从自己的 `os.environ` 起,`tcp_server_fixture.py:60-68`;B 的 `FORCE_SHADER_MIPMAP`/`FORCE_DEFAULT_BLIT_SCRATCH` tcp 条目同病)→ 按 ID-P7-14 `MAGMA_INPROC_ONLY` 先例做 parity 例外只注册 split+spawn;(2) 翻转/缩放的 MS 深度/模板 resolve 仍 `MagmaWireFatal("multisample-depth-resolve-region")`(`WireFramebuffer.inc:437-443`)——颜色臂已处理翻转、深度却杀会话 → 缩放具名 decline、翻转逐行反向 copy-out;(3) 车道基线归因句改正(+4 = A 与 C 各 +2,都在 B 之前落地)。三项交 B2 返工一轮。审查确认:scratch 生命周期经 `RetireWireObjects` 标签正确、shader resolve 取样 0、无臂路径 decline 无 abort、B′ 每行在守卫内 pull 类布局不变、棘轮 13 去 + 5 重分类属实、bake `--check` fail-closed。§12 待记三条(缩放第二腿未裁剪、`multisample-resolve-region` 对超出读缓冲的源仍 Fatal、1→N 同矩形 decline 了合法形状)。 | `notes/p7/magma-b2.md`。 | `WireFramebuffer.inc`、`WireMultisampleResolve.*`、`VulkanRenderer.cpp`、`scripts/data/link_ratchet_baseline.txt`、`CONTRACT-P7.md` §3.2/§4.1 | | ID-P7-32 | 2026-09-22 | bsl-esc-menu 归因(M1,主机复现):split server 无界累积死 `VkBuffer`(`RespecifyWireBuffer` 无条件 `DeferRelease`,桶只在帧界扫,pbuffer 回放整跑只 1 条 present)——派 **M2**(`VkBufferManager.{h,cpp}`:serial 门控回收 + `MOBILEGL_IPC_WIRE_DEFERRED_MB` 水位线 + spawn 臂 red-once);`CollectGarbage()` 在 wire 臂从不执行的次级发现待 B3 落地后路由(`VulkanRenderer.cpp`);「pbuffer 回放 server 只收 1 条 present」另查(若 client 对 pbuffer 面跳过 present 记录,与 `ARCHITECTURE.md:531` 的 1:1 相悖,且饿死 server 全部帧界维护)。40% 检查点 **6/9 已过**(§8)。 | M1 报告;`~/w7/p7-probe-m1` 探针、`~/w7/m1/` 采样器与序列。 | `CONTRACT-P7.md` §8/§12 | -| ID-P7-33 | 2026-09-22 | wave 2-B3 落地(`f62ceec6 214cb2eb c2c3ca49 6a92a10d 38112dc6`,base 8c5dd6fc,叠在 B2 之上自动合并):OpenRA 真机分歧的机制按裁判 H1 **由计数证实**——wire 臂一个 frame serial 两次提交(S1 = 调色板 `glTexImage2D` 触发的 pooled-fence 中帧 flush,S2 = Present 携带 draw 与 staged 拷贝),`OnSubmitsCompletedUpTo` 逐记录 `NotifyFrameSerialComplete` 把 floor 提前到 N-1,帧 N 第一次 `glBufferSubData` 走 `WriteWireBuffer:268` 的无序 host memcpy 被 S2(N-1) 排队的拷贝盖掉;两种前缀 = 上一帧写入序列的后缀极大值(6696 = 31 quad × 216 B)。修复三片:(a) 32 处静默出口全部具名 + `WireDeclines.def` 计数(无新 abort/家族词,census 79 不变);(b) `WriteWireBuffer` 对仍有读者在飞的 buffer 一律走有序路径;(c) floor 只升到「无在飞记录仍携带」的可证 serial(`#if MOBILEGL_BUILD_DISAGGREGATED`)。计数 `unsound-serial-complete` monolith/inproc/spawn = 0/26/26 → 0/0/0;red-once `F1WireScenario.StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn 2/4 红 → 4/4 绿;强制回放 8102/2115/152216 px 错图 → 全 `ace2af04`。**未做**(另派 B4):裁判的 `WaitForSubmitsUpTo` 聚合等待(三处单 fence 退休站点 `Present:14094`/`WaitForSubmitIndex`/`WaitForFrameSerial`,只在无 present 的 fence 循环里不健全)与 GPU-drag 旋钮(修复后无法变红,只能做回归门)。B3 自己的第一稿机制(每第 8 次 drain)被其探针否决(OpenRA 回放 1 次 drain、33 次 serial 推进全来自 Present)。**镜头 A 的静默丢 draw 被独立否决**(32 处出口计数全 0)。门:pull rc 0、G1 恒等、census 79、ratchet 173、parity 0;unit 2429 / split 303 / spawn 219 / tcp 222(首跑因上一次被杀的门留下两个 `libMobileGLServer … 40613 --serve` 占端口而 220 红,清理后重跑 222/222)/ magma **95/74/76** / full 534。真机验收(p7w5):OpenRA inproc+spawn × run-ahead+lockstep 各 6、dump-armed ×3、FIF=8 ×3 全 `ace2af04`;修复前错图应为 quad 前缀 `K+1 ∈ {1,16,31,53}`。 | `notes/p7/magma-b3.md`;ID-P7-19/25 的两次改判到此闭合。 | `VulkanRenderer.{cpp,h}`、`VkBufferManager.{cpp,h}`、`VkTextureManager.cpp`、`WireDraw.inc`、`WireDeclineTally.h`、`WireDeclines.def`、`F1WireScenario.cpp` | -| ID-P7-34 | 2026-09-22 | **OpenRA 真机项关闭**:p7w5(`c89000f5`,B3 之上)验收 **27/27 golden**——inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、`FRAMESINFLIGHT=8` ×3(p7w4 上 6/6 红)、dump-armed ×3(p7w4 上 0/5 绿),全部 ssim 1.000000 / 0 px / `ace2af04`;iterationt ×2 与 26.3 逐位同 p7w4(`W5-verify/README.md`)。B3 的 fable 审查「带修复落地」(tcp `StaleSerial` 条目空转 → parity 例外;floor 钳位无车道 → `run_trace_case.cmake` 对 split 回放里的 `unsound-serial-complete` 行打红;`02bb5789` 的注记把提交项当成修复且仍讲 drain 机制 → 改写、`:273` 加 `IsSubmitIndexComplete(lastUseSubmitIndex)`、`:432` 重打戳;`WireDeclines.def` 53 行里 12 行无站点、纹理站点只计数 → 补齐或删行)交 B3 返工一轮;审查确认 floor 算术对每种顺序精确、`#else` 逐字、无卡死模式,并**否决**裁判的次级「聚合等待」为非缺陷(fence 信号覆盖更早的提交序工作;B 的回读洞是相反形状)——B4 降为后续包(GPU-drag 回归门 + §12 债)。§12 新债:disaggregated 构建的 monolith 臂在中帧 flush 下比 pull 构建更健全(`OnSubData` 经 `IsResourceBusy` 读同一 floor),pull 构建保留该潜在 bug(G1,P13)。 | 门 3 分母 36 现在只剩 bsl-esc-menu(M2)与 §7.2 终局形式。 | `W5-verify/`、`CONTRACT-P7.md` §7.2 | -| ID-P7-35 | 2026-09-22 | **B2 返工 r1 审查 = rework**(fable)。r1 三提交(`856aa7ab` / `5d896170` / `db6892ec` → pipe `475ab254` / `3c4cd022` / `00f342c9`)在 pipe 上门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma 96 / 75 / 72、full 535,但新用例 `AFlippedMultisampleResolveMirrorsTheBandsAndAScaleDeclines` 随 `DepthStencilReadbackMatrixScenario.*` 的整套注册落到 DirectGLES 三条 split 臂与两条 monolith 条目上而红。集成者实测 monolith DirectGLES 同红(翻转 resolve 后目的地仍是 0.5 清除值且无 GL 错、缩放 resolve 无 `INVALID_OPERATION`)= **Espryt 行为**,非 wire 缺陷;先按后端名 skip 的临时提交(`3b66d1b1`,八车道全绿)被审查推翻——**DirectVulkan monolith 条目同样红**(`VulkanRenderer.cpp:9594` 翻转矩形的深度 blit「not supported yet」、`:9608` 合法缩放):wire 臂现在比 monolith 臂更正确,skip 应按车道标记 `MGITest::IsSplitLane()` 而非后端名;临时提交已从 pipe 撤下(pipe 回到 `00f342c9`)。第二条 must-fix:逐行 `VkBufferImageCopy` 的 `bufferOffset = row × width × texelSize` 在 stencil(1 B)宽非 4 倍数或 D16 宽为奇数时违反 `VUID-vkCmdCopyBufferToImage-pRegions-07978`(scissor 裁剪产生任意宽度)→ 行距对齐 + stencil 腿 red-once。should-fix:§7 数字取自非祖先树(`5d896170`)、`COLOR\|DEPTH` 缩放 blit 先写完颜色再拒深度的部分效应未陈述、X 与跨格式 Y 两种 decline 共用一个 `MGLOG_E_ONCE`;nit ×4(`!dstSpan` 静默返回、parity tail 必须匹配、`MsFlip1.` 旋钮孪生、`:10066`)。**r2 已派**。同日:六个在跑 agent 撞 session limit 全部死亡,按各 worktree 未提交 diff 重派为 `claude-opus-5-5` 单 agent workflow(Agent 工具的 opus 别名仍是 Opus 5)。 | pipe 停在 `00f342c9`(DirectGLES split 三车道各 1 红)**不推送**,r2 落地后再门再推;§12 届时抄 B2 §6 五行 + 两条新行(monolith DirectVulkan 翻转 / 缩放 MS 深度 blit 是 wire-vs-monolith 分歧;Espryt 翻转 / 缩放 MS 深度 resolve 是 P3b/P4b 债)。 | `DepthStencilReadbackMatrixScenario.cpp`、`WireFramebuffer.inc`、`magma-b2.md` §6 / §7 | -| ID-P7-36 | 2026-09-22 | **B3 返工落地(pipe `23eeed68..8d1a7848` + 集成提交 `a785d055`),fable 审查 = land with fixes。** 返工五提交:`WireDeclines.def` 53 行全部有站点、每站点一条 W/E(新审计 `scripts/ci/wire_declines_audit.py` 进 CI);`StaleSerial.` 只注册 split+spawn;注记改写(floor = 保证、提交项 = 探针)+ `WaitForWireBufferHostAccess` 早返回兼看 `IsSubmitIndexComplete(lastUseSubmitIndex)` + `ReadWireBuffer` 等待后重打戳;`run_trace_case.cmake` 对 split 回放里任一 `MGWIRE-FLOOR unsound-serial-complete` 行打红(包树上撤钳位 → inproc/spawn 各 26 行红,恢复 → 0 绿)。**集成合并裁定**:B3 的 `MAGMA_NOT_OVER_TCP` 与 B2 的 `MAGMA_SERVER_ENV_KNOB_NO_TCP` 是同一形状 → 只留 B2 的机制(`compare_arms(no_tcp=)` / CMake `mglItestServerEnvKnobArm`),`.StaleSerial.` 入同一张表;冲突外残留的一行 `not_on_arm = not_on_arm or {}`(首次运行即 NameError)删除。pipe 门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma **96 / 75 / 71**(tcp 少 1 = StaleSerial 条目退出)、full 535、审计 53/53/0;**OpenRA DirectVulkan inproc + spawn 回放(B3 树的 replay exe + pipe 的库与 runner)ssim 1.000000 / 0 px / 0 条 unsound-serial-complete** —— 新红条件在 pipe 上武装,并入后续每个包的门(`~/w7/logs/pipe-retrace.sh`)。审查修正(已派 B3 修复轮):must-fix 审计把注释 / 字符串里的站点当真(剥注释与字面量);should-fix 8 行窗口不看分支(按缩进块回溯)、无 `--self-test` 负控、`run_trace_case.cmake` 在 spawn 的 server 日志缺失时读作 0 行 = 绿(补 fail-closed)、注记 §5 数字未标「包树」;nit ×3;§12 新债:`WaitForFrameSerial` 在钳位后对同 serial 的后续记录会先返回 true 而 `IsFrameSerialComplete` 为 false(调用方复查 → 今日退化为伪超时;B4 修)。 | 不阻塞推送;修复轮作为新提交叠加。V1 五提交已 cherry-pick(`e5477898..51c71d87`,尾注统一为 Fable),门 + 审查在跑;pipe 的 verify 构建(`build-verify`,`MOBILEGL_PIPE_VERIFY=ON`)首次配置以跑 `integration-verify{,-split}`。 | `wire_declines_audit.py`、`run_trace_case.cmake`、`VkBufferManager.cpp`、`magma-b3.md` | +| ID-P7-33 | 2026-09-22 | wave 2-B3 落地(`76bbb6c3 c9164f25 a2e244c0 511c1f16 9a494b6f`,base ae3f43ab,叠在 B2 之上自动合并):OpenRA 真机分歧的机制按裁判 H1 **由计数证实**——wire 臂一个 frame serial 两次提交(S1 = 调色板 `glTexImage2D` 触发的 pooled-fence 中帧 flush,S2 = Present 携带 draw 与 staged 拷贝),`OnSubmitsCompletedUpTo` 逐记录 `NotifyFrameSerialComplete` 把 floor 提前到 N-1,帧 N 第一次 `glBufferSubData` 走 `WriteWireBuffer:268` 的无序 host memcpy 被 S2(N-1) 排队的拷贝盖掉;两种前缀 = 上一帧写入序列的后缀极大值(6696 = 31 quad × 216 B)。修复三片:(a) 32 处静默出口全部具名 + `WireDeclines.def` 计数(无新 abort/家族词,census 79 不变);(b) `WriteWireBuffer` 对仍有读者在飞的 buffer 一律走有序路径;(c) floor 只升到「无在飞记录仍携带」的可证 serial(`#if MOBILEGL_BUILD_DISAGGREGATED`)。计数 `unsound-serial-complete` monolith/inproc/spawn = 0/26/26 → 0/0/0;red-once `F1WireScenario.StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn 2/4 红 → 4/4 绿;强制回放 8102/2115/152216 px 错图 → 全 `ace2af04`。**未做**(另派 B4):裁判的 `WaitForSubmitsUpTo` 聚合等待(三处单 fence 退休站点 `Present:14094`/`WaitForSubmitIndex`/`WaitForFrameSerial`,只在无 present 的 fence 循环里不健全)与 GPU-drag 旋钮(修复后无法变红,只能做回归门)。B3 自己的第一稿机制(每第 8 次 drain)被其探针否决(OpenRA 回放 1 次 drain、33 次 serial 推进全来自 Present)。**镜头 A 的静默丢 draw 被独立否决**(32 处出口计数全 0)。门:pull rc 0、G1 恒等、census 79、ratchet 173、parity 0;unit 2429 / split 303 / spawn 219 / tcp 222(首跑因上一次被杀的门留下两个 `libMobileGLServer … 40613 --serve` 占端口而 220 红,清理后重跑 222/222)/ magma **95/74/76** / full 534。真机验收(p7w5):OpenRA inproc+spawn × run-ahead+lockstep 各 6、dump-armed ×3、FIF=8 ×3 全 `ace2af04`;修复前错图应为 quad 前缀 `K+1 ∈ {1,16,31,53}`。 | `notes/p7/magma-b3.md`;ID-P7-19/25 的两次改判到此闭合。 | `VulkanRenderer.{cpp,h}`、`VkBufferManager.{cpp,h}`、`VkTextureManager.cpp`、`WireDraw.inc`、`WireDeclineTally.h`、`WireDeclines.def`、`F1WireScenario.cpp` | +| ID-P7-34 | 2026-09-22 | **OpenRA 真机项关闭**:p7w5(`713bea9a`,B3 之上)验收 **27/27 golden**——inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、`FRAMESINFLIGHT=8` ×3(p7w4 上 6/6 红)、dump-armed ×3(p7w4 上 0/5 绿),全部 ssim 1.000000 / 0 px / `ace2af04`;iterationt ×2 与 26.3 逐位同 p7w4(`W5-verify/README.md`)。B3 的 fable 审查「带修复落地」(tcp `StaleSerial` 条目空转 → parity 例外;floor 钳位无车道 → `run_trace_case.cmake` 对 split 回放里的 `unsound-serial-complete` 行打红;`02bb5789` 的注记把提交项当成修复且仍讲 drain 机制 → 改写、`:273` 加 `IsSubmitIndexComplete(lastUseSubmitIndex)`、`:432` 重打戳;`WireDeclines.def` 53 行里 12 行无站点、纹理站点只计数 → 补齐或删行)交 B3 返工一轮;审查确认 floor 算术对每种顺序精确、`#else` 逐字、无卡死模式,并**否决**裁判的次级「聚合等待」为非缺陷(fence 信号覆盖更早的提交序工作;B 的回读洞是相反形状)——B4 降为后续包(GPU-drag 回归门 + §12 债)。§12 新债:disaggregated 构建的 monolith 臂在中帧 flush 下比 pull 构建更健全(`OnSubData` 经 `IsResourceBusy` 读同一 floor),pull 构建保留该潜在 bug(G1,P13)。 | 门 3 分母 36 现在只剩 bsl-esc-menu(M2)与 §7.2 终局形式。 | `W5-verify/`、`CONTRACT-P7.md` §7.2 | +| ID-P7-35 | 2026-09-22 | **B2 返工 r1 审查 = rework**(fable)。r1 三提交(`856aa7ab` / `5d896170` / `db6892ec` → pipe `9fed478d` / `645dd96f` / `cc3c18c5`)在 pipe 上门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma 96 / 75 / 72、full 535,但新用例 `AFlippedMultisampleResolveMirrorsTheBandsAndAScaleDeclines` 随 `DepthStencilReadbackMatrixScenario.*` 的整套注册落到 DirectGLES 三条 split 臂与两条 monolith 条目上而红。集成者实测 monolith DirectGLES 同红(翻转 resolve 后目的地仍是 0.5 清除值且无 GL 错、缩放 resolve 无 `INVALID_OPERATION`)= **Espryt 行为**,非 wire 缺陷;先按后端名 skip 的临时提交(`3b66d1b1`,八车道全绿)被审查推翻——**DirectVulkan monolith 条目同样红**(`VulkanRenderer.cpp:9594` 翻转矩形的深度 blit「not supported yet」、`:9608` 合法缩放):wire 臂现在比 monolith 臂更正确,skip 应按车道标记 `MGITest::IsSplitLane()` 而非后端名;临时提交已从 pipe 撤下(pipe 回到 `cc3c18c5`)。第二条 must-fix:逐行 `VkBufferImageCopy` 的 `bufferOffset = row × width × texelSize` 在 stencil(1 B)宽非 4 倍数或 D16 宽为奇数时违反 `VUID-vkCmdCopyBufferToImage-pRegions-07978`(scissor 裁剪产生任意宽度)→ 行距对齐 + stencil 腿 red-once。should-fix:§7 数字取自非祖先树(`5d896170`)、`COLOR\|DEPTH` 缩放 blit 先写完颜色再拒深度的部分效应未陈述、X 与跨格式 Y 两种 decline 共用一个 `MGLOG_E_ONCE`;nit ×4(`!dstSpan` 静默返回、parity tail 必须匹配、`MsFlip1.` 旋钮孪生、`:10066`)。**r2 已派**。同日:六个在跑 agent 撞 session limit 全部死亡,按各 worktree 未提交 diff 重派为 `claude-opus-5-5` 单 agent workflow(Agent 工具的 opus 别名仍是 Opus 5)。 | pipe 停在 `cc3c18c5`(DirectGLES split 三车道各 1 红)**不推送**,r2 落地后再门再推;§12 届时抄 B2 §6 五行 + 两条新行(monolith DirectVulkan 翻转 / 缩放 MS 深度 blit 是 wire-vs-monolith 分歧;Espryt 翻转 / 缩放 MS 深度 resolve 是 P3b/P4b 债)。 | `DepthStencilReadbackMatrixScenario.cpp`、`WireFramebuffer.inc`、`magma-b2.md` §6 / §7 | +| ID-P7-36 | 2026-09-22 | **B3 返工落地(pipe `b8d10d07..3f92d0f1` + 集成提交 `75a64ce0`),fable 审查 = land with fixes。** 返工五提交:`WireDeclines.def` 53 行全部有站点、每站点一条 W/E(新审计 `scripts/ci/wire_declines_audit.py` 进 CI);`StaleSerial.` 只注册 split+spawn;注记改写(floor = 保证、提交项 = 探针)+ `WaitForWireBufferHostAccess` 早返回兼看 `IsSubmitIndexComplete(lastUseSubmitIndex)` + `ReadWireBuffer` 等待后重打戳;`run_trace_case.cmake` 对 split 回放里任一 `MGWIRE-FLOOR unsound-serial-complete` 行打红(包树上撤钳位 → inproc/spawn 各 26 行红,恢复 → 0 绿)。**集成合并裁定**:B3 的 `MAGMA_NOT_OVER_TCP` 与 B2 的 `MAGMA_SERVER_ENV_KNOB_NO_TCP` 是同一形状 → 只留 B2 的机制(`compare_arms(no_tcp=)` / CMake `mglItestServerEnvKnobArm`),`.StaleSerial.` 入同一张表;冲突外残留的一行 `not_on_arm = not_on_arm or {}`(首次运行即 NameError)删除。pipe 门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma **96 / 75 / 71**(tcp 少 1 = StaleSerial 条目退出)、full 535、审计 53/53/0;**OpenRA DirectVulkan inproc + spawn 回放(B3 树的 replay exe + pipe 的库与 runner)ssim 1.000000 / 0 px / 0 条 unsound-serial-complete** —— 新红条件在 pipe 上武装,并入后续每个包的门(`~/w7/logs/pipe-retrace.sh`)。审查修正(已派 B3 修复轮):must-fix 审计把注释 / 字符串里的站点当真(剥注释与字面量);should-fix 8 行窗口不看分支(按缩进块回溯)、无 `--self-test` 负控、`run_trace_case.cmake` 在 spawn 的 server 日志缺失时读作 0 行 = 绿(补 fail-closed)、注记 §5 数字未标「包树」;nit ×3;§12 新债:`WaitForFrameSerial` 在钳位后对同 serial 的后续记录会先返回 true 而 `IsFrameSerialComplete` 为 false(调用方复查 → 今日退化为伪超时;B4 修)。 | 不阻塞推送;修复轮作为新提交叠加。V1 五提交已 cherry-pick(`a1d17566..75858bfd`,尾注统一为 Fable),门 + 审查在跑;pipe 的 verify 构建(`build-verify`,`MOBILEGL_PIPE_VERIFY=ON`)首次配置以跑 `integration-verify{,-split}`。 | `wire_declines_audit.py`、`run_trace_case.cmake`、`VkBufferManager.cpp`、`magma-b3.md` | | ID-P7-19 | 2026-09-22 | OpenRA 真机分歧改判为 **wire 臂的 GPU 时序竞态**(冷驱动缓存 = 慢 pipeline 创建 → 最终帧回读在最后几批 draw 完成前采样),归 wave 2-B 第 0 片;主机 red-once 用 pipeline 创建延迟旋钮复现;真机验收 = 三次 `pm clear` 冷跑 1.0。F1 保留(机制正确)但不再被当作分歧原因。 | E7:`pm clear` 三遍 0.976493989 / 14658 逐字相同、热跑 1.0、冷 monolith 1.0、`FRAMESINFLIGHT=1` 一绿一红;两臂 client/server 日志逐行相同;diff 只缺最后画的对象。 | `WireFramebuffer.inc`、`VulkanRenderer.cpp`、`F1-verify/README.md` | diff --git a/docs/Disaggregated/notes/p7/PLAN-PH-P34B-P7.md b/docs/Disaggregated/notes/p7/PLAN-PH-P34B-P7.md index 3852eb26..f51d016c 100644 --- a/docs/Disaggregated/notes/p7/PLAN-PH-P34B-P7.md +++ b/docs/Disaggregated/notes/p7/PLAN-PH-P34B-P7.md @@ -1,4 +1,4 @@ -# Ph / P3b-P4b / P7 统筹计划(2026-09-22,基线 `feat/disaggregated@a96875bf`) +# Ph / P3b-P4b / P7 统筹计划(2026-09-22,基线 `feat/disaggregated@b95f5f1a`) > 用户指令:「查看 ROADMAP,统筹并推进实现,直到 P7 结束。先计划,看看 Ph、P3/4 深化、P7 有哪些任务已经完成、哪些不必要、哪些是必须的,然后开工实现直到 P7 结束。」 > @@ -147,4 +147,4 @@ P3b/P4b 余项(场景普查后半、CTS AFTER)→ Ph 大件(PH-1 (3)(4)、 ## 6. 纪律(每个提交) -沿用 ROADMAP「通用纪律」:ALL target 完整构建(**含 pull 构建的测试**——a96875bf 的 `build-linux` 因 `PipeStatsTest.cpp:137` 编不过,已修);G1 pull `.text` 恒 `0xa52203`、符号 0/0/0/0(基线 `~/w7/p7-before/`);G2/G14 名集合只增不删(split 4155 / linux 3049);每门 red-once;性能只记录;拆分不顺手修 `dev`;先 commit+push 再进下一波(用户 2026-09-11 常规)。 +沿用 ROADMAP「通用纪律」:ALL target 完整构建(**含 pull 构建的测试**——b95f5f1a 的 `build-linux` 因 `PipeStatsTest.cpp:137` 编不过,已修);G1 pull `.text` 恒 `0xa52203`、符号 0/0/0/0(基线 `~/w7/p7-before/`);G2/G14 名集合只增不删(split 4155 / linux 3049);每门 red-once;性能只记录;拆分不顺手修 `dev`;先 commit+push 再进下一波(用户 2026-09-11 常规)。 diff --git a/docs/Disaggregated/notes/p7/device-window-1/00-session/README.md b/docs/Disaggregated/notes/p7/device-window-1/00-session/README.md index 14d0e2c4..34eb9fa9 100755 --- a/docs/Disaggregated/notes/p7/device-window-1/00-session/README.md +++ b/docs/Disaggregated/notes/p7/device-window-1/00-session/README.md @@ -26,4 +26,4 @@ available: 1100000000 1050000000 967000000 ... 160000000 ## APK 身份 -见 `apk.sha256` / `apk-install.txt`(安装后写入)。构建:`~/w7/pipe@d260f110`,`assembleTraceRelease -Pmobilegl.buildDisaggregated=ON -Pmobilegl.buildDisaggregatedInproc=ON -Pmobilegl.pipePush=ON -Pmobilegl.debuggableRelease=true -Pmobilegl.applicationIdSuffix=.p7w1 -Pmobilegl.apkSuffix=p7w1`,显式 `MOBILEGL_BUILD_STAMP=p7w1-d260f110`,debug keystore 签名,并排安装为 `top.mobilegl.plugin.p7w1.trace`。 +见 `apk.sha256` / `apk-install.txt`(安装后写入)。构建:`~/w7/pipe@9be62cbc`,`assembleTraceRelease -Pmobilegl.buildDisaggregated=ON -Pmobilegl.buildDisaggregatedInproc=ON -Pmobilegl.pipePush=ON -Pmobilegl.debuggableRelease=true -Pmobilegl.applicationIdSuffix=.p7w1 -Pmobilegl.apkSuffix=p7w1`,显式 `MOBILEGL_BUILD_STAMP=p7w1-9be62cbc`,debug keystore 签名,并排安装为 `top.mobilegl.plugin.p7w1.trace`。 diff --git a/docs/Disaggregated/notes/p7/device-window-1/CTS-base/README.md b/docs/Disaggregated/notes/p7/device-window-1/CTS-base/README.md index 8b356470..be800353 100644 --- a/docs/Disaggregated/notes/p7/device-window-1/CTS-base/README.md +++ b/docs/Disaggregated/notes/p7/device-window-1/CTS-base/README.md @@ -1,6 +1,6 @@ # CTS `$BASE`(出口门 5)· monolith × DirectVulkan × KHR-GL46,Redmi `2f7cbe2e` -- 库:`/data/local/tmp/mgcts/libMobileGL.so` = p7w1 APK 的 arm64 库,stamp **`p7w1-d260f110`**(wave 0 之前的 monolith Magma;`../00-session/apk.sha256`;`deploy/IDENTITY.txt`)。 +- 库:`/data/local/tmp/mgcts/libMobileGL.so` = p7w1 APK 的 arm64 库,stamp **`p7w1-9be62cbc`**(wave 0 之前的 monolith Magma;`../00-session/apk.sha256`;`deploy/IDENTITY.txt`)。 - glcts:VK-GL-CTS `0b04c470e`(main),arm64,`DEQP_TARGET=mobilegl` + `tools/cts/patches/0001-fbo-color-texture-attachment.patch`;caselists `tools/cts/caselists/p7-*-gl46.txt`(同一提交切出)。 - 跑法:`run_cts.py --backend DirectVulkan --surface fbo --gl-config-name rgba8888d24s8 --cpu-mask fast --env MOBILEGL_CTS_FBO_COLOR_TEXTURE=1 --chunk-timeout 900 --skip-file tools/cts/caselists/p7-skip.txt`,无 `MOBILEGL_TRANSPORT`(monolith 是 `$BASE` 的定义)。preflight `mgprobe`:PASS,`default_fb=ok user_fbo=ok rbo_fbo=ok`(`preflight.txt`)。API 探针:`KHR-GL46.texture_swizzle.*` 列出 697 例(`probe-gl46.txt`)→ 读数在 **GL 4.6**,AFTER 必须同版本。 - 五块全部 `unrun.txt` / `hung.txt` / `crashed.txt` 为空 → **完整读数**;总耗时 6 分钟(`run-base.log`)。UBO 块(GTF)本 CTS 提交无 kc-cts,不可运行(ID-P7-16)。 @@ -13,4 +13,4 @@ | texture (`texture_*`) | 1055(1 例在 skip 表) | 815 | 221 | 18 | 98.29% | 77.32% | | packed-pixels | 4732 | 4732 | 0 | 0 | 100% | 100% | -失败按组:texture_barrier 4/4、texture_cube_map_array 5/27、texture_swizzle 4/697、texture_border_clamp 2/32、texture_buffer 1/16、texture_size_promotion 1/1、texture_view 1/7、shader_image_load_store 6/51、direct_state_access 2/371——逐例名在 `report-*.json`。它们是 **monolith Magma 的既有一致性状态**,不是 P7 的题;门 5 比的是 inproc × DirectVulkan 对这份读数每块 ≤ 0.5 pp 且新 crash = 0。机器可读:`base-DirectVulkan-monolith-p7w1-d260f110.json`(`cts_multi_report.py --json`)。 +失败按组:texture_barrier 4/4、texture_cube_map_array 5/27、texture_swizzle 4/697、texture_border_clamp 2/32、texture_buffer 1/16、texture_size_promotion 1/1、texture_view 1/7、shader_image_load_store 6/51、direct_state_access 2/371——逐例名在 `report-*.json`。它们是 **monolith Magma 的既有一致性状态**,不是 P7 的题;门 5 比的是 inproc × DirectVulkan 对这份读数每块 ≤ 0.5 pp 且新 crash = 0。机器可读:`base-DirectVulkan-monolith-p7w1-9be62cbc.json`(`cts_multi_report.py --json`)。 diff --git a/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/divergent-cases.md b/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/divergent-cases.md index 75ce8a8d..dd0582bf 100755 --- a/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/divergent-cases.md +++ b/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/divergent-cases.md @@ -1,6 +1,6 @@ # E0 · 分歧 case 名单(本窗口最重要的产出) -E0a:39 例 × {monolith, inproc} × DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-d260f110`(`apk.sha256`),reboot-clean,`svc power stayon usb`。两臂各 39/39 回放完成;两臂所有有结果的 case 都逐位确定(`ssim vs first = 1.0`,E0b 的 3 遍确定性在 E1 上补做了 OpenRA 一遍——同样逐位相同)。 +E0a:39 例 × {monolith, inproc} × DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-9be62cbc`(`apk.sha256`),reboot-clean,`svc power stayon usb`。两臂各 39/39 回放完成;两臂所有有结果的 case 都逐位确定(`ssim vs first = 1.0`,E0b 的 3 遍确定性在 E1 上补做了 OpenRA 一遍——同样逐位相同)。 ## 结论一句话 diff --git a/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/exclusions.md b/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/exclusions.md index e250a181..aa2ab6a8 100755 --- a/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/exclusions.md +++ b/docs/Disaggregated/notes/p7/device-window-1/E0-attribution/exclusions.md @@ -1,6 +1,6 @@ # E0 · 出口门 3 分母之外的 case(按名单列,不在汇总表里悄悄删行) -E0a monolith 臂(DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-d260f110`,Redmi `2f7cbe2e`)39 例全部回放、全部逐位确定(`ssim vs first = 1.0`),**3 例低于阈值**。它们都在 **monolith** 上就红,所以按 runbook §4 的判别「monolith 也分歧 ⇒ 问题不在分离」,从出口门 3 的分母里排除;分母 = 39 − 3 = **36**(另:rd12 in-world 本来不在 `--matrix` 里,ID-P7-4)。 +E0a monolith 臂(DirectVulkan × `--use-pbuffer` × 1 遍,APK `p7w1-9be62cbc`,Redmi `2f7cbe2e`)39 例全部回放、全部逐位确定(`ssim vs first = 1.0`),**3 例低于阈值**。它们都在 **monolith** 上就红,所以按 runbook §4 的判别「monolith 也分歧 ⇒ 问题不在分离」,从出口门 3 的分母里排除;分母 = 39 − 3 = **36**(另:rd12 in-world 本来不在 `--matrix` 里,ID-P7-4)。 | case | monolith SSIM | 阈值 | 原因 | 归属 | |---|---|---|---|---| diff --git a/docs/Disaggregated/notes/p7/device-window-1/F1-verify/README.md b/docs/Disaggregated/notes/p7/device-window-1/F1-verify/README.md index 91765308..d8f0c975 100755 --- a/docs/Disaggregated/notes/p7/device-window-1/F1-verify/README.md +++ b/docs/Disaggregated/notes/p7/device-window-1/F1-verify/README.md @@ -1,6 +1,6 @@ # F1 复验 + E7/E8 · OpenRA 的分歧是「冷驱动缓存」下的时序竞态 -APK `p7w3-3c8082cc`(wave 0 + X1 + F1;`../00-session/`),Redmi `2f7cbe2e`,DirectVulkan × `--use-pbuffer` × inproc。每次回放都是**新进程**(logcat pid 11917 → 12156 → 12478),所以「热」不在进程里,在 Adreno 驱动的磁盘 shader / pipeline 缓存里。 +APK `p7w3-3179c497`(wave 0 + X1 + F1;`../00-session/`),Redmi `2f7cbe2e`,DirectVulkan × `--use-pbuffer` × inproc。每次回放都是**新进程**(logcat pid 11917 → 12156 → 12478),所以「热」不在进程里,在 Adreno 驱动的磁盘 shader / pipeline 缓存里。 ## F1 本身:生效,但不是分歧的原因 diff --git a/docs/Disaggregated/notes/p7/device-window-1/W4-verify/README.md b/docs/Disaggregated/notes/p7/device-window-1/W4-verify/README.md index 051fc418..435d6abe 100644 --- a/docs/Disaggregated/notes/p7/device-window-1/W4-verify/README.md +++ b/docs/Disaggregated/notes/p7/device-window-1/W4-verify/README.md @@ -1,6 +1,6 @@ # W4 复验 · p7w4(X1+F1+C+A+B+D1)真机:门 3 AFTER 矩阵、iterationt、OpenRA 改判为纯竞态 -APK `p7w4-8c5dd6fc`(`apk-p7w4.sha256` = `22472dc5…`;`apk-p7w4-install.txt`:`versionName=26.09.8c5dd6f-trace`),= `feat/disaggregated@8c5dd6fc` = wave 0 + X1 + F1 + C + A + B + D1。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × inproc × pbuffer;`--archive-dir .trace-work/p7w4/`(不入库)。 +APK `p7w4-ae3f43ab`(`apk-p7w4.sha256` = `22472dc5…`;`apk-p7w4-install.txt`:`versionName=26.09.ae3f43a-trace`),= `feat/disaggregated@ae3f43ab` = wave 0 + X1 + F1 + C + A + B + D1。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × inproc × pbuffer;`--archive-dir .trace-work/p7w4/`(不入库)。 ## 1. iterationt ×2:`Fatal{UnmigratedVerb,"Magma:mipmap-shader-format-or-shape"}` 退役(`iterationt.log`) diff --git a/docs/Disaggregated/notes/p7/device-window-1/W5-verify/README.md b/docs/Disaggregated/notes/p7/device-window-1/W5-verify/README.md index 2c2c4d51..c796f824 100644 --- a/docs/Disaggregated/notes/p7/device-window-1/W5-verify/README.md +++ b/docs/Disaggregated/notes/p7/device-window-1/W5-verify/README.md @@ -1,6 +1,6 @@ # W5 验收 · p7w5(B3 + B2 + D3 之上)真机:OpenRA 27/27 golden -APK `p7w5-c89000f5`(`apk-p7w5.sha256` = `01040add…`;`apk-p7w5-install.txt`:`versionName=26.09.c89000f-trace`),= 集成树 `c89000f5` = `origin@be636ee5` + B3(`f62ceec6..38112dc6`)+ ID-P7-33。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × pbuffer;`--archive-dir .trace-work/p7w5/`(不入库)。 +APK `p7w5-713bea9a`(`apk-p7w5.sha256` = `01040add…`;`apk-p7w5-install.txt`:`versionName=26.09.713bea9-trace`),= 集成树 `713bea9a` = `origin@b089e0de` + B3(`76bbb6c3..9a494b6f`)+ ID-P7-33。并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。全部 DirectVulkan × pbuffer;`--archive-dir .trace-work/p7w5/`(不入库)。 ## 1. 验收矩阵(ID-P7-25 定的判据:run-ahead 与 lockstep 各 6 遍全等 golden,冷热各半) diff --git a/docs/Disaggregated/notes/p7/device-window-1/X1-verify/README.md b/docs/Disaggregated/notes/p7/device-window-1/X1-verify/README.md index 438a04a6..719b5f3b 100755 --- a/docs/Disaggregated/notes/p7/device-window-1/X1-verify/README.md +++ b/docs/Disaggregated/notes/p7/device-window-1/X1-verify/README.md @@ -1,6 +1,6 @@ # X1 复验 · persistent-map tracker 在 arm64 上认领自己的 fault -APK `p7w2-665cfefc`(`../00-session/apk-p7w2.sha256` = `4b11f647…`;`apk-p7w2-install.txt`),= wave 0 + X1(`0a41972b`,`notes/p7/x1-persistent-map-segv.md`)+ CTS skip list。同一 reboot-clean 会话(boot id `18d8d589…`),并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。DirectVulkan × inproc × pbuffer × 1 遍,外加 26.3 的 DirectGLES 臂: +APK `p7w2-ec3ba00a`(`../00-session/apk-p7w2.sha256` = `4b11f647…`;`apk-p7w2-install.txt`),= wave 0 + X1(`4cbf78c2`,`notes/p7/x1-persistent-map-segv.md`)+ CTS skip list。同一 reboot-clean 会话(boot id `18d8d589…`),并排包 `top.mobilegl.plugin.p7w1.trace` 原地升级。DirectVulkan × inproc × pbuffer × 1 遍,外加 26.3 的 DirectGLES 臂: | case | 后端 | E0a / E4a(修前) | X1 后 | tracker DECLINED | |---|---|---|---|---| diff --git a/docs/Disaggregated/notes/p7/link-ratchet.md b/docs/Disaggregated/notes/p7/link-ratchet.md index 2e03d57b..3c0d7e00 100644 --- a/docs/Disaggregated/notes/p7/link-ratchet.md +++ b/docs/Disaggregated/notes/p7/link-ratchet.md @@ -48,7 +48,7 @@ ## 2 今天的数字 -基座 `78b7d6be`,`build-split`(Release,`-DMOBILEGL_BUILD_DISAGGREGATED=ON +基座 `e8b2c4bd`,`build-split`(Release,`-DMOBILEGL_BUILD_DISAGGREGATED=ON -DMOBILEGL_BUILD_DISAGGREGATED_INPROC=ON -DMOBILEGL_PIPE_PUSH=ON`),211 个 object: | | | @@ -136,7 +136,7 @@ a6 §5 的叙述(「server 不该问 client 要答案」)本来就该把它 ## 4 red-once(R-16) -在 `~/w7/p7-ratchet`(`78b7d6be`,`build-split`)里往一个**被分类为 SERVER 的** object +在 `~/w7/p7-ratchet`(`e8b2c4bd`,`build-split`)里往一个**被分类为 SERVER 的** object 加一次前端触及,只重编那一个 object,跑门,然后还原。 **注意选哪个符号。** 计划书里举的例子 `SamplerObject s(0); s.GetMinFilter();` **不会让门变红**—— diff --git a/docs/Disaggregated/notes/p7/magma-a.md b/docs/Disaggregated/notes/p7/magma-a.md index ca6d0309..87cc314d 100644 --- a/docs/Disaggregated/notes/p7/magma-a.md +++ b/docs/Disaggregated/notes/p7/magma-a.md @@ -1,6 +1,6 @@ # wave 2 包 A — Magma 的 UBO / SSBO / texel 对齐与 range 簇 -基线 `feat/disaggregated @ 460a3a72`(pipe HEAD,wave 0 与 X1 已落地)。分支 `p7/magma-a`, +基线 `feat/disaggregated @ 5c4235d7`(pipe HEAD,wave 0 与 X1 已落地)。分支 `p7/magma-a`, worktree `~/w7/p7-magma-a`。规范:`CONTRACT-P7.md` §0 规则 I / J、§3.2 退役表、§9 的文件分区。 本包只改 `Renderer/UniformManager.{cpp,h}` 与 `Renderer/VkBufferManager.{cpp,h}` 里一个**新增** @@ -168,7 +168,7 @@ G1 不动是结构性的,不是运气:本包所有改动都在 `#if MOBILEGL ### 6.1 census 为什么一个数都没动 -`abort_sites` 数的是 `std::abort()`。wave 0(`852e3c28`)已经把三个 Magma wire fatal 漏斗改走 +`abort_sites` 数的是 `std::abort()`。wave 0(`8bb6309a`)已经把三个 Magma wire fatal 漏斗改走 `MGPipeSessionFailHook` → `SessionFail`,`abort` 本身住在 `FatalFunnel.cpp` 这个被 sanction 的 漏斗里。所以**退役一个 `WireDescriptorFatal` 调用点不改变任何 census 数字**, `--write-baseline` 不需要跑。任务书里「retirements should LOWER abort_sites」的预期来自 @@ -188,9 +188,9 @@ golden half bits=(0x3a74, 0x4821); mismatched 1 of 262656 texels ``` 差别在于契约 §2.5 把这条记在 **tcp** 臂,这里它出现在 **split** 臂。`~/w7/pipe` 自己的 -`build-split` 上同一条用例是绿的,而 `~/w7/pipe` 已经走到 `610fa281`(本 worktree 从 -`460a3a72` 分出),两边 `build-split` 的 configure 也不是同一次生成的。**需要集成者裁定**: -是 460a3a72→610fa281 之间被改掉了,还是 S1 本来就与 configure 有关而不只与 tcp 有关。 +`build-split` 上同一条用例是绿的,而 `~/w7/pipe` 已经走到 `206abdfa`(本 worktree 从 +`5c4235d7` 分出),两边 `build-split` 的 configure 也不是同一次生成的。**需要集成者裁定**: +是 5c4235d7→206abdfa 之间被改掉了,还是 S1 本来就与 configure 有关而不只与 tcp 有关。 本包只能确认「与包 A 无关」。 ## 7. 还剩什么 / 需要真机 diff --git a/docs/Disaggregated/notes/p7/magma-b.md b/docs/Disaggregated/notes/p7/magma-b.md index 89fb0a29..1d6c6a70 100644 --- a/docs/Disaggregated/notes/p7/magma-b.md +++ b/docs/Disaggregated/notes/p7/magma-b.md @@ -2,7 +2,7 @@ > 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) §1.3 与 §3 wave 2-B;规范见 > [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §0(规则 I / J)、§3.2(退役 vs -> decline 表)、§5.1 / §5.2。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `8652bac0` +> decline 表)、§5.1 / §5.2。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `801f8eda` > (wave 0 已落地:Magma 两进程三臂、`MGPipeSessionFailHook` → `Session::Fail` 漏斗、 > `scripts/link_ratchet.py`)。 > diff --git a/docs/Disaggregated/notes/p7/magma-b2.md b/docs/Disaggregated/notes/p7/magma-b2.md index 399efd64..bac7b257 100644 --- a/docs/Disaggregated/notes/p7/magma-b2.md +++ b/docs/Disaggregated/notes/p7/magma-b2.md @@ -3,7 +3,7 @@ > 规范见 [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §0(规则 I / J)、 > §3.2(`multisample-blit-shape` / `-aspect` 行)、§4.2(棘轮目标与 (B′) 路线)、§5.2; > 前一包见 [`magma-b.md`](magma-b.md)。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 -> `ac8065a3`(X1、F1、C、A、B 全部落地)。 +> `09ba88e7`(X1、F1、C、A、B 全部落地)。 > > 主机口径与包 B 相同:WSL Arch + lavapipe(`/usr/share/vulkan/icd.d/lvp_icd.json`), > `build-split` = Release / clang / ccache / `DISAGGREGATED=ON` `INPROC=ON` `PIPE_PUSH=ON` @@ -13,7 +13,7 @@ > 基线门读数(本树实测,非引自包 B):`integration-magma-split` **88**、`-spawn` **67**、 > `-tcp` **69**、`integration-magma-full-split` **521**、`ctest -L unit` **2420**,全绿。 > 包 B 的报告写的是 84 / 63 / 65,差的四条**不是**「包 A 在它之后落地」——那句是错的, -> 审查round 已更正:包 A 在 B **之前**落地(`5a14e5a1..2f48ccf4` 在 `c5fa52f9` 之前)且只有 +2 +> 审查round 已更正:包 A 在 B **之前**落地(`450d3075..2207b6d9` 在 `c4be3800` 之前)且只有 +2 > (`magma-a.md:151-153`),另外 +2 是包 C(`magma-c.md:59-61`)。本树的基线因此是 > 73 + 11(B)+ 2(A)+ 2(C)= **88 / 67 / 69**。 @@ -341,7 +341,7 @@ lifetime-id 探针——所以 P5c 给这两处 teardown 一个具名豁免,P5 裁定 12 点了**四**处 Magma 站点(`VulkanRenderer.cpp` ×3、`ResourceTracker.h` ×1)。其中两处在 P7 开始前就没了——`git log -S` 把 `ResourceTracker.h` 那处记在 P5f fv(`4f3d2d6b`)、第三处 -`VulkanRenderer.cpp` 记在 P5f fm(`036c3a3d`)——所以 P7 基线 `78b7d6be` 上只剩**两**处,就是本片 +`VulkanRenderer.cpp` 记在 P5f fm(`036c3a3d`)——所以 P7 基线 `e8b2c4bd` 上只剩**两**处,就是本片 删掉的这两处。Magma 的 apply 线程分配器债现在是**零**处。 ### 3.4 类型留下,并且写明了为什么 diff --git a/docs/Disaggregated/notes/p7/magma-b3.md b/docs/Disaggregated/notes/p7/magma-b3.md index ea45f8f5..d6e46540 100644 --- a/docs/Disaggregated/notes/p7/magma-b3.md +++ b/docs/Disaggregated/notes/p7/magma-b3.md @@ -2,7 +2,7 @@ > 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) §3 wave 2;规范见 > [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §0(规则 I / J)、§3.2、§7、§9; -> 裁定 ID-P7-14 / 19 / 20 / 21 / 23。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `8c5dd6fc`。 +> 裁定 ID-P7-14 / 19 / 20 / 21 / 23。基线 = `feat/disaggregated` 上 `~/w7/pipe` 的头 `ae3f43ab`。 > 本文所有 `file:line` 均在该提交上读取。 > > 主机口径:WSL Arch + lavapipe(`/usr/share/vulkan/icd.d/lvp_icd.json`),`build-split` = diff --git a/docs/Disaggregated/notes/p7/magma-c.md b/docs/Disaggregated/notes/p7/magma-c.md index 94b60712..bb95c160 100644 --- a/docs/Disaggregated/notes/p7/magma-c.md +++ b/docs/Disaggregated/notes/p7/magma-c.md @@ -41,7 +41,7 @@ Nine things this package changes that live outside its own files or outside its notice it. -Base: `p7/magma-c` off `feat/disaggregated @ a686131e` (pipe HEAD at branch time). +Base: `p7/magma-c` off `feat/disaggregated @ 4f2d4c4e` (pipe HEAD at branch time). Build: `build-split` = `-DMOBILEGL_BUILD_DISAGGREGATED=ON -DMOBILEGL_BUILD_DISAGGREGATED_INPROC=ON -DMOBILEGL_PIPE_PUSH=ON -DMOBILEGL_BUILD_INTEGRATION_TEST=ON`, ICD pinned to `/usr/share/vulkan/icd.d/lvp_icd.json` (the same lavapipe ICD `~/w7/pipe/build-split` pins; the @@ -53,7 +53,7 @@ wire arm), rule J / R-16 (every fix red once on a two-process arm first). ## Gates, on the four slices together -| gate | base (`a686131e`) | after | | +| gate | base (`4f2d4c4e`) | after | | |---|---|---|---| | `ctest -L unit` | 2402 | **2403 / 2403** | +1 = the OQ-8 order case | | `integration-magma-split` | 73 (71 P + 2 S) | **75 / 75, 0 skipped** | +2 vertex-layout; the 2 skips were the death cases | @@ -69,10 +69,10 @@ wire arm), rule J / R-16 (every fix red once on a two-process arm first). | **G1** (`build-linux`, pull) | `.text` `0xa52203` | **`.text` `0xa52203` (10822147, +0)** | `.data`/`.bss`/`.rodata`/total all +0; 27837 → 27837 defined symbols, **0 added / 0 removed / 0 resized / 0 renamed**; the `.so` is byte-identical on disk (19143824) | **Ratchet buckets.** AFTER: `p7-magma` **101**, `p3b-p4b-espryt` **13**, `both-backends` **61**, -`p6-core` **11**, total **186**. CONTRACT-P7 §4.1 records the `852e3c28` baseline as +`p6-core` **11**, total **186**. CONTRACT-P7 §4.1 records the `8bb6309a` baseline as 101 / 14 / 60 / 11. So one symbol sits in `both-backends` that the baseline recorded under `p3b-p4b-espryt`; the total, the monotone assertion and **P7's own target bucket (101)** are all -unchanged. HONESTY NOTE: I did not separately re-measure the buckets at `a686131e`, so I cannot +unchanged. HONESTY NOTE: I did not separately re-measure the buckets at `4f2d4c4e`, so I cannot attribute that single move to this package rather than to the two commits between the baseline and this branch point. Nothing here was aimed at gate 4 — §4.2's path from 101 to 0 is package B's `(B')`. (An attempt to identify the mover by rebuilding one object at the base failed to diff --git a/docs/Disaggregated/notes/p7/magma-two-process-first-run.md b/docs/Disaggregated/notes/p7/magma-two-process-first-run.md index 0e13fbcd..875f8fd6 100644 --- a/docs/Disaggregated/notes/p7/magma-two-process-first-run.md +++ b/docs/Disaggregated/notes/p7/magma-two-process-first-run.md @@ -1,7 +1,7 @@ # P7 wave 0 包 L:Magma 两进程车道的首轮(2026-09-22) > 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) §0 发现 1 / §1.3 出口门 1 / §3 wave 0 第 1 项。 -> 基线 `feat/disaggregated@78b7d6be`,分支 `p7/lane`,主机 WSL Arch + lavapipe +> 基线 `feat/disaggregated@e8b2c4bd`,分支 `p7/lane`,主机 WSL Arch + lavapipe > (`/usr/share/vulkan/icd.d/lvp_icd.json`,系统唯一 ICD),`build-split` = Release / clang / ccache / > `DISAGGREGATED=ON` `INPROC=ON` `PIPE_PUSH=ON` `BUILD_INTEGRATION_TEST=ON`, > `MOBILEGL_ITEST_TCP_ENDPOINT=tcp://127.0.0.1:40713`(本树专用端口,避免与兄弟树的 40613 撞车)。 diff --git a/docs/Disaggregated/notes/p7/verify-split.md b/docs/Disaggregated/notes/p7/verify-split.md index 0f21d11a..006b7bdf 100644 --- a/docs/Disaggregated/notes/p7/verify-split.md +++ b/docs/Disaggregated/notes/p7/verify-split.md @@ -2,7 +2,7 @@ > 计划见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md) 「wave 3」与 §4 分母第 (7) 项;规范见 > [`CONTRACT-P7.md`](../../../../MobileGL/MG_Remote/CONTRACT-P7.md) §6(门 2)、§0(规则 I / J)、§9。 -> 基线 = `ec46a550`。 +> 基线 = `3c2867d3`。 > > 主机口径:WSL Arch + lavapipe(`/usr/share/vulkan/icd.d/lvp_icd.json`,钉在 `MOBILEGL_ITEST_VK_ICD`), > `build-split` = Release / clang / ccache / `DISAGGREGATED=ON` `INPROC=ON` `PIPE_PUSH=ON` @@ -162,7 +162,7 @@ DirectVulkan 半边保留且绿。 ### 2.5 车道计数(每臂,前 → 后) -| 车道 | 臂 | 基线 `ec46a550` | 本包之后 | 结果 | +| 车道 | 臂 | 基线 `3c2867d3` | 本包之后 | 结果 | |---|---|---|---|---| | `integration-verify` | monolith,DirectGLES / DirectVulkan | 568 / 568 = 1136(本配置下 2 红,§2.4) | 568 / 568 = **1136**(名不变) | 1136/1136,271 skip | | `integration-verify-split` | inproc,DirectGLES / DirectVulkan | 0 / 0(不存在) | 533 / 537 = **1070** | 1070/1070,117 skip(GLES 60、Magma 57) | diff --git a/docs/Disaggregated/notes/p7/x1-persistent-map-segv.md b/docs/Disaggregated/notes/p7/x1-persistent-map-segv.md index a89d3374..9e384b9f 100644 --- a/docs/Disaggregated/notes/p7/x1-persistent-map-segv.md +++ b/docs/Disaggregated/notes/p7/x1-persistent-map-segv.md @@ -1,10 +1,10 @@ # X1 — the client-thread SIGSEGV in a mapped buffer under inproc (device window #1) -Wave 2, package X1. Base `a686131e`. Branch `p7/segv`. +Wave 2, package X1. Base `4f2d4c4e`. Branch `p7/segv`. ## 1. What the tombstone actually said -Three CI split-subset traces died on the Redmi (`2f7cbe2e`, Adreno 830, APK `p7w1-d260f110`) +Three CI split-subset traces died on the Redmi (`2f7cbe2e`, Adreno 830, APK `p7w1-9be62cbc`) under `MOBILEGL_TRANSPORT=inproc` and passed under monolith on the same device and APK: `improved-transparency-minecraft-26.3`, `minecraft-1.21.1-neoforge-create-instancing-in-world`, `minecraft-1.21.1-neoforge-create-indirect-in-world`. Every one of them is