mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-15 22:13:24 +09:00
70 lines
77 KiB
Markdown
70 lines
77 KiB
Markdown
# P7 集成者裁定日志
|
||
|
||
> 形式沿用 P5e 的 `INTEGRATOR-DECISIONS-P5E.md`:一条裁定一个 ID,只记「定了什么、为什么、影响哪些文件」,不记来回。计划正文见 [`PLAN-PH-P34B-P7.md`](PLAN-PH-P34B-P7.md)。
|
||
|
||
| ID | 日期 | 裁定 | 理由 | 影响 |
|
||
|---|---|---|---|---|
|
||
| ID-P7-1 | 2026-09-22 | PH-1「`Session::Fail` 翻成每会话闩」按四片重定界:(1) supervisor 读 `waitpid` status 并命名子进程死亡;(2) 两处头层裸 `abort`(`Server/StagedShadow.h:115`、`Server/StagedTextureStore.h:344`)改走漏斗;(3) 只对对端字节可达站点做 latch-and-decline;(4) 负控。**98 处 `SessionFail` 的字面翻转拒做**。 | ≥9 处返回引用的站点没有诚实返回值;§12.3 进程级 `eglTerminate` 使闩住的进程也服务不了第二会话;P6.5 fork-per-session 已给出「下一连接照常服务」。 | `ServerMain.cpp`、`Server/Staged*.h`、`PipeWireCodec.cpp`、`PipeApplier.cpp`、`ServerLoop.cpp`、`SurfaceOpCodec.cpp` |
|
||
| ID-P7-2 | 2026-09-22 | PH-6 取 drop-with-latch:`ReserveEventOrBlock` 两处 BUSY 拒绝改置 forfeit 闩 + `CountDrop()` + 返回 scratch,`ServerLoop` park 谓词见闩走正常 Stop;`kEventBacklogWaitMs` 改 `MOBILEGL_IPC_EVENT_WAIT_MS`(默认 2000)。**不等 PH-1**。 | 一个函数、一个标志、一个配置字段即闭;30 s 的「测量」从来不是测量;解耦掉 6–10 天的闩迁移。 | `ServerSession.cpp:215-263`、`ServerLoop.cpp:403-406`、`ConfigLoader` |
|
||
| ID-P7-3 | 2026-09-22 | OQ-21:**令牌足够,不做 TLS**。令牌常量时间比较、≥16 字节、无令牌只 loopback;数据面以 `Welcome.dataNonce`(CSPRNG 128 位)绑定到已认证的控制连接,认证在 fork 之前完成。TLS 作为 P12 的开放项保留。 | Ph 门的威胁模型是「任何人都能连的远程代码路径」,不是窃听:局域网 GL 命令流不含凭据。令牌 + 连接绑定关掉前者;TLS 是另一个多天项且应有自己的路线图行。 | `protocol.fbs`(`Welcome` 追加字段 → `wireFingerprint` 随之变)、`SocketTransport.cpp`、`Handshake.h`、`ServerMain.cpp` |
|
||
| ID-P7-4 | 2026-09-22 | 出口门 3(真机 ssim 1.0)的分母排除 `minecraft-1.21.4-rd12-odinlite-in-world` 与 `create-indirect`;`iterationrp` 按 `apk.yml:460-462` 带三个 Magma 旋钮。 | OQ-17:两者在 `dev@81b17c0b` 就在 Adreno 830 上坏,非本分支造成。 | `CONTRACT-P7.md`、设备矩阵跑器 |
|
||
| ID-P7-5 | 2026-09-22 | `SetupDrawSnapshot` 探测字段塌 dirty mask、`VertexInputStateFactory` 内容寻址 CSO **本阶段拒做**,记入优化阶段。 | `VulkanRenderer::SetupDraw` 在非 monolith 传输下分支到 `SetupWireDraw`(`:6946`),monolith 快照机制在 split 下不跑;无性能门;改 monolith 表动 pull `.text`。 | 无 |
|
||
| ID-P7-6 | 2026-09-22 | D18 取 21-memo 普查的读法(节点稳定容器纪律;负控 C 必须仍能到达已发货臂)。 | 两名反驳者对指涉不一致,必须由集成者定一个。 | `CONTRACT-P7.md` 一句 |
|
||
| ID-P7-7 | 2026-09-22 | 184 符号棘轮归 P7 wave 0;baseline 存符号列表而非计数;`--assert-monotone` 只对新增符号红,消失只提示重基线。 | 裸计数的棘轮在「清一个加一个」时通过;P6.5 行从未接收该移交。 | `scripts/link_ratchet.py`、`scripts/data/link_ratchet_baseline.txt`、`test.yml` |
|
||
| ID-P7-8 | 2026-09-22 | 实现方 `opus`、审查方 `fable`;每包合并前聚焦审查一次,阶段收官整体审查一次。 | ID-66「实现方与审查方错开」;本环境无 Codex。 | 过程 |
|
||
| ID-P7-9 | 2026-09-22 | 性能只记录不设门(沿用 2026-09-08);wave 2-B 若实测 CSO 缓存为热点才做 P7-5 的 server 半边。 | 路线图纪律。 | 过程 |
|
||
| ID-P7-10 | 2026-09-22 | wave 0 之前不派任何 `@P7` 拒绝退役的活。 | 今天没有一条车道能让 Magma 两进程用例变红,每个修复都需要 red-once。 | 过程 |
|
||
| ID-P7-11 | 2026-09-22 | pull 构建(`MOBILEGL_PIPE_PUSH=OFF`)必须**连测试一起**编过:`MG_Test/Util/PipeStatsTest.cpp:137` 用了 push-only 的 `PipeStats::Gauge`,已加 `#if MOBILEGL_PIPE_PUSH` 并保留用例名以维持名集合奇偶。CI 的 pull control 作业关了 `MOBILEGL_BUILD_TEST` 所以看不见——这是 CI 的一处盲区,随 wave 0 的 CI 改动补一条「pull 构建含测试」的编译步骤。 | 「默认 ALL target 必须完整构建」。 | `PipeStatsTest.cpp`、`test.yml` |
|
||
| ID-P7-12 | 2026-09-22 | 出口门 3 **逐 case 对 monolith 臂**判(同会话;三遍逐位相同;≥ 阈值;与 monolith 读数之差 ≤ 0.0005;OpenRA 两臂 1.000000),不是对 golden 的平 1.0;分母 = 39 − 3 = **36**,排除 monolith 自己就红的 create-indirect(OQ-17)、1.21.11-main-menu(trace UBO 对齐伪差)、iris-photon。 | E0a 实测 monolith × DV 对 golden 在 0.996–1.000,只有 OpenRA 是 1.0;「pbuffer monolith 1.0」是 OpenRA 的事实不是规则。 | `CONTRACT-P7.md` §7.1/7.2、`device-window-1/E0-attribution/exclusions.md` |
|
||
| ID-P7-13 | 2026-09-22 | iris-photon 归 `dev` 侧独立条目(Adreno 830 的 `vkCreateGraphicsPipelines` 对 photon 程序返回 `VK_ERROR_UNKNOWN`,`PipelineFactory.cpp:660`,monolith SSIM 0.0089,lavapipe 绿);不进 P7 出口门。 | OQ-17 先例:monolith 级的 Magma × Adreno 失败不是分离缺陷;拆分不借机顺手修。 | `exclusions.md` |
|
||
| ID-P7-14 | 2026-09-22 | wave 0 三个包的命名/分桶裁定一并批准:C——`ResourceUnavailable`→`ServerCrashed`(不是 `SegmentMismatch`)、Magma 漏斗家族词保持 `UnmigratedVerb`、`Refuse{ProtocolMismatch}` / `Refuse{InitialCapsSnapshot}` 进 `LOCAL_REFUSAL_WORDS` 允许表;R——`FatalFunnel.cpp.o` 归 SHARED、`MG_Backend/Init.cpp.o` 按 a6 归 SERVER、Espryt 桶地板 5(`MG_Pipe::` 槽分配器符号,`# P13`)、P3b/P4b 可清数 9;L——`MagmaRunAheadScenario` / `MagmaWireCacheScenario` 只注册 inproc 臂(`MAGMA_INPROC_ONLY`),跨进程 hold / peek 记债;六处 `MGL_ITEST_MAGMA_*_ENVIRONMENT` 改用 `VULKAN_ENV`。 | 各包报告里的理由成立;改名会作废历史普查计数;一致性胜过「含义不变」。 | `scripts/ci/fatal_census.py`、`link_ratchet.py`、`spawn_lane_parity.py`、CMake |
|
||
| ID-P7-15 | 2026-09-22 | 新增 wave 2 包 **X1**(inproc 下 GL 线程 memcpy 写进不可写映射的 SIGSEGV)进 P7 出口门 3 关键路径;其两条残余(屏蔽 SIGSEGV 的非 GL 线程写者、`RefaultOfANonWriteAccess`)与「P5d 的 Adreno mprotect 臂数字存疑」记 `CONTRACT-P7.md` §12,不阻塞 P7。 | 26.3 在门 3 分母里;机制是 bionic 指针标记 0xb4 与内核 `si_addr` 比较,与后端、run-ahead、persistent push 无关(E1/E4a/E4b)。 | `PersistentMapTracker.cpp`、`notes/p7/x1-persistent-map-segv.md` |
|
||
| ID-P7-16 | 2026-09-22 | 出口门 5 = **五个可测块**(texture 1055 / shader-image 125 / packed-pixels 4732 / dsa 371 / ssbo 124),UBO 块(GTF 模块)在本 CTS 提交 `0b04c470e` 无 kc-cts 不可运行,记 unrun;API 版本 **KHR-GL46**(设备探针列出 697 例,`mgprobe` PASS 含 default_fb=ok);`$BASE` 用 pre-wave-2 库 `p7w1-9be62cbc`,AFTER 同版本同 caselist。 | 设备探针结果;caselists README 已预告 GTF 缺席。 | `tools/cts/caselists/`、`notes/p7/device-window-1/CTS-base/` |
|
||
| ID-P7-17 | 2026-09-22 | E2(present credit 扫描)与 E0b 的 ARMED 三遍确定性**不单独跑**:E1 已证明 run-ahead 整条线出局(OpenRA lockstep 仍 0.989、崩溃 case 照崩),确定性在 F1 修复后的复测里按 §7.2 一起做。 | runbook §5 的判别规则;设备时间省给 wave 2 复测与 CTS。 | `E1-lockstep/README.md` |
|
||
| ID-P7-18 | 2026-09-22 | F1 落地(`df17c416`):split 起会提到 `MG_State::Init()` 之前(`InitSplitRolesBeforeState()`),`CapsMirror::ServerConsumes` 不再从 placeholder 作答(他线程 bring-up 在飞时等 250 ms,否则 `Fatal{CapsBeforeFirstSnapshot}`);**批准** `MG_Config::SplitTransportRequestedByConfig` 作为该门的武装闩——任何绕过 `MG_ConfigLoader::Init()` 手设 `Transport` 再造前端对象的生产路径都会退回 placeholder 作答,今天只有 `ServerLoopTest` 这么做且写了理由。 | 发射者是确定性的(11 个默认纹理在起会前 `resource_create`),主机也发生;不做「把警告调轻 / callMask 全 1」。 | `MobileGL/Init.cpp`、`MG_Backend/Init.cpp`、`CapsMirror.{h,cpp}`、`ClientSession.cpp` |
|
||
| ID-P7-20 | 2026-09-22 | wave 2-C 落地(`dce9953d..074a0727`)并批准其五条:§5.4 白盒(opcode 49 上 wire)在 P11 采纳档落地前不可达,以「server 按表发布 + 镜像收到」为验收;`g_programResourceCaches` 的 monolith 删除归 P13(G1);`buffer-window` 家族词暂留 `UnmigratedVerb`(改 `ProtocolCorruption` 记 §12);`vertex-layout` 屏蔽原因是七种不是六种;死亡缺口是 server twin 泄漏而非 client slot 泄漏(framebuffer 用例两边计数)。`p7_worktree.sh` 补 `MOBILEGL_ITEST_VK_ICD` 钉。 | 各条理由见 `notes/p7/magma-c.md`。 | `CONTRACT-P7.md` §3.2/§12、`p7_worktree.sh` |
|
||
| ID-P7-21 | 2026-09-22 | wave 2-A 落地(`450d3075..2207b6d9`)并批准:`uniform-buffer-byte-tail` 退役(外扩到字边界读进 staging,一次子字拷贝进 padded block);两处 native-range **钳制**;三处 unaligned-*-range 与 `texel-buffer-native-format` 具名 decline(可写 range 的 copyback 不做——该站点分不出 readonly,且录制点在 B/C 的 draw/dispatch 尾;配方在 `magma-a.md` §3.1);两条算术不变量(`*-offset-overflow`)留作 hook 经过的具名 Fatal、不再带 `@P7`。审计写的「offset = alignment + 1」测试**不可达**(前端对非对齐 offset 报 `GL_INVALID_VALUE`),真正活的缺口是 `glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, …, 4, 4)`(GL 只强制 `offset % 4`)。 | `notes/p7/magma-a.md`;`@P7` 树上只剩 B 的 5 处(`WireFramebuffer.inc` 4 + `VulkanRenderer.cpp` 1)。 | `UniformManager.cpp`、`F1WireScenario`、`CONTRACT-P7.md` §3.2 |
|
||
| ID-P7-22 | 2026-09-22 | S1(`IterationRPProgram203Scenario` exposure texel 差一个)**改判为环境敏感而非 tcp 专属**:A 在未钉 ICD 的树上 inproc 也 3/3 红、pipe(钉 lavapipe ICD)inproc 绿、L 只在 tcp 红。记为 §12 债,归 P6.5 StreamLink × Magma 交叉项的主人(未派);helper 已钉 ICD 免再混淆。 | 三棵树三种结果,唯一变量是 ICD 配置与臂。 | `CONTRACT-P7.md` §12 |
|
||
| ID-P7-23 | 2026-09-22 | wave 2-B 落地五片(`c4be3800..76b74693`):mip 形状拒绝半退役 + 具名、深度 mip 烘焙 (A)(D)、copy-image-in-place、default-color-blit(含 3D 源 blit 寻址 bug)、**wire 回读竞态修复**(OpenRA 真机分歧的机制,主机用 fence 计数 red-once,因为本机布局是 GENERAL 撞不上空 scope)。B 未做的三项(multisample-blit ×2、AllocatorDebtScope ×2、B′ 棘轮下降)另派 **B2**。`WireColorBlit.inc` / `VulkanRenderer.h` 在簇内顺手改,批准。 | `notes/p7/magma-b.md`。 | `WireFramebuffer.inc`、`VulkanRenderer.{cpp,h}`、`WireDepthMipmap.*`、`scripts/bake_internal_shaders.py`(若有) |
|
||
| ID-P7-24 | 2026-09-22 | wave 2-D1 落地(`faf0a1f9..ba81453f`):XFB 孤儿目标保留 varyings、回写事件按 `EventRingCapacityBytes/4` 切片、`OnXfbScatterReady` 删除(回调 10→9,`ARCHITECTURE.md` §8.1/§8.5 改成树的样子)、四个 resolver 在有传输时具名启动期 stop、readback 家族三臂武装(+39 例/臂)。**readback 半边其实早已关**:首跑 65/65,`copy-image-shadow-mirror` 自 P5b i1 起有传输 `return`,`get-tex-image-shadow` 从 wire 路径不可达(server 经 `ReadTextureImageWire` 答)——P3b/P4b 行的「readback 开」是从未在传输下跑过的假设,不是缺陷;仍改成 rule-I decline 作纵深防御。`p7_worktree.sh` 改为非递归子模块 + 显式 `include/ska`。 | `notes/p34b/espryt-d1.md`。 | `DirectGLES.cpp`、`Managers.{h,cpp}`、`MGPipeCallbacks.h`、`ServerSession.cpp`、CMake |
|
||
| ID-P7-25 | 2026-09-22 | W4 真机复验(p7w4 = `ae3f43ab`,`device-window-1/W4-verify/`):iterationt ×2 通过(B 的 mip 退役兑现);门 3 AFTER 矩阵 **34/36 与 monolith 差 ≤ 0.0005**,未过的只剩 OpenRA 与 bsl-esc-menu(inproc OOM,待 spawn 臂)。**ID-P7-19 的「冷驱动缓存」读法撤回**:16 遍显示 run-ahead 臂是与温度、`IPC_AUDIT`、`FIF=1` 都无关的每次约 50% 的竞态,且只产生两张图(`ace2af04` = golden、`fb75d412` = 14658 像素错,与 B 修复前逐字节相同);lockstep 确定性地给第三张 `4e5ba514`(0.988998 = E1)。B 的回读 fence 修复保留(真洞)但不是本分歧的机制。**门 3 对 OpenRA 的验收改为** run-ahead 与 lockstep 各 6 遍全 `ace2af04`,冷热各半。归因交 B3(四镜头调查 + 裁判)。D2 落地时顺手:`SubsystemDepsTest` 在 pull 构建下调用 push-only 的 resolver 使 `build-linux` 编不过而 `.so` 陈旧、G1 看似恒等——门脚本改为对 `linux build rc≠0` 硬红(ID-P7-11 的第二次)。 | 16 遍的表在 `W4-verify/README.md` §3;目标调用 31249 是 `glXSwapBuffers`,快照在 swap 前经普通 `glReadPixels` 入流,present 是 class-B 记录,没有旁路。 | `W4-verify/README.md`、`CONTRACT-P7.md` §7.2、`SubsystemDepsTest.cpp`、`p7-gate-*-inner.sh` |
|
||
| ID-P7-26 | 2026-09-22 | wave 2-D2 落地(`da30c130..519445f9` + pull 构建修复 `c2cc3a96`);fable 审查判「带修复落地」,修复 1/2/4(TUS 散点工作负载的 union box 盖满整层所以 `rect=0` 是几何不是 unpack-ring 策略——`CoversWholeLevel`;`espryt_memo_purity.py` 对改名家族 fail-open、`LEGACY_MEMOS` 默认 ON 的措辞、`FRONTEND` 无词界;普查数 71→72、+37→+76、每片 Gates 行)交 D2 返工一轮,修复 3(排除用例的契约行)由集成者记 §12。**批准** D2 触及 `MG_Pipe/*`(`SubsystemDeps.def`、`MGPipe.h` 表)与 `CONTRACT-P5.md`:在 §9 D 簇清单之外,但正是计划 R-5/R-3 行点名的文件。审查确认:产品代码零 abort/Fatal/MGLOG 新增、`MG_Backend/` 零触及、G1 恒等、`SubsystemDeps.def` 与 `PipeFill.cpp:1487-1518` / 六个 resolver 逐行一致。 | 审查报告全文在 agent 记录;要点已入本行与 §12。 | `TextureUploadShapeScenario.cpp`、`espryt_memo_purity.py`、`split-scenario-census.md`、`CONTRACT-P7.md` §12 |
|
||
| ID-P7-27 | 2026-09-22 | bsl-esc-menu-854 **不排除**:monolith 807 MiB 通过、spawn 的 server 进程 ~1.2 GiB 死于 scudo `internal map failure`(client 543 MiB、系统余 8 GB)、inproc 1.6 GiB 死——wire 臂的内存缺陷(≈2.1× 字节或映射数上限),派 **M1** 归因(host 复测、逐 store 归因、泄漏/平台、`max_map_count`),修复包随归因定分区。 | `W4-verify/README.md` §3c 的采样表;ID-P7-12 的规则是「monolith 自己红才排除」。 | `CONTRACT-P7.md` §12 |
|
||
| ID-P7-28 | 2026-09-22 | wave 2-D3 落地(`1e1f4bad 1c36987e 00d02396`;其 `8274dcab` 与集成者的 `c2cc3a96` 重复,不取):view 陈旧缺陷取「谓词解析到 storage record」而非反向索引(删除顺序:反向索引要在 view 死亡时剪枝,否则 owner 上传会推到被回收给无关纹理的槽——静默跨纹理串号;且把可变状态放进两后端共读的 `MG_Pipe`);删除顺序由构造保证(`TextureObjectView::m_storageOwner` 强 `SharedPtr`,`resource_destroy` 在析构发出,`TextureObject.cpp:63`)。D-K2 「两处一行」实为六处读者,全部改读 `SubsystemDeps.def`,client 侧参数按 `kMGPipeP4aFamilySubsystems` 掩码(bit 8 的 vertex-input 发射归 P3a 规则,`TextureEmit.EveryDKTwoDependencyRowGatesItsOwnFamilyAndTheMirrorPairsStayLive` 抓到);**批准**「`SubsystemDepsTest` 从比两份副本变成比两个读者」的减弱,编译期一半(`MGPipe.h:225/:230`)承担。门:pull rc 0、`.text` 0xa52203、nm 0/0;unit 2426 / split 303 / spawn 219 / tcp 222 / magma 88/67/69 / full 530;census 79、ratchet 186、parity 0。门脚本模板自此对 `linux build rc≠0` 打 `GATE-RED`。 | `notes/p34b/espryt-d3.md`;两处基线引文更正(KHR-GL46 非 GL43;`texture_view` 1/7 红是 `view_sampling` 不是 `coherency`)。 | `Managers.{h,cpp}`、`PipeFill.cpp`、`DirectGLES.cpp`、`SubsystemDeps.def`、`CONTRACT-P5E.md` §5.2、`CONTRACT-P7.md` §12 |
|
||
| ID-P7-29 | 2026-09-22 | wave 2-D2 返工落地(`b3334cf3 0f3b8272 394df892 a2d7fbd7`,叠在 D3 之上;`SubsystemDepsTest` 取 D2 版守卫 + 两条注记,`split-scenario-census.md` 与 D3 的附记手工合并):TUS 散点内缩后 gold 不变(`emit=9 box=9 rect=0 jobs=9` 四臂同)但对象对了——**零补丁 red-once** `MOBILEGL_ESPRYT_DISABLE_UNPACK_RING=1` 给 `box=3 rect=6 jobs=183`(两张散点纹理都动,26 像素例仍绿);顺带抓到 `ASSERT_TRUE(clientWindow.found)` 被「counters ON」横幅满足的假读,改为带 `tex[]` 的窗口;`espryt_memo_purity.py` 锚点/allow 活性断言后 6 条 allow 剩 1;`+76`/72 数字改正、每片 Gates 表。门:pull rc 0、G1 恒等、unit 2426 / split 303 / spawn 219 / tcp 222(`F1WireScenario.TextureReadbackRejectsPackedDestinationOverflowBeforeWriting` 首跑 1 红、rerun 绿——tcp 车道已知 flake 形状,非本包文件)/ magma 88/67/69 / full 530。 | D2 报告;tcp flake 记 §12 的既有条。 | `TextureUploadShapeScenario.cpp`、`PipeStatsWindow.h`、`espryt_memo_purity.py`、`test.yml`、`split-scenario-census.md`、`MEASUREMENTS.md` §13.1 |
|
||
| ID-P7-30 | 2026-09-22 | D3 的 fable 审查判「带修复落地」,两处修复由集成者直接落在 pipe:(1) `SubsystemDeps.def` 第 1/6 行(bit 8 / bit 13 各 requires bit 7)自 D3 起是活行为、却无任何钉子(`MGPipe.h` 的 static_assert 只钉纹理行/程序行/0x7ff/0x1fff,`SubsystemDepsTest` 只扫四个 P4a resolver)——加两条 `static_assert`;(2) 「删除顺序由构造保证」的说法在常见情形下反了:`m_storageOwner` 是派生类成员、destroy 从基类析构发出,view 持有 owner 最后一个引用时 wire 上先 `resource_destroy(owner)` 后 `(view)`,一次 apply 内 view 记录活着而 `ViewOf` 指向已释放槽——保证是 walk 的 `Live`/`Gen` 检查,不是顺序;`Managers.h`、`CONTRACT-P5E.md` §5.2、`espryt-d3.md` 三处改写,call-site 计数「五→四」改「四→三」。审查确认:门代数对非 view 逐字节同旧;G1 每处改动都在 `PIPE_PUSH`/`BUILD_DISAGGREGATED` 守卫内;red-once 在 tcp 臂真跑真红;引文(KHR-GL46、`view_sampling`)属实。**批准** D3 改 `CONTRACT-P5E.md` §5.2(既非 R-5 也非 R-3,但是 D2 普查行点名的修正)。 | 审查报告;`~/w7/pipe` 上 `range-diff` 三个提交 `=`。 | `MGPipe.h`、`Managers.h`、`CONTRACT-P5E.md`、`espryt-d3.md` |
|
||
| ID-P7-31 | 2026-09-22 | wave 2-B2 落地(`452d33b5 51fa513d a50d50df 3c2867d3`):multisample-blit-shape / -aspect 退役(scratch resolve + 第三套烘焙 resolve shader;MS 目的地与无臂采样数具名 decline),`MagmaP7AllocatorDebtScope` 两处删除(P7 基线只剩两处——P5e 裁定 12 的四处里 P5f fv/fm 已去两处;类型留作 `RemoteClientTest` 负控),(B′) disaggregated 构建的 monolith 臂改用烘焙模块,棘轮 **186 → 173 重基线**(p7-magma 101 → 88,余 88 = monolith draw 路径,按 ID-P7-5 留运行时分支、不标 `# P13`,归 wave 3)。**`@P7` 拒绝站点归零**(§3.2 六个退役全部完成 → 子系统分母 (2) 成)。门:pull rc 0、G1 恒等;unit 2429 / split 303 / spawn 219 / tcp 222 / magma **93/72/74** / full 533;census 79、parity 0。**批准** B2 的「decline 的 GL 错误骑在后一次回复上、场景里 `glFinish()` 是承重的」记入 §12 作为 wire 错误归属的已知形状。真机待验:旋转面上的缩放 MS blit、Adreno 830 是否带 `VK_KHR_depth_stencil_resolve`(决定默认臂)、(B′) 烘焙 blit 几何在 ROTATE_90/180/270 下的等价(从未执行)。**fable 审查:带修复落地**——(1) tcp 臂的 `MsResolve1` 条目空转(knob 进的是 client 的 ctest ENVIRONMENT,tcp 的 server 是车道级 fixture 从自己的 `os.environ` 起,`tcp_server_fixture.py:60-68`;B 的 `FORCE_SHADER_MIPMAP`/`FORCE_DEFAULT_BLIT_SCRATCH` tcp 条目同病)→ 按 ID-P7-14 `MAGMA_INPROC_ONLY` 先例做 parity 例外只注册 split+spawn;(2) 翻转/缩放的 MS 深度/模板 resolve 仍 `MagmaWireFatal("multisample-depth-resolve-region")`(`WireFramebuffer.inc:437-443`)——颜色臂已处理翻转、深度却杀会话 → 缩放具名 decline、翻转逐行反向 copy-out;(3) 车道基线归因句改正(+4 = A 与 C 各 +2,都在 B 之前落地)。三项交 B2 返工一轮。审查确认:scratch 生命周期经 `RetireWireObjects` 标签正确、shader resolve 取样 0、无臂路径 decline 无 abort、B′ 每行在守卫内 pull 类布局不变、棘轮 13 去 + 5 重分类属实、bake `--check` fail-closed。§12 待记三条(缩放第二腿未裁剪、`multisample-resolve-region` 对超出读缓冲的源仍 Fatal、1→N 同矩形 decline 了合法形状)。 | `notes/p7/magma-b2.md`。 | `WireFramebuffer.inc`、`WireMultisampleResolve.*`、`VulkanRenderer.cpp`、`scripts/data/link_ratchet_baseline.txt`、`CONTRACT-P7.md` §3.2/§4.1 |
|
||
| ID-P7-32 | 2026-09-22 | bsl-esc-menu 归因(M1,主机复现):split server 无界累积死 `VkBuffer`(`RespecifyWireBuffer` 无条件 `DeferRelease`,桶只在帧界扫,pbuffer 回放整跑只 1 条 present)——派 **M2**(`VkBufferManager.{h,cpp}`:serial 门控回收 + `MOBILEGL_IPC_WIRE_DEFERRED_MB` 水位线 + spawn 臂 red-once);`CollectGarbage()` 在 wire 臂从不执行的次级发现待 B3 落地后路由(`VulkanRenderer.cpp`);「pbuffer 回放 server 只收 1 条 present」另查(若 client 对 pbuffer 面跳过 present 记录,与 `design/08-runtime-and-platform.md:7` 的 1:1 相悖,且饿死 server 全部帧界维护)。40% 检查点 **6/9 已过**(§8)。 | M1 报告;`~/w7/p7-probe-m1` 探针、`~/w7/m1/` 采样器与序列。 | `CONTRACT-P7.md` §8/§12 |
|
||
| ID-P7-33 | 2026-09-22 | wave 2-B3 落地(`76bbb6c3 c9164f25 a2e244c0 511c1f16 9a494b6f`,base ae3f43ab,叠在 B2 之上自动合并):OpenRA 真机分歧的机制按裁判 H1 **由计数证实**——wire 臂一个 frame serial 两次提交(S1 = 调色板 `glTexImage2D` 触发的 pooled-fence 中帧 flush,S2 = Present 携带 draw 与 staged 拷贝),`OnSubmitsCompletedUpTo` 逐记录 `NotifyFrameSerialComplete` 把 floor 提前到 N-1,帧 N 第一次 `glBufferSubData` 走 `WriteWireBuffer:268` 的无序 host memcpy 被 S2(N-1) 排队的拷贝盖掉;两种前缀 = 上一帧写入序列的后缀极大值(6696 = 31 quad × 216 B)。修复三片:(a) 32 处静默出口全部具名 + `WireDeclines.def` 计数(无新 abort/家族词,census 79 不变);(b) `WriteWireBuffer` 对仍有读者在飞的 buffer 一律走有序路径;(c) floor 只升到「无在飞记录仍携带」的可证 serial(`#if MOBILEGL_BUILD_DISAGGREGATED`)。计数 `unsound-serial-complete` monolith/inproc/spawn = 0/26/26 → 0/0/0;red-once `F1WireScenario.StreamedBufferSubDataBeforeEachDrawIsOrdered` Split+Spawn 2/4 红 → 4/4 绿;强制回放 8102/2115/152216 px 错图 → 全 `ace2af04`。**未做**(另派 B4):裁判的 `WaitForSubmitsUpTo` 聚合等待(三处单 fence 退休站点 `Present:14094`/`WaitForSubmitIndex`/`WaitForFrameSerial`,只在无 present 的 fence 循环里不健全)与 GPU-drag 旋钮(修复后无法变红,只能做回归门)。B3 自己的第一稿机制(每第 8 次 drain)被其探针否决(OpenRA 回放 1 次 drain、33 次 serial 推进全来自 Present)。**镜头 A 的静默丢 draw 被独立否决**(32 处出口计数全 0)。门:pull rc 0、G1 恒等、census 79、ratchet 173、parity 0;unit 2429 / split 303 / spawn 219 / tcp 222(首跑因上一次被杀的门留下两个 `libMobileGLServer … 40613 --serve` 占端口而 220 红,清理后重跑 222/222)/ magma **95/74/76** / full 534。真机验收(p7w5):OpenRA inproc+spawn × run-ahead+lockstep 各 6、dump-armed ×3、FIF=8 ×3 全 `ace2af04`;修复前错图应为 quad 前缀 `K+1 ∈ {1,16,31,53}`。 | `notes/p7/magma-b3.md`;ID-P7-19/25 的两次改判到此闭合。 | `VulkanRenderer.{cpp,h}`、`VkBufferManager.{cpp,h}`、`VkTextureManager.cpp`、`WireDraw.inc`、`WireDeclineTally.h`、`WireDeclines.def`、`F1WireScenario.cpp` |
|
||
| ID-P7-34 | 2026-09-22 | **OpenRA 真机项关闭**:p7w5(`713bea9a`,B3 之上)验收 **27/27 golden**——inproc / spawn × run-ahead / lockstep × 冷 / 热各 3、`FRAMESINFLIGHT=8` ×3(p7w4 上 6/6 红)、dump-armed ×3(p7w4 上 0/5 绿),全部 ssim 1.000000 / 0 px / `ace2af04`;iterationt ×2 与 26.3 逐位同 p7w4(`W5-verify/README.md`)。B3 的 fable 审查「带修复落地」(tcp `StaleSerial` 条目空转 → parity 例外;floor 钳位无车道 → `run_trace_case.cmake` 对 split 回放里的 `unsound-serial-complete` 行打红;`02bb5789` 的注记把提交项当成修复且仍讲 drain 机制 → 改写、`:273` 加 `IsSubmitIndexComplete(lastUseSubmitIndex)`、`:432` 重打戳;`WireDeclines.def` 53 行里 12 行无站点、纹理站点只计数 → 补齐或删行)交 B3 返工一轮;审查确认 floor 算术对每种顺序精确、`#else` 逐字、无卡死模式,并**否决**裁判的次级「聚合等待」为非缺陷(fence 信号覆盖更早的提交序工作;B 的回读洞是相反形状)——B4 降为后续包(GPU-drag 回归门 + §12 债)。§12 新债:disaggregated 构建的 monolith 臂在中帧 flush 下比 pull 构建更健全(`OnSubData` 经 `IsResourceBusy` 读同一 floor),pull 构建保留该潜在 bug(G1,P13)。 | 门 3 分母 36 现在只剩 bsl-esc-menu(M2)与 §7.2 终局形式。 | `W5-verify/`、`CONTRACT-P7.md` §7.2 |
|
||
| ID-P7-35 | 2026-09-22 | **B2 返工 r1 审查 = rework**(fable)。r1 三提交(`856aa7ab` / `5d896170` / `db6892ec` → pipe `9fed478d` / `645dd96f` / `cc3c18c5`)在 pipe 上门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma 96 / 75 / 72、full 535,但新用例 `AFlippedMultisampleResolveMirrorsTheBandsAndAScaleDeclines` 随 `DepthStencilReadbackMatrixScenario.*` 的整套注册落到 DirectGLES 三条 split 臂与两条 monolith 条目上而红。集成者实测 monolith DirectGLES 同红(翻转 resolve 后目的地仍是 0.5 清除值且无 GL 错、缩放 resolve 无 `INVALID_OPERATION`)= **Espryt 行为**,非 wire 缺陷;先按后端名 skip 的临时提交(`3b66d1b1`,八车道全绿)被审查推翻——**DirectVulkan monolith 条目同样红**(`VulkanRenderer.cpp:9594` 翻转矩形的深度 blit「not supported yet」、`:9608` 合法缩放):wire 臂现在比 monolith 臂更正确,skip 应按车道标记 `MGITest::IsSplitLane()` 而非后端名;临时提交已从 pipe 撤下(pipe 回到 `cc3c18c5`)。第二条 must-fix:逐行 `VkBufferImageCopy` 的 `bufferOffset = row × width × texelSize` 在 stencil(1 B)宽非 4 倍数或 D16 宽为奇数时违反 `VUID-vkCmdCopyBufferToImage-pRegions-07978`(scissor 裁剪产生任意宽度)→ 行距对齐 + stencil 腿 red-once。should-fix:§7 数字取自非祖先树(`5d896170`)、`COLOR\|DEPTH` 缩放 blit 先写完颜色再拒深度的部分效应未陈述、X 与跨格式 Y 两种 decline 共用一个 `MGLOG_E_ONCE`;nit ×4(`!dstSpan` 静默返回、parity tail 必须匹配、`MsFlip1.` 旋钮孪生、`:10066`)。**r2 已派**。同日:六个在跑 agent 撞 session limit 全部死亡,按各 worktree 未提交 diff 重派为 `claude-opus-5-5` 单 agent workflow(Agent 工具的 opus 别名仍是 Opus 5)。 | pipe 停在 `cc3c18c5`(DirectGLES split 三车道各 1 红)**不推送**,r2 落地后再门再推;§12 届时抄 B2 §6 五行 + 两条新行(monolith DirectVulkan 翻转 / 缩放 MS 深度 blit 是 wire-vs-monolith 分歧;Espryt 翻转 / 缩放 MS 深度 resolve 是 P3b/P4b 债)。 | `DepthStencilReadbackMatrixScenario.cpp`、`WireFramebuffer.inc`、`magma-b2.md` §6 / §7 |
|
||
| ID-P7-36 | 2026-09-22 | **B3 返工落地(pipe `b8d10d07..3f92d0f1` + 集成提交 `75a64ce0`),fable 审查 = land with fixes。** 返工五提交:`WireDeclines.def` 53 行全部有站点、每站点一条 W/E(新审计 `scripts/ci/wire_declines_audit.py` 进 CI);`StaleSerial.` 只注册 split+spawn;注记改写(floor = 保证、提交项 = 探针)+ `WaitForWireBufferHostAccess` 早返回兼看 `IsSubmitIndexComplete(lastUseSubmitIndex)` + `ReadWireBuffer` 等待后重打戳;`run_trace_case.cmake` 对 split 回放里任一 `MGWIRE-FLOOR unsound-serial-complete` 行打红(包树上撤钳位 → inproc/spawn 各 26 行红,恢复 → 0 绿)。**集成合并裁定**:B3 的 `MAGMA_NOT_OVER_TCP` 与 B2 的 `MAGMA_SERVER_ENV_KNOB_NO_TCP` 是同一形状 → 只留 B2 的机制(`compare_arms(no_tcp=)` / CMake `mglItestServerEnvKnobArm`),`.StaleSerial.` 入同一张表;冲突外残留的一行 `not_on_arm = not_on_arm or {}`(首次运行即 NameError)删除。pipe 门:G1 恒等、census 79、棘轮 173、parity 0、unit 2429、magma **96 / 75 / 71**(tcp 少 1 = StaleSerial 条目退出)、full 535、审计 53/53/0;**OpenRA DirectVulkan inproc + spawn 回放(B3 树的 replay exe + pipe 的库与 runner)ssim 1.000000 / 0 px / 0 条 unsound-serial-complete** —— 新红条件在 pipe 上武装,并入后续每个包的门(`~/w7/logs/pipe-retrace.sh`)。审查修正(已派 B3 修复轮):must-fix 审计把注释 / 字符串里的站点当真(剥注释与字面量);should-fix 8 行窗口不看分支(按缩进块回溯)、无 `--self-test` 负控、`run_trace_case.cmake` 在 spawn 的 server 日志缺失时读作 0 行 = 绿(补 fail-closed)、注记 §5 数字未标「包树」;nit ×3;§12 新债:`WaitForFrameSerial` 在钳位后对同 serial 的后续记录会先返回 true 而 `IsFrameSerialComplete` 为 false(调用方复查 → 今日退化为伪超时;B4 修)。 | 不阻塞推送;修复轮作为新提交叠加。V1 五提交已 cherry-pick(`a1d17566..75858bfd`,尾注统一为 Fable),门 + 审查在跑;pipe 的 verify 构建(`build-verify`,`MOBILEGL_PIPE_VERIFY=ON`)首次配置以跑 `integration-verify{,-split}`。 | `wire_declines_audit.py`、`run_trace_case.cmake`、`VkBufferManager.cpp`、`magma-b3.md` |
|
||
| ID-P7-37 | 2026-09-22 | **提交尾注改写落地;B2 r2 / B3 修复轮 / V1 / F 片 1–3 全部到集成树,pipe 门全绿。** (1) 用户令「Rewrite the commits and strip the trailer」:785fed0b0 起 144 个提交改写(122 个带尾注),`origin/feat/disaggregated` 按 SHA 强推 1135c664 → `3c80cd62`(树逐字相同;与 `dev` 共有的历史不动),41 份文档 / 契约里的 SHA 引用按映射表重写;此后所有提交无尾注,pick 脚本自动剥。(2) **B2 返工 r2 落地**:用例按 `IsSplitLane()` + 后端名双 skip(monolith DirectVulkan 与 Espryt 各一条新 §12 债)、逐行拷贝行距对齐到 4 字节 + 29×32 stencil 腿(validation layer 上 `VUID-vkCmdCopyBufferToImage-dstImage-07978` ×10 红 → 0)、`DeclineWireDepthStencilResolveShape` 在任何 aspect 之前决定(`COLOR\|DEPTH` 缩放腿:颜色不再先写)、X / 跨格式 Y 各自 once 站点、`MsFlip1.` 旋钮孪生、parity 每个 tail 必须恰匹配一条(七条)。(3) **B3 修复轮落地**:审计剥注释 / 字面量、按缩进块回溯、`--self-test` 8/8 进 CI、`run_trace_case.cmake` 对 spawn 无 server 日志 FATAL、注记双行、§12 `WaitForFrameSerial` 债。(4) **V1 审查 = land with fixes**(fable):should-fix 5(server 侧 read hook 无 split 红 → hook 内施加 corrupt + 新控制条目;poison 断言分角色;中性 pack 改共享函数;武装证明改逐条 + 具名例外表;契约 §6/§8 措辞)、nit 3、注 6(放宽健全;`PipeInputs.cpp` 越分区改动按 §9 接受;G14 成立;棘轮 176 不进 CI)→ 修复轮已派(工作流子代理三次拒做——它们把用户最新一句当唯一指令——改走 Agent 通道)。(5) **F 报告并 cherry-pick**:片 1–3(常量时间令牌合一 + ≥16 字节具名拒绝 + 无令牌只 loopback 控制 + smoke 进 CI + flatc;`Welcome.dataNonce` 128 位 + `DataBind` 帧,data 连接绑定到已认证控制连接,TCP 上 250 ms 配对窗口消失,**`wireFingerprint` `0x7d4470f241d23539` → `0x03c4c293a54b3e08`,手机 server 必须随 p7w6 重部署**;PH-8 单测 + smoke,child 峰值 237 MB);片 4–6(D11 五处 + PH-2、PH-6、PH-1 (3)(4))与 PH-7 (5) 未做——需要对端字节的 fuzz 驱动(fuzz 臂 2 的第一块),另派 **F2**。**pipe 门(B2 r2 + B3 修复之后)**:G1 恒等、census 79、棘轮 173、parity 0、`@P7` 19、unit 2431 / split 304 / spawn 220 / tcp 223 / magma **97 / 76 / 71** / full 535、审计 53/53/0 + self-test 8/8、`AFlipped…` 在 monolith 与 DirectGLES 条目全部 Skipped 而 `DirectVulkan.Split.MsFlip.` Passed、OpenRA DirectVulkan inproc + spawn 1.000000 / 0 条 unsound;**verify 构建(`build-verify` = PUSH + DISAGG + VERIFY,tcp 40714)unit 2431 / integration-verify 1140 / integration-verify-split 1074 全绿**。集成工具修正:pipe 的 tcp fixture 端口改 40713(V1 门的 tcp 车道曾撞上 F 包在 40613 的 fixture,那次读数作废);门模板只在车道红时打印失败名(裸 `--rerun-failed` 在无失败表时会串行重跑整套)。 | 等 B2 r2 与 B3 修复轮的 fable 审查 + F 门 → 推送;p7w6 APK(含 F 的指纹变更)→ 手机 server 重部署 → bsl-esc-menu spawn(M2 落地后);F2 = 片 4–6 + PH-7 (5)。 | `spawn_lane_parity.py`、`WireFramebuffer.inc`、`wire_declines_audit.py`、`run_trace_case.cmake`、`AuthToken.h`、`protocol.fbs`、`Handshake.h` |
|
||
| ID-P7-38 | 2026-09-22 | **B2 r2 审查 = land with fixes**(fable):should-fix 2——`IsSplitLane()` 标记也让 `Full.` / `VerifySplit.` 两条 wire 车道以假的「monolith」理由跳过(改按 `PeekSplitRuntime().transportResolved` 门控);pre-pass 排除了默认 draw framebuffer(`!draw->IsDefault`,注释理由错),MSAA → 窗口的 `COLOR\|DEPTH` 缩放仍先写颜色再拒深度(改为以 `isWriteTarget=false` 解析目的地并撤掉排除,red-once);nit 2(措辞限定为 shape decline;note 六 → 七条 tail);域外 3 条(合法的等尺寸 MSAA → 默认 framebuffer 深度 blit 仍是 Fatal;scissor 清空目的地时静默返回;MS→MS 逐 aspect 决定)→ **B2 r3 派 fable**(第三轮,按用户 09-08 规则)。**B3 修复轮审查 = land with fixes**(fable):should-fix 3——审计 `LOGGED` 未锚定(受守卫的单行日志算作站点自己的);spawn 无 server 日志的 FATAL 放在 ARMED 检查之前使诊断变差(挪到普查之前);inproc 的 server 日志仍 `if(EXISTS)`(同样 fail-closed);nit 6(前缀字符字面量、`case`/`break` 停走、`#if` 不应停走、行号 ±1、§0 表缺一行、`MGL_WIRE_DECLINE_FALSE` 不存在);域外 3(pull-library 控制自 P6 日志改名后证据可能不可达;replay 非零退出跳过普查;B4 restart 不得再读 `record`)→ **B3 修复 r2 派 fable**。**F 门(pipe)**:G1 恒等、census 79、棘轮 173、parity 0、`@P7` 19、split 304 / spawn 220 / tcp 223(pipe 自己的 fixture 端口 40713)/ magma 97 / 76 / 71 / full 535、审计 53/53/0 + 自测 8/8、OpenRA DirectVulkan inproc + spawn 1.000000 / 0 条 unsound、verify 构建 unit 2435 / integration-verify 1140 / integration-verify-split 1074;unit 车道 2434 / 2435——`InitialCapsStartup.ANullInitialSnapshotFailsInsteadOfStartingWithAPlaceholder` 在并发构建负载下红一次、单跑 3/3 绿(已知偶红家族,原始失败输出被复跑覆盖)→ 记 flake,不阻塞;F 的 fable 审查在跑。**E1 落地**(pipe `70bbb159..b05406b5` + 引用重映射 `99882304`):231 / 231 全活、70 / 77 行逐字节同(7 行分歧 = Magma monolith draw 路径 vs wire 路径或运行噪声)、P9 例外表为空(`texture-remint-pull` 未到达)、§7.2 的 27 例 24 绿 / 3 具名停止(`PIPE_PUSH=0` 控制臂)/ 0 错答,全车道 1051 / 172 / 37 / 7(44 条非绿全是 monolith-control 条目);ROADMAP P3b/P4b 与 P7 行、CURRENT_STAGE_STATUS §5 已并入(子串合并两处失败已手工修)。 | 推送等 F 审查回;B2 r3、B3 修复 r2、V1 修复轮、M2 在跑。 | `ROADMAP.md`、`MEASUREMENTS.md` §7.2、`notes/p7/iris-census-1135c664.md` |
|
||
| ID-P7-39 | 2026-09-22 | **推送 `origin@87584d0b`**(自 `3c80cd62` 起 42 提交、0 尾注):B2 返工 r1 + r2、B3 返工 + 修复轮、V1、F 片 1–3、E1 与文档全部上远端;四份 fable 审查均 land with fixes,修复轮作为后续提交。**F 审查 = land with fixes**(fable):should-fix 5——(1) **回归**:会话绑定 data 连接后 supervisor 仍把后续每个 `DataBind` 连接经 socketpair 转给不再读取的 child:对端得不到具名拒绝(base 是 `Refuse{Busy}`)、连接被挂到会话结束,队列满(`net.unix.max_dgram_qlen`,手机默认 10)后 supervisor 阻塞在 `sendmsg`、不再 accept / 拒绝 / 收尸 → child 在 `Accept()` 后关掉自己的 hand-off 端 + `MSG_DONTWAIT`,让既有的 `Refuse{Authentication} "could not be handed to the live session"` 具名触发;(2) 指纹 pin 单边——`MOBILEGL_PROTOCOL_CONTROL_REVISION` 与 `protocol.fbs` 内容无绑定 → 以 `sha256(protocol.fbs)` 表 pin;(3) 文档:「旧 server 与新 client 按指纹互拒」只对新 server + 旧 client 成立,旧 server + 新 client 是 `AcceptPair` 等第二条连接 2000 ms 后关闭、client 见 `no Welcome … TRANSPORT_CLOSED`——正是手机未重部署时的症状,要写明;(4) 非 `--serve` TCP 的 listener 绑定后不关,第二个 client 挂满 20 s 连接预算而非 ECONNREFUSED;(5) unix 端点保留到达顺序配对,「只有本 app 能到」依赖 SELinux 而未陈述 → §12 记债;nit 6(常量时间比较循环上界是 secret 长度、≥16 字节只在 TCP、PH-8 实为「忽略、按 server 定尺寸」而非钳制、`MintNonce` 失败裸关、垃圾首帧记成 `Refuse{Busy}`、示例 `devtoken` 8 字节现在会 exit 72);注:CI 接线真实、smoke 不能空过、nonce 路径逐项核过、片 4–6 缺席不使片 1–3 不安全(两处 pre-auth 暴露为既有:fork-per-connection 10 s Hello 等待、`ValidatePeerHandshake` 先于令牌把指纹 / build stamp 给未认证对端 → F2 §12)→ **F 修复轮派 fable**。 | 下一次推送带四个修复轮;p7w6 APK 等 M2 + F 修复轮(指纹变更 → 手机 server 重部署)。 | `ServerMain.cpp`、`FdPassing.cpp`、`mg_protocol_base.h`、`ph-f.md` |
|
||
| ID-P7-40 | 2026-09-22 | **窗口 1b 开跑 + 三个修复轮到集成树。** (1) 用户在 Arch WSL 加了主机路由(`192.168.21.181/32 via 192.168.31.1 dev eth0`),route 监视器确认;手机 supervisor 已死,`tcp_device_server.py start` 重起(`0.0.0.0:40613`,token 24 字节);冻结的 p7w4 主机制品被 `Refuse{BuildFingerprint} … peer=p7w5-c89000f5` 拒绝(`MOBILEGL_IPC_REQUIRE_SAME_BUILD`)→ 在 p7w5 的提交(改写后 `713bea9a`,树同 c89000f5)建 `~/w7/p7-w5host`、`-DMOBILEGL_BUILD_STAMP=p7w5-c89000f5 -DMOBILEGL_BUILD_TRACE_REPLAY=ON`(apitrace 三方从 pipe 只读复制),制品 `~/w7/logs/p7w5host/host/`(stamp 字符串 1);**P6.5 残余 39 例 DirectGLES TCP 矩阵(WSL client ↔ 手机 server,credit 2,`--require-run-ahead`)已在跑**,产物 `~/w7/logs/p7w1b/matrix5/`。(2) **B3 修复 r2 落地**(pipe `9d5f5012..f4b0662d`):`LOGGED` 锚定 + 字符前缀 + 块回溯停在同缩进 `case`/`break`/`return`、跨过列 0 `#if`(自测 14/14,旧审计 6 个假绿 / 假红被抓)、`run_trace_case.cmake` 的 server 日志 FATAL 挪到 ARMED 之后、inproc 同样 fail-closed(两条 FATAL 行在 `:384`)、pull-library 控制自 P6 日志改名后确实不可达(实测 rc 1)→ 接受 no-client-log 句为证据;门全绿(unit 2434/2435,仍是 `InitialCapsStartup.ANullInitialSnapshot…` 一例在并发负载下红、单跑 3/3 绿——**连续两次门都撞它,列为待修 flake**);fable 审查在跑。(3) **V1 修复轮落地**(pipe `ca8cbe5c..0bc59ab2`,Agent 通道):`MGPipeNeutralReadPixelsPack()` 共享函数、read hook 在 `CopyField` 后与中性 pack 覆盖后各施加一次 corrupt + `VerifySplitReadCorrupted.` 双后端控制(server 半边 3/2 行 `where=read`,client 半边 0;撤掉 → 2/2 红)、poison 控制断言 server 半边、武装证明改逐条双向普查 + 56 名具名例外表(5 类,gtest skip 不入表)、车道日志先留副本再跑控制、契约 §6/§8 措辞(§8 的检查点句保留)、§12 spawn-verify 一行并入;包树 verify-split 1072 / verify 1138。(4) **B2 r3 落地**(fable,pipe `6f1c6d26..11edc8e3`):skip 门改 `!IsSplitLane() && !PeekSplitRuntime().transportResolved`(`Full.` 三臂由 Skipped 变 Passed、`VerifySplit.` 在 verify 构建上 Passed、monolith 仍 Skipped)、pre-pass 不再排除默认 draw framebuffer(`isWriteTarget=false` 解析两侧;red-once:恢复排除 → `MsFlip.` split/spawn 读到红/绿而非蓝)、新腿 MSAA→窗口 `COLOR\|DEPTH` 2× 缩放、§6 项 8–10(A/B/C 域外债);门 `v1fb2r3` + 两份 fable 审查在跑。 | 等三份审查 + 门 → 推送;F 修复轮、M2 在跑;矩阵结果入 `notes/p65/`(窗口 1b)。 | `wire_declines_audit.py`、`run_trace_case.cmake`、`PipeFill.cpp`、`WireFramebuffer.inc`、`~/w7/logs/p7w1b/matrix5/` |
|
||
| ID-P7-41 | 2026-09-22 | **M2 到集成树;三份审查 land with fixes;窗口 1b 的真相是配对窗口。** (1) **V1 修复轮 + B2 r3 门全绿**(pipe:unit 2435 / split 304 / spawn 220 / tcp 223 / magma 97 / 76 / 71 / full 535,verify 构建 unit 2435 / integration-verify **1142** / integration-verify-split **1076**,OpenRA split 回放 0 unsound)。(2) **B3 修复 r2 审查 = land with fixes**(fable):审计跨过 `#endif` 会接受被 `#if 0` 编译掉的日志、缩进的 `#else` 不停走(两处潜在假绿,树上无实例)、注记 B4 句的两个行号是包树号、`stub_ctest.sh` 模式位被翻、`EVIDENCE` 空模式的保护 → **B3 修复 r3 派 fable**。(3) **B2 r3 审查 = land with fixes**(fable):窗口腿的底色与用户 FBO 相同(蓝 / 0.5),读错面也会过——改成独一无二的底色;`IsSplitLane()` 合取项在可达状态下恒为死代码;三处行号已陈旧 → 改按符号引用 → **B2 r4 派 fable**(第四轮,只有测试与文档)。(4) **M2 落地**(pipe `b81a8827..7d131527`,含集成提交):孤儿 wire store 在 defer 路径上回收(`lastUseSerial==0` 立刻、park 时的 submit index 完成后、渲染器空闲时),`MOBILEGL_IPC_WIRE_DEFERRED_MB` 水位线(默认 64,0 关)+ 1,024 个 store 的计数上限触发 `WaitForSubmitIndex` 同步、失败走既有 `Fatal{ResourceUnavailable,"buffer-write-sync"}`(census 79 不变);`ServerSpawn.cpp` 的环境清洗按名放行该旋钮(分区外,**集成者按 §9 接受**,理由:不放行则 spawn server 看不到设置,实测 47 MiB 对 8 MiB 预算零同步);server 发布 `wbuf[wbufs wlivepk wdefpk wdefsync]` 四个 PipeStats 计量;`MagmaWireReclaimScenario` 三例 split+spawn(tcp fixture 拿不到 server 环境与私有日志 → 并入 `MAGMA_SERVER_ENV_KNOB_NO_TCP`,一例一 tail,共十条)。主机(lavapipe,M1 harness):bsl-esc-menu-854 spawn server 峰值 825 → **546 MiB**、映射 41k → **5.8k**、活 VkBuffer 25,935 → ~1,053 稳态;inproc 1175 → 894 MiB;ssim 不变;red-once:1,024 次无 draw 的 respecify 活峰 1025 vs 4、48 轮 1 MiB parked 49 MB vs 9 MB、旋钮 0 复现红数。**新发现**:M1 把映射增长归给 VkBuffer 是错的——字节上限单独生效时 VkBuffer 降到 32 而映射不动,增长是 4 KiB `memfd:allocation` = lavapipe 的 descriptor set(27,377 对 28,134 映射):wire 臂在长帧内不断分配新 descriptor set(`UniformManager` 只在 `BeginFrame` / drain 时回卷),今天只靠 M2 的强制同步带来的 drain 约束着;Adreno 上它们在驱动堆里,是手机 scudo 死亡的强嫌疑 → **M3 包**(`UniformManager.cpp` / `VulkanRenderer.cpp`,B4 之后或并入)。集成时的教训:pick 脚本的解析步骤失败后仍 `--continue` 把带冲突标记的文件提交了一次(未推),已 reset 重做并让脚本 fail-closed。M2 门 + fable 审查在跑。(5) **窗口 1b**:手机 supervisor 起来后,单例 OpenRA 过(run-ahead ARMED,12.7 s),但 39 例循环全部 0.3 s 失败,手机侧每个 child `exit=67` + 「only 1 of 2 connections arrived within 250 ms」——**就是 PH-7 (4) 的配对窗口,在直连 LAN 上同样触发**(不只是 adb forward);逐例 3 s 间隔时会话能起来,于是改用逐例分步驱动跑两遍(第二遍只跑失败例,逐例抓 logcat),产物 `~/w7/logs/p7w1b/paced/`。前三例已见:startup 过;OpenRA 一次过一次 `Fatal{ReadbackDeclined,"ReadPixels"}`(**设备上 DirectGLES server 拒了 ReadPixels,主机从未出现**);main-menu 在 48 s 时 server 进程死亡(`DEVICE LOST` → `Fatal{UncarriedInitialBytes}`)。这些是窗口 1b 要收的读数;配对窗口本身由 F 的 `DataBind` 消除,p7w6 部署后重跑一遍作对照。 | M2 门 + 审查 → 推送;矩阵两遍跑完 → `notes/p65/` 窗口 1b 报告 + ID;M3(descriptor set)待派;F 修复轮、B3 r3、B2 r4、V1 修复审查在跑。 | `VkBufferManager.{h,cpp}`、`ServerSpawn.cpp`、`PipeStats.h`、`MagmaWireReclaimScenario.cpp`、`~/w7/logs/p7w1b/paced/` |
|
||
| ID-P7-42 | 2026-09-22 | **M2 门全绿;F 修复轮落地且门全绿;B3 r3 / B2 r4 到集成树;V1 修复轮审查 = land with fixes。** (1) **M2 门**(pipe):G1 恒等、census 79、棘轮 173、parity 0(十条 tail)、unit 2434 / 2435(同一 flake)、split 304 / spawn 220 / tcp 223、magma **100 / 79 / 71**(+3 `Reclaim.` 于 split 与 spawn)、full **538**、verify 构建 unit 2435 / integration-verify **1148** / integration-verify-split **1082**、OpenRA split 回放 0 unsound;fable 审查在跑。(2) **F 修复轮落地**(pipe `0293aebb..9cea5140`):child 在 `Accept()` 后关掉 hand-off 端 + `SendFd` `MSG_DONTWAIT`(base:12 条多余 DataBind 挂起、supervisor 卡在 `sendmsg`;后:12 条全部 `Refuse{Authentication} "could not be handed to the live session"`,新控制连接得 `Refuse{Busy}`)、listener 绑定后关(第二个 client 立即 ECONNREFUSED)、`scripts/ci/protocol_revision_pin.py` + `protocol_revision_pins.json` 把 `sha256(protocol.fbs)` 钉到 `MOBILEGL_PROTOCOL_CONTROL_REVISION`(改 schema 不 bump 即红;ctest `ProtocolSchema.RevisionPinsDigest` + `flatc-check` 作业步骤)、令牌比较定宽 64 字节、超额 Hello 请求记一条 `MGLOG_W`、`MintNonce` 失败先回 `Refuse{LinkTerms}`、垃圾首帧回 `Refuse{MalformedHello}`;文档:指纹拒绝是单向的(旧 server + 新 client = `no Welcome … (rc=6)`,即手机未重部署的症状)、unix 配对窗口与 SELinux 假设、两处 pre-auth 暴露 → §12(集成时 F 那条 §12 的「互拒」句已改正);门:unit **2436** / split 304 / spawn 220 / tcp 223 / magma 100 / 79 / 71 / full 538 / verify 1148 / 1082 全绿、G1 恒等;fable 审查在跑。(3) **V1 修复轮审查 = land with fixes**(fable):read 侧控制只要求一行——`savedPack` 经访问器读取已在中性窗口内,第一块 corrupt 单独就能红,第二块(backend read)无反证 → 断言 ≥ 2 行;「client 半边 0 行」的原因不是入口比对不报而是 **client 日志在退出时被截断**(`Debug::Close()` 后静态 `~VerifyState` 记摘要,`WriteToFile` 重开文件 "w"——既有缺陷,波及所有 `FATAL=0` 产物)→ **V1 修复 r2 派 fable**(verify 侧在 Close 之前 flush 摘要,不动 `Log.cpp` 以守 G1)。(4) **B3 r3 与 B2 r4 到集成树**(pipe `bd849b28..4b96f55d`):审计跨 `#endif` 只对整行 `#if MOBILEGL_BUILD_DISAGGREGATED` 放行、任意缩进的 `#else`/`#elif` 停走(16/16 夹具)、tcp 检查信息带 `MOBILEGL_IPC_CONTROL`、`EVIDENCE` 空模式保护、`stub_ctest.sh` 模式位恢复;B2:窗口腿底色改品红 / 0.625(读错面时三臂全红,已演示)、去掉死合取项、§6 按符号引用;门在跑。**V1 审查第 5 条(落地数字)**:契约 §6 与状态页改用 pipe 的 verify 构建读数(1148 / 1082),note 的表保留包树数字并标注。 | M2 + F 修复审查回 → 推送(含 B3 r3 / B2 r4);X2(`InitialCapsStartup` flake)、V1 修复 r2 在跑;窗口 1b 矩阵在跑。 | `ServerMain.cpp`、`FdPassing.cpp`、`protocol_revision_pin.py`、`wire_declines_audit.py`、`DepthStencilReadbackMatrixScenario.cpp` |
|
||
| ID-P7-43 | 2026-09-22 | **M2 审查 = land with fixes,含一条 must-fix;集成者会话收尾并交接。** M2 审查(fable):**must-fix** = 中帧 use-after-free 的新可达点——M2 让孤儿 wire store 在帧中被销毁,而 `UniformManager` 的 `FastRebindMemo` 按裸 `VkBuffer` 句柄命中、descriptor-reuse memo 的签名混入 `VkDescriptorBufferInfo` 字词,二者都不看 epoch;句柄被堆复用后同一 program 的下一次 draw 命中旧 descriptor set → 静默错 UBO / SSBO 字节、无 Fatal(base 上 wire store 只在 `BeginFrame`/drain 死,与 memo 清空配对,M2 打破了配对)。修法 ~10 行:`VkBufferManager` 的 `m_wireStoreDestroyEpoch` 在每条销毁路径上自增,`UniformManager` 的两个 memo 带上 / 混入它(disagg 守卫内)——在 M2 分区之外,**集成者按 §9 批准例外**,已派 **M2 r2**(fable);同轮:note §0 引用改 pipe SHA、`VkBufferManager.h` 的「floor 非证明」去掉过期理由、case 3 单侧断言补 `ASSERT_GE`、「never decreases」注释、`RespecifyWireBuffer` 清 `lastUseSubmitIndex`、`ServerSpawn.cpp` 清洗名单补 `SpinUs/ServerAffinity/Audit`。审查确认:提前释放的三个条件健全(每条把 store 交给 GPU 的路径都打 `lastUseSerial`;park tag ≥ B3 的 `lastUseSubmitIndex`;`IsSubmitIndexComplete` 拒绝未提交索引;空闲判定真)、水位线同线程无跨线程等待、失败漏斗同族一处 abort、计量 / 配置全在 push / disagg 守卫内、descriptor-set 归因成立(VMA 子分配,M1 的「一 VkBuffer 一 memfd」不可能)。**用户令收尾**:让在跑的 agent 跑完并把报告写到 `~/w7/notes/handoff/`,机械未完项写进 [`HANDOFF-2026-09-22.md`](HANDOFF-2026-09-22.md)(M2 r2 落地 → p7w6 + 手机 server 重部署 → bsl 验收 / 窗口 1b 对照 / 门 3 终局 → M3 → B4 → F2 → wave 3 棘轮 88 → wave 4 CTS AFTER → wave 5),交给其他 agent。 | 推送集成树头(门全绿;M2 的 must-fix 由 M2 r2 关闭,在此之前 wire 臂有一处已知可达的 memo ABA)。 | `UniformManager.{h,cpp}`、`VkBufferManager.{h,cpp}`、`HANDOFF-2026-09-22.md` |
|
||
| ID-P7-44 | 2026-09-22 | **用户叫停 fable 审查代理,改由集成者本人审查。** F 修复轮 = **land**(两 nit 记债:`RunSession` 里 `Accept()` 返回到 `close(sourceFd)` 之间已转发的一条 DataBind 会随队列被关而无具名拒绝,微秒级窗口;`protocol.fbs` 任何字节变化都要 bump,严格但有意);B3 修复 r3 + B2 r4 = **land**(审计跨 `#endif` 只认整行 disagg 守卫、任意缩进 `#else` 停走;`EVIDENCE` 三种空模式都拒;模式位 100755;窗口腿底色品红 / 0.625 独一;门控只看 transport)。审查文本在 `notes/handoff/review-f-fix.md`、`review-b3r3-b2r4.md`(仓库与 WSL `~/w7/notes/handoff/` 各一份)。 | 集成树头已推送;余下机械项见 HANDOFF。 | `notes/handoff/` |
|
||
| ID-P7-45 | 2026-09-22 | **X2 落地**(pipe,test-only):`InitialCapsStartup.*` 与 `SocketTransportTest` 的 TCP 用例在负载下偶红的真因是**夹具**按 accept 顺序配对两条 loopback 连接,而内核在负载下会乱序交付(裸 socket 探针:空闲 0/2000、20 个 CPU 占用者下 5/3000)——对端把数据套接字当控制用,`StreamLink` 读到 `MGLD` 魔数外的首帧 → `Fatal{ProtocolCorruption,"StreamLink"}`;夹具改用产品的 DataBind nonce 会合(PH-7 (4) 形状),三例 0/500;无产品字节变化,G1 恒等。域外债:`AcceptPair`/`ConnectTo` 对 `tcp://` 监听仍可调且按顺序配对(产品从不这样用),未具名拒绝。 | pipe unit 车道全绿后推送;`~/w7/notes/handoff/x2-caps-flake.md`。 | `InitialCapsStartupTest.cpp`、`SocketTransportTest.cpp` |
|
||
| ID-P7-46 | 2026-09-22 | **M2 r2 落地(集成者本人审查 = land,must-fix 关闭)**:`VkBufferManager::m_wireStoreDestroyEpoch` 在四条销毁 wire store 的路径上自增(`DeferWireRelease` 即时销毁、有销毁的扫描每次一跳、`DestroyAllDeferredWireReleases`、`Shutdown` 清 record 持有的 store),永不复位;`UniformManager` 的 descriptor-reuse 签名 `mix64(epoch)`、`FastRebindMemo` 记录并比对(全在 disagg 守卫内;§9 分区例外已批);第四条 Reclaim 用例(一帧内 orphan → 不等待的 flush → 一条 staged copy 挡住清 memo 的 drain → 下一次停放的扫描销毁 S1 → 64 KiB 经同一句柄值铸造、放不进 1 MiB pin 封住的 256 B 洞 → draw)red-once 两臂读到死 store 的颜色,加守卫后绿。集成者核对:扫描在 `dead == 0` 先返回、不空跳 epoch;`DestroyWireBuffer` 先 move 进 defer 再 erase;文件里其余七处 `buffer.Destroy()` 都是非 wire record;`FastRebindMemo` 聚合初始化顺序与结构体一致。pipe 独有一行:`RespecifyWireBuffer` 顺带清 B3 的 `lastUseSubmitIndex`(`f62703e9`);`spawn_lane_parity.py` 的具名例外表补第四条 tail(`1ab62ece`;包分支按前缀例外、pipe 两次合并后按精确名——门上唯一的一条 parity 红就是它);`ServerSpawn` 放行 `SPIN_US` / `SERVER_AFFINITY` / `AUDIT`。**代价记 §12(M3 的分母)**:每次销毁事件后同 program 第一笔 draw 多一次 descriptor set 分配 + 写(bsl ~2.6 万 / 130 万)。方法学:`MobileGLIntegrationTest` 桌面上静态链接 `MobileGL_s`,Split 臂跑的是编进测试二进制的 backend——red-once 变体必须三个目标都建。 | 门(`f62703e9`):unit 2436、split 304、spawn 220、tcp 223、magma 101 / 80 / 71、full 539、G1 恒等、普查 79、棘轮 173、审计 53/53/0、OpenRA inproc + spawn ssim 1.0 / 0 unsound、verify 1150 / 1084;parity 0(`1ab62ece`);推送。审查文本 `notes/handoff/review-m2-r2.md`。 | `VkBufferManager.{h,cpp}`、`UniformManager.{h,cpp}`、`MagmaWireReclaimScenario.cpp`、`ServerSpawn.cpp`、`spawn_lane_parity.py` |
|
||
| ID-P7-47 | 2026-09-22 | **V1 修复 r2 落地(集成者本人审查 = land)**:(1) read 侧负控数到 **2**——server 在 ReadPixels 窗口内读 pack 字段两次(applier 装中性 pack 之前的 saved-pack 读、backend 装后的读),hook 每次读各施加一次扰动(ID-49 的窗口内覆写会抹掉第一次),只认一行的控制对两块扰动都不证伪;`VerifySplitReadCorrupted.` 与 CI 步都要 `where=read` ≥ 2 行;证伪的不对称性已量出(去掉块 2 两后端都掉到 1;去掉块 1 只有 DirectVulkan 掉到 1,DirectGLES 装后读两次仍是 2)→ CI 两后端都要。(2) FATAL=0 的 verify 摘要改由 `DestroyImpl` 在 `Debug::Close()` 之前调 `MGPipeVerifyFlushSummary()` 写出(`#if MOBILEGL_PIPE_VERIFY`):此前命名空间级静态的析构在 `__run_exit_handlers` 里写、`Log.cpp` 以 "w" 重开已关的 sink,于是每个 FATAL=0 的 client 半边只剩摘要一行(121 B;预存缺陷)——现在 7461 / 7386 B,武装行、entry 报告、摘要末行齐全;`FlushSummary` 以 `Summarised` 幂等,从未 Destroy 的进程保留旧臂。(3) 两处引文修正;`CONTRACT-P7` §6 那句与集成树的版本冲突,取树上句子 + 包的改动(去掉 CMake 行号引文,只留守卫)。集成者核对:`CountReadReports` 按行、CI 计数 `grep -c … \|\| true` + `${reads:-0}` 缺文件读 0 即红;两个写者顺序执行故 `Summarised` 不必原子;pull 构建无字节变化。包 note 的车道计数表未改,以本门为准。 | 门(`336174e3`):unit 2436、split 304、spawn 220、tcp 223、magma 101 / 80 / 71、full 539、G1 恒等、普查 79、棘轮 173、parity 0、审计 53/53/0、OpenRA inproc + spawn ssim 1.0 / 0 unsound、verify 1150 / 1084;推送。审查文本 `notes/handoff/review-v1-fix-r2.md`。 | `PipeFill.cpp`、`PipeInputs.h`、`Init.cpp`、`PipeVerifyArmingScenario.cpp`、`test.yml`、`split_log_paths.py` |
|
||
| ID-P7-48 | 2026-09-22 | **窗口 1b 配速矩阵的中期读数与假设(未结)。** 44 / 78 例跑完时 pass 1 = 27/39 红:主因是 `DEVICE LOST`(client `mobilegl.client.log`:「the barrier woke on a peer that had hung up」= 对端 TCP 挂断,随后的 `Fatal{UncarriedInitialBytes, "resource_respecify"}` 是 `PipeFill.cpp:1080` 的**下游**判定,不是原因);其中 11 例的失败时长聚在 **57–61 s**(sodium 56.3、xaero-minimap 60.5、journeymap 61.1、modernui 56.9、rei-normal 60.8、…);pass 2 同例已有 3 例转绿(1.17 main-menu、sodium、common-mods),即非确定性。手机侧:`settings get system screen_off_timeout` = **60000**,`dumpsys battery` = AC 供电(`stay_on_while_plugged_in=2` 只对 USB),`am_kill` / `logcat -b crash` 在本轮时段无任何记录,`:mglsrv` 服务进程存活(child 是每例 spawn 的 pid)。**假设**:runner 每例 `wake-adb` 点亮屏幕,~60 s 息屏后 MIUI 的后台策略切断 child 的 TCP(不是 OOM、不是崩溃、不是配对窗口)。**不在本会话改设备状态**(保持两遍数据同口径);下一位先 `adb -s 2f7cbe2e shell svc power stayon true`(或 `settings put system screen_off_timeout 1800000`)再重跑,并把 supervisor 对 child 的 reap 行(`tcp_device_server.py`)纳入每例采集——现在 `phone:` 列只抓 0.5 s 的 logcat。 | 报告待 `=== ALL DONE`:`~/w7/logs/p7w1b/paced.log`、`paced/pass/<case>/`。 | `notes/p65/`(待写) |
|
||
| ID-P7-49 | 2026-09-23 | **窗口 1b p7w5 中断批次校正 + p7w6 设备 bsl 验收。** 旧脚本实际挑 38 条 DirectGLES CI case(交接的 39 是误数),pass 1 = 11 绿 / 27 红,其中 23 条 client 记 DEVICE LOST;pass 2 仅 13 条即 adb 从 Windows/WSL 消失,4 转绿、9 仍红。旧脚本同一条 `local` 赋值使两遍写到 `pass/<case>`,13 条第一遍原始文件被覆盖;报告逐例保留摘要能证的事实。p7w6 APK `p7w6-0e16ca27` 已重装并重起 supervisor,`stayon=15`;bsl-esc-menu DirectVulkan pbuffer inproc/spawn 各三遍 6/6,实际 PNG SHA 全同且与旧 monolith 完全相同,0 Fatal。p7w6 主机 TCP OpenRA 冒烟通过;38 例对照续跑中,旧外层 900 s 比 case 清单最大 1800 s 短,`rei-inventory` / `xaero-minimap` 的两次截断不算产品结果,续跑改 1900 s。 | bsl 设备项关闭;门 3 终局形式、p7w6 TCP 对照仍在跑。证据 `notes/p65/window-1b-p7w5.md`、`notes/p7/device-window-1/W6-verify/`。 | `run_android_retrace_local.py` 的显式 APK 路径 `f749d4c3`;手机日志 `~/w7/logs/p7w6-matrix{,-resume}/` |
|
||
| ID-P7-50 | 2026-09-23 | **M3 到集成树,集成者本人对 pipe 源码审查 = land。** `UniformManager` 当前 frame slot 每 2048 次 descriptor Acquire,在下一条 wire draw/dispatch 入口先 flush 当前录制、graphics queue idle 证明所有旧 descriptor 读者退休,再回卷每个 layout 游标及四类 memo;不用旧 `WaitForSubmitIndex` 的单 fence 推断。2049 个不同 SSBO 窗口单帧用例 split/spawn 绿(`retiredSubmit=2 cached=2048`),禁用入口回卷两臂按名红,恢复绿。主机 bsl-esc-menu inproc/spawn 均为 M2 后同一 `ssim=0.998402`、0 Fatal;真实触发一次 M3 回卷,spawn `wbuf[wlivepk=1052 wdefsync=22]`。G1 `.text=0xa52203`、符号 0/0、普查 79、棘轮 173、parity 0、审计 53/53/0;pipe 门 unit 2436 / split 304 / spawn 220 / tcp 223 / magma 102/81/71 / full 540 / verify 1152/1086 全绿,OpenRA 两臂 1.0 / 0 unsound。 | M3 源码 `9fd768d4` 已落地,审查 `notes/handoff/review-m3.md`;设备 p7w6 是 M3 前二进制,M3 设备回归待下一版。queue idle 的极长帧 stall 只记性能。 | `UniformManager.{h,cpp}`、`VulkanRenderer.{h,cpp}`、`MagmaWireReclaimScenario.cpp`、`magma-m3.md` |
|
||
| ID-P7-51 | 2026-09-23 | **B4 落地,集成者源码审查 = land。** pipe 提交 a4c1bc8b / b19297d5:聚合 fence 前缀等待与目标索引存在性检查、WaitForFrameSerial 退休后重扫并重查地板、Present 槽 command-buffer 回收前等待、pre-pass work 纳入 pending、wire draw/dispatch 周期性 prune、AdoptRun extent 变更清旧 coverage。确定性单 fence 负控共享生产 fence-prefix selector;完整 split 与 verify lanes 均 0 失败,G1 .text 0xa52203 / symbols 0/0,census 79/0 未标记、ratchet 173、parity/audit 通过,OpenRA 两臂 1.0 / 0 unsound。审查 notes/handoff/review-b4.md。 | B4 package + pipe 门全绿,日志 ~/w7/logs/p7b4-integration-b19297d5-rerun-20260923/。 | VulkanRenderer.cpp、FrameContext.cpp、VkBufferManager.cpp、StagedTextureStore.h、SubmitFencePrefix.h |
|
||
| ID-P7-52 | 2026-09-23 | **窗口 1b p7w6 DirectGLES × TCP 矩阵结案(独立调查,不是门 3)。** 38 例含 9 缓存跳过;29 次尝试 = 16 pass、8 idle timeout、2 视觉失败、3 missing-result timeout。缺结果/超时不计视觉产品红。Iris Photon v1.3b SSIM 0.008877075、D24.4.14 SSIM 0.850784981;Photon server shader varying link 失败后 program 0,D24 为部分场景错绘;两者需设备 DirectGLES monolith 对照。normal-world 与若干长例停在等待且无 P65 进展;B4 host gate 与未知子集 attempts 重叠,timeout 结论需保留此限制。 | 逐例 armed/reap/SSIM/timeout 见 notes/p65/window-1b-p7w6.md;原始日志与图片 ~/w7/logs/p7w6-matrix-resume/pass1/。 | p7w6 APK p7w6-0e16ca27(M3 前) |
|
||
| ID-P7-53 | 2026-09-23 | **p7w6 DirectGLES 错图 monolith 对照完成。** 设备 Redmi `2f7cbe2e` 上跳过重装,TCP 与 monolith 复用同一个 trace 和同一个 APK;测前后 APK SHA-256 都为 `780bb00e81b9cf2e84298543692c1b005c281dfc2a0f499bfa1af86772625590`。Photon v1.3b 的 monolith SSIM / mismatch 与 TCP 完全相同(0.008877075 / 403024),两臂复现相同 shader varying link errors;D24.4.14 monolith 0.850671535 / 402596,TCP 0.850784981 / 402598,两臂都碰到 attribute location 超设备限制。判定:两项是同 APK 的 DirectGLES monolith 也能复现的 baseline 错图,不是 TCP split 专属回归。 | 截图、`result.json`、logcat、两侧应用日志:`~/w7/logs/p7w6-monolith-compare/`;trace SHA Photon `217d4939…a69b3`、D24 `fe89d01b…9228b0`。设备回到 Home,无源码或提交变更。 | DirectGLES × TCP 错图判定 |
|
||
| 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-60 | 2026-09-23 | **P7 收官异模型审查(codex,`6afa077f`)= yes-with-fixes,分诊后修掉五项、记债两项。** 修:越界 / 空存储图像单元有 `VK_EXT_robustness2` nullDescriptor 时绑空描述符(读 0、写丢,GL §8.26 精确),否则按 (形状, 单元) 私有占位(上限 384)——原共享占位让单元 A 的写被单元 B 读到;PH-5 改按元素最小编码宽度限 count(原 `sizeof(T)` 会拒掉编码器自己产出的紧凑合法归档,如多个短 XFB 名);DrainRing 每次 pop 前再查闩(控制线程闩住后的窗口收窄到 check→pop);深度 resolve 探针判定按物理设备身份缓存;窗口 2 判读器硬编码 §7.2 常量(≥3 遍、四臂齐、规范 36 例集合)、CTS 的 Pass→NotSupported 流失计入非通过(裁定过的出分母)、跨臂不同图未裁定即 PASS-NEEDS-ADJUDICATION。记债:对端在已声明大层末尾写几字节会按整层零填(上限 = 设备限制,已认证对端用合法大纹理也能要到同量,不在 ID-P7-3 威胁模型内);`SessionRings` 对闩住的记录也前进 `appliedSeq`。 | 分诊 `notes/handoff/review-p7-closeout-codex.md`;修复 `p7/int3` | `WirePlaceholderImages.inc`、`WirePlaceholderKey.h`、`ProgramArtifactsCodec.cpp`、`ServerLoop.cpp`、`WireDepthResolveArm.h`、`60-reduce.py` |
|
||
| ID-P7-61 | 2026-09-23 | **spawn 冷启动:client 的回复预算改量「沉默」而不是「操作时长」,控制协议修订 1 → 2。** `6afa077f` 的 CI 有一条 spawn retrace 腿「ALIVE BUT SILENT,20 s 内没有 CreatePbufferSurface 回复」;同签名在 F2 之前(5 s 预算时 11/77、17/77 腿)就有,本地 4,820 次拉起 0 复现,模拟 21 s 冷拉起与 CI 逐行同形——根因是冷 runner 上首次 `eglInitialize` 装载 libLLVM/libgallium ≈ 20 s,而不是丢唤醒。修法:server 在 apply 线程执行 surface 操作期间每 250 ms 发 `SurfaceProgress{seq, elapsedMs}`,client 每收到一个就重置预算(从发送起封顶 120 s);冻住的 server 照样按名超时;≥1 s 的控制分派记日志。red-once:3 s 拉起对 1 s 预算修前 10/10 红、修后 30/30 绿。**wireFingerprint 变,设备 server 随 APK 重部署。** | `p7/spawnhang` `307535dc` | `ServerLoop.cpp`、`ServerMain.cpp`、`ClientSession.cpp`、`protocol.fbs` |
|
||
| ID-P7-62 | 2026-09-23 | **门 3 判读裁定:monolith 自身不逐位稳定的 case 改用分布判据;create-instancing 的 1:1 LINEAR blit 偏差修掉。** 窗口 2(`6afa077f`)门 3 严格读数 33/36:sundial-lite、bliss、derivative d24.4.14 的 split 三遍各三张不同图。同会话设备追查:monolith 也不稳定(sundial 9/9 不同、derivative 9/9、bliss 11/18),两臂变动的是同一批像素(Jaccard 与 split-vs-split 基线相当),lockstep / FIF=1 都不稳定,主机 syncval 0 hazard;derivative 的根因在光影包自身(同一 dispatch 内对同一图像 `imageLoad`/`imageStore` 的边框竞态)。**规则(CONTRACT-P7 §7.2 修订)**:同会话 monolith ≥3 遍不逐位相同的 case,split 的逐位条款换成「每遍对每个 monolith 读数 \|Δssim\| ≤ 0.0005,且每个 split 遍对最近的 monolith 遍:差异像素 ≤ 1.25 × D_mm + 32、最大通道差 ≤ 1.5 × Δ_mm + 8(D_mm / Δ_mm 取 monolith 留一最近邻的最大值)」,monolith 臂改跑 ×5;按窗口 2 的实拍图模拟,×5 下 sundial / bliss / derivative 通过率 100% / 99.9% / 100%、纯噪声对照 100%,窗口 2 加同会话追查的 monolith 读数重判 36/36;monolith 稳定的 case 仍逐位严格。create-instancing:split 两臂逐位稳定但与 monolith 差 712 px ±1 LSB——wire 臂把 1:1 `GL_LINEAR` 默认帧缓冲 blit 走着色器 + 线性采样,Adreno 采样位置微偏;未缩放时改最近邻(结构性单测,lavapipe 看不到)。 | 追查 `~/w7/logs/g3det/{DEVICE,HOST,VERDICT}.md`;终局窗口读数见 §7.2 | `WireColorBlit.inc`、`30-gate3.sh`、`60-reduce.py` |
|
||
| ID-P7-63 | 2026-09-23 | **P7 收官:CONTRACT-P7 §8 的 9 项分母全绿。** 终局设备窗口 3(`p7w8-78e71f2b`,Redmi 2f7cbe2e,reboot-clean、pinned、1152 条记录同一 boot_id):**门 3 PASS 36/36**——33 例 monolith ×5 / inproc ×3 / spawn ×3 四臂逐位同(create-instancing 在 1:1 blit 最近邻后与 monolith 同图),三例 Iris(sundial-lite 5/5、bliss 3/5、derivative 5/5 张不同 monolith 图)按 ID-P7-62 分布判据通过(split 到最近 monolith:sundial 3928 px / Δ24 对界 4795 / 59,bliss 9 / 3 对 36 / 12.5,derivative 8768 / 49 对 10891 / 83),OpenRA 四臂 1.000000,`RUN_AHEAD=0` 对照 36/36;**门 5 PASS**——shader-image +4.35 pp、texture +0.96 pp、ssbo / dsa / packed-pixels 持平,0 新 crash、0 流失,UBO(GTF)记 unrun;bsl-esc-menu spawn server 360 MB / 10,330 映射行、inproc app 10,393 行。窗口 2(`6afa077f`)同样门 5 PASS,门 3 严格 33/36 即 ID-P7-62 的起因。门 4 以 ID-P7-55 的 `# P13` 读法关闭。 | 证据 `notes/p7/device-window-2/{final-p7w8,window2-p7w7}/`;交接 `notes/p7/HANDOFF-2026-09-23.md` | 窗口 2 工装 |
|
||
| 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` |
|