Files
MobileGL/docs/Disaggregated/notes/p5f/close-review.md
T

79 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P5f 阶段末跨模型族审查
实现方为 GPT 系列;审查通过本机 Claude Code 只读 CLI 执行,限定 Read/Glob/Grep、无 MCP,
没有修改文件或运行 shell。审查头 `de78f47d`,基线 `e75e00cb`。CLI 成功返回;模型记录含
`claude-opus-5[1m]` 与 `claude-haiku-4-5`,与实现方错开模型族。原始结果保存在
`C:/Users/geekerwan/.codex/tmp/p5f-final-review-de78f47d/result.json`。
## 原始审查结果
## 审查发现
### P1 — 最终 dual-block“硬绿”门可在测试未完整执行时伪绿
- **位置**
- `.github/workflows/test.yml:1387-1400`
- `MobileGL/MG_IntegrationTest/Harness/split_log_paths.py:138-160`
- `MobileGL/MG_IntegrationTest/CMakeLists.txt:2580-2601`
- `MobileGL/MG_IntegrationTest/Scenarios/F1WireScenario.cpp:99-103`
- **触发条件**
1. 当前 `dualblock-expected-fatals.txt` 为空;
2. `ctest` 因空选择、提前中断或基础设施错误返回非零;或者新加的某个 `DirectGLES/DirectVulkan.Split.P5fRsp.*` 用例因环境标记或 split runtime 不满足而 skip/未出现在 JUnit 中。
- **失败路径**
- workflow 用 `|| rc=$?` 吞掉 `ctest` 的非零状态;
- 随后仅在“`rc == 0` 且预期表非空”时失败。当前预期表为空,因此任何非零 `rc` 都不会直接使步骤失败;
- `expect_fatal()` 只遍历 JUnit 中实际出现的 testcase,不把 `dualblock-lane.json` 的发现集合与 JUnit 集合比较;skip 被直接计数后忽略,缺失用例也完全不可见;
- 最终空观测集合与空预期集合相等,helper 返回成功。
- 因而阶段出口要求的双后端逐帧 `rsp=0` 用例可以没有实际执行,步骤仍打印硬绿。
- **最小修复建议**
1. 当前阶段预期表为空时,无条件要求 `rc == 0`;
2. 在 `expect_fatal()` 中比较 JSON 发现集合与 JUnit 集合,拒绝 missing、notrun、disabled;硬绿模式还应拒绝所有 skip;
3. 对 `integration-p5f-rsp` 增加独立核验:必须恰好执行 DirectGLES、DirectVulkan 两条,`2 PASS / 0 skip / 0 failed`。
### P2 — 三个反向回调没有投递给实际取得所有权的 `ServerSession`
- **位置**
- `MobileGL/MG_Remote/Server/ServerSession.cpp:264-315`
- 对照正确的错误回调:`MobileGL/MG_Remote/Server/ServerSession.cpp:332-340`
- active owner 发布点:`MobileGL/MG_Remote/Server/ServerSession.cpp:567-573`
- **触发条件**
- 首个成功 `Accept()` 的对象不是 `ServerSessionInstance()`,而是另一个合法的 `ServerSession` 实例;
- 之后后端调用 `OnBufferWriteback`、`OnGpuWritten` 或 `OnSurfaceChanged`。
- **失败路径**
- `Accept()` 将实际 owner 发布到 `g_active`,并把全局回调表安装为该 session 的生产者;
- 但三个生产函数仍硬编码调用 `ServerSessionInstance()`,而不是 `ServerSession::Active()`;
- 事件因此写向未接受连接的 singleton,而非拥有 SEG_EVENT 的 session,通常在无效 event producer 上落入 `Fatal{EventRingOverflow}`;即使 singleton 状态发生变化,也会投递到错误 session。
- `ServerOnGlError()` 已正确通过 `Active()` 解析 owner,四个回调的所有权语义目前不一致。`g_sessionOwner` 对任意 `ServerSession*` 做 CAS,也说明所有权并未限定为 singleton。
- **最小修复建议**
- 让三个生产函数与 `ServerOnGlError()` 一样解析 `ServerSession::Active()`;没有 active owner 时给出具名 `RoleViolation`;
- 增加一个“非 singleton session 首先 Accept,四种回调均进入其 event ring”的测试。
## 审查局限
本次严格保持只读,仅使用 `Read/Glob/Grep`;未运行构建、测试或设备门。因此未评价当前 pending validation 的通过与否,也未将其视为代码缺陷。除此之外,在指定的跨角色访问、上下文/XFB/raw sampler 生命周期、控制帧保真及 Magma record/resource 路径中,未发现其他具有充分代码依据的 P0/P1/P2 问题。
## 处置(均已完成)
1. **P1,结果集不完整可伪绿**:`c42577a4` 给空表要求 ctest rc=0;对 JSON 发现全集与
JUnit 做非空、完整、一一对应核验;拒绝 missing/extra/duplicate/notrun/disabled。
对已执行的 green/skip 也扫描 marker,而非仅扫描 failed 条目。GLES 与 Magma 私有日志
所有权同样校验。新增独立 `integration-p5f-rsp` 硬门,必须恰两后端 2 PASS / 0 skip。
仅保留既有六个 skip,严格匹配名称和原因;不采用“所有 skip 都拒绝”,因为四个是专属
计数车道的普通/SmallRing sibling,另两个是已有 Magma clip-feature 限制。其他 skip 均红。
9 个结果核对回归测试全绿;旧 helper 对“缺一个 JUnit 条目”没有拒绝,控制真实失败为
`ValueError not raised`,新 helper 通过。日志 `exit-review-gate-{red-once,green}.log`。
2. **P2,非 singleton callback owner**:`53699b5a` 让四种 producer 统一取 `Active()`,
无 active owner 时均具名 RoleViolation。新增非 singleton 首先 Accept 后四事件落入其
ring 的生产测试,以及 Close 后缓存的四 callback 不可再投递测试。旧版真实 abort 于
`kEventGpuWritten` 的 `EventRingOverflow`,修复后 11 项反向通道测试全绿;原 readback
fixture 与握手也通过。日志 `fv-review-*.log`。
两项均有实际红转绿证据,未把审查建议当作验证结果。修复后的最终 Android 库也重新部署,
六个 clean-boot 臂全部重新运行。没有留待 P6 的本次审查 P0/P1/P2 项。