From 41b35536e3e4300ff25a70a49f678aadb2a0a50e Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 25 Sep 2026 01:34:29 -0400 Subject: [PATCH] [Docs] (P12): record post-review verification --- docs/Disaggregated/CURRENT_STAGE_PROGRESS.md | 13 +++--- docs/Disaggregated/MEASUREMENTS.md | 2 +- docs/Disaggregated/README.md | 2 +- docs/Disaggregated/ROADMAP.md | 4 +- docs/Disaggregated/notes/p12/PLAN-P12.md | 6 +++ docs/Disaggregated/notes/p12/README.md | 45 +++++++++++++++----- 6 files changed, 50 insertions(+), 22 deletions(-) diff --git a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md index 7ea5adbd..83a681f0 100644 --- a/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md +++ b/docs/Disaggregated/CURRENT_STAGE_PROGRESS.md @@ -1,6 +1,6 @@ # 当前阶段:P12 — server 自己开窗口上屏 -> **更新 2026-09-24**。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。上一阶段 P7 已于 2026-09-23 完成。 +> **更新 2026-09-25**。这一页只有摘要;带裁定编号的明细、余项清单、证据位置在 [`notes/p12/README.md`](notes/p12/README.md)(计划与交接 [`PLAN-P12.md`](notes/p12/PLAN-P12.md))。P12 审查后的定向主机与真机复测已完成;两个收官验收门仍未打。上一阶段 P7 已于 2026-09-23 完成。 ## 目标 @@ -12,16 +12,15 @@ Android 上的 server 应用自己开一个全屏窗口,把收到的渲染流 |---|---| | 功能:server 自有窗口、无头 client、窗口丢失处理、一台设备同时只一个 server | ✅ 已并入主分支 | | 代码审查发现的 10 个问题 | ✅ 已修 | -| 主机测试;单进程构建二进制不变(G1) | ✅ | -| 真机 7 项检查(两个后端上屏、排队与拒绝、窗口丢失、离屏不受影响……) | ✅ 修复前通过;⏳ **修复后未复测** | +| 主机门与单进程构建二进制不变(G1) | ✅ 原主机门 / G1 见 ID-P12-14/15;审查后 P12 定向 CTest **46/46**(`1fb18d9e`) | +| 真机 7 项检查(两个后端上屏、排队与拒绝、窗口丢失、离屏不受影响……) | ✅ 审查后在 Redmi `2f7cbe2e` 复测通过(`1fb18d9e`);明细见 [`notes/p12/README.md`](notes/p12/README.md) | | 验收 A:同一台手机上用 FCL 以两个后端进游戏,杀掉 server 后干净报"设备丢失" | ❌ 未做 | | 验收 B:另一台电脑经 TCP 连手机进游戏,并记录链路数据 | ❌ 未做 | ## 下一步 -1. 真机复测(需要连着 Redmi 的机器)。 -2. 验收 B,再验收 A。 -3. 收尾:写 `MG_Remote/CONTRACT-P12.md`、修门脚本里误导的一行输出、做一次收官审查。 -4. 之后按 [`ROADMAP.md`](ROADMAP.md):P8;P9 → P10 → P11。 +1. 完成验收 B:另一台机器经 TCP 连 Redmi 入世界并记录 P6.5 必测数;再完成验收 A:FCL 同机 spawn、双后端入世界并验证杀 server 后的 device-lost。 +2. 收尾:写 `MG_Remote/CONTRACT-P12.md`、修门脚本里误导的一行输出、做一次收官审查。 +3. 之后按 [`ROADMAP.md`](ROADMAP.md):P8;P9 → P10 → P11。 **阻塞**:没有需要决策的事项。 diff --git a/docs/Disaggregated/MEASUREMENTS.md b/docs/Disaggregated/MEASUREMENTS.md index f1cb3fa9..75bf4862 100644 --- a/docs/Disaggregated/MEASUREMENTS.md +++ b/docs/Disaggregated/MEASUREMENTS.md @@ -30,4 +30,4 @@ | 13 | P3b/P4b | 纹理上传形状在四种拓扑下完全一致 | [`notes/p34b`](notes/p34b/README.md) | | 14 | P6.5 | 跨机 TCP 102/102;断线约 5 s 检测到 | [`notes/p65`](notes/p65/README.md) | | 15 | P7 | 真机画面 36/36;server 内存无界增长收住(主机 825 → 546 MiB) | [`notes/p7`](notes/p7/README.md) | -| 16 | P12 | 上屏两后端 SSIM 1.0;审查修复后待真机复测 | [`notes/p12`](notes/p12/README.md) | +| 16 | P12 | 审查后真机复测:Espryt SSIM 1.0;Magma 1.0 / 0.999999511;P12 定向 CTest 46/46;FCL 与跨机 TCP 收官门仍待完成 | [`notes/p12`](notes/p12/README.md) | diff --git a/docs/Disaggregated/README.md b/docs/Disaggregated/README.md index 69c08d7c..aad4968d 100644 --- a/docs/Disaggregated/README.md +++ b/docs/Disaggregated/README.md @@ -2,7 +2,7 @@ **做什么**:在 MobileGL 的前端(处理应用的 GL 调用)和后端(调用 GLES / Vulkan 驱动)之间立一份显式接口——前端把状态变化**推**给后端,后端不再直接读前端的内存。有了这份接口,前后端可以放在两个线程、两个进程,甚至两台机器上运行。 -**做到哪了**(2026-09-24):接口与拆分已完成到"两个进程、可经 TCP 跨机"。当前在做 **P12:让 Android 上的 server 自己开窗口,把画面直接显示到屏幕上**——功能已实现,还差真机复测和两项验收。→ [`CURRENT_STAGE_PROGRESS.md`](CURRENT_STAGE_PROGRESS.md) +**做到哪了**(2026-09-25):接口与拆分已完成到"两个进程、可经 TCP 跨机"。当前在做 **P12:让 Android 上的 server 自己开窗口,把画面直接显示到屏幕上**——审查后的主机定向测试和 Redmi 真机七项复测已通过;FCL 与跨机 TCP 两项验收仍未完成。→ [`CURRENT_STAGE_PROGRESS.md`](CURRENT_STAGE_PROGRESS.md) ## 一张图 diff --git a/docs/Disaggregated/ROADMAP.md b/docs/Disaggregated/ROADMAP.md index 98b1dc55..dfdef8aa 100644 --- a/docs/Disaggregated/ROADMAP.md +++ b/docs/Disaggregated/ROADMAP.md @@ -1,6 +1,6 @@ # 路线图(索引) -> **2026-09-24**:P0 到 P7 已完成;当前阶段 **P12**(server 自己开窗口上屏)功能已实现、待验收。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 +> **2026-09-25**:P0 到 P7 已完成;当前阶段 **P12**(server 自己开窗口上屏)审查后主机定向测试和真机七项复测已通过,FCL 与跨机 TCP 两项验收仍待完成。每个阶段的计划、验收结果、实测与报告在 `notes/<阶段>/`(点阶段名进入)。 ## 目标 @@ -32,7 +32,7 @@ client(跑应用的一方)与 server(跑驱动的一方)可以在**不 | [Ph](notes/p7/README.md) | server 能安全地接受外来连接:令牌、限额、坏数据不致崩溃 | 必需项 ✅(随 P7) | | [P3b / P4b](notes/p34b/README.md) | GLES 后端的深化与收尾 | 大部分 ✅,余项并行 | | [P7](notes/p7/README.md) | Vulkan 后端完整迁移;真机画面检查 36/36 通过 | ✅ 09-23 | -| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | **进行中**:已实现,待复测与验收 | +| [**P12**](notes/p12/README.md) | **server 自己开窗口上屏,client 不需要窗口** | **进行中**:审查后主机定向测试和真机七项复测通过;FCL / 跨机 TCP 验收待完成 | | [P8](notes/p8/README.md) | 把剩余的仿真路径挪到正确的一侧,补齐协议 | 待排 | | [P9](notes/p9/README.md) | 反向通道异步化(回读、写回不再同步等待) | 待排 | | [P10](notes/p10/README.md) | 同步对象、查询与帧节奏 | 待排 | diff --git a/docs/Disaggregated/notes/p12/PLAN-P12.md b/docs/Disaggregated/notes/p12/PLAN-P12.md index 7932c21b..eece46ed 100644 --- a/docs/Disaggregated/notes/p12/PLAN-P12.md +++ b/docs/Disaggregated/notes/p12/PLAN-P12.md @@ -61,6 +61,12 @@ | 6 | 负控:`MOBILEGL_IPC_SURFACE=server` 打离屏 server | 双侧具名 `Refuse ServerOwned (NoServerDisplay)`;随后同 service 的离屏会话绿 | | 7 | 一台设备上只有一个 server | Activity 起来杀 service、service 起来杀 `:mglwin`,互相都验证了 | +### 审查后复测(`feat/disaggregated@1fb18d9e`,2026-09-24) + +审查修复后的同一 P12 实现 head 已在 Redmi `2f7cbe2e`(Adreno 830)重建并复跑七项检查。结果与上表一致:Espryt OpenRA SSIM **1.000000**;Magma OpenRA / Minecraft startup **1.000000 / 0.999999511**;串行第二会话和 `Refuse{Busy}` 通过;HOME 失窗得到 `ServerWindowLost` 干净 device-lost,surface 释放 **15 ms**,Activity 存活且重附后新会话 SSIM 1.0;pbuffer 与 `NoServerDisplay` 负控通过;Activity / service 互斥通过。第 6 项初次尝试与上一会话回收竞态命中 Busy;临时测试副本等待 2 秒后重跑,双侧具名拒绝和后续 pbuffer 会话均通过,仓库脚本未改。 + +审查后主机 **P12 定向 CTest 46/46 通过**:`ServerDisplayTest`、`ServerLoopTest`、`InProcessServer`、`SupervisorChildren`、`ServerOwnedSurface`。这组定向测试不等于完整主机门。证据在测试机 `/home/swung/w7/logs/p12-verify-1fb18d9e/`;日志、APK 和截图按证据数据规则未入仓库。当前 `0fe01588` 相对验证 head 只有文档整理及文档检查配置更新。 + ## 3. 还没做(P12 未收官) 按 [`../ROADMAP.md`](../../ROADMAP.md) P12 行的两个出口门,以及本包任务书列出的改小后的条目: diff --git a/docs/Disaggregated/notes/p12/README.md b/docs/Disaggregated/notes/p12/README.md index 61b39d07..51717fe7 100644 --- a/docs/Disaggregated/notes/p12/README.md +++ b/docs/Disaggregated/notes/p12/README.md @@ -6,17 +6,41 @@ - 当前阶段。状态摘要在 [`../../CURRENT_STAGE_PROGRESS.md`](../../CURRENT_STAGE_PROGRESS.md);计划与交接 [`PLAN-P12.md`](PLAN-P12.md);任务书 [`BRIEF-onscreen.md`](BRIEF-onscreen.md);裁定 [`INTEGRATOR-DECISIONS-P12.md`](INTEGRATOR-DECISIONS-P12.md)(ID-P12-1..15);只读审计 `map-*.md` 四份。 - 形状:server APK 自建 `ANativeWindow`(`MobileGLDisplayActivity` 的 SurfaceView,进程内 TCP server,会话串行)把渲染流**上屏**;离屏路径保留、同一时刻一条活跃;client 以 `WindowKind::ServerOwned`(控制修订 3)**完全无头**接入,几何由 server 回传;失窗 → `Fatal{ServerWindowLost}` → 干净 device-lost。 -- 进展:15 个 `(P12)` 提交 + 审查轮修复(10 个问题,ID-P12-5..11)已并入 `feat/disaggregated`;主机门绿(ID-P12-14)、G1 成立(ID-P12-15);真机七项检查在审查轮**之前**的 head 上通过,审查轮之后**未复测**(ID-P12-13)。 +- 进展:15 个 `(P12)` 提交 + 审查轮修复(10 个问题,ID-P12-5..11)已并入 `feat/disaggregated`;主机门绿(ID-P12-14)、G1 成立(ID-P12-15);审查后在 `1fb18d9e` 上完成 P12 定向 CTest 46/46 和 Redmi 真机七项复测。当前分支 `0fe01588` 后续提交只改了文档、文档检查范围和基准脚本说明文字,未改 P12 实现。 - 未完成:出口门 (a) FCL 同机 spawn + 杀 server 的 device-lost、(b) 跨机 TCP 入世界 + P6.5 必测数;`CONTRACT-P12.md`;阶段表行里的其余条目(`unix:` 监听、DirectGLES 去全局、freezer、多 context、FCL 开关接线、D8 白名单)。 ## 阶段表行(原 `ROADMAP.md`) - **阶段**:**P12** Android 生产窗口路径 -- **状态**:**子集已实现、未收官(2026-09-24,自 `9f669e52`,15 提交 + 审查轮 8 提交)**:上屏 server 窗口、`WindowKind::ServerOwned`、无头 client、失窗 device-lost 已落地并过真机七项检查;审查轮 10 个问题已修(两个大项:批内失窗、会话间 Espryt 单元影子悬空;裁定 [`notes/p12/INTEGRATOR-DECISIONS-P12.md`](INTEGRATOR-DECISIONS-P12.md) ID-P12-5–11),主机门复跑,**真机未复测**(ID-P12-13);两个出口门均未打(见 [`notes/p12/PLAN-P12.md`](PLAN-P12.md) §3) +- **状态**:**子集已实现、未收官(2026-09-25)**:上屏 server 窗口、`WindowKind::ServerOwned`、无头 client、失窗 device-lost 已落地;审查轮 10 个问题已修(两个大项:批内失窗、会话间 Espryt 单元影子悬空;裁定 [`INTEGRATOR-DECISIONS-P12.md`](INTEGRATOR-DECISIONS-P12.md) ID-P12-5–11)。审查后 P12 定向 CTest 46/46、真机七项复测通过;出口门 (a) FCL + 杀 server 与 (b) 跨机 TCP 仍未完成(见 [`PLAN-P12.md`](PLAN-P12.md) §3)。 - **落地什么 / 范围**:**按重审 §6 改小**:~~Service 收 Java `Surface`~~ 删掉 Surface 传递那一半——server app 拥有自己的 SurfaceView,client 根本没有窗口,于是 minSdk 26 没有扁平化 `ANativeWindow` 的 NDK API 这条约束不再成立;`WindowKind::ServerOwned`;两个后端各一条 `CreateEGLWindowSurface` 臂;`m_windowHandle` 四处写点 + `sameHandle` 去重键(a6 §6);DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局;`kEventSurfaceChanged` 的 Width / Height 缺口(Espryt 只发布格式,server 拥有显示时 client 默认 FBO 会停在 512×512 占位值);client 侧不再无条件发 `SetWindowHandle`(`BackendObject_Remote.cpp:215`——今天 FCL 里开 spawn,第一次 `eglCreateWindowSurface` 就在 server 进程 abort);server app 监听 `unix:` 与 `tcp://`(后者 Ph 之后);server 生命周期绑 Activity;cached-app freezer(SPAWN-PLAN §8.2);多 context(契约 §11);FCL env 与 plugin APK 开关表接线 - **验收门 / 证据**:两个门:(a) Minecraft 经 FCL **同机 spawn** 在 Adreno 830 双后端入世界,杀 server 产生干净 device-lost latch;(b) **另一台机器上的 client 经 TCP** 在 Redmi 上进世界(数据面 stream),并记录 P6.5 的必测数 -## 状态记录(原 `CURRENT_STAGE_STATUS.md`,2026-09-24) +## 2026-09-25 复测补记 + +复测针对 P12 实现提交 `1fb18d9e`(控制协议修订 3);当前 `feat/disaggregated@0fe01588` 相对它只改了文档、文档检查范围和基准脚本说明文字。测试 APK 为 `26.09.1fb18d9-trace`(独立包名 `top.mobilegl.plugin.p12verify.trace`),设备为 Redmi `2f7cbe2e`(Adreno 830)。本记录只覆盖 P12 定向用例,不表示两个收官出口门已通过。 + +**主机 P12 定向 CTest:46/46 通过。** 包含 `ServerDisplayTest`、`ServerLoopTest`、`InProcessServer`、`SupervisorChildren` 与 `ServerOwnedSurface`;不是整套 P12 主机门重跑。 + +**真机七项检查:** + +| # | 检查 | 审查后结果 | +|---|---|---| +| 1 | Espryt 上屏(OpenRA) | 通过,SSIM **1.000000**,server-owned window `640×480` | +| 2 | Magma 上屏(OpenRA)及同进程第二会话(Minecraft startup) | 通过,SSIM **1.000000 / 0.999999511** | +| 3 | 串行会话与 Busy | 第二次 OpenRA 通过,SSIM **1.000000**;并发客户端收到 `Refuse{Busy}`(rc=134),长 Minecraft 会话继续并以 SSIM **0.999999511** 完成 | +| 4 | 推流时按 HOME 触发 `surfaceDestroyed` | `ServerWindowLost` 后客户端干净 device-lost;Activity 进程存活,surface 在 **15 ms** 内释放;重附窗口后的 OpenRA 会话 SSIM **1.000000** | +| 5 | 离屏 service(pbuffer) | OpenRA 通过,SSIM **1.000000** | +| 6 | 离屏 server 收到 ServerOwned 请求 | 服务端和客户端都返回 `NoServerDisplay`;后续 pbuffer 会话通过,SSIM **1.000000**。首次尝试与上一会话回收竞态命中 Busy;临时测试副本等待 2 秒后重跑通过,仓库脚本未修改 | +| 7 | Activity 与离屏 service 互斥 | 启动 Activity 会停止 service 及其活动会话;启动 service 会停止 `:mglwin`,之后 service 正常监听 | + +设备检查通过 `adb forward` 由 trace_replay 驱动;失窗检查使用 HOME,不是 FCL 杀 server。出口门 (a) 的 FCL 同机 spawn / 杀 server,以及出口门 (b) 的跨机 TCP 入世界与 P6.5 必测数仍未验证。 + +运行证据保存在测试机器的 `/home/swung/w7/logs/p12-verify-1fb18d9e/`(`build-host/Testing/Temporary/LastTest.log` 与 `device/`);按证据数据规则,大日志、APK 和截图未复制进仓库。 + +## 状态记录(原 `CURRENT_STAGE_STATUS.md`,2026-09-24 历史快照) + +> 本段保留当日记录;其中“审查后未复测”的状态已由上方 2026-09-25 复测补记更新。 **更新:2026-09-24(P12 子集)** · 计划与交接 [notes/p12/PLAN-P12.md](PLAN-P12.md)。**P12「server 自有屏幕窗口」子集已实现、未收官,已并入 `feat/disaggregated`**(15 提交自 `9f669e52` 起,加审查轮 10 个问题的修复——两个大项:批内失窗、会话间 Espryt 单元影子悬空;裁定 [notes/p12/INTEGRATOR-DECISIONS-P12.md](INTEGRATOR-DECISIONS-P12.md) ID-P12-5–15,主机门与 G1 见 ID-P12-14/15,**审查轮之后未上真机复测**,ID-P12-13):Android 上的 server 自建 `ANativeWindow`(自己的 SurfaceView)把渲染流**上屏**,离屏路径保留,同一时刻只一条活跃;client 以新的 `WindowKind::ServerOwned` **完全无头**接入(控制修订 3)。主机门除一条既有环境敏感项外全绿,G1(pull 构建 `.text` `0xa52203`、符号 0/0)已独立复核;真机 Redmi `2f7cbe2e` 上七项编号检查过了双后端上屏、串行/Busy、失窗 device-lost、离屏不回归、无显示具名拒绝、一台设备一个 server。**两个出口门都还没打**:跨机 TCP(门 b)完全未做,FCL + 杀 server 的 device-lost(门 a)未做——本轮的真机是 trace_replay 经 `adb forward` 环路驱动的。上一阶段 **P7 已收官(2026-09-23,ID-P7-63)**:§8 九项全绿——终局窗口 3(`p7w8-78e71f2b`)门 3 PASS 36/36、门 5 PASS;门 4 以 `# P13` 读法关闭。 @@ -26,9 +50,9 @@ > 顶层 [`CURRENT_STAGE_PROGRESS.md`](../../CURRENT_STAGE_PROGRESS.md) 只留摘要;带裁定编号的落地表、门表、余项清单与证据位置在这里。 -### 1. 一句话 +### 1. 一句话(2026-09-24 历史快照;现状见上方复测补记) -Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流**上屏**,client 以 `WindowKind::ServerOwned` **完全无头**接入。子集已实现并入,**未收官**:审查轮修复之后欠一次真机复测,两个出口门都还没打。 +Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流**上屏**,client 以 `WindowKind::ServerOwned` **完全无头**接入。该快照记录当时审查轮修复后尚欠真机复测;复测现已在上方补记,两个出口门仍未打。 ### 2. 已落地 @@ -46,7 +70,7 @@ Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流** |---|---|---| | G1 | ✅ pull 构建同机前后 `.text` 一致、符号 0 增 0 减 | ID-P12-15 | | 主机门 | ✅ unit 2605/2605,spawn / tcp 与三条 Magma 双进程车道全绿;剩余红全部归容器的 CMake/CTest 版本 | ID-P12-14 | -| 真机七项检查(Redmi `2f7cbe2e`) | ✅ 审查轮之前(`29b7b284`):双后端上屏 ssim 1.0、串行 + `Refuse{Busy}`、失窗 device-lost、离屏不回归、无显示具名拒绝、一台设备一个 server;⏳ **审查轮之后未复测** | PLAN-P12 §2、ID-P12-13 | +| 真机七项检查(Redmi `2f7cbe2e`) | ✅ 审查轮之前(`29b7b284`)及审查后(`1fb18d9e`);审查后详细结果见上方复测补记 | PLAN-P12 §2、ID-P12-13 | | 出口门 (a) | ❌ FCL 同机 spawn、双后端入世界、**杀 server** 产生干净 device-lost(本轮的驱动是 trace_replay,device-lost 由按 HOME 触发) | PLAN-P12 §3 | | 出口门 (b) | ❌ **另一台机器**的 client 经 TCP 在 Redmi 入世界,并记录 P6.5 必测数(本轮 client 是 `adb forward` 环路) | PLAN-P12 §3 | @@ -56,11 +80,10 @@ Android 上的 server 自建窗口(自己的 SurfaceView)把 IPC 渲染流** ### 5. 下一步 -1. **真机复测**(ID-P12-13):重建 APK(控制修订 3),重跑七项检查,外加"推流中按 HOME:回调返回前 surface 已释放,并记耗时";在与原门同版本的 CMake/CTest 上复跑一次主机门。 -2. **出口门**:先 (b) 跨机 TCP 入世界 + P6.5 必测数,再 (a) FCL + 杀 server。 -3. **收尾**:写 `MG_Remote/CONTRACT-P12.md`;修 `notes/p12/gate.sh` 的 G1 符号比较(与基准不同源,会印出误导的 `added=N removed=N`);按惯例做一次收官审查。 -4. **阶段表行里的余项**(交接时在树上核过,均未做):in-process server 的 `unix:` 监听、DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局、cached-app freezer、多 context、FCL env 与 plugin 开关表接线、D8 窗口种类白名单。 -5. 其后按 [`ROADMAP.md`](../../ROADMAP.md):monolith 跑道 P8;IPC 跑道 P9 → P10 → P11;P6.5 残余(39 例 device 矩阵 + 必测数)与 P3b/P4b 余项并行;`CONTRACT-P7.md` §12 的记录债按阶段认领。 +1. **出口门**:先 (b) 跨机 TCP 入世界 + P6.5 必测数,再 (a) FCL + 杀 server。 +2. **收尾**:写 `MG_Remote/CONTRACT-P12.md`;修 `notes/p12/gate.sh` 的 G1 符号比较(与基准不同源,会印出误导的 `added=N removed=N`);按惯例做一次收官审查。 +3. **阶段表行里的余项**(交接时在树上核过,均未做):in-process server 的 `unix:` 监听、DirectGLES `g_Display` / `g_Surface` / `g_Context` 去全局、cached-app freezer、多 context、FCL env 与 plugin 开关表接线、D8 窗口种类白名单。 +4. 其后按 [`ROADMAP.md`](../../ROADMAP.md):monolith 跑道 P8;IPC 跑道 P9 → P10 → P11;P6.5 残余(39 例 device 矩阵 + 必测数)与 P3b/P4b 余项并行;`CONTRACT-P7.md` §12 的记录债按阶段认领。 ### 6. 阻塞 / 需要人