[Docs] add CI/inproc continuation handoff (2026-09-20)

This commit is contained in:
2026-09-20 18:16:45 -04:00
parent 5cbf29b041
commit 6f0248048d
@@ -0,0 +1,203 @@
# CI / inproc 功能补齐交接(2026-09-20,用户要求停止)
> 用户最后明确要求:“写个交接文档,不要继续你未完成的任务了”。已停止继续实现、构建、测试和推送,只整理本交接。所有子 agent 已结束/中断;停止时检查没有本任务的 retrace / CTest / replay 进程在运行。最后启动的完整 retrace 已自行结束,结果已读入本文。
>
> **任务尚未完成,GitHub CI 尚不能宣称全绿。本轮修复没有 push,也没有合并到 `feat/disaggregated`。**
## 1. 用户确定的范围
- `feat/disaggregated` 的主产物必须编译拆分实现,并实际以 `inproc` 执行主验收。
- 普通 OpenGL 功能场景、完整 retrace 矩阵都应迁移并通过。不得用 skip、降低 SSIM、缩矩阵、吞退出码或“仅记录 census”替代实现。
- 明确验证 monolith 内部机制的对照保留 monolith,不强改成 inproc。
- D/P 只是 `MOBILEGL_BUILD_DISAGGREGATED` / `MOBILEGL_PIPE_PUSH` 两个编译开关;运行时还需 `MOBILEGL_TRANSPORT=inproc`。已向用户解释,后续尽量直接说中文。
- 本轮是此前 P5f / Magma run-ahead / RD32 性能工作的后续 CI 修复。历史 P5f 完成不等于现在扩展出的全部 inproc 功能验收完成。
## 2. 工作树、提交与未提交改动
基础目录:`C:/Users/geekerwan/AndroidStudioProjects/FoldCraftLauncher/`。
| 用途 | 路径 / 分支 | 停止时 HEAD |
|---|---|---|
| 本轮所有实现,后续应从这里继续 | `MobileGL-ci-fix` / `codex/fix-github-ci` | **`70c8230b3e05a8d62d881d4996db27e0ad251936`** |
| 用户交付树,尚未集成本轮修复 | `MobileGL-disagg` / `feat/disaggregated` | **`30b1bf25a4ea5ed8394dc9909c420051633c5115`** |
| WSL Arch 测试树 | `/home/swung/w7/p5f-int` / `codex/ci-fix` | **`70c8230b3e05a8d62d881d4996db27e0ad251936`** |
| 默认会话 cwd | `MobileGL` / `dev` | 不是本轮修改树,勿误改 |
`MobileGL-ci-fix` 有两份**未提交、不能当成已验证成品**的改动:
- `.github/workflows/test.yml`
- `.github/workflows/apk.yml`
这是 fm 最后审查 artifact 清理时留下的修改:Linux cleanup 等待/识别 `retrace-split`;保留失败 case 的 fixture 和结果;两工作流先成功读取完整 GitHub 分页 inventory,再执行删除,避免 process substitution 的 API 失败被当成“没有失败用例”。修改已落盘,但 agent 随后结束,未拿到完整最终校验/提交回报。后续先审 diff,不要直接丢掉,也不要假定已测试。
本交接文档另外新增在 CI 树和交付树,尚未提交。交付树原 `HANDOFF-P5F.md` 顶部增加了本交接入口。
### 必须保留的交付树现有修改
- `MobileGL-disagg/build.gradle`:SHA256 `331C22D6509AC5E5794F135E27D024675808220EC5001E404803BAB889DF1FF5`
- `MobileGL-disagg/android-plugin/app/build.gradle.kts`:SHA256 `FA7F21664A05A7172376DD47E00F435158D20E2F6422626C5D932B3228CF950C`
- `.trace-work/`、`Testing/`、`docs/Disaggregated/inproc-dataflow.html` 均为停止时已有未跟踪内容。
- 前两份 Gradle 改动是先前 FCL 本地测试 plumbing,与本轮新提交的 Gradle wiring 有重叠。最终集成要逐项协调,尤其旧 embedded-FCL arm64 限制;不要 reset 或把无关修改一起提交。
- FCL 父仓库此前有 `UU FCL/src/main/java/com/tungsten/fclauncher/FCLauncher.java` 等用户改动,不属于本轮。
- 不修复既有 DiligentCore gitdir 噪声。看状态/差异可用 `--ignore-submodules` / `--ignore-submodules=all`。
### WSL 状态
停止时除了 `tools/trace_replay/fixtures/` 的 LFS 实体文件外,WSL tracked 源码无差异。fixture 显示很多 `M`:这是把 LFS pointer 替换成已按 pointer SHA256 校验的真实文件,**不是换 golden**。共补齐 92 个 LFS 文件,来源为已有 `/home/swung/mgl/MobileGL` 或 Windows CI 树。不要直接 reset 成 pointer 后又把解包失败误当 renderer 失败。
未跟踪的 `Testing/`、`build-pull/`、`build-trace-ci/` 保留。`build-pull/` 原已存在。
Windows → WSL 的正常同步方式(不要让 Linux git 直接操作 Windows 工作树):
```bash
git -C ~/w7/p5f-int fetch /mnt/c/Users/geekerwan/AndroidStudioProjects/FoldCraftLauncher/.git/modules/MobileGL refs/heads/codex/fix-github-ci
git -C ~/w7/p5f-int -c submodule.recurse=false merge --ff-only FETCH_HEAD
```
## 3. 已完成的实现与关键提交
以下均已提交在 CI 分支;“已实现”不替代第 4 节的实际验证范围。
| 主题 | 提交 / 说明 |
|---|---|
| CI 主产物与完整双模式矩阵 | `7e82ea0f`、`bb3a5199`、`97ce032f`:目标分支主库/APK 开 D/P + INPROC;完整 **77 个 case/backend × 2 transport = 154**;日志、artifact、汇总分模式;独立 OFF/pull 库供错误库负控 |
| 清除旧“预期红 / census 算通过” | `347bb90c`:客户端数组专用通道必须绿并纳入主 GPU/split 标签;全量 inproc CTest 退出码为硬门 |
| 合法 monolith 对照 | `11132981`:指针/slot ABA、CSO 开关、resource/object mask、direct-adoption 计数等机制对照明确 monolith;普通像素功能保持当前模式。`03c6b8c9` 纠正 TextureUploadShape,应仍测 inproc,测试内等真实 applied boundary |
| 原 Linux CI 红 | `08c63f77`:统计等绘制 Present applied;`10bfd29f`:E1 负控改为观察真实协议 wait,避免要求所有 run-ahead draw 在 VERB_BARRIER=0 时必崩 |
| Android 回放生命周期 | `7fd83133`:retained ReplaySession、重建时取消旧 callback/unbind、trace configChanges 整数资源、native 原子 lease、ANativeWindow 生命周期;防两个 Activity 同时进入 JNI 全局回放 |
| 客户端顶点/索引 | `beba0256`:复制到 owned 普通 wire buffer;GPU EBO/indirect/count 先真实同步;保留 baseVertex/baseInstance/drawID;新增 GL 回归 |
| XFB / 查询 | `d0c6fdbc`、`70df57bb`、`8eaebc90`、`e2d6e33d`:Magma wire capture、真实 native query/result、XFB lifetime 删除、空捕获 buffer lazy readback;`4610b573` 防首次握手在 renderer 未创建时调用 Vulkan timer hook;`c7de0dff` 补齐 32 个 verb-boundary 的逐项断言 |
| GLES image / view / SSO | `c1bf7e15`、`57e0f6be`:server-owned promotion、native view;`c3a5d2f5`:空 image slot 保持实际 unit,避免高位空槽误解绑 unit 0,非当前 SSBO 程序先发布;`e2d6e33d`:sampler high-water tracker、whitebox peek 在 apply 线程执行 |
| 纹理读回 / PBO | `29b5e064`、`7875e28c`、`c0b40ff5`、`859c0efb`、`44cac27b`:真实服务端 GPU bytes、PACK/PBO 由 client 写入、texture 大回复分块、完整目的范围检查、避免同步 PBO 回复后虚构 pending GPU write;`f5234b9e` signed/half depth 编码 |
| sparse mip / packed format | `cf0f77b0` 暂时隔离 GLES native BASE/MAX;`40c5443f` **MGPSubData 72 → 88 字节**,携带完整 level extent;`ed01f4e3` 同时修 GLES hook 与通用 applier 的 adoption;`616f3c90` 按 Vulkan format 能力设置 attachment usage、只允许真正无 backing 且非 GPU-dirty 的 server stage 读回;`d339053e` RGB 展开前真实长度/溢出检查 |
| framebuffer / MSAA | `1389e8e7` cube face→layer;`ec4ca06d` color resolve;`0cb0e9af` RP2 depth/stencil resolve;`7b926429` 经纯 GPU 单 aspect buffer 中转保留另一 aspect,并补正确 resolve-write 屏障 |
| packed-float mip 生成 | `5310ff62` 缺 native blit 时用真实 GPU shader 逐 mip/layer 生成;`2426abb8` backend 裁 logical mip window;`70c8230b` frontend immutable/view 不再重分配或截断 owner,mutable 只更新生成窗口,新增窗口回归 |
注意:`MGPMipPlan.LevelCount` 在当前组合里保持 **logical end-exclusive**,不是 `BaseLevel` 后的数量。backend 先减 logical base,再映射 storage root。这个语义不可单边改。
GLES 的 texture-view 功能原本需 `MOBILEGL_ESPRYT_ENABLE_TEXTURE_VIEW=1`。相关功能 case 的 CTest recipe 已显式开启;早先 view construction 失败不是 CapsMirror 非虚函数问题。
## 4. 验证快照:不要混淆不同提交
统一证据目录:
- WSL:`/home/swung/w7/ci-fix-logs/`
- Windows:`C:/Users/geekerwan/.codex/tmp/github-ci-fix-20260920/`
### 4.1 完整 unit / GPU 最近一次整轮
**`5922e54b`**:`/home/swung/w7/ci-fix-logs/full-5922e54b/`
- unit:2319 总数,2308 pass、10 skip、1 fail。唯一失败为 `FieldOwnershipTest.VerbBoundaryOpsCoverEveryVerbShapedCall`,已在 `c7de0dff` 修复并单项复测 PASS。
- GPU inproc:1443 总数,1198 pass、221 skip、24 fail。
- 24 个失败都曾用独立日志重新复现:`full-5922-failure-probes/summary.json`,有 command、原输出、XML、首 Fatal。
- 后续 **`ed01f4e3` 的这 24 个精确失败全部复测 PASS,0 skip**:`failure-recheck-ed01/summary.json`。
- **没有在最终 `70c8230b` 上重跑完整 unit、完整 GPU、完整 monolith GPU。** 不能把“24/24 修复”写成“最后完整门全绿”。221 个 skip 也尚未做最终逐项分类审计。
其它已执行证据:
- E1 三个协议用例 baseline 绿 → 关必要 barrier 仅两个指定断言红 → restored 绿;smoke/redcheck 通过。见 `e1-control-current2/`、`e1-control-driver2.log`、`control-smoke-current.log`、`redcheck-control-current.log`。尚需最终头完整 split 负控(包括 E3)与其它出口门。
- `4610b573` 的 Magma query 13 项:13 PASS / 0 SKIP / 0 FAIL,真正 inproc/REQUIRE_GPU=1,零 Fatal:`magma-init-4610-query13/summary.json`。此前 6 个 skip 的直接原因是旧 query 返回 0,并非仅 COUNTER_BITS 广告问题。
- `40c5443f` 的 4 项 GLES XFB / TextureParams:4 PASS,相关 tracker 回归 PASS:`gles-final4-40c5/summary.json`。
- depth/stencil aspect 修复:`depth-aspect-buffer.{log,stdout,xml}`,增强 case PASS,Vulkan/sync validation 无 VUID/SYNC 错误。
### 4.2 最新新增窗口回归仍有一个失败
在 **`70c8230b`**:
- `F1WireScenario.GenerateMipmapHonorsMutableBaseAndMaxWithoutChangingOtherLevels`:两后端 PASS。证据 `mip-window-70c/summary.json`。
- `F1WireScenario.GenerateMipmapThroughViewKeepsOwnerLevelsAndLayersOutsideItsWindow`:Magma PASS,**GLES FAIL**。证据 `mip-view-window-70c/summary.json`。
- 断言:`F1WireScenario.cpp:596`,`owner mip 3, layer 0` 有 4/4 texel 不对。该 view 应只改变 root mip 3 / layer 1;窗口外 layer 0 被改变。
- 已分给 fr,但该 agent 随后退出,**没有这项修复的未提交半成品或完成报告**。仍需定位 GLES view mip 生成 / owner stage replay,不能减断言。
### 4.3 完整 Linux inproc retrace 已结束:67/77,10 失败
**这是停止整理时读取的最终结果,不是最初工具尚在运行时的 15/77 进度。**
证据:`/home/swung/w7/ci-fix-logs/retrace-inproc-70c8230b-hydrated/`
- `results.xml`、`ctest.log`、`matrix.json`、`cases.txt`
- **77 总数,67 PASS、10 FAIL、0 SKIP**,原阈值未修改。
- 单 case `result.json`、`mobilegl.log`、`retrace.log`、actual/diff 在:
`/home/swung/w7/p5f-int/build-trace-ci/tools/trace_replay/<case>/<backend>/output/`
- 首次 `retrace-inproc-ed01f4e3/` 是 LFS pointer 解包失败,不能当 renderer 结果。之后校验补齐 92 个实体文件才跑上面这轮。
10 个失败:
| case | backend |
|---|---|
| `minecraft-1.21.4-fabric-iris-sundial-lite-in-world` | DirectVulkan |
| `minecraft-1.21.4-fabric-iris-iterationt-in-world` | DirectGLES、DirectVulkan |
| `minecraft-1.21.4-fabric-iris-iterationt-nodsa-in-world` | DirectGLES、DirectVulkan |
| `improved-transparency-minecraft-26.3` | DirectGLES、DirectVulkan |
| `minecraft-1.21.4-fabric-iris-iterationrp-in-world` | DirectVulkan |
| `minecraft-1.21.4-fabric-iris-bsl-esc-menu-854` | DirectGLES、DirectVulkan |
停止时只读取了已有输出,未继续诊断或修复:
- Sundial Vulkan:`ssim=0.000046370`,阈值 `0.99`,mismatchPixels `408472`,真实图像不匹配。
- 其余日志中有 7 次 `Fatal{RingOverrun, "SEG_STAGE"}`:单 blob `34,603,008` / `56,623,104` / `134,217,728` 字节超过 `33,554,432` 字节 stage。
- 另有 2 次 `Fatal{InitialBytesNotCarried, "resource_respecify"}`,描述 initial content 的后续 subdata 没有发出。
- 尚未逐 case 完成这 9 个 Fatal 的对应/根因分析。不能把放大 stage、放宽阈值或跳过 case 直接当迁移完成。
- 完整 monolith retrace 本轮未跑;新头 Android retrace / AVD lifecycle 实跑也未完成。
### 4.4 Android 构建与旧远端失败
Windows 已成功编译 trace/plugin Release APK,各含 arm64-v8a + x86_64,D/P/INPROC=ON:
- `android-plugin/app/build/outputs/apk/trace/release/MobileGL-plugin-trace-release-5922e54.apk`
- `android-plugin/app/build/outputs/apk/plugin/release/MobileGL-plugin-release-5922e54.apk`
- 日志:Windows evidence 目录的 `android-gradle-full-ready.log`,`BUILD SUCCESSFUL in 8m 8s`。
- APK/native SHA 和二进制 marker:`android-local-built-identity.json`。这是较早 5922 标记产物,**不是最终头产物,也没有声称已在设备/AVD 跑过本轮 APK**。
- 主库及 trace 编译依赖已初始化(排除了 DiligentCore);glslang 的 `update_glslang_sources.py` 已成功执行。
- Windows Java selector loopback 需要当前命令的 `JAVA_TOOL_OPTIONS=-Djdk.net.unixdomain.tmpdir=C:/T`;Gradle `-Pmobilegl.xxx=...` 参数在 PowerShell 要整段加引号。
旧远端 `30b1bf25` 两轮均已完成且红:
- Test run `35513925180`:`integration-split-strict` job `106089389584`,`integration-split` job `106089389592`。
- APK run `35513925171`:Vulkan create-indirect retrace job `106089768679`。
- Windows `android-latest-vulkan/` 的 logcat 确认 Activity relaunch 后两个回放 TID(2276 / 2289)重叠;与先前 Bliss 的重复 JNI 生命周期根因一致。`7fd83133` 是代码修复,仍需新头远端验证。
- **本轮新修复从未 push,远端还没有这些提交的 CI 结果。**
## 5. 后续明确的未完成事项
仅在用户重新授权继续后执行:
1. 先审查并收尾两份未提交的 artifact-cleanup workflow diff。
2. 修最新 GLES view mip-window 回归。
3. 修上述 10 个完整 retrace 失败:大 stage blob、initial bytes 携带、Sundial 实际像素错误;保持完整矩阵与阈值。
4. 最终头重跑完整 unit、完整 inproc GPU、明确 monolith 对照;审查剩余 skip 的真实原因。
5. 跑完整 split strict / dual-block / clientarray / E1/E3 / run-ahead / generated/include/模式证明等适用门。部分已有老头证据,不等于最终头全绿。
6. 重建最后提交的两 ABI Android APK;验证真实 AVD overlay/recreate 生命周期和完整两 transport retrace。
7. push 修复分支,实际观察 GitHub workflows 结束并修远端差异;再协调交付树 Gradle 现有修改,合入/push `feat/disaggregated`,确认远端 SHA。
8. 写最终报告。不要把当前 handoff 或历史 P5f close-report 当成本轮完工证明。
## 6. 恢复所需命令与工具说明(未在停止后执行)
WSL `build-split` 已配置 D/P/INPROC。`build-trace-ci` 是独立 replay runner,使用:
```text
MOBILEGL_TRACE_REPLAY_MOBILEGL_LIBRARY=/home/swung/w7/p5f-int/build-split/libMobileGL.so
```
retrace 用的是共享库,**只 build `MobileGLIntegrationTest` 不会更新它**;修改后需构建 `MobileGL`。CTest integration 多数链接静态库。
Windows evidence 目录已有复现助手,都是本任务临时脚本,不是产品代码:
- `run-feature-probes.py`:从 CTest discovery 保留 recipe,强制真实 inproc/strict/role/REQUIRE_GPU,逐 case 私有 log/stdout/XML;可 `--regex` 或 `--failed-junit`。
- `run-ci-retrace.py`:按原 `github-test-matrix` 精确选 77 项,`ctest --tests-from-file`,mode 参数为 inproc/monolith;输出按 HEAD 命名。
- `run-current-full.sh`:完整 unit 后完整 inproc GPU,两个退出码均报告。
- `summarize-results.py`:只读 JUnit 汇总。
- `hydrate-trace-fixtures.py`:校验 LFS pointer SHA 后从现有实体缓存复制,初次已成功,无需盲目重复。
当前 replay 已结束,无需恢复旧 session。未来两 transport 运行会共用 build-trace-ci 的 case 输出目录,**不要同时跑它们覆盖同名图片/日志**,下一轮前先归档已有失败证据。
多 agent 曾共享同一文件并发生提交夹带:`c3a5d2f5` 带入 query agent nativeDelete hunk,`e2d6e33d` 又带入 root LevelWidth adoption,直到 `40c5443f` 才是完整可编译组合。现在提交链配套已齐全。以后每次提交逐 hunk 检查归属;不要让另一 agent 的未完成 hunk 混入独立提交。
子 agent 在 completed/errored 后,`send_message` 不会启动新工作;恢复需 `followup_task`。本次所有 agent 已停止,不存在后台继续修复的约定。
## 7. 历史设备成果,仅作背景
本轮之前已交付 Magma inproc / run-ahead / RD32 性能修复;`70fb6689` 下 RD32 Magma inproc **116.73 FPS**,同包 monolith **115.01 FPS**。Redmi `2f7cbe2e`,FCL 包尾 `.mgdebug.debug`,MC `26.3-rc-3`。历史已安装库 SHA256:`11f26ca1f1d6c9a3d89134c31b2348306e669b1d9ebcc2fc77c7f5def2b4f818`。
这些是历史头证据,**不代表 `70c8230b` 或后续代码已完成 Redmi E2E/性能验收**。原世界/options 已在先前工作恢复并核验,勿无故再改。