[docs] (P7): ID-P7-57/58/59 - F2 finishes the Ph items, gate 5's three inproc CTS defects are fixed, and device window 2 is tooled

This commit is contained in:
2026-09-23 15:52:33 -04:00
parent 431bda67dc
commit 6afa077f96
8 changed files with 42 additions and 10 deletions
+1 -1
View File
@@ -144,7 +144,7 @@ These three are the reason `kHasBlob` had to be given an exact meaning (table 0)
|---|---|---|---|---|
| 21 | `MapPersistent` (5) | `kReplySlot\|kOptional` | **Returns `nullptr` under split, always** (R-6/R-2.4). Its `const void* seedBytes` companion (`PipeApply.h:917`) therefore never crosses in P5 and needs no carrier. The three frontend sites already tolerate a decline (`BufferObject.cpp:238`, `:603-606`, `:657-660`). Answer travels as `Status = DECLINED` with a zero-length payload. | `map_persistent.decline` |
| 22 | `ResourceReadback` (52) | `kReplySlot` | Bytes go **server → client** in `SEG_EVENT` via `OnBufferWriteback` (#3), not in the reply slot: the destination is the client's shadow and the size is the resource's, not a fixed slot's. The reply slot carries only completion. **The ordering rule is load-bearing:** the writeback is applied **before** the mutation epoch bumps, never after (`ARCHITECTURE.md:292-294`, `Managers.cpp:2120-2136`). | `resource_readback.done` |
| 23 | `ReadPixels` (58) / `GetTextureImage` (55) | `kReplySlot` | **`ReadPixels` blocks in P5** and its pixels come back in the reply slot, which is why `ReplyPool::SlotBytes()` is sized from the scenario's largest read rather than guessed. **ID-47: `SEG_REPLY` is 16 MiB, eight slots of 2 MiB, `MaxReplyBytes = 2 MiB − 16 = 2,097,136`** — the canonical sizes are 8/32/16 MiB + 256 KiB (`ProtocolSmokeTest` pins them on the wire, `SessionTest` on the mapping); the largest P5 read is E2's full-surface 640×480 RGBA8 snapshot, 1,228,800 bytes, which the previous 8 MiB pool refused. **A read whose answer would exceed `MaxReplyBytes` is refused at the CLIENT before emission** with `Fatal{ReplyTooLarge, "ReadPixels <w>x<h> <format> <bytes> > <cap>"}` (`ReplySlotPool::RequireReadPixelsFits`, forwarded by `ClientSession::RequireReadPixelsReplyFits`, called once by c1's `OnReadPixels` emitter) — never truncated, never a server-side abort the client cannot name; `Post`'s own refusal stays as the last line of defence. Reads larger than 2 MiB (a 2400×1080 RGBA8 device surface) are a P6 debt, not a bigger pool; §5 has no knob for this segment by design. `MGPReadbackInfo` has `DstOffset`/`DstSize` but **no `Seg`** (`MGPipeTypes.h:1197-1206`): ruling — the destination is **always `SEG_REPLY`** in P5, so no `Seg` field is added; the PBO destination (fire-and-forget plus a client-side `MarkGpuWritten`) is b1's and also needs none, because a PBO destination is a resource handle rather than a segment. `GetTextureImage` is **not on P5's reduced path** and its slot stays `Fatal{UnmigratedVerb}`. | `read_pixels.pixels` |
| 23 | `ReadPixels` (58) / `GetTextureImage` (55) | `kReplySlot` | **`ReadPixels` blocks in P5** and its pixels come back in the reply slot, which is why `ReplyPool::SlotBytes()` is sized from the scenario's largest read rather than guessed. **ID-47: `SEG_REPLY` is 16 MiB, eight slots of 2 MiB, `MaxReplyBytes = 2 MiB − 16 = 2,097,136`** — the canonical sizes are 8/32/16 MiB + 256 KiB (`ProtocolSmokeTest` pins them on the wire, `SessionTest` on the mapping); the largest P5 read is E2's full-surface 640×480 RGBA8 snapshot, 1,228,800 bytes, which the previous 8 MiB pool refused. **A read whose answer would exceed `MaxReplyBytes` is refused at the CLIENT before emission** with `Fatal{ReplyTooLarge, "ReadPixels <w>x<h> <format> <bytes> > <cap>"}` (`ReplySlotPool::RequireReadPixelsFits`, forwarded by `ClientSession::RequireReadPixelsReplyFits`, called once by c1's `OnReadPixels` emitter) — never truncated, never a server-side abort the client cannot name; `Post`'s own refusal stays as the last line of defence. Reads larger than 2 MiB (a 2400×1080 RGBA8 device surface) are a P6 debt, not a bigger pool; §5 has no knob for this segment by design. `MGPReadbackInfo` has `DstOffset`/`DstSize` but **no `Seg`** (`MGPipeTypes.h:1197-1206`): ruling — the destination is **always `SEG_REPLY`** in P5, so no `Seg` field is added; the PBO destination (fire-and-forget plus a client-side `MarkGpuWritten`) is b1's and also needs none, because a PBO destination is a resource handle rather than a segment. `GetTextureImage` is **not on P5's reduced path** and its slot stays `Fatal{UnmigratedVerb}`. | `read_pixels.pixels` **P7 更正(ID-P7-58)**:超出一个回复槽的 ReadPixels 由客户端切成行带(单行超槽切行内片),每带各过一次 `RequireReadPixelsReplyFits`;`Fatal{ReplyTooLarge}` 只剩「一个像素都放不下」。 |
---
+1
View File
@@ -189,3 +189,4 @@ verify **在 wave 3 之前**只在 monolith 臂注册(`MG_IntegrationTest/CMak
- `MGB_CTX` 访问 4:`PipeInputs::{GetTextureObject,HasOpenTransformFeedbackSpan,InvalidateCompileEnv}`、`GLImpl::CopyTextureImageToClientOrPBO_State`。
- **PH-6 / fuzz 臂 3 的记录债(包 f2-event,ID-P7-2;细节 `~/w7/logs/f2-event/NOTE.md` §5)**:(1) **被丢事件所属的那条记录照常完成**:它仍贴 `kStatusOk` 回复并推进 `appliedSeq`(`ServerLoop.cpp` `DrainRing` 在该记录之后才停),而 `Client/` 里没有任何代码读 `eventDropped`(`EventRingConsumer::DroppedEvents()` 只有测试在读)——一个先发不等的 readback、事后才等其回复的 client,可能在看到 EOF 之前读到缺那次 writeback 的影子。只有不等待的 client 走得到(等待中的 client 在等待里就排空了)。修法候选是让触发 forfeit 的记录回复失败,或 client 在 `eventDropped != 0` 时闩 device-lost;两者都动 client 的等待 / 回复契约,未做。(2) **inproc 不被告知**:forfeit 停掉 apply 线程,同进程的 client 收不到任何信号。这不是「只有测试能到达」(初版 NOTE 的说法不对):(3) 的场景在 inproc 上同样可达,之后 client 的下一次等待在 120 s 后以 `Fatal{BarrierTimeout}` 死——诊断名字是错的,真因是 forfeit(审查指出,本包未测)。(3) **默认 2000 ms 未在设备上测过**:合法 client 停调 GL 超过旋钮(如 Android 退后台)且队里有一环以上未等待的事件(XFB writeback)会丢会话;此前是 30 s 后 Fatal。(4) **lockstep 臂不变**:无 `kCapRunAheadApply` 的 server(Magma)满环仍是 P5C 的 `Fatal{EventRingOverflow}`,不排空的对端让会话 SIGABRT(计入 `sessionsFaulted`,下一连接照常服务);fuzz 臂 3 没有 Magma 臂。(5) **对端不被告知原因**:没有 forfeit 的 wire 词,client 只见 EOF → device-lost;加 `Refuse` / `Fatal` 码会改 `wireFingerprint`。(6) **shm 的 `eventRingFull` 在对端可写的页上**:持续写 0 的对端让保留循环不 park 地自旋,直到旋钮耗尽后以 `TooSlow` forfeit 或会话被 Stop(有界,只记)。(7) **stream 面的阻塞 `sendmsg`**(`StreamLink.cpp:158`,apply 线程经 `StreamLink::Flush` 同步 `SendEvents`)**不是无界的**:数据套接字带 `TCP_USER_TIMEOUT=5000`(`SocketTransport.cpp:99-112`)。实测(临时探针,未入库):对端 SIGSTOP、旋钮 8000,stream 面 5327 ms 时链路被内核判死 → `ReverseChannelForfeit{PeerGone}`、exit 0;shm 面等满 8006 ms → `NotDraining`、exit 0。即 stream 面上一个冻住(活着但不 ACK)的对端约 5 s 被叫作 PeerGone,与旋钮无关;apply 线程恰好卡在 send 里时控制流又结束,`Stop()` 的 5000 ms join 与这 5 s 赛跑——未构造出,记录。(8) forfeit 后队列里剩下的记录不再应用(有意);`RunSession` 每会话每 100 ms 轮询一次控制套接字(包内原为 250 ms;与 PH-1 (3) 闩的控制切片在 p7/f2-all 合并为一个 100 ms 切片,每轮先问闩、再问 apply 线程),且每一轮都查 apply 线程(记录,不是门)。(9) 排在 PH-6 等待后面的 surface op:server 的控制线程阻塞在 apply 线程的邮箱里(P5e 的等待谓词不含控制请求,本包未改),对端活着但只是不排空时,这个 op 要等旋钮耗尽才被回答;对端死亡则由数据 bell 报告(shm 面靠 server bell 挂在控制套接字上的死亡见证,镜像 CONTRACT-P6 D5c)。(10) **server bell 的死亡见证改变了 shm 会话的正常收尾顺序**:client 的 `ShutdownSend`(`ClientSession::Stop` 第 2 步)现在可能先让 apply 线程从 park 里以 dead bell 退出、再由控制循环读到 EOF;两条路走同一个退出块,每次 shm 会话正常收尾 server 日志多一行 INFO `the peer hung up (witness fd …, revents=0x2000)`(其措辞是为 client 侧写的)。
- **PH-7 (5) + fuzz 臂 1 + ID-P7-44(包 f2-auth,分支 `p7/f2-auth`,含 fix round)关掉的与留下的**。关掉:TCP `--serve` supervisor 在 fork 前读首帧、先验令牌(未认证对端只得 `Refuse{Authentication}`,无指纹 / stamp,无 fork);首帧期限 `MOBILEGL_IPC_PREAUTH_MS`(默认 2000);待认证连接上限 `MOBILEGL_IPC_PREAUTH_MAX`(默认 8,钳到 256),满时按地址公平让位(新连接顶掉占位最多地址的最老一条,`Refuse{Busy}` "displaced ...");失败退避 `MOBILEGL_IPC_AUTH_BACKOFF_AFTER`(默认 5,0 关)/ `MOBILEGL_IPC_AUTH_BACKOFF_MS`(默认 1000,逐次翻倍,上限 60 s,认证成功清零,10 分钟遗忘,最多跟踪 256 个地址),失败 = 错令牌、畸形首帧、超时、静默占位超过 250 ms 后关闭或被顶掉;accept 遇 EMFILE/ENFILE/ENOBUFS/ENOMEM 暂停 100 ms 而非退出 73;`RunSession` 自读首帧(单会话 TCP、unix 端点)每条出路具名,令牌先于 `ValidatePeerHandshake`;ID-P7-44 见上。无 schema 变化,`MOBILEGL_PROTOCOL_CONTROL_REVISION` 与 pin 不动;**对端可见的行为变化要设备 server 随下一个 APK 重部署**:未认证的错指纹 Hello 得 Authentication 而非 WireFingerprint;静默连接 2 s 后得 Authentication(原来是 fork + 10 s 后 exit 67 且计入 faulted);会话忙时静默的第二条连接得期限拒绝而非 Busy;满队时的让位拒绝。**留下的记录债**:(1) unix 端点仍对每个 `AcceptPair` 先 fork 再读 Hello(本地对端债,不在远端威胁模型内;只补了具名拒绝);(2) 退避按对端地址计,NAT / `adb forward` 回环后的对端共用一个键,同址合法 client 会被连坐;轮换地址(如 IPv6)只受上限、期限与按地址让位约束;(3) nonce 不符的 DataBind(child 内比较)与找不到活会话的 DataBind 不计入退避(后者可能是合法的陈旧连接),两者都不花 fork;(4) 会话建立后的畸形控制帧只以日志行结束会话(child exit 0),握手之后没有给对端的帧;(5) 四个旋钮只读环境变量,不在任何配置表或 Android service extra 里;(6) ID-P7-44 的控制依赖 Linux af_unix dgram 语义(接收端 `SHUT_RD` 后 `sendmsg` 得 EPIPE),child 崩溃时已排队的 DataBind 仍被内核丢弃;(7) 测试专用杠杆 `MOBILEGL_TEST_DELAY_SESSION_HANDSHAKE_MS`(与 `MOBILEGL_TEST_DELAY_FIRST_CAPS_MS` 同类,未设不生效)。
- **门 5 修复(ID-P7-58)的记录债**:(1) 探针判坏的设备上 shader resolve 臂 decline(无 `VK_EXT_shader_stencil_export` 的模板面、格式不带 `SAMPLED_IMAGE | DEPTH_STENCIL_ATTACHMENT`、pipeline 失败)时回落到已知不写目标的 render-pass 臂,读回 0、无 GL 错误(POST 上是 UNFIXABLE 行,只有 `MGLOG_W_ONCE`);(2) 探针只测 4×、4×4、整幅 render area,别的采样数 / 尺寸 / 子矩形上坏的驱动看不到;(3) 非 1:1 单采样深度 blit(缩放 / 翻转 / default FB)在无 `BLIT_DST` 的深度格式上仍调 `vkCmdBlitImage`(monolith 同样);(4) 跨格式 wire 深度 blit 不走 monolith 的 `BlitDepthAcrossFormats`;(5) tcp 带不了 `MsResolveBug.` / `MsFlipBug.` / `MsResolveElide.`(server 环境旋钮,`MAGMA_SERVER_ENV_KNOB_NO_TCP` 具名);(6) 图像单元:在存储里但落在 [BASE, MAX] 之外或 mip 不完整的 level 仍按原样绑定(与 monolith 一致,门 5 以它为参照),占位按 (格式, target) 共享、每次 resolve 清零一次;(7) 切带回读在 Magma 上每带一次完整 `ReadWirePixels`(flush + 转换 + 等待),2400×1080 截图 5 带——只记性能。
+9 -7
View File
@@ -4,7 +4,7 @@
**阶段: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-23(ID-P7-49–56)** · 当前交接 [notes/p7/HANDOFF-2026-09-23.md](notes/p7/HANDOFF-2026-09-23.md)。CI 自 P6.5 起的七个红因已修(ID-P7-56),job/step 标题缩短、两个工作流加并发组;棘轮 173 → 171,余 86 标 `# P13`,门 4 关闭(ID-P7-55)。F2(PH-6、PH-1 (3)(4)、PH-7 (5)、fuzz 三臂)与门 5 的三个 inproc CTS 缺陷修复在集成;门 3 / CTS AFTER 待最终 APK。
**更新:2026-09-23(ID-P7-49–59)** · 当前交接 [notes/p7/HANDOFF-2026-09-23.md](notes/p7/HANDOFF-2026-09-23.md)。CI 自 P6.5 起的七个红因已修,`1997fd88` 上 Test 全绿(含 P6.5 以来首次跑的 retrace 链);棘轮 171、门 4 关闭(ID-P7-55/56)。F2(Ph 余项 + fuzz 三臂)与门 5 预演抓出的三个 inproc CTS 缺陷已落地(ID-P7-57/58);门 3 与 CTS AFTER 在设备窗口 2(ID-P7-59)。
## 1. 出口门总览(CONTRACT-P7 §8 的 9 项分母)
@@ -20,7 +20,7 @@
| 8 | 真机 ssim 1.0(门 3,分母 36) | 🔄 | p7w5 OpenRA 27/27 golden;p7w6 bsl-esc-menu DirectVulkan inproc/spawn 6/6 且图像 SHA 与 monolith 相同;DirectGLES × TCP 38 例窗口矩阵 16/29 pass、8 idle timeout、2 visual failure、3 missing result。Photon / D24 两项错图已由同 APK DirectGLES monolith 复现;36 例 DirectVulkan 三遍、同会话 monolith 对照和 M3 后 APK 回归待跑 |
| 9 | CTS 五块 AFTER ≤ 0.5 pp(门 5) | ⏳ | `$BASE` 已取(`notes/p7/device-window-1/CTS-base/`);AFTER 在 wave 4 |
**40% 检查点(§8 中点)已过:6/9**,不触发重定基线。G1 全程恒等(pull `.text` `0xa52203`、符号 0/0);census 79 站点 / 0 未标;棘轮 186 → 173 → **171**(ratchet88:`p7-magma` 余 86 全标 `# P13`,门 4 关闭,ID-P7-55)(B2 重基线,余 88 = monolith draw 路径,wave 3)。
**40% 检查点(§8 中点)已过:6/9**,不触发重定基线。G1 全程恒等(pull `.text` `0xa52203`、符号 0/0);census 79 站点 / 0 未标;棘轮 186 → 173 → **171**(ratchet88:`p7-magma` 余 86 全标 `# P13`,门 4 关闭,ID-P7-55)。
## 2. 已落地(`feat/disaggregated`,按合并序)
@@ -52,6 +52,9 @@
| B4 | 聚合 submit 前缀等待、frame serial 重新扫描、Present 槽退休保护、pre-pass pending、texture prune 与 staged extent 清理 | pipe b19297d5(ID-P7-51;集成者 review land,完整 pipe 门通过;当前文档/citation/push 收尾中) |
| CI 修复 | 链接缝走工厂、TCP fixture headless + 资源锁守卫、D3 拒绝句、Magma-only decline、dual-block 登记、retrace 链(旋钮 / pull verify 日志 / spawn 冷启动预算)、并发组、80 个标题缩短 | pipe `eaef83b3..e751b07b`(ID-P7-56) |
| ratchet88 | `MGPipeTextureLegacyArmScope` 退役、余 86 标 `# P13`、棘轮 171 | `d49df354` / `d74e9923`(ID-P7-55) |
| F2 | Ph 余项:PH-1 (3)(4) 每会话闩、PH-6 事件通道弃投闩、PH-7 (5) fork 前认证 + 预认证有界 + 退避、fuzz 三臂进 CI;PH-4 两个回归(零尺寸层、`R8 == 0`)与 ID-49 回读在线内修掉 | F2 线 29 提交 + 集成 2 跟进(ID-P7-57) |
| 门 5 修复 | 超槽 ReadPixels 切带、深度/模板 resolve 臂由设备探针选(+ POST FIXED 行)、单采样深/模板 blit 改 copy、越界图像单元绑占位 | ID-P7-58 |
| 窗口 2 工装 | 门 3 / bsl / CTS AFTER 一条命令、可续跑、共享设备锁;判读按合同公式、五块必齐、同一 boot_id | ID-P7-59 |
## 3. 真机(Redmi 2f7cbe2e,Adreno 830)
@@ -63,14 +66,13 @@
| 工作 | 状态 |
|---|---|
| 最终真机验收 | p7w6 TCP 矩阵与 Photon / D24 monolith 对照结束;待最终 APK 的门 3 与 CTS AFTER |
| F2 | `p7-f2-driver` 已提交 raw-record driver、D11 CSO、PH-3 readback、PH-4 exact mip extent / byte bound、PH-5 ArchiveVector、PH-2 named slot/generation refusal(`db80dd16`, `adf2cbe0`, `2c6a6e25`, `51480f8c`);Luna review land,build-split 49/49、G1 与生成器门全绿;余 PH-6、PH-1(3)(4)、PH-7(5) / fuzz 臂2 |
| 设备窗口 2(p7w7) | 最终功能 APK 构建 → reboot-clean → 门 3(36 例 × monolith ×1 + inproc ×3 + spawn ×3 + `RUN_AHEAD=0` ×1)→ bsl 映射 / `wbuf[]` → CTS AFTER 五块 → 判读 |
## 5. 下一步
1. p7w6 TCP 矩阵及 Photon / D24 DirectGLES monolith 对照已结案;保留的 idle/missing-result 项在主机空闲时按需重跑,细节见 notes/p65/window-1b-p7w6.md。
2. 最终功能 APK 部署后完成门 3(36 例 DirectVulkan × pbuffer × inproc/spawn,三遍逐位一致并与同会话 monolith 差 ≤0.0005)和 CTS AFTER 五块(相对 BASE ≤0.5 pp、新 crash=0);另采 PipeStats bsl 映射峰值与 wbuf[]。
3. F2 继续 PH-6、PH-1 (3)(4)、PH-7 (5) 与 fuzz 臂 2;每个字节可达负控由两进程 raw-record 驱动触发,之后跑 F2 完整包门与集成审查。
1. 窗口 2 判读:门 3(臂内三遍逐位、与同会话 monolith 差 ≤ 0.0005、OpenRA 1.0)与门 5(每块 ≤ 0.5 pp、新 crash = 0)。
2. P7 收官异模型整体审查(codex,ID-66)。
3. P7 收官文档(ROADMAP / 本页 / 交接)。
## 6. 阻塞 / 需要人
File diff suppressed because one or more lines are too long
@@ -0,0 +1,15 @@
# review-f2(集成者审查,2026-09-23)
**Verdict: land.** `p7/f2-all@ec845daa`(29 提交 = 基底 4 + f2-event 7 + f2-latch 8 + f2-auth 8 + 合并收尾 2),`~/w7/p7-f2-driver`。
| 片 | 核对 | 结论 |
|---|---|---|
| 基底 PH-2/3/4/5(Luna 审查 land) | 只跑了 49 条定向测试;全车道下 PH-4 两个真缺陷(零尺寸 `glTexImage*` 被判 `ExtentCarrier` 腐坏、`TextureInternalFormat::R8 == 0` 被当「未声明」)+ PH-3 把 ID-49「DstSize≠tight 读 tight」改成拒绝 + PH-2 测试期望 | 由 f2-latch 片 A(`20b827c0`)与空层修复(`58835fa4`)一次修掉;**教训:F2 落地必须全车道 + 主机 CTS 子集** |
| PH-1 (3)(4) 闩 | `FatalFunnel.cpp` 首错胜出(mutex + release store)、未武装=`SessionFail` 原样;只有 spawn/TCP 会话子进程武装(`ServerMain` RunSession),inproc 保持 Fatal(同进程无 supervisor,理由在 `FatalFunnel.h`);DrainRing 入口 + 每记录后查闩、apply 线程离环、闩后控制帧不执行、`_exit(75)` | 正确;64 处闩调用 53 行有原始对端负控、8 处论证不可达、`ph_latch_sites.py --self-test` 丢行即红 |
| fuzz 臂 2 | 64 行表驱动 `PeerLatchTest`,每行独立 `--serve` supervisor、会话 A 伪造、会话 B 必须渲染;D11 五界全有行,PH-5 行已改为旧字节界放行、新界拒绝(RLIMIT_AS 红一次) | 正确 |
| PH-6 + fuzz 臂 3 | drop-with-latch、`MOBILEGL_IPC_EVENT_WAIT_MS`(默认 2000,测试用非默认值并回读)、Stop 结束等待、shm 服务端铃有死亡见证、闩后队列不再 drain | 正确 |
| PH-7 (5) + fuzz 臂 1 | supervisor 在 fork **之前**读 Hello 并先验令牌(未认证只回 `Refuse{Authentication}`,不泄漏指纹/stamp);预认证队列按地址共享 + 置换 + 退避;五种畸形控制帧 + `CtrlEnvelopeBufferHasIdentifier` | 正确;`MOBILEGL_IPC_PREAUTH_{MS,MAX}` / `AUTH_BACKOFF_{AFTER,MS}` 四旋钮已入文档 |
| 门 | G1 `.text` 0xa52203 / 符号 0/0;census 79;棘轮 173;parity 0;unit 2546、split 306、spawn 223、tcp 227、magma 104/83/73、full 542;verify 构建 1156/1090;OpenRA 两臂 1.0 | 全绿 |
**记 §12 的债**:PipeApplier / QueryServer 另有 29 处读对端字节的 `WireProtocolFatal` 仍是 Fatal(会话进程死、supervisor 照常服务下一个);生成门 `MGPipeWireProtocolFatal` 与 MG_Pipe D11 钩子按设计 Fatal(改闩会碰 pull 构建);被丢弃事件的记录仍回 `kStatusOk`,client 无 `DroppedEvents()` 消费者。
**协议变化**:`ControlSchemaRevision` 并入 respecify 尺寸载体修订 → wireFingerprint 变,设备 server 随下一个 APK 重部署。
@@ -0,0 +1,11 @@
# review-g5(集成者审查,2026-09-23):门 5 的三个 inproc × DirectVulkan CTS 缺陷
| 包 | 提交(只取这些) | Verdict | 核对 |
|---|---|---|---|
| g5-readback | `18d3f27d`、`60eabf7b`、`e521c72b`(跳过重复的 `01f95c7b`) | **land** | 客户端把超出一个回复槽的 ReadPixels 切成行带(单行超槽则切行内片),每带是一条普通 `read_pixels`、DstSize 取带的 tight 值,server 侧 PH-3 界不变;中性 pack 态保零拷贝、bounce 只一带、scatter 与整读同一函数;`Fatal{ReplyTooLarge}` 只剩「一个像素都放不下」。7 个场景含 2 MiB 整、2 MiB+1 行、17 MB > 整个 SEG_REPLY、pack 缝隙、PBO、深度/模板,red-once 72/86 红 |
| g5-imgwin | `e8869c2a`(跳过 `8cc63c0b`);F2 落地后按包注记把 view 窗口用例并入门控臂 | **land** | 图像单元指向纹理没有的 level/layer(GL 4.6 §8.26)= 空单元:绑存储占位(着色器声明维度、每次清零),格式无声明时取应用绑定格式;只由 `ResolveWireTextureStorage` 的「确实不在」答案触发,死记录/陈旧 view 仍是具名拒绝;monolith 不动(BASE 本就 Fail) |
| g5-msrbo | `7c1a3b74`(单采样深/模板 1:1 blit 改 copy)、`b10c8529`;`e80392ec`/`19c78bb9` 的**按 vendorID 选臂** | **rework → g5-msprobe** | 根因成立(Adreno 830 的 render-pass 深度/模板 resolve 不写目标),但按 Qualcomm vendorID 选臂违反用户 2026-08-22 规则「后端限制类判定一律 POST 探针、不按驱动名硬编码」→ 改为带对照组的运行时探针 + POST Known Driver Bugs 行(FIXED) |
| g5-msprobe(p7/g5-msrbo 续) | `52d1099b`、`d2f2971a`、`926869f0` | **land** | 删 `WirePrefersShaderDepthResolve(vendorID)`;`WireDepthResolveProbe` 在 server 侧 Magma 初始化跑一次:六种深度/模板格式 4×4×4 样本、清到 0.25/0x5A、目标预填哨兵,用**生产同一个**无 draw render-pass resolve,对照组 = 生产着色器臂;对照不过的面不计 → inconclusive 保默认序。红米 6 格式全 `render pass 0/16 / shader control 16/16` → verdict broken,CTS 3/3;强制 clean 同库即 Fail。POST Vulkan「Known Driver Bugs」加 FIXED 行(无 stencil export 为 UNFIXABLE)。补一条 should-fix:`elide-subject` 测试旋钮让 lavapipe 的真实测量路径判 broken,证明主机上探针的真测量能红 |
| w2-reducer(p7/devprep) | `fe4c8745..f93a9da9` | **land** | 门 3/门 5 化简器按合同公式、五块必齐、同一 boot_id、缺块/空读/子集不给 PASS,自测覆盖;设备共享锁 |
共同基底:三个包都带 PH-4 空层修复的重复拣选(补丁 id `92d463c8`);只随 F2 线落一次(`58835fa4`)。
View File
@@ -59,4 +59,7 @@
| ID-P7-54 | 2026-09-23 | **F2 PH-4 / PH-5 / PH-2 landed on the package branch; Luna integration review = land.** PH-4 carries exact mutable mip W/H/D with the accepted ResourceRespecify and bounds staged bytes under server target/format/device limits; PH-5 rejects vector counts whose immediate allocation exceeds remaining archive bytes; PH-2 names slot-cap and backwards-generation faults through the server fatal funnel at reachable attachment-adoption guards. Raw-peer negatives cover extent mismatch, multisample subdata, carrier canonicality, and PH-2 slot / generation refusal. Build-split targeted gates: ServerSpawnTest 20/20, StagedTextureStoreTest 13/13, ProgramArtifactsCodec 6/6, SessionHandshakeTest 10/10 (49 total); generator + diff checks pass. Strict pull G1 uses exact package base `adf2cbe0`: `.text=0xa52203`, 27,837 symbols unchanged, 0 added/removed/resized/renamed, all section deltas 0. | commits `51480f8c` (PH-5) + `2c6a6e25` (PH-4/PH-2); combined CTest `/tmp/p7-f2-all-required-final.log`; G1 `/tmp/p7-f2-g1-adf2-final.md` / `.json`. | `ProgramArtifactsCodec.cpp`, `StagedTextureStore.h`, `SlotTables.h`, `Managers.{h,cpp}`, raw FBO / texture peer controls |
| ID-P7-55 | 2026-09-23 | **棘轮 88 → 86,余 86 标 `# P13`(取代 ID-P7-31 的「不标 # P13、归 wave 3」)。** disaggregated 构建里 monolith 是默认运行时(`ConfigLoader.cpp` `MOBILEGL_TRANSPORT` 默认值)、是门 3 / 门 5 的同会话参照臂,CI 的 monolith-control 车道也跑它;86 个符号全在该臂可达:62 = `UniformManager.cpp.o` 构造前端占位纹理(六个头文件纹理类的 vtable 在该对象发射)、14 = `VkSamplerManager` 的 `SamplerObject` getter、6 = 应用 FBO/RBO/VAO/buffer getter、4 = `MGB_CTX` 访问器(其中 `PipeInputs::HasOpenTransformFeedbackSpan` / `InvalidateCompileEnv` 计入的真因是 `PipeFill.cpp` 按路径规则归 FRONTEND,与 5 个 SlotAllocator 符号同类)。`#if` 掉 = 删参照臂;改用 wire placeholder 会改变参照臂可观测行为(1D/3D/cube/array 未绑定 sampler 由丢 draw 变为画、阴影占位 RGBA8→D16、MS 占位由未定义变为清零),需另开设备窗口裁定,记 §12。可删的 2 个(`MGPipeTextureLegacyArmScope` 构造/析构)已删:探针在 Magma split/spawn/tcp + full 车道与 78 行 split 子集 retrace 上 0 命中,回归现由 `Fatal{RoleViolation,"texture-legacy-arm"}` 按访问器名拦。§4.2 的 P13 判据扩为「不动 pull `.text` 去不掉,**或**去掉会改变 disaggregated monolith 参照臂」。G1 `.text` 字节同(替换注释保持行数,`__LINE__` 进 pull `.text`)。 | pipe `d49df354` / `d74e9923`;`~/w7/logs/ratchet88/ATTRIBUTION.md`;审查 `notes/handoff/review-ratchet88.md` | `scripts/data/link_ratchet_baseline.txt`、`VkTextureManager.cpp`、`MipmapStorage.{h,cpp}` |
| ID-P7-56 | 2026-09-23 | **CI 自 P6.5(09-22)起持续红,七个根因全修 + 标题缩短 + 并发组。** (1) 链接缝门:ID-P7-3 的 dataNonce 提交让 `ServerSession` 直接构造 `StreamLink` → 改走 `Transport::CreateDeferredStreamLink` / `BindStreamLinkDataFd`;(2) TCP 车道 220/223 红:fixture 起的 server 没有 harness 的 headless EGL 钉(本地 WSLg 的 `DISPLAY` 遮住了它),另 `Tcp.TextureUploadShape` 缺 `mobilegl-tcp` 资源锁(并发时 `Refuse{Busy}`)→ 钉 + 锁 + `junit_tally` / `spawn_lane_parity` 锁守卫;(3) `ObjectSubsystemControl` 匹配器仍认 D3 前的拒绝句;(4) 四个 Magma-only decline 用例在 Espryt split 臂上跑 → 按后端名 skip;(5) dual-block 普查 9 个合法 skip 未登记、buffer 必绿表 19→21;(6) retrace 链(自 P6.5 起被上游红跳过):Magma 修复旋钮只在主步 shell 里 → 写 `$GITHUB_ENV`;CI 的 verify 库是 pull 构建写 `mobilegl.log` → verify 块回退;spawn 冷启动被 5 s 控制回复界杀(09-22 两次 11/77、17/77 腿)→ `MOBILEGL_IPC_CONTROL_TIMEOUT_MS`(5000,P6 D5b 早已命名但从未读取)+ `MOBILEGL_IPC_COLD_START_MS`(20000,首个 MakeCurrent 答 ok 之前的三个可能拉起后端的 op);(7) 两个工作流无并发组 → APK 排队 10 h:加 `concurrency`(非 dev 推送取消在跑的),apk.yml 跳过纯文档推送。80 个 job/step 标题缩到 ≤45 字符(`retrace (…, <case>)` 形状留给 `remove-artifact-clutter` 解析)。本地门模板 v2(`~/w7/logs/p7-gate-template2.sh`)补齐 CI 覆盖:pipe-gates 全步、integration-gpu 双传输、车道去 `DISPLAY`。 | pipe `eaef83b3..e751b07b`;CI 复刻 `~/w7/logs/cifix-rep/`(每个红 job 本地转绿);真 CI 待本次推送 | `.github/workflows/{test,apk}.yml`、`scripts/ci/*`、`ClientSession.cpp`、`ServerSession.cpp`、`MG_IntegrationTest/CMakeLists.txt` |
| ID-P7-57 | 2026-09-23 | **F2 落地:Ph 余项全做完(PH-6、PH-1 (3)(4)、PH-7 (5)、fuzz 三臂),集成者审查 = land。** 基底四提交(Luna 审查 land)只跑过 49 条定向测试;全车道 + 主机 CTS 抓出 PH-4 两个真缺陷——零尺寸 `glTexImage*` 被判 `Fatal{ProtocolCorruption,"ResourceRespecify.ExtentCarrier"}`(dEQP 每例 reset 都发,inproc 下**每个** KHR 用例 abort)、`TextureInternalFormat::R8 == 0` 被当「未声明」(设备 dsa 块 11 个新 crash)——另 PH-3 把 ID-49「DstSize≠tight 读 tight」改成了拒绝;三者在 F2 线内各修一次(空层修复 + f2-latch 片 A)。PH-1:只有 spawn/TCP 会话子进程武装的每会话闩(首错胜出、未武装 = `SessionFail` 原样、inproc 保持 Fatal),DrainRing 入口 + 每记录后查闩、`_exit(75)`、supervisor 照常服务下一连接;64 处闩调用 53 行有原始对端负控、8 处论证不可达(`ph_latch_sites.py --self-test`)。PH-6:drop-with-latch、`MOBILEGL_IPC_EVENT_WAIT_MS`(默认 2000)。PH-7 (5):supervisor 在 fork **前**读 Hello、先验令牌(未认证只回 `Refuse{Authentication}`,不泄漏指纹)、预认证队列按地址共享 + 退避(`MOBILEGL_IPC_PREAUTH_{MS,MAX}`、`AUTH_BACKOFF_{AFTER,MS}`)。三臂 fuzz 全进 CI 车道。**流程裁定**:F2 类「server 字节界」包落地必须跑全车道 + 主机 CTS 子集,定向测试不算门。 | F2 线 29 提交 + 集成 2 个跟进(`TcpLane.EventForfeitPeer` 取 `mobilegl-tcp` 锁、`EventForfeitPeerTest` 钉 headless EGL);审查 `notes/handoff/review-f2.md` | `FatalFunnel.{h,cpp}`、`ServerMain.cpp`、`PreAuthGate.h`、`ServerSession.cpp`、`ServerLoop.cpp`、`PipeWireCodec.cpp`、`PipeApplier.cpp`、`StagedTextureStore.h` |
| ID-P7-58 | 2026-09-23 | **门 5 的三个 inproc × DirectVulkan CTS 缺陷修掉(窗口 2 预演 dry run 发现)。** (1) `direct_state_access.renderbuffers_storage`:256×512 RGBA/FLOAT 恰 2 MiB,比回复槽大 16 字节 → `Fatal{ReplyTooLarge}`(ID-47 旧债):客户端把超槽的 ReadPixels 切成行带(单行超槽切行内片),每带一条普通 `read_pixels`、tight DstSize,server PH-3 界不变——CONTRACT-P6 归 P9 的「分块回读」ReadPixels 部分提前还;(2) `renderbuffers_storage_multisample`:Adreno 830 的无 draw render-pass 深度/模板 resolve 不写目标 → **运行时探针**(六格式、生产同一 render-pass 臂、对照组 = 生产着色器臂、对照不过则 inconclusive)选臂 + POST「Known Driver Bugs」FIXED 行;包最初按 Qualcomm vendorID 选臂,按用户 2026-08-22 规则(后端限制一律 POST 探针、不按驱动名硬编码)返工;顺带单采样深/模板 1:1 blit 改 copy(Adreno 深度格式无 BLIT_DST、单面 blit 会踩另一面);(3) `shader_image_load_store.incomplete_textures`:图像单元指向纹理没有的 level/layer 时 wire 臂 `Fatal{UnmigratedVerb,"Magma:image-view-window"}` → 按 GL 4.6 §8.26 绑存储占位(读 0、写丢)。主机 CTS 三例 inproc 全 Pass(monolith `incomplete_textures` 仍 Fail = BASE);红米 msrbo 3/3。 | 审查 `notes/handoff/review-g5.md`;`docs/Disaggregated/notes/p7/g5-msrbo.md` | `EmitTables.{h,cpp}`、`WireDepthResolveProbe.{h,cpp}`、`WireDepthResolveArm.h`、`DriverBugProbes.cpp`、`UniformManager.cpp`、`VkTextureManager.cpp`、`WirePlaceholderImages.inc` |
| ID-P7-59 | 2026-09-23 | **设备窗口 2 工装与判读裁定。** `docs/Disaggregated/notes/p7/device-window-2/tools/`(= `~/w7/notes/p7/window2/`)一条命令:构建 → reboot-clean preflight → 安装 → 门 3(36 例 × monolith ×1 + inproc ×3 + spawn ×3 + inproc `RUN_AHEAD=0` ×1)→ bsl 映射/wbuf → CTS AFTER 五块 → 判读 → 复原;可续跑、共享设备锁。**裁定**:门 3 的「三遍逐位相同」按臂内判;inproc/spawn/monolith 跨臂同图只报告、不同则 WARN、不设门;同一 boot_id 贯穿(否则 INVALID-SESSION);CTS 每块率 = Pass/(Pass+Fail)(NS、CompatibilityWarning 不入分母),缺块 / 空读 / 子集一律不给 PASS,新 crash = 0 单独硬红;UBO(GTF)块记 unrun。跑器修复:POSIX 主机可起跑、每遍先清上一遍产物(旧行为会把死掉的一遍归档成通过且逐位相同)。 | window-2 工装 6 提交;dry run 证据 `device-window-2/dry-run/` | `run_android_retrace_local.py`、`60-reduce.py` |
| 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` |