Files
MobileGL/docs/Disaggregated/notes/p7/INTEGRATOR-DECISIONS-P7.md
T

77 KiB
Raw Blame History

P7 集成者裁定日志

形式沿用 P5e 的 INTEGRATOR-DECISIONS-P5E.md:一条裁定一个 ID,只记「定了什么、为什么、影响哪些文件」,不记来回。计划正文见 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(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