diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index 63791314..507fbfc8 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -1,389 +1,94 @@ -# 当前阶段进度 +# 当前阶段进度 — P6:backend 跑在第二个进程里 -**P5f 已收官(2026-09-20)**。最终行为验收头:WSL `cfca93c7885fd8db1e881f91189ba59090ae9c52`,Windows `c42577a4` 等价;本次整合来自 `codex/p5f-close`,主分支合入记录见 [`notes/p5f/close-report.md`](notes/p5f/close-report.md)。P6 的 P5f 前提已解除,a6 / c6 / spawn 尚未实施。**CI / inproc 功能补齐已收官(2026-09-21)**并合入 `feat/disaggregated`(合并头 `e1bf3677`):拆分主产物 + inproc 主验收、完整 retrace 双 transport、18 项 CI 门、双 ABI APK / AVD 全绿,见 §2.8。以下 §2 为 P5f 验收、§2.8 为当前验收;其后的 P5c/P5d/P5e 数字与性能章节保留为历史,不替代当前结果。 +> **这份文档只记当前阶段(P6)。** 已收官阶段(P0…P5f)的逐门数字与证据在 +> [`ROADMAP.md`](ROADMAP.md) 的阶段表与各 `P5*` 报告里,不在这里重复。规范契约见 +> [`MobileGL/MG_Remote/CONTRACT-P6.md`](../../MobileGL/MG_Remote/CONTRACT-P6.md);设计见 +> [`ARCHITECTURE.md`](ARCHITECTURE.md)。 -## 1. 阶段状态 +**状态(2026-09-21):P6 全部包已落地(a6…t6),出口门第 1–6 项达成;第 7 项(真机配对 A/B +热窗口)与第 8 项(三个强制性能数)尚未正式采集,因此 P6 记为「实现完成、出口性能/设备数待补」, +未宣布收官。** 分支 `feat/disaggregated`,头 `16bfab10`,已推 origin。三种传输形态 +(`monolith` / `inproc` / `spawn`)在桌面(WSL lavapipe)与真机(Redmi `2f7cbe2e`)上都跑通了 +真实 trace 的两进程 retrace,逐像素对上 golden。 -| 阶段 | 状态 | 范围 / 证据 | +--- + +## 1. 包状态 + +契约把 P6 切成 a6(审计)→ c6(契约)→ lk / so / sm / cp / hs / dl / st / t6。全部已落地: + +| 包 | 落地什么 | 状态 / 证据 | |---|---|---| -| P0 / P0.5 / P1 / P2 / P3a / P4a(monolith 跑道) | 已落地 | `ROADMAP.md` 阶段表;`MEASUREMENTS.md` §1–§5 | -| **P5** 首个 IPC 帧(reduced path,lockstep inproc) | 已收官 | `ff2994d9..37fc4fdb`;`MEASUREMENTS.md` §6 | -| **P5b** inproc 下的 verb 迁移(Minecraft 优先) | **已收官(2026-09-16)** | `37fc4fdb..82683d4a`;`MEASUREMENTS.md` §7 | -| **P5c** `inproc` 共享内存读点归零 | **已收官(2026-09-17)** | `11ac3de6..b88e8487` + triage 修复;契约 `MobileGL/MG_Remote/CONTRACT-P5C.md`;审计 `~/w7/notes/p5c/p5c-audit-v1.md` | -| **P5d** `inproc` 性能专项 | **已收官(2026-09-18,三轮)** | `cb06538c`、`56a77348`、`1f8de61b`;报告 [`P5D-INPROC-PERFORMANCE.md`](P5D-INPROC-PERFORMANCE.md);`MEASUREMENTS.md` §9 | -| **P5e** 退役 Espryt draw path 的 lockstep | **已收官(2026-09-19)**,附一条具名未决(E1 对照,ID-122) | 契约 `MobileGL/MG_Remote/CONTRACT-P5E.md`;计划 `~/w7/notes/p5e/BRIEF-P5E.md`、裁定 `~/w7/notes/p5e/INTEGRATOR-DECISIONS-P5E.md`(**ID-80..136**);**十二个包已全部落地合并**(§2.7),`kMGPipeP5eRunAheadReady` 与 `kMGPipeP5eClientWaitRuleLanded` 均已翻。strict 车道硬绿 179/179、`integration-gpu` 1357/1357、三个构建 flavour 全绿;设备上 VD32 已与 monolith 齐平。报告 [`P5E-RUNAHEAD.md`](P5E-RUNAHEAD.md),未完成项见 §5 | -| **P5f** 一切状态上 wire | **已收官(2026-09-20)** | f0 / f1 / fc / fe / fm / fs / fr / fv 及分类收口均已完成;零 BARRIER_PULLED、两份 marker 空表、逐帧 rsp=0。主机全门、Claude 异族终审两项修复及 red-once、Redmi 六 clean-boot 臂通过。见 [`close-report`](notes/p5f/close-report.md)、[`close-review`](notes/p5f/close-review.md)、[`device-report`](notes/p5f/device-report.md) | -| **P6** spawn transport | **a6、c6 已收官(2026-09-21)**;下一个包 `lk`(数据面缝的实现) | 计划 [`P6-SPAWN-PLAN.md`](P6-SPAWN-PLAN.md)、草稿 [`P6-CONTRACT-DRAFT.md`](P6-CONTRACT-DRAFT.md);a6 见 [`a6-audit-v1.md`](notes/p6/a6-audit-v1.md) 与 [`a6-link-experiment.md`](notes/p6/a6-link-experiment.md)。传输原语与 P5f 值控制帧、静态世代/角色隔离已在树上;待做的是进程装配、socket 传输、握手/EOF/device-lost 等,不再重做已落地的控制帧与静态量 | +| **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` | -## 2. P5f 最终验收 +配套:CI 的 `retrace-split` 从「1 case × 1 后端 × inproc」扩成「全 CI 矩阵 × 两后端 × inproc/spawn」, +`split` 键改成 opt-out;Android CI 新增 `spawn-acceptance` 臂,真机 App 从 `nativeLibraryDir` 解析 +server 路径(`94e2f2e0`、`15bd9a67`、`1039502e`、`2afa0002`)。 -**Magma RD32 性能补修已完成**(`70fb6689`):inproc平均从86.85提升至116.73 FPS, -同包monolith为115.01 FPS。重复native对象与pipeline缓存键已修正,保留同步/角色边界; -7项新缓存场景、Vulkan同步验证和主机全门通过。见 [报告](notes/p5f/magma-rd32-performance-fix.md)。 +--- -**Magma run-ahead 已完成**(最终行为头 `194382c9`,2026-09-20):异步 GPU 生命周期、 -真实 client lead、present credit 1/3、负控与 Vulkan 同步验证已通过;实机 VAO 哈希碰撞 -已修复。Redmi 同一 `.mgdebug.debug` APK 的 Magma RA=1 / RA=0、GLES RA=1 均完成 -至少60秒 MC `26.3-rc-3` 世界运行并验图。最终 unit 2312、GPU 1401、双块245 均零失败, -完整结果与边界见 [run-ahead 报告](notes/p5f/magma-runahead.md)。下面为此前修复与原 P5f 快照。 +## 2. 出口门(契约 §9) -**Magma inproc 游戏修复**(行为头 `38919d45`,2026-09-20):已编入 Redmi 的 -`com.tungsten.fcl.mgdebug.debug`。MC `26.3-rc-3` 世界 `test` 的 Magma inproc、GLES inproc -与 Magma monolith 均完成至少60秒运行及人工验图;应用 buffer 拒绝与 Android 90° blit -错误已修复。该历史包为 lockstep,实测约20 FPS。该包的19项专项门、 -1387项GPU结果和剩余边界见 [修复报告](notes/p5f/magma-inproc-fix.md)。 -旧 [fcl-e2e-report.md](notes/p5f/fcl-e2e-report.md) 保留 `aa78f102` 失败;下面六臂数字 -仍是原 P5f 公开 GL runner 快照,不能冒充 FCL 测试或覆盖最新修复报告。 - -| 门 | 总条目 | PASS | skip | failed / 结论 | -|---|---:|---:|---:|---| -| unit | 2310 | 2300 | 10 | 0 | -| integration-gpu | 1377 | 1118 | 259 | 0;既有功能/驱动/专属车道 skip 不计 PASS | -| ordinary / strict integration-split(各自) | 180 | 176 | 4 | 0;strict 三类 marker 均为零 | -| 双块 split + magma | 212 | 206 | 6 | 0;发现集合与 JUnit 完整核对,skip 名称和原因精确匹配 | -| integration-p5f-rsp | 2 | 2 | 0 | GLES、Magma 各一条真实执行,每帧 rsp=0 | -| Redmi 六个 clean-boot 臂 | 66 | 60 | 6 | 0;六个不同 boot-id,36 个统计窗口 rsp=0 | - -字段表为 **41 RECORD_SUPPLIED / 6 APPLIER_DERIVED / 0 BARRIER_PULLED / 16 FATAL**。 -`strict-expected-markers.txt` 与 `dualblock-expected-fatals.txt` 均为空集合,两侧棘轮仍有效; -空结果、漏跑、重复/notrun/disabled 或额外 skip 不得判绿。双块精确保留以下六个 skip: - -- `DirectGLES.Split.TriangleScenario.TheServerStampedAVerbBoundaryOnThisDrawingFrame` -- `DirectGLES.Split.SmallRing.TriangleScenario.TheServerStampedAVerbBoundaryOnThisDrawingFrame` -- `DirectGLES.Split.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares` -- `DirectGLES.Split.SmallRing.PersistentCoherentMapScenario.TheMapLandsInTheArmItsLaneDeclares` -- `DirectVulkan.Split.Fm.ClipDistanceScenario.ADisabledClipDistanceRemovesNothing` -- `DirectVulkan.Split.Fm.ClipDistanceScenario.TheEnablesAreIndependentPerDistance` - -前四项是 strict-arming / counting 专属车道的 sibling;后两项是已知 Magma clip-distance -逐项开关限制,原因同样参与校验。独立 RSP 门不允许任何 skip。 - -pull / push 实际构建及生效宏通过;**G1** `.text` **10806051 → 10806051**、defined symbols -**27815 → 27815**、**0 added / removed / resized / renamed**;**G2** 两者各 **3016** 个测试名, -集合相同;**G14** f1 **3646 → 3744**,没有删除。生成器/闭包门与逐包 red-once 均已执行。 -Claude 异模型族终审的 P1(结果集可伪绿)与 P2(callback owner 错投)均修复并实际红转绿, -见 [`close-review.md`](notes/p5f/close-review.md)。 - -设备门使用最终库在指定 Redmi `2f7cbe2e` 上重跑 GLES/Magma 的 monolith、role0、role1 -六臂;仅为本阶段可执行子集的正确性与 rsp 验证,性能只记录,不代替 P5e 的 MC/FPS 实测。 -原始身份、skip 原因与运行边界见 [`device-report.md`](notes/p5f/device-report.md)。 -Magma 仍不发布 `kCapRunAheadApply`,已由同一双块/strict 判据证明可达子集;P7 应用 buffer / -native-format、P8 client arrays、P12 真窗口到达等具名边界继续保留。 - -## 2.1 历史实测:P5c / P5d 收官头 - -以下表格是当时的验收记录;包括当时未做的设备项与非零 rsp,不表示 P5f 当前状态。 - - -| 门 | 结果 | -|---|---| -| P5d 三轮门(WSL `~/w7/p5d-gate`,split flavour,头 `1f8de61b`) | unit **2203/2203**(tcache_count=0)、`integration-split` **111/111**、两条曾 flaky 用例 `--repeat until-fail:5` 全绿;双生成器 --check/--self-test、include 闭包、dirty-surface、doc 引用全绿;G1 由 CI 核(四包自报 pull 构建零变化) | -| P5d 三轮设备(Redmi,CPU 定频,VD12 世界内 30 s) | inproc p50 **103-106 fps**(起点 64.3),client 线程 CPU 9.2 ms/帧(起点 15.0)、apply 7.0-7.4(起点 12.4);monolith 115(封顶)/ 206(一次未封顶)(此设备 120 Hz vsync 封顶与线程放置不受控,见报告"数字"节) | -| 构建(P5c 收官时) | pull / push / verify / split 四个 flavour 全部通过 | -| G1(pull 符号恒等) | `.text` −16 B,0 增 / 0 删 / **3 认定 resize** / 0 重命名(`SwapchainObject::Create` ev 的表面事件化、`CopyTexSubImage2D` hd 的传输臂、`ScopedRestartIndexSubstitution` 的 server-shadow 臂,均已在合并提交具名);pull 构建零 `MG_Remote` 符号 | -| 发射表分区(`EmitTables.cpp` 的 `static_assert`) | A 2 / B 54 / C 15,共 71 槽(未变) | -| unit | split **2187/2187**(`MOBILEGL_IPC_STRICT_ERRORS=1` 下同绿) | -| `integration-split`(inproc) | **111/111**(107 + ct 的 4 条 CtWireScenario) | -| `integration-gpu` 普查(inproc,对 11ac3de6 同机基线逐名比对) | 修复后 newly-failing 全部归类:设计红(传输下旧臂具名拒绝的对照车道 + Magma P7 未迁移面,逐条 Fatal 名证据在案);三个真回归(默认 FBO 格式时序、大 writeback 切片、XFB scatter 读 server shadow)已修并回归绿 | -| G5(p3a / p4a 保护区) | 双绿(`11ac3de6` ↔ 收官头字节一致) | -| 生成器 / 卫生门 | `gen_pipe` / `gen_pipe_field_ownership` 的 --check/--self-test 绿;doc 引用 0 problem;include 闭包 0 problem;dirty-surface rc=0 | -| 纹理 `0xDD` audit(`MOBILEGL_IPC_AUDIT=1`) | bsl in-world(100000 调用)与 iris-complementary in-world 全程零 Fatal | -| `rsp` 按帧实测(`MOBILEGL_PIPE_STATS_PERIOD=1`) | bsl 948.5/帧(38.7/draw)、complementary 1591.9/帧;值类 = 0,残留即 FieldOwnershipTest 钉住的 15 行对象类 | -| Redmi 四臂复测 | **未做**(E-P5c #5 是记录项;本机无设备,需 Redmi `2f7cbe2e` 窗口) | -| 79 trace 普查 | **未重跑**(全集语料不在本机;本机可用语料的实测见 `rsp` 与 audit 行)。P5b 收官数字(72/6/1)仍以其头为准 | - -## 2.5 P5e wave 2 与 fix1:设备发现的 monolith 回归(历史,头 `3cc4e1ec`) - -八包全部落地并合并:wave 1 = **c0e**(契约 + 线上行)+ **id**(身份按 `{slot, gen}` 重键),wave 2 = **vi / sb / pg / tx2 / fb** ∥ **ra**,集成提交 `44f91c74` 解了三处两包相接的 seam。**`kMGPipeP5eRunAheadReady` 与 `kMGPipeP5eClientWaitRuleLanded` 仍为 false**:翻转它们的门是 BRIEF-P5E §3(strict 车道转硬绿,只余 §7 白名单)与 §4(设备出口),前者尚未达成。裁定见 `~/w7/notes/p5e/INTEGRATOR-DECISIONS-P5E.md`(ID-80..110)。 - -### 设备验证发现的 monolith 回归与修复(ID-107 → fix1 `66621767` → ID-109 / ID-110 `3cc4e1ec`) - -| | | -|---|---| -| 症状 | `MOBILEGL_TRANSPORT=monolith` 下游戏启动即 SIGSEGV:`Lightmap.` → `clearColorTexture` → `glClear` → `SyncCurrentFBO` → `SyncToBackend(前端 FBO)` → `SyncAttachmentSurface` → `SyncMipmapsToBackend(空 SharedPtr)` | -| 根因 | fb 的 `SyncAttachmentSurface` 把**存储同步**指向 tx2 的 by-handle 座,后者传空 `SharedPtr` 并依赖记录臂被选中;而记录臂自身由 `Transport != Monolith` 选择(ID-81)。push 构建自 P4a 起**两条臂都由记录驱动附件**(`FramebufferSubsystemEnabled()` 单独门控,无传输测试),于是 monolith 臂走进了一个无法作答的座 | -| 覆盖漏洞 | 结构性,而非"少写了一个用例":门禁跑 `unit` + `integration-split`,而 `integration-split` 的**每一条**都导出 `MOBILEGL_TRANSPORT=inproc`;凡是"清一个带纹理附件的 FBO"的场景又都在 `SetUp` 里按 `SplitRuntimeSkipReason` 自跳过——**push 构建的第二条运行时臂在门禁集合里一条条目都没有**。实测 `44f91c74` 上 `ctest -L integration-gpu` = **1157/1294,137 个 SEGFAULT、横跨 38 个 scenario**,全部是带纹理附件的 FBO 用例。回归从来不只在 Lightmap 一条路径上 | -| 修复 `66621767` | (1) `SyncAttachmentSurface` 的存储同步按 `MG_Config::Transport` 选臂——monolith 臂拿回 `f6cfcbd3` 的前端同步,经一个**只用于存储同步**的 monolith 胶水指针(附件形状、空点测试、twin 认领两臂都仍归记录,N-6 的洞不重开);renderbuffer 半边同理,它的 by-handle 形丢掉了应用可见的 OOM `RecordError`。(2) 三个纹理同步体改用 `RefuseNullFrontendTextureOffTheHandleArm`:空前端对象落到无法作答的臂上是 `Fatal{RoleViolation, "texture-handle-arm"}` 具名中止,而不是空指针解引用;pull 构建里折成与修复前逐 token 相同的常量,不新增调用(D-P)。(3) 新增 `MonolithAttachmentClearScenario`(可变纹理 / 不可变纹理 / renderbuffer 三例,**断言像素而非"没崩"**——附件点未填的 clear 会静默抛 `GL_INVALID_FRAMEBUFFER_OPERATION`,那是同一缺陷的无声形态)与 `DirectGLES.PushMonolithArm.` 注册(ctest ENVIRONMENT 钉 `MOBILEGL_TRANSPORT=monolith`,挂 `integration-split` 标签) | -| ID-109 | 标签保留(`integration-split` 指"门禁要跑的集合"而非"跑 inproc";ID-81 给 push 构建两条服务端臂,只有一条在集合里,"门禁全绿"就一直等于"两条里的一条全绿"),**并把 `integration-gpu` 升为集成分支的常设门禁步骤**(`p5e_gate.sh gpu`,-j 4 约 10 分钟),不下放到每个包 | -| ID-110 | 新增 `MGB_TEXTURE_RECORD_ARM_SELECTED()`(`Transport != Monolith` 且 `TextureResourceSubsystemEnabled()`),把"记录臂被选中"这句话只说一次;`texBufferByRecord` 那处"靠链条安全"的座改为自述式传输测试。有传输时该合取项已被 `pushedStorage != nullptr` 蕴含,故行为不变、不关门 | - -### 头 `3cc4e1ec` 的门(WSL `~/w7/p5e-int`,split flavour) - -| 门 | 结果 | -|---|---| -| build | rc=0 | -| unit | **2250/2250** | -| `integration-split` | **116/116**(113 + 三条新的 monolith 臂条目) | -| `integration-gpu`(ID-109 新增步) | **1294/1294**(修复前同机 1157/1294) | -| 生成器 / 卫生门 | `gen_pipe`、`gen_pipe_field_ownership`、`gen_pipe_dirty_surface` 的 --check/--self-test 与 include 闭包共七项全 rc=0;doc 引用只余 `CONTRACT-P5.md:524` 的既有歧义行 | -| `integration-split-strict` | **7/116**(预期红,与 fix1 的基线逐数相同;本阶段进度以其"具名标记集合"而非通过数衡量) | - -### 设备验证(Redmi `2f7cbe2e`,FCL fordebug + Minecraft 26.3-rc-3 世界 "test",进世界后 60 s 采样) - -| 臂 | 进世界 | fps | draws/帧 | 进程 | Fatal / crash buffer | -|---|---|---|---|---|---| -| monolith | 31 s | **263.5** | 845 | 存活 | 无 | -| inproc | 31 s | **136.1** | 853 | 存活 | 无 | -| inproc(复跑) | 32 s | **140.3** | 852 | 存活 | 无 | - -两臂截图为同一视角同一世界,画面正确。monolith 这一次未被 120 Hz vsync 封顶(与 P5d 的 205.8 那次同类),故**不与 inproc 直接比大小**——本轮问的是"改完还能不能正常跑",不是配对性能。inproc 的 136-140 与 ID-107 记的 140.0 / 144.9 同档,说明 fix1 触到的那行(臂选择本身,两臂都读)没有拖慢 split 臂。库版本以符号探针确认(`texture-handle-arm` 等四个字符串在 APK 的 `lib/arm64-v8a/libMobileGL.so` 内),不看游戏内的 `GIT@` 戳记——增量构建下它是旧的。 - -## 2.6 历史:P5e wave 3,strict 硬绿、run-ahead 武装(头 `25fba0d5`) - -四个包:**pa**(program 家族,逐 draw 的那次拉取)、**mv**(multi-draw 的 VAO 读点 + 五个档位的门禁条目)、 -**gl**(门禁机制本身 + 两处潜伏崩溃)、**ra2**(翻开开关后暴露的竞态)。裁定 ID-111..136。 - -### 2.6.1 strict 车道成为可被脚本判定的硬绿 - -`GetProgramForDraw@DrawArrays` 从 62 条归零(**无线上改动**:记录早就带着每次 link 的 `ProgramArchive`, -缺的是仍去问前端对象的读者),`GetProgramForDispatch@DispatchCompute` 7 → 0, -`GetBoundVertexArray@DrawArrays` 9 → 0。采纳规则最终是**三个析取项**: - -1. 该 verb 的线上 op 静态设障(ID-116); -2. 该字段的退役相不指向本阶段(ID-125); -3. 记录是**按升级**而非按静态类设障的(ID-128,XFB 活跃与客户端数组两种 draw)。 - -三条都不是预想出来的,都是被真实条目逼出来的。白名单由 `gen_pipe_field_ownership.py` **生成**而非手抄 -(ra 原本手抄的 13 行在两个方向上都错),棘轮**两侧**都会失败——新出现的对要认领,不再出现的对要删除, -否则车道会"烂绿"。合并当天棘轮就自己点名了两处:pa 退役的行不再出现,mv 的间接档位逼出了一行新的。 - -### 2.6.2 覆盖面 - -| | wave 3 前 | 现在 | +| # | 门 | 状态 | |---|---|---| -| `unit` | 2250 | **2256** | -| `integration-split` | 116 | **179**(+ 2 条 clientarrays 预期红、2 条 magma 预期红) | -| `integration-gpu` | 1294 | **1357** | -| 构建 flavour | 只有 split 编得过 | **pull / push / split 全绿**(ID-124) | +| 1 | **G1** pull 构建 0/0/0/0、`.text` 不变 | ✅ 符号 0 差异、`.text` 恒为 `0xa52203`(每次改动后复测) | +| 2 | **G2/G14** `integration-spawn` 名集合 == `integration-split` | ✅ `scripts/ci/spawn_lane_parity.py`:可比 102 == 102;名只增不删 | +| 3 | `integration-spawn` 与 split 同数绿 | ✅ 102/102 | +| 4 | 进程树:运行时恰多一个子进程、结束后为零 | ✅ `ServerSpawnTest.StartsAServerProcessAndHandshakesAcrossIt`(`CountOwnChildren`) | +| 5 | Arm 证明(ID-124):每条 spawn 条目记子进程 pid 与 `transport=spawn` | ✅ `--require-spawn` 门要求 ConfigLoader marker **且** `spawn ARMED - pid N` | +| 6 | 每包 red-once(R-16) | ✅ dl 的 S2/S7、hs 的 serverPid、sm/st 的守卫塌缩、t6 的名集合漂移均已跑红一次 | +| 7 | **设备**:Redmi reboot-clean、同热窗口配对 A/B | ⏳ 功能已验(下 §3),正式配对 A/B 热窗口性能跑**未采集** | +| 8 | **性能只记录**,但三个数强制:socket 门铃 vs condvar、`SEG_STAGE` 字节/帧、chunking 后记录/帧 | ⏳ **未采集**,`MEASUREMENTS.md:342` 仍说 chunking 后分布不存在 | -新增的 65 条条目全部覆盖此前**一条门禁条目都没有**的臂或档位。 +负控(各跑红一次):S1 不可解析镜像(sm)、S2 kill server(dl)、S3 未洗环境(sm)、S5 窗口 token +到达(cp)、S6 `dataPlane=StreamOnly`(hs 的 Refuse)、S7 裸 abort(dl 普查门)、S8 `SessionFaultCount()==0` +整轮(t6)。 -### 2.6.3 翻开开关之后:strict 硬绿是必要而**不充分**的 +--- -翻开两个常量后 `unit`/`gens`/`flavours` 仍全绿,而 `isplit` 掉到 112/181、`gpu` 掉到 1290/1359,**且 flaky**。 -70 条红只涉及四个字段、横跨十一个 verb——一个字段一个 verb 稳定失败是漏迁移,**四个字段散在十一个 verb 上且 -flaky 是竞态**。根因(ra2 实测,推翻了我 ID-132 的机制猜测):`gPipeInputs` 的**字段值**已由 `SuppliedFieldMask` -分区、不竞态;竞态的是**元数据标量**。而让它长期不可见的是守卫本身—— -`RefusePipeInputsTouchWhileApplierOwnsIt` 的 run-ahead 臂对任何 `isBarrieredFill` 一律豁免,依据是一句 -**关于未来**的断言("客户端马上就要 park"),而真实顺序是 fill → emit → park。修法是把那句断言**变成事实**。 -同源的第二个缺陷:`MGP_VERB_OP_LIST` 把整个 draw 家族并到一行,十九个索引 draw verb 都答"设障"、都填充、都不 park。 +## 3. 真机验收(Redmi `2f7cbe2e`) -**教训(ID-132)**:strict 跑在 lockstep 下,`ApplyOne` 把每条记录都盖成 barriered,所以"只在客户端不再等待时 -才发生"的事它按构造看不见。阶段出口必须有一条**独立的、翻开开关后的**车道。 +trace APK 以 `-Pmobilegl.buildDisaggregated=ON` 构建,调试签名安装。功能全绿: -### 2.6.4 头 `25fba0d5` 的门(run-ahead 已武装) +- **`OpenRA.DirectGLES` spawn**:ssim=1.000000、mismatchPixels=0、`Fatal{` 零条,连跑三次; + `--require-spawn` 确认 `server role in pid N`。 +- 另有 6 个 case(含 in-world、BSL 光影)spawn 下通过。 +- **monolith** 控制组 ssim=1.0;证明门确认 monolith 只写 `mobilegl.client.log`、无 server 日志。 -| 门 | 结果 | -|---|---| -| build | rc=0 | -| unit | **2256/2256** | -| `integration-split` | **179/179** | -| `integration-gpu` | **1357/1357** | -| `flavours` | rc=0(pull 915 TU push=absent,push 929 TU push=1) | -| 生成器 / 卫生门 | 全 rc=0 | -| 逐条普查(strict) | **179/179 绿,`Fatal{` 为零**,`Admitted{` 恰为 ID-128 的八行 | -| 预期红车道 | `integration-clientarrays-split` 2 条(`(Multi)DrawArrays+CLIENT_ARRAYS`)、`integration-magma-split` 2 条(`GetFramebufferBindingSlot@Clear`),均具名断言 | +**如实记录、非 P6 引入**:`DirectVulkan` 在真机分离路径下画面分歧且**不确定**(inproc 与 spawn +抽自同一组结果:0.988998/0.976494…,而同 pbuffer 的 monolith 是 1.0)。两种 transport 表现一致, +故是 Magma 分离路径在真实 GPU 上的问题,P6 既未引入也修不了;桌面 lavapipe 上 DirectVulkan spawn 为 1.0。 -### 2.6.5 设备(Redmi `2f7cbe2e`,MC 26.3-rc-3,~850 draws/帧,**CPU 定频**,风扇开,30 s 窗口,交错) +那个会杀死 server 的 llvmpipe case(`iterationrp`,`LLVM ERROR: Cannot select vcvtps2ph`):dl 落地后 +从 123 秒的错误 `BarrierTimeout` 变成 **5.7 秒**的正确 `DEVICE LOST`(`revents=0x2010` = POLLRDHUP|POLLHUP)—— +仍红(驱动 bug),但红得诚实。 -**先记一条测量纠错**:第一轮矩阵**没有定频**,monolith 自己那一臂的逐帧 CPU 在两次之间从 4.43 跳到 7.07 ms, -而那次慢的**温度更低**——是 walt governor 把 policy0 从 2745 拉到 748 MHz,不是热降频。 -`tools/device_bench/pin_device.sh` 不认识本机 serial 且**拒绝猜**(正确),故按本机节点另写了 `pin_redmi.sh`, -写序 min→底、max→目标、min→目标,并**回读 `scaling_cur_freq` 验证定频生效**。 +--- -定频 little 1555200 / big 1958400(每臂两次,离散度 < 2%): +## 4. 日志按角色分文件(本阶段的一处基础设施改动) -| 臂 | fps p50 | fps max | client ms/帧 | apply ms/帧 | -|---|---|---|---|---| -| monolith | 115.1 | 117.0 | 6.19 | — | -| inproc **run-ahead** | **117.6 / 117.9** | 118.3 / 118.6 | 6.71 / 6.63 | 4.30 / 4.32 | -| inproc lockstep(`RUN_AHEAD=0`,配对对照) | 111.1 / 110.7 | 114.9 / 115.1 | 8.27 / 8.09 | 6.44 / 6.41 | +spawn 的两个进程原先 O_APPEND 追加同一个 `MOBILEGL_LOG_FILE_PATH`(正确但两个会话混在一处)。现在 +库按**调用线程角色**写 `.client.log` / `.server.log`(inproc 下 apply 线程即 server 角色, +同样分开)。基名不再指向任何文件——这是刻意的:没跟上改名的读取方会「文件不存在」当场报错,而不是 +半读通过。34 个消费方全部改到派生路径;拒绝普查读两份;派生规则由库 `RoleLogPath` 导出,不复制。 +G1 守卫下 pull 构建不变。 -定频 little 1996800 / big 1958400(本机允许的最高,再高被厂商限幅器夹住): +--- -| 臂 | fps p50 | fps max | client ms/帧 | apply ms/帧 | -|---|---|---|---|---| -| monolith | 115.6 / 115.4 | 117.2 / 117.5 | 6.45 / 6.25 | — | -| inproc **run-ahead** | **117.6 / 118.0** | 118.5 / 118.6 | 6.92 / 6.87 | 4.43 / 4.35 | -| inproc lockstep | 111.6 | 113.7 | 8.16 | 6.53 | +## 5. 已知未决 / 明确不属于 P6 -**配对 A/B(同一构建、同一定频,唯一差别是客户端等不等)**:client −18%、apply −33%、fps p50 +6%。 - -**结论**:两个定频档下,**monolith 与 run-ahead 都撞到 120 Hz 面板上限(max 117-118.6),只有 lockstep 撞不到** -(max 113.7-115.1)。也就是说在这台设备的真实负载里,**inproc 现在与 monolith 齐平**,而阶段开始时是 0.62-0.74 倍。 -逐帧 client CPU 上 run-ahead 比 monolith 多约 8%(6.9 vs 6.3),两者都在上限之下留有余量。 - -**面板上限之上谁更快,已由渲染距离 32 的一轮回答**(`MEASUREMENTS.md` §11.1,~3550 draws/帧,两臂都远离任何上限,每臂五次):monolith p50 中位 58.5、run-ahead **59.9**,client CPU 16.19 vs **15.72**——**齐平,且 run-ahead 略前、离散度只有 monolith 的一半**(±4% vs ±10%);相对 lockstep p50 **+69%**。下一个机会是两侧不平衡(apply 11-12 ms vs client 15.7 ms),run-ahead 之后才成立。 - -**尚未回答的**:VD12 下面板上限之上谁更快。本机定不住更高的频率,而未定频的一次高频窗口里 monolith p50 201 / run-ahead -p50 181(约 1.10 倍)——那一次不可配对,只能作为方向性提示。要回答它需要关掉 vsync 或换一台上限更高的设备。 - -## 2.7 历史:P5e 落地内容 - -| 波 | 包 | 内容 | 效果 | -|---|---|---|---| -| 1 | c0e | 契约与线上行:`PipeCalls.def` 第五列 `WaitClass` + `MGPipeWaitClassFor`、`set_program_bindings`(opcode 80)、`kCapRunAheadApply`(位 10,只在 DirectGLES 臂)、`kDrawClientArrays`、子系统位 13、`MGPipeImageAccess` 一张表、两个旋钮、跨包 seam | 十一个包按同一契约并行施工,且全部 inert | -| 1 | id | registry 按 `{slot, gen}` 重键、三个 by-handle resolver、分配器守卫(含按对方身份索引自己表的第二道守卫,ID-101) | 身份不再是前端指针 | -| 2 | vi | 顶点输入 / VAO / 索引 | 普通 draw 路径的 bound-VAO 行退役 | -| 2 | sb | 缓冲绑定点;`MGPShaderBuffers::WritableMask` 加宽(ID-104);consumer 位 13(ID-106) | 索引绑定点过线 | -| 2 | pg | 逐 link 的反射归档进 SEG_STAGE;`set_program_bindings` 的三条 post-link 尾 | 后续 pa 的前提:数据已在线上 | -| 2 | tx2 | 纹理与 sampler、staged store 的按句柄读、纹理单元窗口 | | -| 2 | fb | framebuffer、附件、image、blit | | -| 2 | ra | 等待规则 `EmitAndWaitTails`、present credit、`gPipeInputs` 变 server 角色内存、事件环流控 | 等待规则本体 | -| 2.5 | fix1 | 设备发现的 monolith 臂回归(ID-107):`SyncAttachmentSurface` 的存储同步按传输选臂;`MonolithAttachmentClearScenario` + `DirectGLES.PushMonolithArm.` 车道 | `integration-gpu` 1157→1294 | -| 3 | pa | `PrepareForDraw` / `PrepareForCompute` 的 program 拉取离开前端,`SyncCurrentVertexAttributeValues` 改读 `record->Archive->Link` | `GetProgramForDraw@DrawArrays` 62→0、`GetProgramForDispatch@DispatchCompute` 7→0,**无线上改动** | -| 3 | mv | `MultiDraw.cpp` 的 `BoundIndexBuffer` 改按句柄(ID-113);五个 multi-draw 档位各自的门禁条目 | `GetBoundVertexArray@DrawArrays` 9→0;`integration-split` +60 条 | -| 3 | gl | 生成式采纳谓词、strict 旋钮的第三态、车道两侧棘轮、`ResourceCopyRegion` 等待类、Magma 车道切分;以及两处潜伏崩溃(ID-111 的盖章、ID-112 的编译期绊线) | 车道成为可被脚本判定的硬绿 | -| 3 | ra2 | 翻开开关后暴露的竞态(守卫把"关于未来的断言"当豁免依据);`BoundDrawIndirectBufferId` 退役并撤回升级 (iii)(ID-136) | 翻开开关后 `isplit` 112→179 | - -## 2.8 CI / inproc 功能补齐(2026-09-21,当前验收) - -范围:`feat/disaggregated` 主产物按拆分实现编译(`MOBILEGL_BUILD_DISAGGREGATED` / `MOBILEGL_PIPE_PUSH`)并以 `MOBILEGL_TRANSPORT=inproc` 执行主验收;普通 GL 功能场景与完整 retrace 矩阵(77 case/backend × 2 transport)全跑,不以 skip / 降阈值 / 缩矩阵替代实现;验证 monolith 内部机制的对照保留 monolith。工作分支 `codex/fix-github-ci`,已合入 `feat/disaggregated`(`30b1bf25` FF 至 `d56c0e83` + Gradle plumbing `17bbb448` + 合并 `e1bf3677`)。 - -修复(均有红→绿证据;起点与过程见 [`notes/p5f/HANDOFF-CI-INPROC-20260920.md`](notes/p5f/HANDOFF-CI-INPROC-20260920.md)): - -| 主题 | 提交 | -|---|---| -| SEG_STAGE 内容分块(清偿 R-10 的"提前分块"一半) | buffer 范围走查 `1e7c372e`;纹理整宽 slab + `StagedTextureStore::AdoptRun` `9469d48e`;预算 `MGPipeStageChunkBytes()`(segment/4) | -| 零字节 `glBufferData` 的 respecify 误报 `Fatal{InitialBytesNotCarried}` | `07f91f35`(谓词改按字节数,契约 R-13.3 形状不变) | -| DirectVulkan 默认帧缓冲图像身份跨 swap(inproc 读回黑屏) | `f1d3fa8f`(GL 可见后缓冲索引与 acquire 轮转解耦 + 读未定义图像告警) | -| texture view 的 mip 生成窗口裁剪(GLES / Magma 后端 + 前端 monolith 臂守卫) | `73b37bbe`、`fd30b5c3`、`ed919f0d` | -| DirectGLES FBO 附件同步 memo 改为对象级(improved-transparency 冻结帧) | `e004269d` | -| monolith 客户端数组(baseInstance / GPU 写 EBO / indirect 形状,含一处 Vulkan SEGV) | `62bfe461..e258a822` | -| monolith 深度/模板读回编码(signed/half、单 aspect 经 buffer 中转) | `5264f9a9..d56c0e83` | -| pipe-gates 字段表覆盖 `MGPSubData` 新成员、P7 packed-float mip 探针由 known-red 翻绿 | `3542f64f`、`e4ae1964` | -| barrier 看门狗 30 s → 120 s:它是死锁检测而非性能门;lavapipe 的 texture-handle 注册(`vkCreateImageView → llvmpipe_register_texture`)单次停顿实测 29.3–39.7 s、整轮累计 ~44.6 s,monolith 同路径同样停顿但无上限(用户裁定:两臂同现即属可接受环境开销) | `68b55ea3` | -| CI artifact cleanup 先读完整分页 inventory 再删除、等 retrace-split 车道、保留失败 case 产物 | `5cbf29b0` | - -验收数字(WSL `p5f-int`:`d56c0e83` 全量实测 + `0689fc96` 定向复测): - -| 门 | 结果 | -|---|---| -| unit | 2328,**零失败**(10 个既有 skip) | -| `integration-gpu` × inproc | 1455,**零失败**(221 skip 经逐条审计全部为既有类别:机制对照车道、驱动/能力门、单后端专属等) | -| `integration-gpu` × monolith | 1455,**零失败**(两臂逐名比对仅 76 条合法的 split-runtime 自声明 skip 差异) | -| retrace 77 例 × monolith | **77/77** | -| retrace 77 例 × inproc | 76/77;唯一失败 `bsl-esc-menu-854` DirectVulkan 是上述 lavapipe 停顿间歇越过旧 30 s 预算,预算修正后隔离 **10/10 绿**(ssim 恒 0.998402) | -| CI 门 18 项(split strict / dual-block / clientarray / E1 / E3 / run-ahead 负控与同步验证 / flatc / include 闭包 / gen_pipe / pipe-gates 等) | **18/18 绿**,strict 与双块棘轮均为空 | -| Android | 两 ABI(arm64-v8a + x86_64)trace/plugin Release APK 在最终头重建并验明正身;AVD(api35 x86_64)上 OpenRA monolith / inproc 冒烟均 ssim=1.0,Activity 重建 reattach 与重复 JNI 回放拒绝(`7fd83133`)探针通过 | - -最终合并头的完整矩阵以远端 GitHub CI(test.yml / apk.yml)为准。已知边界:lavapipe 的 texture-handle 注册停顿本身(性能现象,两臂同有)未消除;`iterationrp` 的 DirectGLES 不在 CI 矩阵内(本机 llvmpipe 无法 lower 其 256-bit half 转换,`LLVM ERROR: Cannot select: intrinsic %llvm.x86.vcvtps2ph.256`);`rd12-odinlite-in-world` 不在 77 矩阵内、本轮未单独复跑;wire view 缓存键含全局 image epoch 导致的冗余重建(实测 173 次 vs 按需 ~39 次)是已证伪与本次卡死无关的纯性能机会,未动。 - -## 3. 历史:P5c 落地内容 - -| 包 | 内容 | 效果 | -|---|---|---| -| c0c | `MG_Remote/CONTRACT-P5C.md`:纹理 staged shadow 所有权 / SEG_EVENT blobref 约定 / 按句柄解析 / 两条控制记录 / 残余值字段表 / 角色守卫语义;落地偏差全部写回 | 六包按同一契约施工 | -| tx | `StagedTextureStore`(句柄为键、整段覆盖、defined-ness 追踪);`SyncMipmapsToBackend` 四臂改读 store + 描述符;Magma mip 改标 server shadow | 纹理纹素不再回读 client;`0xDD` audit 覆盖纹理 | -| ev | `SEG_EVENT` 三个 producer + `kEventGlError`;producer 归 server session 安装;消费端三臂(拆 monolith guard);`InvalidateCompileEnv` forward 删除 | 反向通道零裸指针 | -| hd | sink / twin 按记录句柄解析(具名 blit 经 verb 句柄工作区、CopyTex、mip、间接族);`HasDefinedContent` 读描述符位 | 守卫面闭合前的解析层 | -| 合并协调 | 两个具名豁免 scope(通告家族 P4b/P7、G6 registry 家族 P3b/P4b);PrimitiveRestart 改读 server shadow;Magma 具名 blit 的 G6 消费臂 | 审计漏报的三个无句柄家族有具名归宿 | -| ct | `applier_reset`(77)/ `object_death`(78,framebuffer 首个 wire delete);GL 线程直调 `MGPipeApplierReset` 成 RoleViolation | 控制面补全 | -| rv | `set_context_values`(79);值类 BARRIER-PULLED 清零;三 shutter 自答;`MGPAttribValue` 三视图 | rsp 值类 = 0 | -| gt | 纹理九表面 layer-1 守卫(挂 MipmapStorage 汇聚点);`InBarrierWait` 接线成 gPipeInputs 单写者规则的 client 半边;strict CI 车道(unit 绿门 + 场景预期红);rsp 按帧实测 | 每层守卫 red-once 按名验证 | -| triage 修复 | 默认 FBO 格式事件的第二类排空点(EGL RPC 返回);大 writeback 的客户端切片(环 1/4);XFB scatter 改读 server staged shadow | 普查三个真回归修复 | - -## 4. 历史:P5b 落地内容 - -| 包 | 迁移的槽 / 内容 | 效果 | -|---|---|---| -| c0b | 25 个已测量 class-C 槽的 wire 记录、`WireVerbSink` 分派、具名 Fatal stub、`CONTRACT-P5B.md` | 四包可并行 | -| f1 | `ClearBuffer{iv,uiv,fv,fi}`、`ClearNamedFramebuffer*`、`CopyTexImage2D`、`CopyTexSubImage2D`、`GenerateMipmap` | 34 个车道中止归零 | -| i1 | `BindImageTexture`、`DispatchCompute`、`CopyImageSubData`、`MemoryBarrier`、`ShaderStorageBlockBinding` + 两个伴随槽 | 235 个车道条目解锁 | -| t2 | 四个 stream-output span 行、XFB 对象绑定、`PatchParameteri`、`kCapBackendOwnsXfbCapture` | 138 个车道条目解锁 | -| d1 | 十九个索引 / 实例 / multi-draw / indirect 槽下沉到 `draw_vbo` | Minecraft 主阻塞解除 | -| sync | `FenceSync`、`ClientWaitSync`、`GetSyncStatus`、`WaitSync`、`DeleteSync` 上 apply 线程;client 铸造 Fence 句柄,wire 只过 `{slot,gen}` | 顺带修掉 `MGL_BACKEND_SLOT_PTR_LOCAL` 对 split 恒返回 nullptr | -| blit / mip | `BlitNamedFramebuffer` 经作用域化 client-shadow 绑定下沉;生成 mip 存储按推送描述符验证 | 31 + 7 个 trace 阻塞解除 | -| r1 / r2 | P5 收官审查 13 项(coherent-map 服务器侧绕过、FBO 死亡在 client 线程、`PACK_SWAP_BYTES`、`RingOverrun` 等待、CI 对照九项) | — | -| 收官审查修复 | 索引 span 上界(`Count × IndexSize` 必须装进声明的 run)、fence wait 预算、`Fatal{ReplyStatusInvalid, "ReadPixels"}` | P5b 审查 0 blocker | - -## 4.1 历史:P5b 真实负载(inproc,独立 apply 线程) - -- `DrawElements` 不再是阻塞:d1 普查时 77 个 Minecraft 后端用例中 28 个渲染通过(SSIM ≥ 0.99995)。 -- blit + mip 之后:`improved-transparency-minecraft-26.3` DirectGLES SSIM 1.0 / DirectVulkan 0.999914;`minecraft-1.21.4-fabric-iris-bsl-in-world` DirectVulkan 0.997324、DirectGLES 0.997496;OpenRA 双后端 1.0。 -- 79 trace 普查 7 条未过项的首阻塞:`rd12` GLES `Fatal{InitialBytesNotCarried,"resource_respecify"}`、VK `Fatal{BarrierTimeout,"Present"}`;`iris-photon` / `iris-derivative` / `create-indirect` GLES 均 `Fatal{UnmigratedEmulation,"texture-remint-pull"}`;`iris-bsl-esc-menu-854` GLES 同 rd12 GLES;`create-indirect` VK 在 llvmpipe 上内存膨胀(>60 GiB RSS,两次复现,守护杀死)。 -- Redmi 出口(2026-09-16):正确性 8/8;barrier tax 首测,逐例见 `MEASUREMENTS.md` §7.4。 - -## 5. 开放项(按优先级) - -| 项 | 证据 / 去向 | -|---|---| -| ~~`SEG_STAGE` 默认 32 MiB 装不下目标负载的单次 128 MiB 上传~~ | **内容侧分块已落地(2026-09-20)**:buffer 范围走查 `1e7c372e`、纹理整宽 slab `9469d48e`,预算 `MGPipeStageChunkBytes()`(默认 segment/4 = 8 MiB),默认 32 MiB 即可容纳;未接入分片的 record 类型与专用 carrier 仍归 P8(`ROADMAP.md` 开放问题 11)。历史证据 `p5b-results/blit-codex-v1.md`;`MEASUREMENTS.md` §7.2 | -| Magma P7 剩余功能与性能 | 应用 VBO/EBO/UBO、已对齐 SSBO/atomic/texel、persistent 和 indirect 消费已随 `38919d45` 实际游戏修复落地;XFB buffer capture、部分不对齐 range/UBO byte-tail、placeholder/native-format 及批处理性能仍待做。P5b “82个错答”只属历史计数;见 [修复报告](notes/p5f/magma-inproc-fix.md) | -| ~~`iris-bsl-esc-menu-854` 的 `InitialBytesNotCarried/resource_respecify`~~(两后端,`07f91f35` 已修,CI 矩阵内实测通过;rd12 GLES 的同型 Fatal 同根因已修,但该 case 不在 CI 77 矩阵内、未单独复跑)、rd12 VK `BarrierTimeout/Present`、三条 `texture-remint-pull` 仿真槽、`create-indirect` VK 内存膨胀 | 79 trace 普查 `counts.json` / `trace-transitions.json` | -| RGB 三通道 CPU mip 回退仍是具名 Fatal | `p5b-results/mip-codex-v1.md` | -| ~~P5c 历史跨角色清单与对象类残余~~ | **P5f 已全部收口**:双块空棘轮、零 BARRIER_PULLED、两后端逐帧 rsp=0;旧指针 accessor 以 FATAL 保持边界,未伪标为 record-supplied。见 [`close-report`](notes/p5f/close-report.md) | -| 27 个 P5 inproc 错答:22 纹理读回走 client-shadow 回退、3 query、1 inspection、1 FBO/RBO 删除后生命期 | P4b / P7 / P6 债 | -| `SEG_REPLY` 2 MiB 单槽上限;GetCaps 两个 blobref 的载体;PACK-PBO 读回真实形式 | P6+ / P9 的协议广度;`rsp` 残余读取已由 P5f 关闭,不再与这些功能债并列 | -| 15 个 class-C 槽(query / sync 尾 / `GetTexImage` / `SetSwapInterval` 等)无负载命中,仍具名拒绝 | P9 / P10 | -| Redmi 定频行只在树外 `~/w7/notes/p2/devices/pin_device.sh`;钉频口径 2026-09-16 起 1100 MHz(原 1050) | `devices/pin-verification-2026-09-07.md` | -| `test.yml` / `apk.yml` 的 `feat/disaggregated` 触发器是临时的,合入 dev 前必须移除 | — | -| ~~P5e:BRIEF §3 的三条阴性对照与逐包 red-once 尚未重跑~~ | 当期后续已执行,结果保留在历史 §2.6 与 P5e 报告;E1 自检债单列保留,不与执行完成混同 | -| **P5e 历史债:`split_negative_controls.sh` 的 E1 对照定义/自检**,原 `BATCH_WAITS=1` 组合下索要的 `Fatal{BarrierViolation}` 无法触发 | ID-122;仍需重新定义其证伪对象。P5f 的双块开绿/关红、RSP 硬门与逐包 red-once 不代替修复这条旧脚本 | -| ~~P5e:per-role stamp 存储未落地~~ | **P5f f1 / fs 已完成**:server 私有 stamp/identity/liveness、client 独立块与角色本地诊断。旧契约的历史 UNLANDED 注记不再作为当前施工状态 | -| **P5e:VD12 面板上限之上谁更快未答**(本机定不住更高频);VD32 那一轮回答了一般性问题 | `MEASUREMENTS.md` §11 / §11.1 | -| **新机会(非缺陷)**:VD32 下 apply 11-12 ms 对 client 15.7 ms,两侧不平衡;把工作从 client 挪到 apply 会直接降瓶颈——lockstep 下无意义,run-ahead 才解锁 | `P5E-RUNAHEAD.md` 末节 | - -## 6. 下一步 - -1. ~~**P6 a6 尚未执行**~~ **a6 已收官(2026-09-21)**,产出与十四项 c6 决定清单见 [`a6-audit-v1.md`](notes/p6/a6-audit-v1.md) §7。原计划文字::按 [`P6-SPAWN-PLAN.md`](P6-SPAWN-PLAN.md) 核验 P5f 的 wire-only 结论在独立进程装配中成立,重点是角色链接闭包、段映射/句柄传递与生命周期边界;控制帧、静态世代与对象字段不重新施工。 -2. a6 后推进 **c6 契约与 spawn 实现**:SocketTransport、ServerMain、握手、EOF / device-lost 及子进程身份门。`integration-spawn` 应与现有 split 同名,且日志证明真正在子进程执行;这些代码和验收尚未实施。 -3. P7/P8/P9 的 buffer、格式/placeholder、client arrays、大 blob、异步回读等功能债继续按阶段推进;79 trace 全集重新普查后再引用首阻塞,P5b 历史清单不当作当前结果。 -4. **保留 P5e E1 历史债(ID-122)**与 VD12 面板上限、线程放置/负载平衡等测量问题。P5f 设备正确性通过不改写 P5e 的性能结论,也不声称解决上述性能问题。 - -## 7. 记录位置 - -| 内容 | 位置 | -|---|---| -| P5f 收官、异模型族终审、最终设备门 | [`close-report`](notes/p5f/close-report.md)、[`close-review`](notes/p5f/close-review.md)、[`device-report`](notes/p5f/device-report.md);分包报告位于 `notes/p5f/` | -| P5 brief / 契约 / 前言 | `~/w7/notes/p5/BRIEF-P5.md`、`MobileGL/MG_Remote/CONTRACT-P5.md`、`~/w7/notes/p5/PACKAGE-PREAMBLE.md` | -| P5 包报告与审查 | `~/w7/notes/p5/p5-results/`(`joint-v1.md` 全门记录、`ab-v1.md` 设备 A/B、`p5-close-codex-review.md`) | -| P5b brief / 契约 / 报告 | `~/w7/notes/p5b/BRIEF-P5B.md`、`MobileGL/MG_Remote/CONTRACT-P5B.md`、`~/w7/notes/p5b/p5b-results/` | -| P5b 收官主机门 | `~/w7/p5b-final-host-348d22a4/`(`reconciliation-20260916.md`、`summary-counts.{json,md}`) | -| P5b 合并普查 | `~/w7/p5b-final-census-348d22a4/`(+ `-resume1/2/3`)、`p5b-results/joint-codex-v1.md` census 块 | -| P5b 设备证据 | `~/w7/notes/p5b/apk/p5bcodex2/`(APK + proof);`MobileGL/.trace-work/p5b-redmi/p5bcodex2/2f7cbe2e/`(correctness 8/8、`ab-tables.md` 与 bsl 补充表) | -| class-C 普查 | `~/w7/notes/p6/census-classC.md`;基线 `~/w7/p5b-c0b-census-logs/results.json` | -| P5c 审计 | `~/w7/notes/p5c/p5c-audit-v1.md`(59 行清单、wire-clean 清单、与契约的分歧、已有 `rsp` 数字)+ `BRIEF-p5c-audit.md`;Kimi K3 只读静态审计,头 `a79a0af6`,关键行已由集成者逐条抽查 | -| P5d 三轮 | brief `~/w7/notes/p5d/BRIEF-P5D-R3.md`;设备记录 `~/w7/notes/p5d/RESULTS-P5D-R3.md`;四包报告与 lockstep 研究 `~/w7/notes/p5d/reports/`(`E-lockstep-feasibility.md`);profile 数据 `~/w7/notes/p5d/perf/`(`mg-vd12-8`/`mg-mono-1` 为二轮头 `56a77348`);bench 脚本 `~/w7/notes/tools/p5d_bench_*.sh` | -| P5c 契约 / 实测 | `MobileGL/MG_Remote/CONTRACT-P5C.md`(含落地修订);`MEASUREMENTS.md` §8(逐门数字);普查逐名 Fatal 证据 `~/p5c-fatal-map.tsv`;G1 报告 `~/p5c-g1-report.json`;audit 日志 `~/p5c-audit-{bsl,comp}.log` | -| 门日志 | `~/w7/p5-joint-gate.log`、`~/w7/p5b-quickgate.log`、`~/w7/p5-joint-evidence/` | -| 脚本 | `~/w7/notes/tools/`(`wsl_p5_gate.sh`、`p5_ab_redmi.sh`、`p5b_codex_redmi.sh`、`wsl_build_p5_apks.sh`、`p6_census_*.{sh,py}`、`p5b-c0b-census.sh`) | - -## 8. 仍在生效的裁定(ID 索引;过程性裁定与 ID-1..39 见 git 历史) - -| ID | 裁定 | -|---|---| -| 41 | G5 第十一行 `FlushPendingRangesFrom` 始终对固定 pin 比较;re-pin 必须同时改两份脚本 | -| 42 | persistent-map 成员性期望 `live == (arm == emulated)` | -| 43 | 带 CALL 旗标的 ring 头会被弹出,不当 wrap filler | -| 47 | `SEG_REPLY` 16 MiB / 8 × 2 MiB slot;超限在 client 侧具名拒绝;ABI fingerprint 尚未混入段尺寸 | -| 49 | ReadPixels 以紧凑形式过线:server 用中性 pack 读进回复,client 按应用 pack 散布 | -| 50/52 | 有传输时 `liveHostBase()` 不得回落到 client 的 `MappedData()` | -| 53 | 每个 `DirectGLES.Split.*` 条目一个私有日志;对照只从被选条目的私有日志取 Fatal | -| 54 | forwarder 每 (dpy, draw, read, ctx) tuple 只 bind 一次;client 的 release 不解绑 apply 线程的上下文 | -| 55 | R-17:33 行生成路由 + 4 escape,`PipeCatalogueTest` 钉 37;`&MGPipeApply*` 地址取用点同样在扫描内 | -| 57 | split 下绑定 PACK PBO 的 ReadPixels 具名拒绝;真实形式(server 写 buffer resource + client `MarkGpuWritten`)留 P6+ | -| 62 | 对照必须把"选中条目被跳过"判为失败 | -| 65 | 27 个 inproc 错答归 P4b/P7 债;普查只记录不设门 | -| 66 | 过程规则:不过度验证、轮次间不审查、每阶段收官由 Codex 审一次、只读 / 非核心任务派给 Codex | -| 67 | 相同 tuple 的重复 make-current 不重发 caps;不同 tuple 重发且 client 立即采纳 | -| 68 | class-C 普查决定迁移顺序(所有 Minecraft trace 首阻塞 = `DrawElements` → Minecraft 优先) | -| 76 | P5b 出口 = 主机门 `348d22a4` complete + 79 trace 普查 + Redmi 正确性 8/8 + 四臂 A/B | -| 77 | Redmi 钉频期望 1050 → 1100 MHz(2026-09-16);iris-bsl 8 组判为 fixture 123 帧上限,补充表不进 200 帧尾门表 | -| 79 | **P5d 三轮规则(2026-09-18)**:批处理免等只允许 apply 不读残余填充任何字段的记录(`generate_mipmap` 因后端读 `GetActiveTextureUnit` 而必须等);性能诊断以符号化调用图为准、不再从 self% 猜归属;Redmi 上 fps > ~115 的 monolith 数字视为 120 Hz vsync 封顶,配对比较以逐线程 CPU ms/帧为主指标;`sched_setaffinity` / `taskset` 在该内核对 app 线程无效,线程放置只记录 | -| 81 | **P5e**:handle 臂只在 `Transport != Monolith`;push-monolith 构建保留其前端臂、字节不动 | -| 84 | rule F 只约束**未设障**记录;设障记录保留 P5C 语义 | -| 90 | Magma 整个 P5e 保持 lockstep;`kCapRunAheadApply` 从不在 DirectVulkan 上发布 | -| 107/109/110 | 一整条运行时臂没被门禁(137 SEGFAULT / 38 scenario);`gpu` 成为常设门禁步;**"记下了句柄"≠"记录臂被选中"**,要自述式传输测试 | -| 111 | 盖章必须与服务端**自身**能力合取,否则翻开开关会当场打死 Magma | -| 112 | `EmittedCallSuppliesTheWholeField` 上编译期绊线:把 Magma 的空指针崩溃换成构建断裂 | -| 116/125/128 | 采纳规则**生成**而非手抄,三个析取项(静态设障 / 退役相不在本阶段 / 按升级设障) | -| 117 | 被采纳的 pull **响而不致命**(`Admitted{` 标签),车道才可能真正变绿 | -| 119/115 | `rsp` 的钉子改写为可检查的形式;车道必须有阳性对照 | -| 121 | §3.5 的 red-once 证据形式在当时不可执行,重排到车道变绿之后 | -| 124 | 四个构建 flavour 里只有 split 编得过;**一条臂的证据必须自证它确实是那条臂**(看生效的编译宏,不看 flag、不看 cache) | -| 129 | 没有 stamp 行的 verb 什么都不采纳(采纳集合宁窄勿宽) | -| 131 | `ctest -L` 是**正则**:新标签不得以既有标签为前缀,且要数一遍证明 | -| 132/135 | **strict 硬绿是必要而结构性地不充分**(它跑在 lockstep 下);竞态在元数据标量而非字段值,而**打不响的守卫比没有守卫更坏** | -| 136 | 为让车道变绿而加的等待是真实路径上的真实代价:要问**哪条臂在买单**,不是哪条车道绿了 | -| 78 | **P5c 插在 P6 之前**(2026-09-17):`inproc` 先做到两角色之间除 wire 零直接内存访问,P6 只换传输;值类 BARRIER-PULLED 行在 P5c 过线,对象类行留 twin 表阶段;codex 无额度期间只读审计改派 Kimi(K3) | +- **出口门 7、8**(真机配对 A/B、三个性能数)——待采集,见 §2。 +- **`DirectVulkan` 真机分离路径分歧**——Magma × 真实 GPU,非 P6。 +- **P6.5**:数据面流式(`ILink`/`StreamLink` 已声明未接线)、AF_VSOCK、`SEG_STAGE` 送窗口复活。 +- **Ph**:让 `Session::Fail` 可返回的策略翻转(需在每个依赖 `[[noreturn]]` 的站点造真实返回路径)。 +- **P12**:真窗口跨进程(`ANativeWindow*` 是客户端进程内指针,`SetWindowHandle` 至今具名拒绝)。 +- **seq/op 未穿 SessionFault 帧**:90 个站点不逐一穿线,消息本身已带 op,帧只带 code/family/message。 diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index 78b0afe7..cebd4553 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 的 P5f 前提已解除,a6 / c6 / spawn 实施尚未开始**。逐门数字、主分支合入记录和下一步见 [`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。 +> 状态:**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 全部包(a6 / c6 / lk / so / sm / cp / hs / dl / st / t6)已落地于 `feat/disaggregated`(头 `16bfab10`,2026-09-21);出口门第 1–6 项达成,第 7 项(真机配对 A/B 热窗口)与第 8 项(三个强制性能数)尚未正式采集,故 P6 记为「实现完成、出口性能/设备数待补」,未宣布收官**。逐包状态、出口门逐项、证据见 [`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。 > **P5f 后续 Magma run-ahead 已完成**(`194382c9`,2026-09-20):主机真实排队、credit、负控及 Vulkan 同步验证通过,Redmi 同包 Magma 开/关与 GLES 三臂 FCL 世界实测通过。见 [报告](notes/p5f/magma-runahead.md)。P6 / P7 全阶段状态不因此改变。 @@ -32,7 +32,7 @@ | **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 | **a6、c6 已收官(2026-09-21)**;下一个包 `lk` | `SocketTransport`(socketpair + fork/execve,envp 剔除 + 强制 monolith 双保险);`ServerMain`;`MOBILEGL_IPC_SERVER_PATH` + `dladdr` 兜底;有界重试握手;EOF 即时退出;device-lost latch。消费 P5f 已落地的值控制帧与 server-owned 状态,不重做 EGL 帧化或静态世代隔离。依赖序见 [`P6-SPAWN-PLAN.md`](P6-SPAWN-PLAN.md):**a6**(核验进程装配/链接边界)→ **c6**(契约)→ **so / sm / cp / st / t6**。契约草稿 [`P6-CONTRACT-DRAFT.md`](P6-CONTRACT-DRAFT.md)。**a6 产出**:[`a6-audit-v1.md`](notes/p6/a6-audit-v1.md)(198 行,七项各带对抗复审)、[`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)。**c6 产出**:规范契约 [`MG_Remote/CONTRACT-P6.md`](../../MobileGL/MG_Remote/CONTRACT-P6.md)(21 条裁定,取代草稿)+ 数据面缝的惰性声明 `Transport/ILink.h` 与 `Transport/StreamLink.h`;零 TU 依赖它们、零构建规则、pull 与 split 两侧 `.text` 与符号集逐字不变。c6 指定但留给 `hs` 落地的 schema 行见契约 §2。a6 推翻计划四处陈述:`spawn` 今天不是可观察状态、`cp` 不止传输、device-lost 闩锁不存在、"server 不链 MG_Impl" 为假。边界仍为 pbuffer / surfaceless / 离屏;真窗口到达归 P12。需区分不等待的 client 与已死亡的 server,不以超时阈值代替 device-lost 判定 | P5b 的完整渲染路径在 `spawn` 下绿;进程树只多一个子进程;`HeadlessGL` fork 预检无孤儿;OpenRA 在 Adreno 830 上 split SSIM ≥ 0.99;`integration-spawn` 与 `integration-split` 名集合一致;每条私有日志证明子进程 pid 与 `transport=spawn`;socket 门铃代价实际测量,性能只记录 | +| **P6** spawn transport | ⏳ **全部包已落地(2026-09-21,头 `16bfab10`);出口门 1–6 达成,7/8 待采**(真机配对 A/B + 三个性能数) | 十包全落地:**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) | 出口门(契约 §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 待采**:真机 reboot-clean 同热窗口配对 A/B、三个强制性能数(socket 门铃 vs condvar、`SEG_STAGE` 字节/帧、chunking 后记录/帧)尚未正式记录 | | **P3b / P4b** 深化(Espryt) | 待排 | 按存储属主键控的发射游标与 view 索引重映射;`g_fboTextureSyncList`;`ResolvedTextureBindingMemo` / `SamplerPassMemo` / image sweep / program registry 重键;XFB scatter 搬到 client;删 fragColor 重推导 workaround 与 `g_broadcastMemo*`;raw-depth-fetch sampler 的 monolith 清理(transport 原生臂已由 P5f fs 落地);回读 / pack state;P4a 记下的 R-3 / R-4 / R-5 / R-7 / R-10 / R-11;`ProgramArtifacts.h` 的 NDK 尺寸钉 | 纹理 / program 场景;CTS `texture_*` / `shader_image_*` / `packed_pixels` 在 0.5 pp 内;每一个 Iris trace;`TextureUploadShapeScenario` 升级成门 | | **P7** DirectVulkan(Magma)全量迁移 | 部分已提前落地,阶段未收官 | `38919d45` 已补实际游戏的 server buffer consumers 和 Android 旋转 blit([报告](notes/p5f/magma-inproc-fix.md));`194382c9` 又完成 Magma run-ahead、GPU 延迟退休与 VAO 身份碰撞修复([报告](notes/p5f/magma-runahead.md));其余工作:其余子系统:`SetupDrawSnapshot` 探测字段塌成 dirty mask;占位纹理原生化;具名 UBO host payload(D-B8);内部 shader 烘焙;`VertexInputStateFactory` 内容寻址 CSO;D18 容器纪律保留 | 集成 + trace 在 Magma 的 push 与 split 下全绿;verify 零分歧;`nm -D libMobileGLServer.so \| grep glslang` 为空;CTS 0.5 pp 内。**再基线检查点:中点完成子系统 < 40% 立即重定基线** | | **P8** emulation 下放 + 索引宿主镜像 + 协议广度 | 待排 | `MG_Impl/Pipe/HostResolve.cpp`(client 数组范围、最大索引扫描、`*IndirectCount` 解析,逐站点 reconcile);`Server/IndexHostMirror`;CopyImage 镜像搬到 client;viewport-array 回放验证;`generate_mipmap` 计划 + CPU 回退纹素;大 blob carrier(开放问题 11);无 present fence tick;`kCapDriverOrderedXfbCapture` | `'^DirectGLES\.Split\.'` 与 `'^DirectGLES\.'` 逐名相同;trace split 双后端 SSIM ≥ 0.99 含两个 `coherent_as_flush` fixture;`ClientArrayAfterComputeWriteScenario`;`create-indirect` 上 `roundtrips-per-frame` 读零;`index-mirror-bytes` 逐用例发布 | @@ -112,6 +112,7 @@ 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-21,头 `16bfab10`)**:a6/c6/lk/so/sm/cp/hs/dl/st/t6 十包合入 `feat/disaggregated`;三种传输(monolith/inproc/spawn)桌面与真机两进程 retrace 逐像素对上 golden;device-lost 闩把杀 server 从 123 s 错误 `BarrierTimeout` 变 5.7 s 正确 `DEVICE LOST`;`Session::Fail` 漏斗把裸 abort 93→4。出口门 1–6 ✅,第 7 项(真机配对 A/B 热窗口)与第 8 项(三个强制性能数)待采,**未宣布收官**。逐项见 `CURRENT_STAGE_PROGRESS.md`。 - 仍是方向、不据此伪造新日历:全功能 split(P8 之后)、纯度门在非 verify 构建上转绿(P13)。 再基线检查点仅剩一条:**P7 中点完成子系统 < 40% 立即重定基线**(P3a 的检查点发现不了 Magma 特有的超期)。