Web Blender M6/M7/M8/M9/M10/M11 接续执行记录 更新时间:2026-08-17(America/New_York) 执行规则 1. 本文件是当前接续入口;每轮先读本文件,再直接领取机器队列返回的最新 `nextTask`。 2. 严格按当前里程碑原子任务顺序推进,前一项未通过时不把后一项标为完成。 3. 每完成一段,写回实际命令、结果、hash 和当前计数;后续任务名只从机器队列的最新 `nextTask` 获取,不在本文手工维护或推导。 4. 不覆盖用户已有改动,不提交或改写 git 历史。 当前状态 - M6 正式完成:71/71;剩余:0。 - M7 正式完成:18/18;剩余:0。 - M8 当前完成:20/20;剩余:0。 - M9 当前完成:14/14;剩余:0。 - M10 正式完成:15/15;剩余:0。 - M11 当前完成:13/14;剩余:1。 - 已完成到:M11-13。 - 下一领取点:机器队列的最新 `nextTask`(本文不缓存任务名称)。 - quick lane:READY,7/7 命令通过,总命令耗时 11,455 ms,报告 release/ci-reports/quick.json。 - Chromium lane:READY,9/9 命令通过;每个 browser server 使用独立动态端口,报告 release/ci-reports/chromium.json,总命令耗时 41,003 ms。 - release lane:READY,25/25 命令通过,总命令耗时 1,334,766 ms,报告 release/ci-reports/release.json。 当前执行中(2026-08-16 America/New_York) - M10-07 已完成:新增有界 `WEBGL2_THREE_PHYSICAL` material compile report;Worker 在 `setShaderGraph` Main transaction 前编译并失败关闭,主线程/Offscreen 共用同一 `createPBRMaterial` 结果。`docs/status/M10-07.md`、`tests/golden/M10-07/` 和 `npm --prefix web run test:shader-compile` 证据已补齐。 - M10-08 已完成:`ShaderCompileReport.compileKey` 对 graph hash、排序后的纹理 image/usage/ asset/SHA-256、解析色彩空间和 renderer backend 做 SHA-256 绑定;Engine Worker 和 PBR adapter 传递同一纹理身份。M10-09 已完成:`PBRMaterialPipeline` 在失败编译时保留旧材质, 成功编译才原子替换并释放旧材质。 - M10-10 已完成:`ARBITRARY_SHADER` capability query 接受任意字符串节点类型,未知类型去重并 排序后返回稳定 `PBR-012/ARBITRARY_SHADER`、`SHADER_NODE_UNSUPPORTED`、recoverable block; ShaderGraph/Worker 仍在 Main transaction 前保留原图并阻断。 - M10-11 已完成:桌面 Blender 5.2 fixture 的 1 个 Track、2 个 Action Clip 以 scale=2、 reverse 和 repeat=2 覆盖 12 个边界/周期帧;Node WASM 与生产 Chromium Worker 的 world matrix 最大误差均为 0,逐帧求值前后 NLA/Action identity 不变。本任务未调用 `setNLAStack`,NLA operator、Physics solver 和 cache fault 门不提前计入完成。 - M10-12 已完成有限单个 NLA operator:`moveNLAStrip` 要求 `baseRevision`,Worker 纯函数 保持 source stack 不变并保留 strip duration,native 以一次 Main transaction 提交; stale revision 返回 `REVISION_CONFLICT`,成功后 revision/delta 单调,undo/redo 和 save/reopen 均恢复/保留移动结果。create/remove/resize/active 与多轨混合不在本项声明内。 - M10-13 已完成逐 family Physics solver probe 门:七类分别检查 export、初始化、线程和内存, 任一失败均保持 `DESKTOP_SERVER_BAKE` 路由;当前生产 inventory 没有 solver adapter,七类都不 声明本地 solver。desktop family decoder、浏览器 bake 和 server job 仍保持阻断。 - M10-14 已完成逐 family Physics cache 门:schema/family/desktop-server source/Blender 5.2、 source/settings/input/cache SHA-256、frame range、总/逐帧 byte range/hash 全部版本化;消费前对 实际 source/payload/frame bytes 复算 hash。family decoder/playback 仍不误报 READY。 - M10-15 已完成四域隔离 Chromium Worker 门:GN/Shader/NLA/Simulation 分别通过代表性性能、 超预算/OOM-prevention、恶意输入和同会话小输入恢复。NLA 新增显式 topology/text 预算, Simulation cache 超限使用专用 budget code。M10 15/15 已收口并进入持续回归。 - M11-01 已完成 Camera/Light/World/Scene color-management 字段级 parity 表:TypeScript AST 自动核对 60 个叶字段零漏项/重复,24 COMPLETE、17 PARTIAL、19 BLOCKED;表分别记录 reader、 writer、主线程 viewport 和 Offscreen viewport,不把 metadata-only/近似映射计为完整 parity。 - M11-02 已完成支持字段闭环:Camera/Light/World 通过 Blender Main edit、逐域 undo/redo、保存、 新 Worker 重开与共享 PBR 映射;水平/垂直 sensor fit、色温线性 RGB、shadow、spot/area 和 World 背景均有 Chromium 字段断言。 - M11-03 已完成显式渲染资源预算:主线程/Offscreen 共用 light/shadow/texture planner,超限 只保留确定性前缀并公开稳定 code;纹理 aggregate 预算在 decode 前原子阻断且保留旧资源。 WebGPU 档只冻结 product/device-limit 合同,不误报未安装 renderer。 - M11-04 已完成有界实时渲染 reference 指标:Blender 5.2 Eevee 256×256 fixture 固定相机、 黑色 rough material、World、单样本 TAA 和零 dither;schema 1 固定 SRGB8/STRAIGHT RGBA, 输出 MAE、RMS、P95 channel、max channel、坏像素比例、前景 IoU 和 alpha 覆盖率。主线程与 Offscreen 生产 viewport 使用同一 reference 和阈值,错误构图稳定返回 `RENDER_REFERENCE_MISMATCH`,不把“非空像素”当作通过。 - M11-05 已完成最终渲染 fail-closed 路由:只有 bounded Eevee WebGL2/通过双门的 WebGPU 可走 `WEB_LOCAL_BOUNDED`;Cycles、complex Eevee、Workbench 和 CUDA/OptiX/HIP/Metal/oneAPI 固定走 `SERVER_JOB`。默认 endpoint 缺失返回 `SERVER_JOB_UNAVAILABLE`,不伪造本地等价。 - M11-06 已完成 server render job provenance:schema 1 请求绑定 source `.blend` bytes/hash/ revision、Blender 5.2 build hash、严格白名单 settings hash 和 request hash;成功结果绑定同一 identity、output MIME/bytes/hash 和 result hash。loopback server 用真实 Blender 5.2 headless 执行 fixture still render,source/build/settings/output 四类篡改均 fail-closed。 - M11-07 已完成有限 Compositor WebGPU allowlist golden:真实 Blender 5.2 Main fixture 覆盖 Constant Color、Exposure、Invert、Composite,生产 CPU 与 Chromium WebGPU compute 的 `LINEAR_SRGB` Float32 输出逐字节 hash 相同;资源输入、分支和其他节点继续阻断。 - M11-08 已完成 Unsupported Compositor 全图执行门:CPU 与 cached 入口在求值/cache hit 前 阻断任意 Unsupported 节点,包括未连接节点;真实 Main graph、Blender type metadata 和 revision 保持不变。 - M11-09 已完成 Sequencer runtime codec probe:IMAGE/SOUND/MOVIE receipt 绑定 family、MIME、 byte length 和 source hash,Chromium 分别实际解码 PNG/WAV/H.264 MP4;请求不接受扩展名, 损坏内容、identity drift 和伪造 receipt 均阻断。 - M11-10 已完成 long-media proxy/cache identity:MOVIE source identity、M11-09 READY receipt、 SRGB8/STRAIGHT RGBA8 profile 和 source frame 共同生成 SHA-256 cache identity;payload 独立 绑定长度/hash。Chromium 真实生成首帧 proxy,并通过一帧预算 LRU、Storage Worker 重开和 source/capability/payload 漂移阻断。 - M11-11 已完成 media revision gate:SEEK/SCRUB/DECODE 共享 timeline/request revision;旧 request、timeline 换代期间完成的真实 decode 和伪造 result 均在 publish/cache callback 前 返回 `STALE/REVISION_CONFLICT`,只有最新且匹配当前 timeline 的结果可以发布。 - M11-12 已完成最终编码 fail-closed 路由:请求绑定 Main timeline/source/settings identity; server endpoint 缺失时稳定阻断,存在时只返回 `SERVER_EXPORT_REQUIRED`。实际或注入的 `VideoEncoder` 都只记录探测事实,`localEncoding` 始终保持 `BLOCKED`。 - M11-13 已完成实时音频恢复门:schema 1 区分 context/output/mute 状态;真实 Chromium `AudioContext` 通过 suspend/resume、muted resume、unmute gain 恢复和 close。缺 API/ 构造失败与 resume failure 均保持结构化静音阻断。 本轮新增并已验证 - M6-09A-C:binary archive 解包到 mktemp 后由包内 deployment contract 启动;新浏览器 context 阻断所有非 loopback 请求,manifest、WASM、CSS、3 个 Worker、字体和基础 UI 冷启动通过。 - M6-10A-D:真实归档环境完成 OPFS open/edit/save、Worker 重建、离线恢复、继续 edit、 undo/redo、revision 单调保存和 GLB 严格回读;stable object/data IDs 与 blend SHA-256 已核对。 - M6-11A-C:binary archive 在独立目录校验 SHA256SUMS、合同、许可证、SBOM、manifest, 23 个 manifest 文件通过;archive browser smoke 通过并清理 server/profile。 - M6-12A-D:source archive 在另一个独立目录校验 18,173 个文件,无 pycache/dist/build 输出; npm ci、typecheck、build 通过,14 个 production build 文件与 binary app 逐项一致。 - M6-13A-C:确认 Gitea Actions、自托管 Debian 13 runner、Node 20.19.2、Playwright 1.62.1、 Chromium 149/Chrome 150、Blender 5.2.0、Emscripten 3.1.69;quick cache 只绑定 lockfile/toolchain。 - M6-14A-C:P0、main/Offscreen、network、device-loss、OOM、OPFS quota、malicious blend/archive 共 9 个 Chromium lane 子命令通过,端口均动态分配并由 Playwright 清理。 - M6-15A:full E2E 126/126、100k/1M/10M geometry、4K/8K texture、600 帧 simulation、 1M 帧 media、VDB native/server/OPFS/WebGPU/双视口/故障、49/49 acceptance、 offline reproducibility 和 archive 复验共 19/19 通过。 - full E2E 首次发现开发服务器错收集 archive-only spec;已将该 spec 限制到 playwright.archive.config.ts,定向 M6-09 通过后完整 release lane 从头重跑通过。 - M6-15B/C:release 仅由 main push 或 workflow_dispatch 触发;exit code 17 失败注入 只生成新 FAILED 报告,不复用旧 READY。 - M6-16A-C:quick/Chromium/release 三报告联合校验通过,绑定同一 commit、 lockfile、ledger、engine、archive 和每条日志 SHA-256,retention 固定为 7/14/30 天。 - M6-17A:DEPLOYMENT.md 已补齐空目录安装和 transport preflight;自动门在 mktemp 中校验交付 SHA-256、拒绝危险 tar 条目、安装到内容 hash 目录、原子建立 current, 验证 HTTPS/127.0.0.1 READY 与 public HTTP/file BLOCKED,并从安装后目录验证合同头/range。 - M6-17B:binary archive 新增 release-metadata.json,绑定 product/engine、IDB schema 6、 OPFS schema 1、3 个 Worker 和缓存策略;双版本门验证 5->6 前向迁移、Worker 换代、 失败前置不改 current、成功原子切换、旧 release 保留和项目 SHA-256 不变。 - M6-17C:回滚合同只原子切换 current 的整套 app/engine release;相同 IDB/OPFS schema 旧版 READY,IDB 降级和 OPFS 逆迁移稳定 BLOCKED;新版目录、项目 bytes、revision 17 和 blend SHA-256 全部保留。 - M6-17D:operations-diagnostics.json 与 DEPLOYMENT.md 表格覆盖 MIME、range、isolation、 hash、quota、Worker、GPU 七域,21 个信号唯一;检查、预期、恢复和数据安全边界 与 deployment contract 联合校验,诊断 JSON 已进入 binary archive。 - M6-17E:operations rehearsal 在同一个全新 mktemp 根内连续执行 8/8 步骤: delivery hash/path、空目录安装、deploy HTTP、项目写入、upgrade 切换/HTTP、rollback 切换/HTTP; revision 23 与 blend SHA-256 不变,临时根已清理。 - M6-18A:冻结 `0.1.0-rc.1`、engine `blender-wasm-0.1.0-rc.1` 和 HEAD `17ab961485fe2ea1574c5f0b7d3ef9608a2bf424`;RC 生成器先稳定拒绝旧 `0.1.0` metadata,再重建并两次复验确定性 binary/source archive。`RC_MANIFEST.json` 与 sidecar 已绑定 package/package-lock、engine manifest、binary 内 release metadata/SBOM、ledger、 `SHA256SUMS.txt`、3 个主要构件和 5 个 operations report;binary 25 文件、source 18,185 文件及 14 个重建产物独立复验通过。 - M6-18B:新增 RC 发布说明,只列已通过的 P0、双 viewport、single/pthread、OPFS、 性能/故障、离线交付和 CI/运维能力;自动核对 12 个 V1 family `READY` 与 12 个 Blender 全域 `BLOCKED`,7 个本地链接全部可解析。`V1_SCOPE.md` 和机器 ledger 已进入 离线包,binary manifest 复验 28 个文件通过。 - M6-18C:已知限制明确 Chromium-only、HTTPS/loopback、AUTO/SINGLE/PTHREAD 选择、 初始化失败单次 fallback、hash fatal 和 release 刷新边界;记录 WASM 16 MiB 初始/2 GiB ceiling、origin-bound storage/无最低 quota 保证、纹理 64 MiB/16,384 px/256 项,以及 VDB/NanoVDB 512 MiB/1 GiB/512 MiB 上限与 adapter 可能更低。限制自动检查与 binary 29 文件复验通过。 - M6-18D:发布恢复手册覆盖 SHA256SUMS/RC manifest/归档/三 lane 证据校验、生产 Save Project 的 OPFS commit + 外部 `.blend` 备份、revision/hash/origin 记录、切换前失败、 切换后兼容回滚、IDB/OPFS schema 稳定阻断及独立恢复 origin;文档检查、binary 30 文件 复验和全新临时根 operations rehearsal 8/8 再次通过。 - M6-18E:quick 从首次 unit hardcoded version 的新 `FAILED` 报告定位并修正后完整重跑 `READY 7/7`;Chromium `READY 9/9`;release 扩充 RC 文档、5 项 operations 和 manifest 门后 `READY 25/25`。full E2E 126/126、49/49 acceptance、归档重建/浏览器/独立 source rebuild 全部通过;三报告与 RC manifest 联合绑定同一 HEAD、package/lockfile、ledger、 engine、SBOM、3 份发布文档和最终 archive hash,exit code 17 仍只生成新 `FAILED`。 - M7-01:新增纯 `user-action-state` 合同,覆盖 IMPORT/OPEN/SAVE/SAVE_AS/EXPORT 和 IDLE/RUNNING/SUCCEEDED/FAILED/CANCELLED;action identity、允许转换、身份/复用/错误码 拒绝均为确定性结果。生产 App 已在图片 Main transaction、blend open、OPFS commit、blend download 和 GLB export 的真实边界记录状态;保存仍保持先原子提交再下载。unit 4/4、 Chromium 正负例 2/2、typecheck 和 production build 全部通过。 - M7-02:新增纯项目动作互斥合同,OPEN/SAVE/CLOSE 冲突矩阵完全对称且独占,冲突统一返回 `USER_ACTION_CONFLICT`,并细分 REPEATED_OPEN、CONCURRENT_SAVE、CLOSE_DURING_SAVE。 App 的 open、manual save、autosave 和 close 使用同一 owner lock;同一浏览器任务竞争验证第二次 open 不替换首个 projectId、双 save 只提交/下载一次、save 中 close 不清空 scene 或终止 Worker, 提交后继续 edit/save/close 正常。互斥 unit 4/4,联合 unit 8/8、新 Chromium 5/5、既有 save/autosave 2/2、typecheck 和 build 全部通过。 - M7-03:新增 `File.stream()` 分块 reader;每个实际 stream chunk 最多按 1 MiB 有界复制, 进度来自累计真实字节/文件声明大小,每 4 MiB 让出一次 UI 并同步提交紧凑进度状态,不使用 时间插值。每次 open 有独立 AbortController,读入阶段提供取消按钮;取消稳定进入 `CANCELLED/OPEN_CANCELLED`,不调用 WebEngine、不替换旧 scene/projectId。621,323-byte 有效 blend 精确完成,40 MiB 合成输入在中间字节取消;reader unit 3/3,联合 unit 11/11、 新 Chromium 7/7、既有 save/autosave 2/2、typecheck 和 build 全部通过。 - M7-04:reader 资源 ledger 在取消返回前执行 stream cancel/release、清零未完成 output,并证明 live reader/input bytes/staging 全为 0。WebEngine open 改为隔离候选 WASM module/Main handle, AbortSignal 通过 cancelOpen request 在 NATIVE_INITIALIZE/NATIVE_OPENED 阶段取消;只有构建 SceneIR 成功才原子替换当前 Main,取消则释放 native input、销毁候选 handle,当前架构无 OPFS import staging,计数恒为 0。native 取消后旧 Basic Main 继续 edit/save;联合 unit 11/11、 新 Chromium 8/8、既有 open/save/autosave/concurrent-open/isolated-preview 5/5、build 全部通过。 - M7-05:新增纯 save transaction 合同,冻结 base committed revision/hash,SERIALIZE、OPFS_STAGE、 SCENE_COMMIT、METADATA_COMMIT 任一失败均只更新 attempt;只有 Storage 返回的 revision/hash 与 candidate 完全一致才推进 committed。已有基线项目在 after-stage、after-scene-commit、 before-metadata-commit 故障中用同一原子 writer 回写旧 bytes 后抛错,Worker 重启后旧 revision/hash/bytes 逐项不变;无基线 M6 journal 前滚仍通过。unit 14/14、新 Chromium 9/9、 旧 recovery/save/autosave/quota 4/4、build 全部通过。 - M7-06:新增纯 dirty state,open/recover 建立 current/committed Main revision,只有成功 Main transaction 推进 current,匹配 candidate 的成功 save 才对齐 committed;preview、workspace、 失败 import/open 保持原状态。删除手动 dirty toggle,旧 autosave 测试改用真实 Add Cube。 unit 17/17、新 Chromium 10/10、真实 Main/save/autosave 3/3、build 全部通过。 - M7-07:undo/redo 成功后序列化当前 Main 并与最近成功 save 的 blend SHA-256 比较;逻辑 revision 始终单调增加,内容 hash 相同即 clean、不同即 dirty。save -> edit -> undo clean -> redo dirty -> undo clean 的 Chromium 路径通过。联合 unit 18/18、Chromium 10/10、build 通过。 - M7-08:Engine/Storage Worker 的 `error`/`messageerror` 统一映射为可恢复 `WORKER_TERMINATED` fault;pending request 只结算一次,客户端支持重启。App 在 fault 后保留 当前 snapshot、项目 ID、dirty/committed identity 和项目列表,显示显式“重启并恢复”入口;恢复 先重建两个 Worker,再从当前项目 OPFS commit 与 operation log 重建 SceneIR。Engine/Storage crash 注入和 retry 均不清空当前场景,恢复后 operation log 变更仍在。unit 19/19、Chromium 12/12、typecheck、production build 全部通过。 - M7-09:新增 recent projects schema v1 纯合同,记录只接受可验证的 project ID、revision、 bytes、SHA-256、canonical timestamp 和 backend;排序/去重在输入顺序变化时仍确定,最多保留 50 项。索引存入 IndexedDB `setting`,同 Worker 队列与 `navigator.locks` 共同避免并发丢更新; Worker 重启、页面刷新和新 StorageClient 均可恢复列表。打开但未提交的文件不进入索引;恢复 成功前不切换 project identity。损坏索引被清洗隔离时保留当前 recent 条目和 quarantine 计数, OPFS buffer transfer 前冻结 bytes,索引写回完成后才报告恢复成功。Worker 重启后 selection、 frame、workspace 和逻辑 project revision 均保持;联合 unit 22/22、Chromium 14/14、typecheck 和 production build 全部通过。 - M7-10:recent project 启动列举和选择恢复前核对 IndexedDB project metadata 与 OPFS commit 的 revision、bytes、SHA-256;`MISSING`、`HASH_MISMATCH`、`METADATA_MISMATCH` 失效项只从可打开 列表隔离并保留在索引中,`unknown` backend 记录兼容存储不可用场景。UI 显示稳定的缺失/校验失败/ 元数据不一致提示,并按 projectId 提供只移除失效引用的操作;移除不会删除其他项目或当前场景。 完成 missing、hash mismatch、修复和当前项目保留的 unit/Chromium 正负例,完整用户动作回归、 typecheck、production build 全部通过。 - M7-11:新增 `StorageBudgetBreakdown` v1 和 Storage Worker `getBudget`,按当前 project 精确汇总 committed blend、snapshots、LOD manifest/cache、普通媒体 asset 及 Simulation/NanoVDB VDB payload,计算稳定 total;界面新增五项存储预算面板和分项 bytes data attributes,保存、刷新、 Worker 重启后重新读取同一结果。unit/Chromium budget 正例、完整用户动作回归、typecheck 和 production build 全部通过。 - M7-12:新增 project-scoped orphan content asset cleanup,扫描 `assets/sha256/` 只移除 没有该 project IndexedDB asset metadata 引用的 OPFS 文件,保留已引用文件和其他 project 的 同名/孤儿文件;预算面板提供“清理孤儿资源”入口并报告 removed count/bytes。跨项目正例验证 A 项清理不影响 B 项,完整用户动作回归、typecheck、production build 全部通过。 - M7-13:统一键盘焦点、菜单和 modal 上下文:菜单与 Operator Search 互斥,打开 overlay 后焦点 进入首个可操作控件,Escape 关闭并恢复触发器焦点;菜单支持 Arrow/Home/End、Tab 关闭,点击 外部关闭;全局快捷键不再劫持交互控件的 Tab/输入,打开文件期间 Escape 复用真实取消路径。 追加 focus-visible 样式和稳定 ARIA role;ui-schema unit 5/5、Chromium ui-context 1/1、 大文件 Escape 取消、完整用户动作回归 unit 26/26 + Chromium 19/19、typecheck、lint、 production build 全部通过。 - M7-14:新增响应式布局验收,覆盖 1440x900、1280x720、360x640 和 320x568;检查各布局带的 垂直边界、可见控件文本宽度和页面根 scrollWidth,移动端 topbar/workspace/storage/status 横向内容使用局部滚动而不扩大页面或产生重叠。`test:user-actions` 已纳入该 spec,4/4 Chromium 尺寸通过,完整用户动作回归 26/26 unit + 23/23 Chromium、typecheck、lint、build 全部通过。 - M7-15:新增共享 `viewport-camera` orbit 合同,统一主线程与 Offscreen 的 yaw/pitch/distance、 target、旋转/缩放灵敏度、距离边界和场景相机投影;主线程 OrbitControls 关闭阻尼/平移并按 共享灵敏度配置,Offscreen frame 回传相机状态,两个 backend 的选择回调和 gizmo 投影沿同一 SceneIR/相机合同运行。unit 1/1、双 backend camera/selection/orbit Chromium 3/3、既有 Curve/Gizmo 2/2、完整用户动作回归 27/27 unit + 26/26 Chromium、typecheck、lint、build 全部通过。 - M7-16:P0 用户闭环增加无鼠标键盘路径和 Axe WCAG A/AA 门,关键流程、焦点可见性和 空项目/恢复项目均通过;完整用户动作回归 27/27 unit + 27/27 Chromium 通过。 - M7-17:用户可见故障统一为稳定短消息,原始 Worker/文件异常只进入 200 条有界诊断 ledger 和可导出 schema v1 报告;完整用户动作回归 30/30 unit + 29/29 Chromium 通过。 - M7-18:30 分钟正式 editing soak 完成 352 个自动保存周期和 30 次整页重开,revision 从 1 单调推进到 705;首次正式运行发现 IndexedDB 快照写删导致 33,761,087 bytes 物理增长,改为 OPFS payload + IndexedDB metadata 并保留旧内联快照兼容后,正式报告 `FORMAL/READY`,堆增长 -310,276 bytes、存储增长 1,044,121 bytes、页面错误 0、快照保持 5 个。 - M8-01:新增 `NanoVDBPageFeedback` v1 GPU feedback buffer 合同,固定 4-word header、默认 1,024/最大 8,192 个 page ID 容量、u32 原子 count/overflow、`NANOVDB_PAGE_FEEDBACK_OVERFLOW` 稳定错误码和 `0xffffffff` 空页哨兵;创建、解析、overflow 一致性、页 ID 范围、schema/容量/长度 漂移拒绝以及 reset 清理均为确定性结果。M8-01 unit 4/4、typecheck、lint、production build (64 modules)全部通过。 - M8-02:实际 NanoVDB paged word/Float32 sampling shader 已接入 feedback storage binding;未驻留页 通过 `atomic` 槽、`atomicCompareExchangeWeak` 和同槽重试并发去重,物理扫描上界固定为 `min(header capacity, arrayLength(page_ids))`,容量耗尽只设置 overflow 并递增尝试计数。真实 active voxel 缺失 leaf page 的 256 个并发采样只记录 1 个 page ID;容量 2 下三种缺页稳定 overflow,两个 guard word 不变。全量 unit 83/83、专项/既有 WebGPU 3/3、typecheck、lint、build 全部通过。 - M8-03:新增 CPU feedback readback 和 schema v1 revision-bound batch;只复制声明容量对应的 GPU buffer 前缀,解析后按数值升序排序并再次去重,保留 attempted/gpuStored/unique 三项计数、overflow 状态和错误码,并拒绝负数/小数 render revision。真实 WebGPU leaf/overflow 两批分别绑定 revision 17/18,page IDs 均升序且 guard 不变;全量 unit 84/84、专项 Chromium 1/1、typecheck、lint、build 全部通过。 - M8-04:新增唯一 feedback dispatch revision gate;batch revision 与当前 render revision 不同 时在页请求适配器前返回 `STALE/REVISION_CONFLICT`,请求列表和计数均为零;相同 revision 才按 已排序 page ID 调用适配器。真实 WebGPU revision 17 readback 在 frame 推进到 18 后触发零次页 I/O, 切回匹配 revision 的正例只调用一次;全量 unit 85/85、专项及既有 VDB Chromium 3/3、typecheck、 lint、build 全部通过。 - M8-05:新增 `loadNanoVDBFeedbackPages`,只组合 revision gate 与现有 `loadNanoVDBGridPage`;page ID 使用 manifest 的 `gpu.pageByteLength`,底层仍请求 manifest 原始 chunk `index/start/end/hash` 并调用 `verifyNanoVDBChunk`,未新增 offset/hash 表。真实 GPU 生成 manifest 页 0 feedback 后,stale 路径 range I/O 为 0,匹配路径加载页与原 density payload 逐字节一致;全量 unit 85/85、专项及既有 fault Chromium 2/2、typecheck、lint、build 全部通过。 - M8-06:新增 manifest/grid/source-scoped `NanoVDBGridPageRequestCoordinator`;同页并发订阅共享 一个 loader 与内部 AbortController,成功数据按订阅者复制独立 ArrayBuffer。取消一个订阅者只 结算自身,最后订阅者取消才从 pending 表移除并 abort 底层 range;dispose 同样有界清理。真实 Chromium 两组并发门均只调用一次 source,单取消底层 abort=0、最后取消 abort=1,所有 pending/ subscriber 最终归零;全量 unit 85/85、专项/fault 2/2、typecheck、lint、build 全部通过。 - M8-07:复用 M8-05 已有的 manifest chunk SHA-256 验证先于 coordinator resolve/consumer 的 顺序;真实 chunk 保持声明长度但翻转 1 byte 后稳定返回 `NANOVDB_HASH_MISMATCH`,GPU `uploadPage` consumer 调用为 0,resident page/bytes/virtual IDs 与 page table 均保持空,pending 也归零。专项/fault Chromium 2/2、全量 unit 85/85、typecheck、lint、build 全部通过。 - M8-08:`NanoVDBWebGPUGrid` 新增显式 `beginFrame/pinPage/endFrame`;paged LRU 只从非 pin resident page 选择最旧项,全槽被当前 frame pin 时稳定返回预算错误且不改 resident/page table, 下一 frame 自动清除旧 pin。真实 GPU 容量 2/虚拟页 4 门验证 pin 页 0 后先淘汰页 1、全 pin 阻断、下一 frame 淘汰页 0,最终 page table `[unmapped,unmapped,slot1,slot0]`;专项/fault/OOM Chromium 3/3、全量 unit 85/85、typecheck、lint、build 全部通过。 - M8-09:共享 renderer 新增 `NanoVDBProgressiveRedrawScheduler` 和 `NanoVDBProgressivePageUploader`;只有 `grid.uploadPage` 成功后才安排 frame,同一待执行 frame 内多个成功页合并为一次 redraw,失败页不安排,回调执行后才允许下一轮。真实 WebGPU 验证 三个成功页分两批只产生 2 次 frame/redraw,越界失败页不增加计数;专项/fault/OOM Chromium 3/3、全量 unit 85/85、typecheck、lint、build 全部通过。 - M8-14:两个独立 Worker 验证 OPFS restart;旧 Worker 的 resident `[0]` 即使作为声明传入, 新建 GPU grid 初始仍为空。新 Worker 只从 OPFS 恢复并校验 manifest,页 0 经声明长度和 chunk SHA-256 复验后才写入 resident;翻转 OPFS chunk 首字节后稳定返回 `NANOVDB_HASH_MISMATCH`,第二个新 grid 的 resident/page table 保持空。专项、既有 OPFS、 VDB fault、87/87 unit、typecheck、lint 和 build 全部通过。 - M8-15:新增 device-loss replay schema v1 和生产恢复入口;可见页先数值排序、去重并按新 grid resident capacity 截断,新 page table 从全 unmapped 开始,页经 manifest chunk 复验后才上传。 真实 device loss 后 generation 增加 1,可见 `[2,1,0,2]` 只回放 `[0,1]`,旧非可见末页和 超限页均不驻留;page table 为 `[0,1,unmapped...]`。专项/分页/OPFS restart/OOM Chromium、 89/89 unit、typecheck、lint 和 build 全部通过。 - M8-16:paged/direct grid dispose 与三资源组改为幂等;feedback 初始化写入失败会就地销毁已创建 buffer。OOM 门保留 page-table 失败证据,并新增 feedback 初始化失败:resident/page table/ feedback 峰值 3、三者 destroy 次数各 1、released bytes 131,112、live resources 0;同 device 重新创建资源组、LRU 和重复 dispose 通过。专项/分页/device-loss/双视口 Chromium、89/89 unit、 typecheck、lint 和 build 全部通过。 后续任务领取 - 任务名称、顺序和完成状态以机器队列返回的最新 `nextTask` 为唯一依据。 - 本文不手工维护待办任务名;领取后只追加已完成事实、验证证据和当前计数。 M6-15/M6-16 实际验证命令 - BLENDER_BIN= BLENDER_ARCHIVE_SHA256=96f6c181...1c48 CHROME_PATH= VDB_RESOURCE_ROOT= npm --prefix web run ci:release - node tools/web/check-ci-report.mjs release/ci-reports/quick.json release/ci-reports/chromium.json release/ci-reports/release.json - npm --prefix web run test:ci-failure-report M7-01 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5194 npm --prefix web run test:user-actions`:unit 4/4、Chromium 2/2 通过。 - `npm --prefix web run build`:通过,55 modules transformed。 - `git diff --check -- web/protocol/user-action-state.ts web/tests/unit/user-action-state.test.mjs web/tests/e2e/user-action-state.spec.ts web/app/src/app/App.tsx web/package.json`:通过。 - `user-action-state.ts` SHA-256:232257fb0e85a6827d71a1acbbf82477ba8c441c224cf994049bde96943c518e。 - unit/Chromium spec SHA-256:88ace5b65a5bee44d4ab417ea2144391d461117e848b1446da86b1cf0b21e237 / 9ecb1e63f58c25dc64e0f8738b272b45529212469c9ea2ca660b68d4f0e7b566。 M7-02 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5196 npm --prefix web run test:user-actions`:联合 unit 8/8、Chromium 5/5 通过。 - `WEB_TEST_PORT=5197 npx --prefix web playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts -g "saves the opened blend|autosaves a dirty project"`:2/2 通过。 - `npm --prefix web run build`:通过,56 modules transformed。 - `project-action-mutex.ts` SHA-256:330da0a7253f9bda9f7b43f5df4a252596fe43723c489308b1e0cbb6311aefd4。 - unit/Chromium spec SHA-256:92af891ddbb54c54c2717a8e8d4466678de2cb7117f413f431a2e32fa2446f0c / 0eb8f7c40dab623762d04e485348fbdaa68e9782010199e5d1b888f9475d6896。 M7-03 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5206 npm --prefix web run test:user-actions`:联合 unit 11/11、Chromium 7/7 通过。 - `WEB_TEST_PORT=5207 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts -g "saves the opened blend|autosaves a dirty project"`:2/2 通过。 - `npm --prefix web run build`:通过,57 modules transformed。 - `file-byte-reader.ts` SHA-256:3472e2a8cc01b6a78dda85d90a0a6f106ee3c0ad0e3c598bd3f6a7cbca14b536。 - unit/Chromium spec SHA-256:1e86e6f553cafcd2a890eab76f090ba2eb249c21fced88b6f82db80162254bc8 / 78608c721e5bd66570ae73b13c9c4531fc7d555b226c194188e73cddcde6b370。 M7-04 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5210 npm --prefix web run test:user-actions`:联合 unit 11/11、Chromium 8/8 通过。 - `WEB_TEST_PORT=5211 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts -g "opens a local .blend|serializes concurrent WebEngine init|previews Decimate|saves the opened blend|autosaves"`:5/5 通过。 - `npm --prefix web run build`:通过,57 modules transformed。 - WebEngineClient/Worker SHA-256:1e2cac9f9a9ebfb068cb8a7cfeab5100d9534600dcdd703a12d68614940a28e5 / 331c7854ea75e2def1bf503118c670908d39ce9ede9c5deb5a4432812172582b。 - Chromium spec SHA-256:467d50dadce0f2b1d8da090fcc9383c642d3fd9fa19d19b53833340d418490a6。 M7-05 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5214 npm --prefix web run test:user-actions`:联合 unit 14/14、Chromium 9/9 通过。 - `WEB_TEST_PORT=5215 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts -g "recovers verified atomic saves|quota exhaustion|saves the opened blend|autosaves"`:4/4 通过。 - `npm --prefix web run build`:通过,58 modules transformed。 - save transaction/StorageWorker SHA-256:9c6d932d6d2ce308ae8fbc56ee56296f1b67bd22e76b90a69751813f174bc766 / bfde02b78850beb510c7a92fcefb6b3b9f5d2ef4bef09027a7fdc6f737181789。 - unit/Chromium spec SHA-256:99fde5eb7152e1fe0df8702660724f8457a6423fb1d731f92758670b531cfd96 / e453f817b3bae19ddf18c57c4429743e7157d083ab9ebf2e8e523bc6301d226d。 M7-06 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5217 npm --prefix web run test:user-actions`:联合 unit 17/17、Chromium 10/10 通过。 - `WEB_TEST_PORT=5218 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts -g "Main-authoritative|saves the opened blend|autosaves a dirty project"`:3/3 通过。 - `npm --prefix web run build`:通过,59 modules transformed。 - dirty contract/unit/Chromium SHA-256:283d08dd92e7f7afc13ba004982160d23369a42ea487c77c7fc6de803f4c00e7 / ab71114adb58fec8387ff8b8ca0a1729681a57e370a995c0ee7e71eeabc3baf2 / 9980065a202b97975d299ef93312c442f4bc69b8840e899e89b1f802d13967e7。 M7-07 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5220 npm --prefix web run test:user-actions`:联合 unit 18/18、Chromium 10/10 通过。 - `npm --prefix web run build`:通过,59 modules transformed。 - dirty contract/unit/Chromium SHA-256:ee1a04a6f43a4c5504657f318249c9c2e27abe47647cef64237b94ba2e56f1ea / 1e5c6ddeb29ca110b90a01f40a8ceca26e18d7787455dd13aeb8a0da76adb602 / 9b884c1e975b4ae4b55f6bc80ed191444790d75eccb09718863f24a54fd4aa18。 M7-08 实际验证 - `npm --prefix web run typecheck`:通过。 - `node --test web/tests/unit/worker-fault.test.mjs`:fault contract 1/1 通过;完整 unit 回归 19/19 通过。 - `WEB_TEST_PORT=5230 npx playwright test --config playwright.config.ts tests/e2e/worker-crash-recovery.spec.ts`:Engine/Storage crash recovery 2/2 通过。 - `WEB_TEST_PORT=5233 npx playwright test --config playwright.config.ts --workers=1 tests/e2e/user-action-state.spec.ts tests/e2e/project-action-mutex.spec.ts tests/e2e/file-import-progress.spec.ts tests/e2e/save-interruption.spec.ts tests/e2e/dirty-state.spec.ts tests/e2e/worker-crash-recovery.spec.ts`:既有 M7 与新用例 12/12 通过;并行首轮曾出现 M7-04 时序抖动,单 worker 重跑通过。 - `npm --prefix web run build`:通过,60 modules transformed。 - `git diff --check -- `:通过。 - Worker fault/client/unit/e2e SHA-256: `e95c5a64811abc237b601974ac6fd88bccd6ca51160f9eb4e0a2e1a563d46764` / `0dae0d958398b3e1363a13a0694b1b4785bc49af09124e157b8df72b24ce455b` / `839b3e52b69dd9a5fee7e1c604945c1cb0bde44bf9dea2221d13fc77ef417b68` / `85853dc439e61618f7fb2f2ccfb1619f44909808f535784ddb7aeed5d4b102ba` / `01bfe9221500e10d0abf75dac6149c174627a540c210eb54c041242de7f3805d`。 M7-09 实际验证 - `npm --prefix web run typecheck`:通过。 - `WEB_TEST_PORT=5242 npm --prefix web run test:user-actions`:联合 unit 22/22、单 Worker Chromium 14/14 通过;并行首轮仅复现已知 autosave 时序抖动,已把单 Worker 约束固化到脚本。 - `npm --prefix web run build`:通过,61 modules transformed。 - `git diff --check -- `:通过。 - recent contract/unit/Chromium SHA-256: `bc5cdbc52815f2f4540ff18e1f4f90ec731b1c2a9ccc81cd9a8132f9d9e8d1cc` / `34df83e9a9b27aea6e65667427cda2c5a9216284abb2766b5fe43899df5c712e` / `35c5d54cd13796b7d126313be625bc360a8d1e90c77c78e090a37e4854bcb595`。 - App/StorageWorker SHA-256: `7eddccde9402cb08e03da7412c98b9df868ea3a91ff9fb0524c6cf1bfc2a114a` / `d730a87c4d73d0b844228d1d25a981a30ed2781250f2d125a3b9fb3a116a45f8`。 M7-10 立即执行 - 已完成:启动列举和选择恢复均验证 IndexedDB metadata/OPFS commit 的 revision、bytes、SHA-256; `unknown` backend 保留兼容语义,真实 `opfs/indexeddb` 缺失或损坏项返回稳定 issue code 并从 可打开列表隔离,当前场景和其他 recent 项目不变。 - 已完成:修复提示显示稳定中文短消息和对应 projectId 的“移除引用”按钮;移除只更新 `recent-projects:v1` 索引,不删除项目 metadata、OPFS commit、snapshot 或当前场景。 - `npm --prefix web run typecheck`:通过。 - `node --test web/tests/unit/recent-projects.test.mjs`:unit 4/4 通过。 - `WEB_TEST_PORT=5253 npx --prefix web playwright test --config web/playwright.config.ts tests/e2e/recent-projects-recovery.spec.ts -g "M7-10"`:Chromium 2/2 通过。 - `WEB_TEST_PORT=5252 npx --prefix web playwright test --config web/playwright.config.ts tests/e2e/recent-projects-recovery.spec.ts`:M7-09/M7-10 Chromium 4/4 通过。 - `WEB_TEST_PORT=5254 npm --prefix web run test:user-actions`:联合 unit 23/23、单 Worker Chromium 16/16 通过。 - `npm --prefix web run build`:通过,61 modules transformed。 - `git diff --check -- web/protocol/recent-projects.ts web/protocol/storage.ts web/app/src/workers/storage.worker.ts web/app/src/app/App.tsx web/app/src/app/app-shell.css web/tests/unit/recent-projects.test.mjs web/tests/e2e/recent-projects-recovery.spec.ts`:通过。 - M7-10 文件 SHA-256: `6a5fb9b080c648e0d1673afd4363db705355d57bd685ac718a875ef1d18e0e29` / `8ed45a45abcf21afda9d8871219f238f54dfeceba3414b92cd9a1d5205516489` / `6e3e5584114523cc49bb970f360c832f4acd3ab34994ab102730f344f288e108` / `375fa0a992b1d7f53641b18e4ed48e7aabe56c70b4c875b0acdc0f58ad0714ce` / `b04947d4825a8338854dccd012cef16d7e7d058955a9b5cb3f1b0f58a5b08b0e` / `6ac5ec70528ea95b06f729f4b11e0a225d37af22467eba2b7c46c6fd8ff6074d` / `4234833a8b6cfba5606dfde24772ff688822334abbaf558945a912947bf954e2`。 M7-11 实际验证 - `node --test web/tests/unit/storage-budget.test.mjs`:unit 2/2 通过。 - `WEB_TEST_PORT=5255 npx --prefix web playwright test --config web/playwright.config.ts tests/e2e/storage-budget.spec.ts`:Chromium 1/1 通过;真实项目保存、snapshot、LOD、媒体 asset、simulation/VDB asset 的五项 bytes 与 reload 后面板一致。 - `WEB_TEST_PORT=5261 npm --prefix web run test:user-actions`:联合 unit 25/25、单 Worker Chromium 18/18 通过;其中 M7-04 首轮竞态已由可取消 native 阶段事件窗口修正并通过。 - `npm --prefix web run build`:通过,62 modules transformed。 - `git diff --check -- web/protocol/storage-budget.ts web/protocol/storage.ts web/app/src/storage/opfs-files.ts web/app/src/storage/StorageClient.ts web/app/src/workers/storage.worker.ts web/app/src/app/App.tsx web/app/src/app/app-shell.css web/tests/unit/storage-budget.test.mjs web/tests/e2e/storage-budget.spec.ts web/package.json`:通过。 - M7-11 文件 SHA-256: `151ed8fc658322351c73c48c0d524c154789bba2e8dd7dce4000fe6fcd488efb` / `225cbcde7696d2481a2db6ba8700fe55c011898478dac648f28d95a58aed79e7` / `2eeeb11c543c3fdf0bdbadcfee4ff96893946679d1227b9314110246e4def5ee` / `7be78fa594e218471af165e95ff0a4640d4879a840f1fe2a891c64d4f37d8de9` / `a35082c8443089c92400ed0ee6e36e30638bfe657f3cd2126f0cfd29a8717167` / `1b6feb627a82b8fb5e513bc7d0dd34883e1f3d7d9a6e5c9a03e365315c723392` / `c754d5f384fdf5081b556c1ba87ddc3e4bf5e7e52fb7342f55119b1ef4993f51` / `339b57f9453ea766e6e34144742c91217d45691192e20ee106adaf5d55d6c162` / `d05cdb7b7d7afd13d42330885604a310005eb2c544806d598911e081ec105ebf`。 M7-12 实际验证 - `WEB_TEST_PORT=5260 npx --prefix web playwright test --config web/playwright.config.ts tests/e2e/storage-cleanup.spec.ts`:Chromium 1/1 通过;A 项 removed=1、bytes=19,A 已引用 asset 保留,B 项 orphan 保留。 - cleanup API 通过 project transaction 扫描 `assets/sha256/`,只删除没有该 project asset metadata 引用的文件,并返回 paths/count/bytes;预算面板“清理孤儿资源”入口报告结果。 - M7-12 与 M7-11 联合回归、typecheck、production build 全部通过;StorageClient/Worker、OPFS cleanup 和跨项目 spec 已包含在上方 SHA-256 与 `test:user-actions` 证据中。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M7-13 实际验证 - `npm --prefix web run typecheck`:通过。 - `npm --prefix web run lint`:通过;同时修复 storage Worker catch 链的 preserve-caught-error 诊断,保留 rollback 原始 cause。 - `node --test web/tests/unit/ui-schema.test.mjs`:5/5 断言通过(菜单切换、overlay 互斥、关闭)。 - `WEB_TEST_PORT=5271 npx --prefix web playwright test --config web/playwright.config.ts web/tests/e2e/ui-context.spec.ts`:Chromium 1/1 通过;覆盖普通 Tab、modal Tab 环、菜单 Arrow/Home/End/Tab、Escape 和触发器焦点恢复。 - `WEB_TEST_PORT=5274 npx --prefix web playwright test --config web/playwright.config.ts web/tests/e2e/file-import-progress.spec.ts -g "cancels a large streamed open"`:真实 40 MiB 输入在中途同步派发 Escape 后进入 `CANCELLED/OPEN_CANCELLED`,旧 scene/project 保留。 - `WEB_TEST_PORT=5275 npm --prefix web run test:user-actions`:unit 26/26、Chromium 19/19 通过(单 worker);期间 Worker crash 注入日志为预期测试输出。 - `npm --prefix web run build`:通过,62 modules transformed。 - `git diff --check -- web/protocol/ui-schema.ts web/app/src/app/App.tsx web/app/src/app/app-shell.css web/tests/unit/ui-schema.test.mjs web/tests/e2e/ui-context.spec.ts web/tests/e2e/file-import-progress.spec.ts web/app/src/workers/storage.worker.ts`:通过。 - M7-13 文件 SHA-256:`8aa564cf8141ee42cb1f85a1e42ffaf2f4ae19e6f269c98a4b2e8e3362e224ad` / `3a246c3ae6efcac4fa2ce11aa6f8f6af453a48482963754bd43eb4d7d5894e6b` / `4933febb29004ae75f4a04e38f0a37ef1624cd412ccae89c727c8d7f7527f62e` / `ce39f1d44db40f721869b2509a957277d775435b69b6ff8729df8723d9babc90` / `0adc81a3f6d88565085c426fe220cfc7c826814d6b1c54de9c74292f5f100433` / `4463430b07572d130b5b531fe3e46e443a282204bb91550d91ad5e0508c15860` / `012cbb97df5a9e983e38721d8c167e7abb5beca9cbd98690343f0872c1ce64e6`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M7-14 实际验证 - `WEB_TEST_PORT=5281 npx --prefix web playwright test --config web/playwright.config.ts tests/e2e/responsive-layout.spec.ts`:Chromium 4/4 通过(1440x900、1280x720、360x640、 320x568);各带垂直边界无越界,文本无未处理 overflow,document 根宽度不超过 viewport。 - 移动端 status bar 改为局部 `overflow-x: auto`,保留 Engine/Storage 完整诊断文本,不让页面 根节点横向扩张;topbar、workspace toolbar 和 storage budget 继续使用已有局部滚动约束。 - `WEB_TEST_PORT=5282 npm --prefix web run test:user-actions`:unit 26/26、Chromium 23/23 通过(单 worker;含 M7-13 ui-context 和 M7-14 四尺寸回归)。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`:均通过, production build 62 modules transformed。 - `git diff --check -- web/app/src/app/app-shell.css web/tests/e2e/responsive-layout.spec.ts web/package.json`:通过。 - M7-14 文件 SHA-256:`e3919944825d88e6de367c6704ff120f0a8beb4dd10f68d21b226e728f07f5ff` / `f5de57f570880f823224ebdcddb2be4d59ec414a32641effdaa68dc1f4102f28` / `81480960eb36c7e22217e6b13c164a814de6552ab3935c6e369b47a35bc14a6d`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M7-15 实际验证 - `node --test web/tests/unit/viewport-camera.test.mjs`:orbit 默认状态、反算、delta 和相机 position 确定性通过(1/1)。 - `WEB_TEST_PORT=5284 npx --prefix web playwright test --config web/playwright.config.ts web/tests/e2e/viewport-consistency.spec.ts`:Chromium 3/3 通过;主线程/Offscreen 均核对 默认位置 `4.219781,-4.219781,3.658811`、target、yaw/pitch/distance、中心选择和滚轮距离, 同一 zoom 输入的两 backend 状态完全一致。 - `WEB_TEST_PORT=5287 npx --prefix web playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts -g "previews an N-015 Curve handle drag"`:主线程/Offscreen 2/2 通过;`WEB_TEST_PORT=5286 ... -g "previews N-016 Grease Pencil points"`:2/2 通过。 - `WEB_TEST_PORT=5288 npm --prefix web run test:user-actions`:unit 27/27、Chromium 26/26 通过(单 worker;含 M7-13、M7-14、M7-15 新增回归)。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`:均通过, production build 63 modules transformed。 - `git diff --check -- web/protocol/viewport-camera.ts web/app/src/three-adapter/viewport.ts web/app/src/three-adapter/offscreen-viewport.ts web/app/src/three-adapter/offscreen-viewport-protocol.ts web/app/src/workers/viewport-render.worker.ts web/tests/unit/viewport-camera.test.mjs web/tests/e2e/viewport-consistency.spec.ts web/tests/e2e/smoke.spec.ts web/package.json`:通过。 - M7-15 文件 SHA-256:`b6369fc1145acd14f6099b7a014f39c0611799102ef299296d9cdd3e29d16ae6` / `dec5f6ea8372360c290f9e288edf2cc0ea20e7eb1b1514ad98bf7ca7ed1b93af` / `be910d83a4c3e1042aee708d99eaf04ed0e28e7c859786d4ad23acde7c7c66ad` / `06bc9576081633ad42e5b3a68ec85086aa68afee0359b0c9981c98775b683c55` / `bfadb23ceb943bcdb3aba4c525e19f4f99099b5a976d538003f99a75d0a31f42` / `7c811a9b31a4196d53d80c25b26015a904aa5fe9c19c0b12eff2acce95fd77ae` / `e591e8217b0ed3ea4399918b1ec56ca7160a22bf41f15e67b09c803426e50f4f`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M7-16 实际验证 - 新增无指针 P0 Chromium 路径:全部用户操作只通过 Tab/Shift+Tab、Enter、F3、方向键和 Ctrl+S 完成打开 `.blend`、Add Cube、保存下载、关闭、刷新后从最近项目重开和 GLB 导出; FileChooser 只用于向键盘触发的原生文件选择器提供测试文件。 - 空项目和恢复后的 4-object 项目各运行一次 Axe WCAG 2/2.1/2.2 A/AA 门,`critical` / `serious` 违规均为 0;首轮发现并修正 timeline 刻度对比度、Outliner `treeitem` 父角色和 22px 显隐按钮。 - Outliner 现使用 `tree -> treeitem/group` 语义;搜索框、Operator Search 和隐藏文件控件均有 可见键盘焦点轮廓,关键路径逐点断言焦点可见。 - `WEB_TEST_PORT=5292 npx playwright test --config playwright.config.ts tests/e2e/keyboard-accessibility.spec.ts`:1/1 通过。 - `WEB_TEST_PORT=5293 npm --prefix web run test:user-actions`:unit 27/27、单 Worker Chromium 27/27 通过;Worker crash 注入日志为预期测试输出。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`: 均通过,production build 63 modules transformed。 - `git diff --check -- web/app/src/app/App.tsx web/app/src/app/app-shell.css web/tests/e2e/keyboard-accessibility.spec.ts web/package.json web/package-lock.json`:通过。 - M7-16 文件 SHA-256:`e74a53a1f9e9bfea73be8da1de486938d0dcc4718e7585b57bee27a5ce78a978` / `643831089f0ea60eaf36b725bfa18c2dedb83b06441002ed6626cc5b9359d8a0` / `21758543408469e4fee9ecc1fdc1f5d9fa2922bc981bacb9bb947c41adb02315` / `6788477e4336cce78ec6c04f3fc8d93c88a995e20f7cf3b73641317a329b8b56` / `61f6d13e0148321d3c625a5baa212b5444296d111193c4d62a692685faebff1f`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M7-17 实际验证 - 新增 schema v1 应用诊断合同和 200 条有界 ledger;每条记录包含稳定 area/code/summary、 canonical timestamp、sequence、项目上下文以及只在报告中出现的 detail/sourceCode/stack/cause。 - App 的可见 action、engine、storage、viewport、manifest、PBR、open/save/recovery/autosave/GLB 失败统一显示固定短消息;源码门禁止 status setter 插入 `error.message` 或 Worker 原始消息。 - 顶栏新增“导出诊断报告”,JSON 绑定无查询参数页面 URL、userAgent、language、 crossOriginIsolated、当前 projectId/revision 和按 sequence 排序的诊断条目。 - 真实 Engine Worker crash 正例确认页面不出现 `WORKER_CRASH_INJECTED`,导出 JSON 保留该细节和 `WORKER_TERMINATED`;无效 blend/image 正例确认固定短消息与报告 detail 同时成立。 - 首轮浏览器门发现 React 开发模式重挂载会把已淘汰 StorageClient 的终止误记为 recent-project 故障;catch 现复核当前 client identity,报告不再混入旧 Worker 噪声。 - `node --test web/tests/unit/diagnostic-report.test.mjs`:3/3 通过。 - `WEB_TEST_PORT=5299 npx playwright test --config playwright.config.ts tests/e2e/diagnostic-report.spec.ts`:2/2 通过;M7-16 accessibility 1/1、M7-08 Worker recovery 2/2 定向回归通过。 - `WEB_TEST_PORT=5300 npm --prefix web run test:user-actions`:unit 30/30、单 Worker Chromium 29/29 通过;Worker crash 注入日志为预期测试输出。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`: 均通过,production build 64 modules transformed。 - `git diff --check -- web/protocol/diagnostic-report.ts web/tests/unit/diagnostic-report.test.mjs web/tests/e2e/diagnostic-report.spec.ts web/app/src/app/App.tsx web/app/src/app/app-shell.css web/package.json web/package-lock.json`:通过。 - M7-17 文件 SHA-256:`e18b6e8c375cb0842d7fb521462fe7af5b63257affeea4a34d02dec74afd660f` / `571f3c1d9df6ed905ed60da00efbdcc311c27147bb183db0d3e9d2e47293f28f` / `245fc99bb18986a4e09fc2a66f56f5602dc2519f32a7ec8931741439c03aa5bf` / `413fc12baeb247377825c53235d1198b5f628e23a8fb35c4ca68ebf34f65378a` / `c183861009cdfcd3ac4b0c5a632bc3af2256c68b4ff22cc6ffbc10f16947f8b4` / `61f6d13e0148321d3c625a5baa212b5444296d111193c4d62a692685faebff1f`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M7-18 实际验证 - 新增正式/调试 soak 命令和 schema v1 报告校验器;正式门固定要求 1,800,000 ms、超过 100 个 edit/autosave 周期、至少 20 次整页重开、revision/hash/dirty 一致、单次显式下载、快照上限、 页面错误为空以及 64 MiB heap / 16 MiB origin storage 增长上限。 - 首次 `WEB_TEST_PORT=5318 npm --prefix web run test:editing-soak` 实跑 1,801,443 ms,350 个周期、 30 次重开、final revision 701;除存储外均通过,但 origin 增长 33,761,087 bytes,报告稳定为 `FAILED`,未作为完成证据。根因是完整 `.blend` 快照在 IndexedDB 中反复写入并按 5 个保留数删除, 逻辑字节有界但 Chromium backing store 产生线性写放大。 - OPFS 可用时快照 payload 现写入 `projects//snapshots/.blend`,写后校验并按 retention 删除;IndexedDB 只保留 revision/bytes/SHA-256/backend/path 元数据。旧的 IndexedDB inline `buffer` 行仍可读取,StorageClient 协议、预算计数和恢复语义不变。 - `WEB_TEST_PORT=5319 npx playwright test --config playwright.config.ts tests/e2e/smoke.spec.ts tests/e2e/editing-soak.spec.ts -g "retains bounded snapshots|high-frequency retained snapshots"`: 2/2 通过;128 次 256 KiB 快照压力保持最后 5 个 OPFS 文件且 origin 增长不超过 4 MiB。 - `WEB_TEST_PORT=5321 npm --prefix web run test:editing-soak`:2/2 通过;正式长跑 1,804,650 ms, cycles/autosaves 352/352、reopens 30、revision 1 -> 705、final bytes 201,631、snapshot 5、 download 1、pageErrors 0、heap growth -310,276、storage growth 1,044,121;随后机器报告校验通过。 - `WEB_TEST_PORT=5322 npm --prefix web run test:user-actions`:unit 30/30、单 Worker Chromium 29/29 通过;`WEB_TEST_PORT=5323 npm --prefix web run test:v1-user-loop`:1/1 通过。 - `WEB_TEST_PORT=5324 npx playwright test --config playwright.config.ts tests/e2e/smoke.spec.ts -g "retains bounded snapshots|saves the opened blend|autosaves a dirty project|recovers verified atomic saves"`: 4/4 通过;`typecheck`、`lint`、production build(64 modules)和 `git diff --check` 均通过。 - OPFS/StorageWorker/soak spec/checker/report SHA-256: `74c63f14bef3ddbf60d1106519b3c9cdf370702cb1427e13e59670175d16b840` / `1cdfaf3f07a35276e5d169cafc6b153736c4e9ade20876e2a69bff81e92649dc` / `cb6d49f4be14f65482ca376aaf02b8220b5f26ad8435c83e2966f85c48c3d447` / `8ce82a135a5e857fabf0da87ea1b1609678d9e1738b5bccfd494622808893c41` / `dde16899f21d22dc9b3d0cc41e113b0b8d56a05fd388391ee301bbdcfdc67e4c`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-01 实际验证 - `npm --prefix web run test:nanovdb-page-feedback`:unit 4/4 通过。 - `npm --prefix web run typecheck`:通过。 - `npm --prefix web run lint`:通过。 - `npm --prefix web run build`:通过,production build 64 modules transformed。 - `git diff --check -- web/protocol/nanovdb-page-feedback.ts web/tests/unit/nanovdb-page-feedback.test.mjs web/package.json web/protocol/error.ts`:通过。 - `nanovdb-page-feedback.ts` SHA-256:`43027ff4114b895cd7730529023665d85024308641cc272c35f26ca496db6378`。 - unit spec SHA-256:`9a7358902117eabae81a1438b7ab6fea1ca8bd6fe05348a8d89614cc78829cd6`。 - `package.json` / `error.ts` SHA-256: `aba2cfc12a97fb515122927f1a8de879ab0a50539d26d0d3bc42957bb69d9a4b` / `8d6d1a3f49c5709f63b57ff01094002510665ddfff2a5a4a0f9df009d70aff42`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-02 实际验证 - `npm --prefix web run test:nanovdb-page-feedback`:合同 unit 5/5 通过。 - `WEB_TEST_PORT=5332 npm --prefix web run test:nanovdb-page-feedback-webgpu`:真实 WebGPU 1/1 通过;256 个并发 active-voxel 采样只记录一个未驻留 leaf page,overflow guard 未被改写。 - `npm --prefix web test`:全量 unit 83/83 通过。 - `WEB_TEST_PORT=5333 npm --prefix web run test:vdb-faults`:既有 network/Worker/device-loss/ demand-paging 1/1 通过。 - `WEB_TEST_PORT=5334 npm --prefix web run test:vdb-webgpu`:真实 Float32 native/CPU/GPU 数值与 确定性像素 1/1 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`:均通过, production build 65 modules transformed。 - 首轮 typecheck 发现仓库 WebGPU 声明不暴露 `GPUBuffer.size`,已移除该非合同属性读取并由 WGSL `arrayLength` 执行物理边界;首轮浏览器断言错误假定缺页 sample 必须 invalid,已按既有零/非 active fallback 语义修正,缺页事实只由 feedback 证明,随后完整重跑通过。 - `git diff --check -- `:通过。 - protocol/renderer/sampler/Worker SHA-256: `d7c3f443d046f0c203c9041e44317830f6cb09f3738e5d34c188191bc044c4f2` / `307a1693d5ffd87662cbf1cccfec8630d999ca2b9d6c845db16975b5ee9224fc` / `141a32fc9866485f48b64c85fa7c905b367e48ec2e9e6869f90fbbf0f491864a` / `b98e740225c752a129aaa3fa0203295150fadf5d043da4d9cef220532f15b8d3`。 - unit/e2e/package SHA-256: `0d76b6ffd0f6e994c6ba97498a44c0c8dc5d41db0e65ba5b9f80ed740fccbe48` / `a740df22a86945df601fe87d0867bb5c2589d6bbfa7ff8ccfc00416f9f7a0d63` / `b96f8434d152643411eb3b0ad70a8c25688b49ff051484a76828659efd5d0ea4`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-03 实际验证 - `npm --prefix web run test:nanovdb-page-feedback`:合同 unit 6/6 通过;重复 GPU 槽输入规范化为 `[2, 5, 7]`,并绑定指定 render revision,非法 revision 稳定拒绝。 - `WEB_TEST_PORT=5336 npm --prefix web run test:nanovdb-page-feedback-webgpu`:真实 WebGPU 1/1 通过;leaf/overflow readback 分别绑定 revision 17/18,输出排序、去重和 guard 均通过。 - `npm --prefix web test`:全量 unit 84/84 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`:均通过, production build 65 modules transformed。 - `git diff --check -- `:通过。 - protocol/renderer/Worker SHA-256: `358e70fc6aa3a1c36c191e04f8588c9829d54f4e6a2a4b00d54da2c54165bcd0` / `653680a018d088d18cf978e061ddf649d2d7048de24c79d607cbc8ea3e363d26` / `c81d19d20af0fab00111eb9f578fdf26cb757743a28bc4404aa53cfa0c2854bc`。 - unit/e2e SHA-256: `35aecc597acf4d40dde231f80b9aaacb8afe4e05be13b0d3373ae7837d6d0ef9` / `b83422a61decee352e45779acd31e7decaede51cdb8b9ae1c99c40b796252eb9`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-04 实际验证 - 新增 `dispatchNanoVDBPageFeedbackBatch` 作为 page request 的唯一 revision gate;旧/未来 frame 都返回 `STALE/REVISION_CONFLICT`、`requestedCount=0` 和空 page ID 列表,且不调用 I/O 适配器; 当前 frame 才按 CPU batch 的数值升序调用适配器。 - `npm --prefix web run test:nanovdb-page-feedback`:合同 unit 7/7 通过;覆盖旧 revision、未来 revision、匹配 revision 和非法当前 revision,两个 mismatch 正例合计 I/O 调用为 0。 - `WEB_TEST_PORT=5325 npm --prefix web run test:nanovdb-page-feedback-webgpu`:真实 WebGPU 1/1 通过;revision 17 leaf readback 对当前 revision 18 返回 stale 且页 I/O 为 0,匹配正例只请求 唯一 leaf page 一次。 - `WEB_TEST_PORT=5326 npm --prefix web run test:vdb-webgpu` 与 `WEB_TEST_PORT=5327 npm --prefix web run test:vdb-faults`:既有 Float32 数值/像素及 network/Worker/device-loss/demand-paging Chromium 回归各 1/1 通过。 - `npm --prefix web test`:全量 unit 85/85 通过;`npm --prefix web run typecheck`、 `npm --prefix web run lint`、`npm --prefix web run build` 均通过,production build 65 modules transformed;M8-04 文件 `git diff --check` 通过。 - protocol/unit/Worker/e2e SHA-256: `0d0cd81175147a5a8dcc1eb272aeb13f44b5c694097a4c8926b12b4668fc918e` / `d72db3d7b352a68327592306a4b5cea49bfa0513f52f006b8e8c3f6433554814` / `baedb58bc84d9374701f2aecfa82da64c1caf95a51190757e1c6761c756ac638` / `e622a913ef66186fc2fe0f095c7dc8c16671cbe1c001628732ca4be978afe9ce`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-05 实际验证 - 新增 `loadNanoVDBFeedbackPages` 薄组合层:先执行 M8-04 revision gate,再复用既有 `loadNanoVDBGridPage`;后者从已校验 manifest 计算页/chunk 交集,请求完整声明 chunk 并执行 `verifyNanoVDBChunk`,没有第二份 page range 或 hash 地址模型。 - 首轮 `WEB_TEST_PORT=5328` 失败为 `requested GPU page is outside the grid`:M8-02 合成 shader 使用 256 KiB 页,而 fixture manifest 声明 4 MiB,证明两套 page ID 不可混用;统一 leaf 测试到 4 MiB 后 `WEB_TEST_PORT=5329` 又稳定暴露 root page 也缺失导致 sampler invalid。最终将 M8-02 leaf-only/overflow 压力网格与 M8-05 manifest I/O 网格明确分离,两个失败均未作为完成证据。 - `WEB_TEST_PORT=5337 npm --prefix web run test:nanovdb-page-feedback-webgpu`:真实 WebGPU 1/1 通过;manifest 4 MiB 页 0 feedback 绑定 revision 19,current=20 时 source 调用为 0,匹配时 请求 range 逐项等于 manifest chunk 的 `index/start/end/hash`,加载页与原 payload 逐字节一致。 - `WEB_TEST_PORT=5338 npm --prefix web run test:vdb-faults`:既有 network/Worker/device-loss/ demand-paging 1/1 通过;`npm --prefix web test` 全量 unit 85/85 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`: 均通过,production build 65 modules transformed;M8-05 文件 `git diff --check` 通过。 - viewport loader/Worker/e2e/protocol SHA-256: `46847ee46ecce4483dc378e6c1f4daa474994d38cc0b30bbde9cf43fd4a78c91` / `c342976575e45d14a798d4865fde673317d2054592779c87501db7f3e2037a97` / `5ceaacb2c97d9e4dc3db86c6ecae7a0e3bf8620c5454d61f2cb478dd6b29222e` / `0d0cd81175147a5a8dcc1eb272aeb13f44b5c694097a4c8926b12b4668fc918e`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-06 实际验证 - 新增 `NanoVDBGridPageRequestCoordinator`,以绑定的 manifest/grid/source 和 page ID 为请求域; 首个订阅者创建唯一 loader/内部 AbortController,后续同页订阅加入同一 pending entry。成功时 每个存活订阅者获得 `slice(0)` 独立 buffer,完成、失败、取消和 dispose 均移除 abort listener。 - 真实并发正例让 source 在实际 HTTP range 前暂停:两个 `loadNanoVDBFeedbackPages` 同时请求页 0, 观测 `pendingPages=1/subscribers=2/rangeCalls=1`;取消第一个后为 1/1 且底层 abort=0,释放 range 后只有第二个 consumer 成功,完成统计归零。 - 最后订阅者取消负例使用阻塞 range:两个调用者仍只产生一次 source;首次取消保持底层存活, 第二次取消使底层 signal abort 恰好一次,两个调用者各自只结算一次 `AbortError`,pending 归零。 - `WEB_TEST_PORT=5340 npm --prefix web run test:nanovdb-page-feedback-webgpu`:专项 Chromium 1/1 通过;`WEB_TEST_PORT=5341 npm --prefix web run test:vdb-faults`:既有 fault/demand paging 1/1 通过;`npm --prefix web test`:全量 unit 85/85 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`: 均通过,production build 65 modules transformed;M8-06 文件 `git diff --check` 通过。 - coordinator/Worker/e2e SHA-256: `f7f2d02d7b946116b726e58051fafbb745f2eea110fa58409190c5af6e002a58` / `ca459878899f7328406e8e3f571c432eba99fdc96a73cd58f929aee64ba458cf` / `95b7fb8b59d45e7b5dd567675fbd7dc622c1baf1f9fba4fac5ccdcd0a2eac976`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-07 实际验证 - 生产顺序保持 `source -> verifyNanoVDBChunk -> coordinator resolve -> feedback consumer`; resident cache 写入只发生在 consumer,因此 hash 未通过时没有未验证 bytes 可进入 GPU page slot。 - Chromium 负例从真实 HTTP source 读取声明 chunk 后翻转首字节,长度和 range 均保持不变; `loadNanoVDBFeedbackPages` 稳定抛出 code/message `NANOVDB_HASH_MISMATCH`,rangeCalls=1、 residentWrites=0、residentPageCount/residentBytes=0、residentVirtualPages=[],coordinator 统计归零。 - `WEB_TEST_PORT=5342 npm --prefix web run test:nanovdb-page-feedback-webgpu`:专项 1/1 通过; `WEB_TEST_PORT=5343 npm --prefix web run test:vdb-faults`:既有 fault/demand paging 1/1 通过; `npm --prefix web test`:全量 unit 85/85 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`: 均通过,production build 65 modules transformed;M8-07 文件 `git diff --check` 通过。 - Worker/e2e/coordinator SHA-256: `2e12112a8c855d578be70e869ea6cdc5575f410c11307ced9edd6f9bca1a03a6` / `b84a2502d65a02e6d0d9c2c2adf919abdfc151dc1228492b230e13492bc25244` / `f7f2d02d7b946116b726e58051fafbb745f2eea110fa58409190c5af6e002a58`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-08 实际验证 - `NanoVDBWebGPUGrid` 增加 frame-scoped pin 合同;`beginFrame` 清理上一 frame pins, `pinPage` 只接受当前 resident page,LRU replacement 过滤 pins,`endFrame` 和 dispose 清理集合; 全槽 pin 时返回 `NANOVDB_GPU_BUDGET_EXCEEDED: all resident NanoVDB pages are pinned`。 - 真实 GPU 容量 2/虚拟页 4 正例:页 0/1 resident 后 begin/pin(0),上传页 2 跳过更旧的页 0 并 淘汰页 1;随后 pin 0/2 时上传页 3 稳定失败,resident `[0,2]` 和 evictionCount=1 不变;下一 frame 只 pin 2 后上传页 3,页 0 才被淘汰,最终 resident `[2,3]`、evictionCount=2。 - 首轮 `WEB_TEST_PORT=5344` 仅 page-table readback 断言失败:原 buffer 没有 `COPY_SRC` usage, 逻辑 resident 断言均已通过。direct/paged page table 增加诊断 readback usage 后, `WEB_TEST_PORT=5345 npm --prefix web run test:nanovdb-page-feedback-webgpu` 1/1 通过,真实表为 `[0xffffffff,0xffffffff,1,0]`。 - `WEB_TEST_PORT=5346 npm --prefix web run test:vdb-faults`、`WEB_TEST_PORT=5347 npm --prefix web run test:oom-recovery`:既有 demand-paging 与四域 OOM 各 1/1 通过;全量 unit 85/85 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`: 均通过,production build 65 modules transformed;M8-08 文件 `git diff --check` 通过。 - renderer/Worker/e2e SHA-256: `8668e5ff81963c08d1064d32aebbd715d283892a71d2137514d8c87a2ae37747` / `3b5fea1fd890057d63651a7ca5b78c3af612b800444cd78f19ace4698323976c` / `3e4de849534edd6c6cb230dd62ae797c42be9295e8cf3163b1ec73b8a8e840b2`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-09 实际验证 - `NanoVDBProgressivePageUploader.upload` 先调用真实 grid upload,成功后再交给共享 redraw scheduler;pending frame 存在时后续成功 upload 返回 `redrawScheduled=false`,不会加入第二个 frame。非法 page upload 先抛 `NANOVDB_STREAM_INCOMPLETE`,scheduler 计数保持不变。 - 真实 WebGPU 容量 3/虚拟页 3:页 0/1 连续成功上传后只有 1 个 queued frame;执行回调后 `scheduledCount/redrawCount=1/1`,页 2 再上传才安排第二个 frame,最终计数严格为 2/2。 - `WEB_TEST_PORT=5350 npm --prefix web run test:nanovdb-page-feedback-webgpu`:M8-02 至 M8-09 专项 Chromium 1/1 通过;`WEB_TEST_PORT=5351 npm --prefix web run test:vdb-faults`、 `WEB_TEST_PORT=5352 npm --prefix web run test:oom-recovery`:既有 demand-paging 与四域 OOM 各 1/1 通过。 - `npm --prefix web test`:全量 unit 85/85 通过;`npm --prefix web run typecheck`、 `npm --prefix web run lint`、`npm --prefix web run build` 均通过,production build 65 modules transformed;全工作树 `git diff --check` 通过。 - renderer/Worker/e2e SHA-256: `07225e5a7f07bc7af0e9bceeae77dd4f267ae6c56e08eb71120eec52f3e4acae` / `8beed26a5bea315d412427b80c64e1071809104ae89aaea5e1d122919f3cd1ba` / `61f26e7d86f741074c74496f256d15c4ec6804754e1f5d230cbb48d2bf15699f`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-10 实际验证 - 新增纯 `nanovdb-progressive-redraw` 预算合同:默认每个 render epoch 最多 32 次重绘,调用方 可配置 1..1024 的整数上限;预算耗尽后稳定返回 `NANOVDB_PROGRESSIVE_REDRAW_LIMIT`,并保留 `capped`/`errorCode` 可观测状态。`beginRender()` 清零当前 epoch 计数并使旧回调 generation 失效,避免陈旧回调在新渲染周期重新触发循环;非法上限和计数返回 `NANOVDB_INVALID_ARGUMENT`。 - 真实 WebGPU worker 用上限 2 重复成功上传同一页 4 次:只排入并执行 2 个 frame,后两次 `redrawScheduled=false`,统计为 `scheduledCount/redrawCount=2/2`、`capped=true` 和稳定错误码; reset 后统计清零且 errorCode 为 null。非法页仍在调度器之前失败,不消耗预算。 - `WEB_TEST_PORT=5353 npm --prefix web run test:nanovdb-page-feedback-webgpu`:M8-02 至 M8-10 专项 Chromium 1/1 通过;`WEB_TEST_PORT=5354 npm --prefix web run test:vdb-faults`:既有 network/Worker/WebGPU fault 1/1 通过;`WEB_TEST_PORT=5355 npm --prefix web run test:oom-recovery`: WASM/OPFS/GPU/NanoVDB 四域 OOM 1/1 通过。 - `npm --prefix web test`:全量 unit 87/87 通过(新增 M8-10 unit 2/2); `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build` 均通过, production build 66 modules transformed;`git diff --check` 通过。 - M8-10 文件 SHA-256:renderer `8b229173986fcca8c6d02ae1a0a15280c0f4e381de6eccb53c3b5e583d4d4116`、progressive protocol `7f02e51cb47758b02bb1ea5d8d0fe6e0e8aebeceac5a6b3603f22647cf8ec913`、error contract `f33540bbcc71add8784adb666d0bcc4f0a6141651a446a641573a98448debd77`、Worker `e5f8d6e66387be61410431e12be31df587075dd2408305ba883ff5b624c06274`、e2e `7fc1a630e921def8a216a9d16a196414fcb64523f5d6c908942ac1611664260b`、unit `bf5c3836c4e6f02eea333d21dc315c8cc1b4706ae15921e24e0cc8d787dbe253`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-11 实际验证 - 新增主线程 WebGPU 专项:直接在页面主线程创建真实 paged NanoVDB grid,按 256 KiB 页大小故意 不驻留 leaf page;Float32 sampler 读取缺页 feedback 后,从 fixture HTTP 精确 range 加载该页, 通过 `NanoVDBProgressivePageUploader` 上传并排入一次 redraw。加载后采样恢复 valid,未使用 CPU proxy 或 worker 结果代替主线程 GPU 路径。 - 使用同一驻留表连续执行两次 64x64 `renderNanoVDBFloat32WebGPU`;两次输出均为 16,384 bytes, 可见像素 4,096,SHA-256 完全一致,证明缺页加载后的像素结果确定且非空;scheduler 统计为 pending=false、scheduledCount/redrawCount=1/1、capped=false。 - `WEB_TEST_PORT=5359 npm --prefix web run test:nanovdb-main-thread-webgpu`:主线程 Chromium 1/1 通过;此前 M8-10 专项、VDB fault 和四域 OOM 回归仍保持通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`git diff --check`:均通过; M8-11 e2e SHA-256 `47fd18f653090398ba8d03a2663627f7c091f4fa4ad1a69d5b708f9db975af26`, package script SHA-256 `b83be017b5dd1bb0b3b50d55057a47eb938ec4dcfe30b9818c4dc772702b42ad`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-12 实际验证 - 新增 Offscreen Worker WebGPU 专项,使用与主线程相同的 256 KiB page layout、leaf 缺页反馈、 精确 HTTP range、page upload 和 progressive redraw 序列;Worker 端不是只验证状态,而是实际 执行 `sampleNanoVDBFloat32WebGPU` 与 64x64 `renderNanoVDBFloat32WebGPU`。 - 主线程和 Offscreen Worker 均观察到同一 leaf page ID、唯一 page request、queued frame=1、 redraws=1;最终像素 16,384 bytes 的 golden SHA-256 均为 `87d08a77a644f37ed59609ebdd18555ab1924f9a3b30d8d084db35e7776cfb9c`,各路径重复渲染 hash 相同。 - `WEB_TEST_PORT=5363 npm --prefix web run test:nanovdb-offscreen-page-feedback-webgpu`:Offscreen Worker Chromium 1/1 通过;`WEB_TEST_PORT=5364 npm --prefix web run test:nanovdb-main-thread-webgpu`: 主线程 golden 1/1 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`、 `git diff --check`:均通过,production build 66 modules transformed。 - M8-12 文件 SHA-256:Worker `d8805ef02a44f086bbbab8c5206d22d8b525c650a052c50d60386e30f451b4bc`、Offscreen e2e `e7ce2248933afd307b744282c8c91e29dab6a833be6a050eae2d6c327c359d54`、主线程 e2e `dd16d8a491ae57725b2e9e9ce63839104ebb970febfff3747613e01e7bedf40b`、package scripts `de6c1cc18a8792fc589da9f0c8d2937a5a78114cd2fa417fc3fe1d65ad635b81`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-13 实际验证 - 新增 page feedback resume Worker:以 256 KiB page manifest 通过 `loadNanoVDBFeedbackPages -> NanoVDBGridPageRequestCoordinator -> loadNanoVDBGridPage` 请求页 0, 首个 chunk response body 在已交付 4096 bytes 后注入中断;resumable range source 的第二次请求 精确从 `Range.start + 4096` 续传,并发送首个响应的 `If-Range` ETag。 - 恢复后的 page `consumedBytes == expectedBytes`、SHA-256 与直接 page range 完全一致;dispatch 为 `ACCEPTED/renderRevision=17/requestedPageIds=[0]`,coordinator 最终 `pendingPages/subscribers=0/0`。这验证的是缺页反馈消费链的 page-level resume,不仅是独立 chunk smoke。 - 首轮 `WEB_TEST_PORT=5365` 仅断言固定 fixture page 跨 chunk 数量过严(实际 page 0 只跨一个 chunk,仍发生两次请求且已从 +4096 续传);修正为 `>=2` 后, `WEB_TEST_PORT=5366 npm --prefix web run test:nanovdb-page-resume` 1/1 通过。 - `npm --prefix web run lint`、`npm --prefix web run build`、`git diff --check`:均通过,production build 66 modules transformed。 - M8-13 文件 SHA-256:Worker `7095f447f92b79260d4a80d667e219845d74331ddbcc15fe2c915bd7c120efcb`、e2e `d94b5f78f01fdde488a880c2c16cd896d71ed9098e1fdb9fdcef2547ba2959cc`、package scripts `e18b887712585b19910332d3d7ffc7e3d012f5bd1d5e9d09d6911f0defeb4557`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-14 实际验证 - 新增 Worker restart 专项:`prepare` Worker 将 128 KiB/两 chunk NanoVDB bundle 原子提交到 OPFS,并在旧 GPU grid 驻留页 0;Worker 终止后由全新 `reopen` Worker 读取同一 manifest。 旧 Worker 传入的 `claimedResidentPages=[0]` 不参与恢复,新 grid 的初始 resident 严格为空。 - 正例通过 `openNanoVDBFromOPFS -> loadNanoVDBGridPage` 重新读取声明 chunk,长度和 SHA-256 通过后才上传页 0,resident 变为 `[0]`。负例翻转 `00000.chunk` 首字节且保持长度不变,页加载 稳定返回 `NANOVDB_HASH_MISMATCH`,独立 verification grid 的 resident 保持 `[]`;随后恢复并 清理 OPFS fixture。 - 首轮 `WEB_TEST_PORT=5368 npm --prefix web run test:nanovdb-opfs-restart` 暴露测试 manifest 将源路径误写为 `.nvdb`,生产合同以 `NON_MESH_BINARY_INVALID` 正确拒绝;改为原始 `.vdb` source 与 `.nvdb` bundle 后,`WEB_TEST_PORT=5369` 专项 Chromium 1/1 通过。 - `WEB_TEST_PORT=5370 npm --prefix web run test:vdb-opfs`、`WEB_TEST_PORT=5371 npm --prefix web run test:vdb-faults`:既有 OPFS hash-bound reopen 与 network/Worker/WebGPU fault 各 1/1 通过。 - `npm --prefix web test`:全量 unit 87/87 通过;`npm --prefix web run typecheck`、 `npm --prefix web run lint`、`npm --prefix web run build` 和全工作树 `git diff --check` 均通过, production build 66 modules transformed。 - M8-14 文件 SHA-256:Worker `0c8eda762a9c7051b09bdb0feb8c30222775ac8e469bd9dfc98211f92ec63c50`、e2e `4c8c5d27fc81b1f5c2bad8adb4947ee1865ef5ae395e7282282615c2341bb5fe`、package scripts `c60ca8c69a459faef187b742a3b1c14152f2134ce1792d4987ae26aed8a448f9`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-15 实际验证 - 新增纯 `nanovdb-device-recovery` schema v1:可见页 ID 数值排序、去重并验证在虚拟 grid 范围内,`replayedPageIds` 最多等于 `residentPageCapacity`,其余明确进入 `skippedPageIds`; page count、容量和页 ID 漂移统一返回 `NANOVDB_INVALID_ARGUMENT`。 - 新增生产 `rebuildNanoVDBGridAfterDeviceLoss`:每次只在恢复后的新 device 上创建 page table, 初始 resident 严格为空;仅对计划中的可见页调用现有 `loadNanoVDBGridPage` 复验 manifest chunk 后上传。任何加载/校验失败都会 dispose 整个新 grid,不保留部分可信状态。 - 真实 WebGPU device destroy/recover 后 generation 增加 1;输入可见集合 `[2,1,0,2]` 规范化为 `[0,1,2]`,容量 2 只回放 `[0,1]`、跳过 `[2]`。旧 resident 的末页没有自动恢复,真实 page table 前两项为 `[0,1]`、其余全为 `0xffffffff`,回放页的 GPU words 与已验证源页一致。 - `node --test web/tests/unit/nanovdb-device-recovery.test.mjs`:2/2 通过; `WEB_TEST_PORT=5372 npm --prefix web run test:vdb-faults`:专项 Chromium 1/1 通过。 - `WEB_TEST_PORT=5373 npm --prefix web run test:nanovdb-page-feedback-webgpu`、 `WEB_TEST_PORT=5374 npm --prefix web run test:nanovdb-opfs-restart`、 `WEB_TEST_PORT=5375 npm --prefix web run test:oom-recovery`:分页、Worker restart、四域 OOM 各 1/1 通过;全量 unit 89/89、typecheck、lint、production build(67 modules)和 `git diff --check` 均通过。 - M8-15 文件 SHA-256:recovery protocol/unit `4eb9685efbf8a4cf7c47892ce2613a7377f3e24e07ffb8ac3056fc19959f6513` / `271789b875c9d0f5c7ac3f8e283fb717c9846d913a37581a5d3f11a59bd68f91`;viewport/Worker/e2e `97da1edd026bd522750182227031fa67f013397037bc2d417b69f832fa0d3b5c` / `79ca3e0f53736d39b2a1f925012183a321e7fe4189eaa8c165cb923fa21af91a` / `3e1b7900fbc4af7efe943311052f6f6abedd02810e39ddd79d15428c3ebe9347`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-16 实际验证 - `NanoVDBWebGPUGrid` 的 direct/paged dispose 与新增 `NanoVDBPagedRenderResources` 统一为幂等; 三资源组原子创建 resident buffer、page table 和 feedback buffer。feedback 初始化 `queue.writeBuffer` 抛错时先由 feedback 创建器释放自身,再由资源组释放 grid 的另外两个 buffer,重复 dispose 不再调用底层 destroy。 - OOM suite 保留 `NANOVDB_PAGE_TABLE` 故障,证明 page table 未发布且已分配 resident 只释放一次; 新增 `NANOVDB_FEEDBACK_BUFFER` 故障,在三个 buffer 均已创建后于 feedback 初始化注入。 受控真实 WebGPU proxy 观测三个 label 的 destroy count 各为 1,峰值资源 3、最终资源 0、总释放 `131112 = 2*65536 + 8 + 32` bytes;随后同 device 上资源组、页上传、LRU 与双 dispose 均通过。 - `WEB_TEST_PORT=5376 npm --prefix web run test:oom-recovery`:WASM/OPFS/GPU/NanoVDB 四域 Chromium 1/1 通过,NanoVDB 报告包含两个稳定故障点且 schema 校验通过。 - `WEB_TEST_PORT=5377 npm --prefix web run test:nanovdb-page-feedback-webgpu`、 `WEB_TEST_PORT=5378 npm --prefix web run test:vdb-faults`、`WEB_TEST_PORT=5379 npm --prefix web run test:nanovdb-main-thread-webgpu`、`WEB_TEST_PORT=5380 npm --prefix web run test:nanovdb-offscreen-page-feedback-webgpu`:分页、device loss、主线程和 Offscreen 各 1/1 通过。 - 全量 unit 89/89、typecheck、lint、production build(67 modules)和 `git diff --check` 均通过。 - M8-16 文件 SHA-256:OOM protocol/renderer/scenario/e2e `e93f4549dfb0e368fce41ed3c68461c1dbd6791601e37f832edfe4620fcd437e` / `fa228b46dae1a1b9c6f04bb41b370b7f08d7e2c0b83a5174035e429861b36486` / `616b25a6cbb3d03f599d9bb709c18f73d5df7c169fe33458fa4425ded4d26aa9` / `714eee1d60c037c22c253caa78ead945eb4b0492f5f9418536015e5463531827`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-17 实际验证 - 新增 Vite `__vdb_sparse_64m__` HTTP fixture:逻辑 bundle 严格 67,108,864 bytes,16 个 连续 4 MiB chunk,声明 SHA-256 与实际零填充响应一致;range 响应按 64 KiB 流式写出,支持 稳定 ETag/Content-Range 和可控 body 延迟,不把 64 MiB fixture 写入仓库。 - 新增 sparse-performance Worker,使用生产 `validateNanoVDBBundleManifest`、 `createResumableHttpNanoVDBRangeSource`、`NanoVDBGridPageRequestCoordinator` 和 `loadNanoVDBFeedbackPages`。成功读取 page `[0,16,128,192]` 实际发起 4 次 range,传输 16,777,216 bytes,4 MiB 峰值 range 工作集,首 page 83--89 ms、成功阶段 339--345 ms; coordinator 结束为 `pendingPages/subscribers/pageIds=0/0/[]`。 - 同一 HTTP range 路径注入 2 ms body delay 后中途 Abort:实际收到 327,680--393,216 bytes, consumer 调用 0,底层 request abort 1,取消延迟 12--13 ms,最终 coordinator 仍为 `0/0/[]`,错误稳定为 `AbortError/CANCELLED`。该门只证明传输、分页和取消预算;真实 NanoVDB traversal/pixel 仍由 M8-11/M8-12 专项覆盖。 - `WEB_TEST_PORT=5381 npm --prefix web run test:nanovdb-sparse-performance`:专项 Chromium 1/1 通过;独立复跑 `WEB_TEST_PORT=5386` 仍 1/1。回归 `WEB_TEST_PORT=5382` page feedback、 `5383` page resume、`5384` VDB faults、`5385` OOM 各 1/1 通过。 - `npm --prefix web test`:全量 unit 89/89 通过;`npm --prefix web run typecheck`、 `npm --prefix web run lint`、`npm --prefix web run build` 均通过,production build 67 modules transformed;相关 `git diff --check` 通过。 - M8-17 文件 SHA-256:Vite sparse fixture `fd160c685ed780738e2b37ce9a32e5d4718e11a2875e12d86ddad310213abaf3`、Worker `56b5b10c0b138484b621822fca766f3dffad19692964f018e0d21d9a6df126de`、e2e `de7230678f084bd51c7f2a845d22e3709435131e317c8504491c5a2c5a4d79ab`、package scripts `7aecb80c67a7568b07f890be2d751a150532f0ae0f8ab66e92bce64419e73a7b`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M8-18 实际验证 - Volume Main、NanoVDB asset binding 与双生产视口保存/重开已完成;主线程和 Offscreen 均从同一 OPFS commit 恢复 Volume 数据、source path、density grid 与 asset hash,未把 viewport 临时状态当作 Main 数据写回。 - `WEB_TEST_PORT=5387 npm --prefix web run test:nanovdb-volume-roundtrip`:Chromium 1/1 通过;既有 OPFS/hash-bound、VDB fault、分页、OOM 回归保持通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`、 `git diff --check`:均通过,production build 67 modules transformed。 M8-19 实际验证 - `tests/golden/M8-19/manifest.json` 固定 generated-smoke-vdb source SHA-256 `586f7cdf4b3329fcb7ef00fc57b12a268baafdbaac0a2b3d1bfa142a22ccda33`、OpenVDB 13.0.0、 `volume-wgsl-v1`、64x64 RGBA8 和三轴误差阈值;X/Y/Z 三份 desktop reference 均为 16,384 bytes,alpha coverage 3,552 pixels,SHA-256 均为 `87d08a77a644f37ed59609ebdd18555ab1924f9a3b30d8d084db35e7776cfb9c`。 - `node --test web/tests/unit/nanovdb-render-golden.test.mjs`:unit 2/2 通过; `WEB_TEST_PORT=5390 npm --prefix web run test:nanovdb-render-golden`:Chromium 1/1 通过。 主线程、Offscreen 与 desktop 三轴比较均 `READY`,max/mean/RMS channel error 和 alpha coverage delta 均为 0,backend 比较字节级一致。 - M8-19 protocol/Worker/unit/e2e/manifest SHA-256: `c4375cecc8c2ab4d0c2fd2081a92a8d1265a345f429353a0d92a9456df56f6a0` / `9f3e2e31cfa4c4a0ca2ae7ef8175f37fbbe50aada628c7d0e40a338c4b0eba21` / `5b4d64afa788cf97ee1978f05defc242c3e65de5a10e09abc1a067e4321d526a` / `c23a2e2bb88ff3807b6fcac5cf7be526d08cf4b475f9ef7d8f720186af94397b` / `2fb535d981820fff90bcb9fa353b237e513d0b52ffafaa6b63dc4c7c677e57da`。 M8-20 实际验证 - 仅在 M8-01 至 M8-19 全部专项通过后更新 N-015 对应 VDB slice;slice 台账从 177/60 调整为 181/58,N-015 全域仍保持 `parity BLOCKED`,没有把有限 Volume/VDB 能力推断成完整 Blender parity。 - `docs/CURRENT_EXECUTION_PLAN.md`、`docs/PROJECT_STATUS_AND_NEXT_WORK.md`、 `docs/status/N-015.md`、`docs/status/parity-ledger.json` 与 `docs/status/release-evidence.json` 的 M8/ledger/evidence 联合校验通过;M8 正式计数为 20/20。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-01 实际验证 - 新增纯 `external-vfont` schema v1 校验器:仅接受项目内 `//fonts/` 路径、TTF/OTF/PFB 扩展名与 MIME 对、对应字体 magic bytes、32 MiB 大小上限和声明 SHA-256;验证成功前 只复制 ArrayBuffer,不调用 StorageClient、WebEngineClient 或任何 Main 写回。 - 真实 Blender `bfont.pfb`(25,181 bytes,SHA-256 `a33954fdab9fb09b9d308cb7f970518293128922ffc523c0a22b3b314a9a56c6`)通过;路径逃逸、 类型伪装、大小超限、长度漂移和 hash 漂移分别返回稳定错误码。 - `node --test web/tests/unit/external-vfont.test.mjs`:unit 2/2; `WEB_TEST_PORT=5391 npm --prefix web run test:external-vfont`:Chromium 1/1; `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`、 `git diff --check`:均通过,production build 67 modules transformed。 - M9-01 protocol/Worker/unit/e2e SHA-256: `f313e344b7708196c323f1ab25f1aff4bdaf8cbc277bc7ff25166e0015f29114` / `f8ea3d199b996970da437cac5c1727d2b1f4d2b73ff346dee7ba20568768ed09` / `cc4ed4fb724563e6df8692e8777e4a241ee41712605c6154d6fca238f52b138e` / `d0bbdc47b71e0442b4744ccfebddb2a687d3520f13a49dfdbac98f1b10a70d13`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-02 实际验证 - 新增外部字体导入事务:复用 M9-01 校验后,先调用 Storage Worker `putAsset`;只有 receipt 的 project、hash、bytes、MIME、source path 和 `projects//assets/sha256//` OPFS 路径全部一致,才构造 Main 命令。 - WebEngine Worker 在进入 WASM 前重新验证 receipt、32 MiB 预算、base64 bytes、字体 magic 和 SHA-256;Blender Main writer 从同一 bytes 创建 packed VFont,并以原 `//fonts/` 路径发布到 SceneIR。存储失败注入确认 Main 调用为 0;Main 失败时已验证 OPFS 资产保留为可清理孤儿。 - 首次 native 增量编译发现本分支 allocator 不暴露 `MEM_mallocN/MEM_freeN`;改用仓库既有 `MEM_new_array_uninitialized/MEM_delete` 所有权后,`cmake --build build_web_blender6 --target web_engine -- -j8` 通过,新 WASM 已安装到生产 Worker 的 src/public vendor 位置。 - `node --test web/tests/unit/external-vfont.test.mjs`:M9-01/M9-02 unit 3/3; `WEB_TEST_PORT=5395 npm --prefix web run test:external-vfont`:Chromium 2/2;真实 PFB 的事件顺序为 `storage:start -> storage:committed -> main:start -> main:committed`,新增 VFont 为 packed。 - `npm --prefix web run test:nonmesh-roundtrip`:既有 Font links、undo/redo、save/reopen 通过; content-addressed asset Worker restart 定向 Chromium 1/1;全量 unit 94/94、typecheck、lint、 production build(67 modules)、local-dependencies 和 `git diff --check` 全部通过。 - M9-02 protocol/orchestrator/Worker/Main/API/unit/e2e/WASM SHA-256: `44dea6d944f9ed891dd30f00bc4e03fdaf9e528ea97c911ea87036d131c6e0c8` / `0f3801549dcffcf592e6f579cecf3fb97b78ccb1fc0b272a862ab11d062f77d8` / `90dd37e3c94ec62b8f6dfc67acc3aa9c5fbe9a3114f0c553984e628419c3aaa4` / `30f6d7edc394162fbdf9f8b404cc16f309fb2ad5cad9dada769b38221607d8ea` / `6bfec5d5aca321c9c9694263648c763a295137cbfb03d7e13d4ad05907e3606e` / `9ebd6f4628d59e919425ec4ddee8d3ca75445a69c5499402a3d3d3fd817e6e4a` / `020b99560b4328f8593c2bc064867903b80229f2c36e7d7fa65d4f6a621e51e3` / `a2e1f8bf1cd02c288538230bcc891d0208694fe97e0ea5dc32192580d671299e`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-03 实际验证 - SceneIR VFont 资源新增真实 packed byte length 与 SHA-256;native reader 从保存后的 PackedFile bytes 计算身份,协议对 packed/unpacked 字段组合失败关闭。外部字体导入只有在 Main 发布的 length/hash 与 OPFS receipt 完全一致时才成功。 - 新增生产字体样式替换协调器:先由 Storage Worker `readAsset` 复验 project、content-addressed path、source path、MIME、长度和 SHA-256,再以单次 `setFontLinks` 修改 regular/bold/italic/ boldItalic。missing metadata/bytes 稳定映射为 `NON_MESH_RESOURCE_MISSING`,Worker 等其他故障不被 错报为资源缺失;缺失路径确认 Main 调用为 0。 - 真实 Chromium 完成 import -> regular replace -> undo -> redo -> save Project;删除 OPFS font payload 后,新的替换请求稳定阻断,但新 WebEngine 从已提交 `.blend` 重开仍恢复同一 packed VFont、length/hash 与四项 links,证明保存文件不依赖已删除源资产。 - `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8` 通过;新 stable WASM 已安装到生产 Worker 的 src/public vendor 位置。 - `node --test web/tests/unit/external-vfont.test.mjs`:M9-01 至 M9-03 unit 5/5; `WEB_TEST_PORT=5399 npm --prefix web run test:external-vfont`:Chromium 3/3;全量 unit 96/96。 - `npm --prefix web run test:nonmesh-roundtrip`:Font links、undo/redo、save/reopen 通过;content-addressed asset Worker restart 与跨项目 orphan cleanup Chromium 各 1/1;typecheck、lint、production build(67 modules)、local-deps 和 `git diff --check` 全部通过。 - M9-03 protocol/orchestrator/SceneIR/Storage/native-reader/unit/e2e/WASM SHA-256: `2a2f8a3c5a86227ca294c03c032de48b6e539ccc798aad2f56bdc642711b5748` / `d6e35eb562fd577c54d554c53e9be0c658e382742ee4d6129180fa908691b7ef` / `8bb885fa49717e7c6d30f61b2fd130833e491afba9a7ff8d0904d9485c08070a` / `09e307d619081329a0fbdc9c2af6698c62ead409c99d045c4cf96a9d06ec236c` / `d81907dc5084bc9e033059e94aa47632a3d192ed3f9e1fbe3f7ae853928f0095` / `8e1594d6e9b2aa6b33576f4c750e5899c6902a4725c5fba962a0bd99108ba536` / `f15863e38b0da66be0d59d6afabdf6cab407159adb34f691c65de4b8035c04a4` / `f8e89fbb8aef657798d557afe987d461025c8b19d6bd193365500400ae063a37`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-04 实际验证 - 新增纯 `curve-topology-editor` schema v1:以 Blender 5.2 `source/blender/editors/curve/curve_ops.cc` 为算子来源,冻结 14 项 topology allowlist、selection domain、参数名和每次 Main transaction 最多 1 个操作;未完成 Main/undo/save/golden 的算子全部 返回 `BLOCKED/CURVE_TOPOLOGY_OPERATOR_NOT_VERIFIED`,没有提前暴露到生产 UI 或 Main。 - 冻结 65,536 splines、1,000,000 points、100,000 selected elements、单次新增 4,096 splines/ 100,000 points、64 MiB payload 和 subdivide 64 cuts 预算;claim 绑定 base revision,未知算子、 stale revision、重复/跨域 selection、未声明输出增长、非法额外字段和预算超限均稳定失败关闭。 - 审计草稿时修正稳定 ID 合同:Curve Main/SceneIR 数据 ID 只接受 `curve:*`,拒绝误写的 `data:*`; 空输入域不再把索引 0 当成有效选择。浏览器 Worker 明确报告 `CONTRACT_ONLY_NO_MAIN_OR_UI`。 - `node --test web/tests/unit/curve-topology-editor.test.mjs`:3/3 通过; `WEB_TEST_PORT=5400 npm --prefix web run test:curve-topology-contract`:Chromium 1/1 通过; `npm --prefix web test`:全量 99/99 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build` 和相关 `git diff --check` 均通过,production build 67 modules transformed。 - M9-04 protocol/Worker/unit/e2e/Blender source SHA-256: `2bf5bbda49ac96af55c5d9b4267773c7c7657c74bd6d23586b4d9fb1d8d5028c` / `7b57c159788a660f2e3ae6b83b5332de325f8c857e2c1489f061463f49e43189` / `ae8385cf698f899639b0037b0d9a529d4c9e9a01d3a91c4b4dca8c8a4dc7b420` / `5f511706f18fa294fe385bbad6b24dab4e4376709a5d19f8ad54e52acc3b2d65` / `b355f035482ce4e667bb08222cfc2d0967205b7e6a3b0fb5a63be81ff0c8cb8e`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-05 实际验证 - 仅将 `TOGGLE_CYCLIC` 从 M9-04 的 BLOCKED gate 提升为唯一 READY operator;生产 helper 先生成 revision-bound claim,再生成只含 `cyclicU` 的单一 `setCurveTopology` Main 命令,所有其他 13 项 算子仍没有 UI 或 Main writer 暴露。 - 新增官方 Blender 5.2.0 golden 生成器 `tools/web/generate-curve-toggle-golden.py`:对真实 `tests/files/web/nonmesh_scene.blend` 的 `WebCurveData` 第 0 条 POLY spline 翻转 cyclic U,另存 临时 `.blend` 后重开;golden 固定 fixture SHA-256 `ae8ef85d606aa120ce6b7611fc03407fd80bb60311e94a6ef73f6384d0b6c8b4`、类型 `[POLY, BEZIER]`、点数 `[4, 3]`、 `false,false -> true,false`,生成器复跑与提交 golden 逐字节一致。 - App Properties 只在 gate READY 时显示 `Cyclic U` checkbox;真实 UI 操作通过 WebEngine Worker/Main 执行一次 revision 递增,随后 undo/redo 各自产生新 revision,保存到 OPFS 后关闭/恢复仍为 golden 的 `true,false`。修复了 topology/undo/redo 返回时错误覆盖用户 active Curve 的 UI 状态;权威几何和 revision 仍来自 Main snapshot。 - `node --test web/tests/unit/curve-topology-editor.test.mjs`:5/5; `WEB_TEST_PORT=5403 npm --prefix web run test:curve-topology-operator`:Chromium 2/2(contract + Main/UI/undo/redo/save/reopen);`npm --prefix web run test:nonmesh-roundtrip`:既有非 Mesh 原生 Curve/Surface/Font/MetaBall/Volume roundtrip、undo/redo/save/reopen 通过。 - `npm --prefix web test`:全量 101/101;`npm --prefix web run typecheck`、`npm --prefix web run lint`、 `npm --prefix web run build`、`git diff --check` 均退出 0,production build 68 modules transformed。 - M9-05 protocol/App/Worker/unit/contract-e2e/operator-e2e/generator/golden/package SHA-256: `41791ff197406b6b4b7579e55639b9770ec5fa3dc874d2401f1bf7c008f48978` / `c04ebb59ec8092258e5df5832d6650d04f54d68ac7c72fa66c03827de7c4f070` / `2c3cddc78339001d082333a9c7d8514fbe4ea15fb1d495402cf3e4f6837b1f16` / `097590221adb362058de55efae4f2ea3af4855f20a581ecba92df85fb1e4a412` / `ccde87fad3025c3e7525b80a59796403df38b6d9cbee88a3b464b3982c4597d5` / `71677b2b59c5c1639f2c0fa4db66883b872b225eb77c43c7a70efabd522ad17a` / `193b87f42977b6e0bc1c46f47d882c073070d797183777eafe123f24af1da6ec` / `0a487bd73c40afdc969f5a90d3289e14f116b10b3bfeb0655fa312f7d2848655` / `c90a759788b98adc5011cf68dd510838b0fe6bea4fc12f862af950851783eac6`。 - 首次 Chromium 失败证据不计入 READY:第一次 toggle 后 Main 返回的 active object 覆盖了 UI Curve, 第二次确认 toggle 成功后 undo 同样触发 active 丢失;修复后从 `WEB_TEST_PORT=5403` 全量 2/2 重跑通过,没有保留失败报告作为成功证据。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-06 实际验证 - 新增 `grease-pencil-marquee` schema v1:请求绑定 Main `baseRevision`、当前 data/layer/frame/drawing、 归一化 viewport box 和最多 1,000,000 个候选;候选必须携带稳定 drawing/stroke/point ID,跨 drawing、重复 point ID、同 stroke ID 映射多索引、伪造前缀、非法 box、stale revision 和超预算 分别返回稳定结构化错误,框外候选不会进入结果。 - Blender Main reader 现发布 `activeLayerId`、必需 stroke ID 与 point ID;point ID 由 data/drawing index/stroke index/point-local index 构成。文件未保存 active layer 时,SceneIR 只读 快照确定性使用首个实际 layer,不修改 Main;真实 fixture 的四个 point ID 经保存重开保持一致。 - Three.js Grease Pencil proxy 同时保存 drawing/stroke/point stable ID;点击、高亮和多选去重改用 stable ID,几何索引只保留给当前帧 writer 定位。marquee 只遍历活动、可见、未锁定 drawing 的 point proxy,拒绝 onion、其他 layer/frame/drawing 候选。 - App 新增真实框选工具和可见 drag rectangle;主线程直接投影候选,OffscreenCanvas 通过 Worker 使用相同投影/helper/合同并回传相同 result。两条路径均选中真实 `modifier_grease_pencil_scene.blend` 的 4 个 point ID 和 1 个 stroke ID,选择前后 Main revision 不变。 - `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8`: 增量 C++/WASM 构建通过;生成 JS/WASM 已同步到 `web/app/src` 与 `web/app/public` stable vendor, 两处逐字节一致。 - `npm --prefix web run test:grease-pencil`:native layer/frame/stroke transaction、undo/redo、 save/reopen 及 stable ID 通过。 - `WEB_TEST_PORT=5404 npm --prefix web run test:grease-pencil-marquee`:unit 3/3;真实 Chromium 主线程/OffscreenCanvas 2/2。 - `WEB_TEST_PORT=5406 npm --prefix web run test:e2e -- --workers=1 --grep "N-016 Grease Pencil"`: 既有 schema/onion/双视口/点击/gizmo/layer/frame/point/Worker restart 12/12。 - `npm --prefix web test`:全量 104/104;`npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`、`npm --prefix web run check:local-deps` 和 `git diff --check` 均退出 0;production build 69 modules transformed。 - `npm --prefix web run test:status-consistency` 与 `npm --prefix web run test:release-evidence`: 12 parity BLOCKED、0 release blocked、17 evidence records、0 missing、release `READY`。release evidence 首跑发现前序 M8-20 将 `C3-volume-combined-asset-viewport-reopen` 与 `E2-vdb-large-stream-device-loss-oom` 移入 completed 后仍残留于 N-015 `v1ExcludedSlices`;只移除 两个过期 excluded 引用并同步 evidence family/hash,不改变 completed/blocked、evidence record 或 release claim,随后两项检查均重跑通过。ledger/evidence SHA-256: `4d0c3cd7b53103f37a5cc604b507307618d591338620c2beff972d556654cf58` / `f65a7e43ccb2b71ba6309d6b44d0f0e5deb01e12f85cd2bb8de7bf787e710107`。 - 未计入完成的首跑失败:marquee unit 初次因候选复用 drawing-only 精确字段解析为 1/3,投影 drawing 字段后 3/3 重跑;native roundtrip 初次发现 fixture 无 active-layer 标记,增加只读有效 layer fallback 后重编译通过;N-016 聚合初次 11/12 是 blocked 摘要夹具清空 layers 后仍继承 activeLayerId,修正负例并从头重跑 12/12。 - M9-06 native/SceneIR/marquee/App/GP-adapter/main-viewport/Offscreen/protocol/Worker/unit/e2e/ native-check/package/WASM SHA-256: `45e54e9f2d4a6157d8298f3432fbbe4281e44d6c8190712edca5e22c5a4ca831` / `d2885203b6c138067b94b13c6f03c68769c2853317d32b6d7d9718ab5d1e6c28` / `1e97396358b09a380c149ff5ed75b7b2dbfbd2beae49376e0b0ff3024e9a53a6` / `c0860527a27e568432f618bb0a69b57e2ec03e77e3c231272763deedb4fe7b2f` / `83a03a9626fd4434be1c18099aea29eba070bba9ae45ff109d47feace274ad99` / `de061f817f722a5850393f5d1903ed13fa7cf43a8bbbb8f809aca2ccafc583f0` / `955ba945e0155b2ef2ade573ac32bf9e2ad2153ec690efd18cb10a8d34cfc495` / `4874e9bbebe35feeab73b8cfcc3b0259738b86fad21a180cb9d3a1ccde7a7e0b` / `fb6f03491fa5421dc99555bb7db23f9ed69bd01bcc273ec169e8b8e75dee7d79` / `460fe70ceaca4ffae11d99abe0b47c97d80fffb2b47182a0899a4f7d05c8db46` / `abcd92e29eb08debb64f5a90e153d12348fc370f15a86b808412c5297fa4d83e` / `55ba74a1544b946c7a5ed6f931649928bdabdd32a299866dc34a7cbe9649590a` / `a2cf86a99737a92088eb9085f1673746c64bcc8091712a68110610c522426528` / `d65c4680359b35300ea148ddd5e11f765eab241e7fe40d1d5f30d9bd2e3f1b23`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-07 实际验证 - 新增纯 `grease-pencil-selection` schema v1:当前 data/layer/frame/drawing、稳定 point/stroke ID、 selection source 和独立 revision 构成唯一状态;REPLACE/ADD/TOGGLE/CLEAR 均绑定 `baseSelectionRevision`。stale revision、跨 drawing、重复 point ID、同索引多身份、同 stroke ID 多索引、伪造前缀和 1M point 超预算均在 UI 状态发布前失败关闭。 - Properties 新增真实 2D point canvas,按当前 drawing 的 XY 坐标绘制 stroke/point;pointer 与键盘 点选进入同一 selection transaction。App 不再让 2D/3D 各维护一份 point selection;Select All、 重选同一对象、工具模式和关闭项目也与中心 store 保持一致,selection revision 与 Main revision 明确分离。 - 主线程 ViewportRenderer、Offscreen wrapper/Worker 的 point pick 和 marquee 都携带发起时的 base selection revision;Offscreen 仅在实际应用 point 高亮后回执 revision/point IDs。迟到结果 由中心 store 返回 `REVISION_CONFLICT`,不会覆盖更新后的 2D/3D selection。 - 真实 `modifier_grease_pencil_scene.blend` 在 2D canvas 先选 1 点,再由 3D current-drawing marquee 选择全部 4 点;selection revision 为 `0 -> 1 -> 2`,source 为 `CANVAS_2D -> VIEWPORT_3D`, 2D canvas 与主线程/Offscreen 3D 高亮回执一致,Main revision 全程不变。 - `WEB_TEST_PORT=5411 npm --prefix web run test:grease-pencil-selection`:unit 2/2;真实 Chromium 主线程/OffscreenCanvas 2/2。`WEB_TEST_PORT=5410 npm --prefix web run test:grease-pencil-marquee`: M9-06 unit 3/3、双后端 2/2;`WEB_TEST_PORT=5412 npm --prefix web run test:e2e -- --workers=1 --grep "N-016 Grease Pencil"`:既有 N-016 聚合 12/12。 - `npm --prefix web run test:grease-pencil`:native layer/frame/stroke、undo/redo、save/reopen 通过; 全量 unit 106/106、typecheck、lint、production build(70 modules)、local-dependencies 和 `git diff --check` 全部退出 0。 - 未计入完成的首跑失败:`WEB_TEST_PORT=5407` 的测试坐标未先滚动 Properties canvas 到可见区, pointer 未触发;补 `scrollIntoViewIfNeeded` 后 `WEB_TEST_PORT=5408` 暴露 UI 将含 point/stroke 额外字段的引用直接传给 drawing-only 精确解析器。协调器显式投影四个 drawing 字段后, `WEB_TEST_PORT=5409` 2/2;完成 Select All/重选/关闭状态收口后从 `5411` 再次全量 2/2。 - M9-07 selection/marquee/App/CSS/main-viewport/Offscreen/protocol/Worker/unit/e2e/package SHA-256: `7e19b049581edaa984abe7c0f5e6432d4aaca9514afce1060f3136544788aa50` / `cef77a20b0dc05595adcb160fd4cdb4d9b426d717c714a94f2af7b23b35593ab` / `bb5c38ad0ed4c1088e205fee2f75b4b14b96b8d337724e1e5d9e2762c56737be` / `c88c6484e3cad1c86e2deaa0536a20bc3c46dffdb64f6af744e904fa355da506` / `d1328dc803557b7c42e52d03394a01d79a9ace1aecbf7af28ee08813c975f028` / `18985f06b83d6ad71cae2e3535e01d45644114b8d12b00d8d547eb77d047bdb1` / `a69d98e602a0141517dac78fdac2c605d8a032301be104450d84ed502040889b` / `a822ab87dd69849614a34eca015666284145a1c9d5782ccf7a18c4ab0ec64abd` / `104785b5e5af27a43e5178a26e6ba130ff35cf6bf082b5816a0528a6e0ce3f07` / `b83862a4c23d89a279c99f186d43af62a80905d368b46b0a2d5cd7a0ecdb1912` / `a9e293a04c7aaa3ebdf04958deba60cf5317d4f850d96659cfe5b24cac282310`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-08 实际验证 - 新增纯 `grease-pencil-reorder` schema v1:layer move 绑定 data/layer stable ID、方向和 Main `baseRevision`;frame move 额外绑定 source frame、target frame 与 drawing stable ID。stale revision、边界 no-op、伪造 drawing、已占用 target、相同 source/target、非法额外字段和超出 正负 1,000,000 的帧号均在 Main 前稳定失败关闭。 - Blender Main 新增 drawing-preserving frame move;Worker 进入 WASM 前以当前 SceneIR/revision 二次校验。Properties 的 layer 上下移动和 target frame 移动均只提交一次 Main transaction, undo/redo 后 revision 单调推进;保存到 OPFS、关闭并恢复后 layer 顺序、frame 12 与原 drawing ID 保持一致。 - 官方 Blender 5.2.0 golden 生成器以真实 `modifier_grease_pencil_scene.blend` 新建 `Web Drafts` layer/frame,执行 layer DOWN 与 frame `1 -> 12`,另存并重开;重新生成结果与提交 golden 逐字节 一致,fixture SHA-256 为 `3a8525077807f9178dac3a5ba84b524e5f8e80874b15c54e2a6658ecb80315a3`。 - `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8` 返回 `ninja: no work to do`;`bash tools/web/install-web-engine-assets.sh` 校验 single/pthread manifest 4 项资源通过。 - `WEB_TEST_PORT=5416 npm --prefix web run test:grease-pencil-reorder`:unit 2/2,真实 Chromium Main/UI/undo/redo/save/reopen 1/1;`npm --prefix web run test:grease-pencil`:native layer/frame/stroke、undo/redo、save/reopen 通过。 - M9-06/M9-07 回归:marquee unit 3/3 + 主线程/Offscreen 2/2,selection unit 2/2 + 主线程/Offscreen 2/2;`WEB_TEST_PORT=5417 npm --prefix web run test:e2e -- --workers=1 --grep "N-016 Grease Pencil"`:既有聚合 12/12。 - `npm --prefix web test`:全量 unit 108/108;typecheck、lint、production build(71 modules)、 local-dependencies 和 `git diff --check` 均退出 0。N-016 仍保持 parity `BLOCKED`,完整 group hierarchy、frame duplicate、2D stroke/segment/lasso、完整 Dope Sheet、modifier 和 desktop drawing golden 未被本任务扩大声明。 - M9-08 protocol/App/Worker/Main/API/header/stub/unit/e2e/generator/golden/package/WASM SHA-256: `630286c6243295d55ce7ff99125518086321e8fde6cbc6481b4775f1081cee19` / `c80d082e8d2e26efe440d6e9dae994b20458003cbb27f5172581068d7a477320` / `3c692df2bf13df4214c498f5a9b1ceb2a687e24104c18e5d5bba8fc2be913784` / `8b0e607b94507c0cae4e973a42f223a56fef1d8cd4fcf6773c5bdca065bedfee` / `feed5740701794914fbd1f8a93113d0913ebc4feb187adc858746c888fcab4ab` / `078836b7c19d5c90e74909c93c4d0b73d5eaa2010a3394517bbe40db358f84d5` / `8575b407b4b1bcd119d3d9d02d0344cdcfdb527542a6c1000786183fb8e7e6b7` / `7e28bb4292b1d81f4b04f7eaca25a759f98a809eac3f3cb3c566dd49cfaee70a` / `60824eff69e49883954df4b01f49642666eeb97cc48477f418d3239f1c69180f` / `b19c3c2cdb94e026b888ca9c659cc9981735053fe3d74c037850e81bfa68cea4` / `922ce1bcacd788983ad6e3d855b8477653c0f0acda45b49e11e46925a8afb7c4` / `dd7ee25e51cef9fbf9ff226fc26b349c1f883774bfd944b890d13c83e47cabaa` / `e9c285a35dffd17f577087df5dfa08719575850d37b01a6c70523b79084ab8eb`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-09 实际验证 - 新增纯 `paint-depth-visibility` schema v1:请求绑定 object/mesh stable ID、Main revision 和最多 100,000 个顶点索引;返回绑定后端、RGBA depth readback 尺寸/字节数、 遮挡像素数和可见顶点。stale revision、伪造 ID、重复/越界顶点、未声明字段、 非 GPU source 与 64 MiB readback 超预算均在发布结果前失败关闭。 - 主线程 `ViewportRenderer` 和 Offscreen Worker 都使用同一生产 helper:在真实 WebGL2 `WebGLRenderTarget` 中以 `MeshDepthMaterial/RGBADepthPacking` 渲染当前场景, 再读回 GPU RGBA depth 与候选顶点的投影深度比较;没有使用 CPU raycast/proxy 冒充可见性。资源、scene override、clear state 和原 render target 在成功/失败路径均恢复。 - 真实 Chromium fixture 在相机前方构造大遮挡面和后方三角形;主线程与 OffscreenCanvas 均只返回前方 `[0,1,2,3]`,后方 `[4,5,6]` 被 GPU depth 排除, 两后端结果一致;stale Offscreen 请求返回 `REVISION_CONFLICT`。 - `WEB_TEST_PORT=5418 npm --prefix web run test:paint-depth-visibility`:unit 3/3,真实 Chromium 主线程/Offscreen 1/1;`npm --prefix web test`:全量 unit 111/111。 `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build` 和 `git diff --check` 均退出 0,production build 73 modules transformed。 - M9-09 protocol/GPU-helper/main-viewport/Offscreen/protocol-worker/Worker/unit/e2e/package SHA-256: `def08629f9957bf2f31b58c6426ed0dd736fdf947fd40d0875a20d516f1fbe16` / `b8b9c3960a06af9571323b273589848bdd0033d0dbba351994fcc08c97058830` / `bef752dd255ffe0a0119cd51f9f9efcbd503692094fcb6fe7ecebe0d1fc33c69` / `8a236d979d8f25f420e84919c0812f057dbc4cfd32d9914292abc3625be458af` / `ff397e06638bef71e0435222dbc1e6d0550699f3208429937a7a4c73bc8027d8` / `3e1540a1e931ebf56544202ae2c8febc1a9a5c34408a4b33f2f154db682c5129` / `a781cd40c3e773e8cf8991af5e16c70e3c4aa82a8b0847ab381d7fe36eab66a4` / `20afebca07bc5ac89525690b40372386f7d78b9bf579b77316f5143e9f7a6d1f` / `d6acbd199bd0b33405c1d96a6a05ce4b4724d0502101ae8f214b0d6830f251b2`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-10 实际验证 - 新增 `paint-stroke-session` schema v1 与 Worker 内有界事务:`BEGIN` 绑定 `paint-pointer:*` session ID、Main base revision 和 vertex-color/weight 目标;最多 4,096 个连续序号 chunk、单 chunk 16,384 项、整笔 1,000,000 项/64 MiB,最多同时 8 个会话。跳号、重复索引、非法数值、声明 chunk 数漂移和 stale revision 均在 Main 前失败关闭。 - 每个 chunk 只进入 WebEngine Worker 缓冲,不调用 WASM;同一顶点跨 chunk 重复时 确定性 last-write-wins,`COMMIT` 按顶点索引排序后生成唯一 `setVertexColors`/`setVertexWeights` Main 命令。`CANCEL` 直接释放缓冲,打开新 `.blend`、Worker restart 或 shutdown 也不会保留未提交会话。 - 真实 `attribute_scene.blend` 在 Chromium 中提交 2 个 chunk/5 个输入/4 个唯一 顶点;chunk 期间 Main revision 不变,commit 仅 `r -> r+1`。一次 undo 移除整个 `M9StrokeColor` 属性,第二次 undo 稳定返回空历史;redo 恢复整笔,cancel 会话前后 revision 不变。 - `WEB_TEST_PORT=5420 npm --prefix web run test:paint-stroke-session`:unit 4/4、真实 Chromium Main/undo/cancel 1/1;`WEB_TEST_PORT=5421` 的 M9-09 双后端深度回归 1/1。 `npm --prefix web run test:paint-roundtrip` 的 color/weight normalize/mirror gate/undo/save/reopen 全通过;全量 unit 115/115、typecheck、lint、production build(73 modules)和 `git diff --check` 均退出 0。 - M9-10 session-protocol/WebEngine-protocol/client/Worker/unit/e2e/package SHA-256: `7c33e1f9df475a741cb78f69b044d4ddc3797b08bc7467f5bd1e16d85cea7808` / `aeeaba3bfef4d2b1924b15f6bd9fc3028c1144b9202f29a0b9aa04576cf9fcd7` / `71d0c9e25da3f478f18f34f3f5131526d566f0365aa88ec8078d6a32d5879dc2` / `714347cc7b448067742ddb36d0dc1ace26fd9520c9d3112310e67bf331e17ce8` / `3ee03cd9cb8082d7b1330df9c4d6fcb310f01a696d1aa43ca885652cea3b5796` / `ab9077bc4f7efc574f49388b2e1e4fe1342ea1ff7a110f4695e3476ce78df3f5` / `1b5e7aa17c54240d992a5fb61bfac109656bb438f4cdfa736cc3caf1c223be1b`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-11 实际验证 - 新增 `texture-paint-asset` schema v1:target 绑定 project/image/texture asset、 packed 或 UDIM tile 1001--1999、Main revision、尺寸、PNG MIME、SRGB/LINEAR、 project-relative source path 和 base asset SHA-256;dirty patch 必须与同一 tile/revision/ dimensions/color space 完全一致。 - Storage Worker 从已验证的 content-addressed packed PNG 解码真实 RGBA8,复用 `applyUdimTilePatch` 复验 base/result pixel SHA-256 后重新编码 PNG。新字节先通过 OPFS 临时文件、content-addressed 命名和回读 hash,然后才在 IndexedDB `setting` 单事务把 tile binding 从旧 hash 切换到新 hash。 - 注入 `after-asset-write` 故障时,新 asset 可成为后续可清理孤儿,但已发布 binding 的 generation、asset/pixel hash、path 和 updatedAt 逐字段不变;旧资产仍 可读。成功重试才从 generation 1 切换到 2,每个 tile 独立序列化。 - 真实 Chromium 对 2x2 packed tile 1001 先写红色 dirty pixel、故障注入写绿色、 成功重试;同时对 UDIM tile 1002 写蓝色。新 Storage Worker 重建后两份 binding 与解码像素逐字节恢复。 - `WEB_TEST_PORT=5422 npm --prefix web run test:texture-paint-asset`:unit 2/2、真实 Chromium packed/UDIM/OPFS/binding fault/restart 1/1;全量 unit 117/117。既有 paint Main round-trip 通过;`WEB_TEST_PORT=5423` 的 content-addressed restart/quota/ cross-project cleanup 4/4 通过;typecheck、lint、production build(73 modules)、 local-dependencies 和 `git diff --check` 均退出 0。 - M9-11 texture-protocol/paint/storage/error/client/Storage-Worker/OPFS/unit/e2e/package SHA-256: `f85bcc0e1a8445d6e83846a841d8e201c41de8e7e307132565bfec3d7a3f5ab9` / `76db7c4ff146d929571d7b58f66faf4e2a2f3c8d6cc2d3fca937a17be8b5f827` / `77482c74d71bcca9aaf57d96ec0c201698fe9c887d85c5681edcea354417e23c` / `36868e5278ab11509fc744719bd8e058934ff922675a6901f4a52587a709fa2f` / `67b228bd0e5e81fa34ab198feefa1430454807e85460dea70ecb5a9ef09dbb66` / `b6bcce466257fef0ea2d53ef894f2cc455e03834302576ab1230ff38da0241da` / `74c63f14bef3ddbf60d1106519b3c9cdf370702cb1427e13e59670175d16b840` / `c3796e4bbfab3ed70f897e2682eec5c9e6a5ba166dc2fea24da553ebf411f47b` / `3b4299d5319dbbf0839a04ee55962d30f448202c88747ebdabb9bbe1c07031cd` / `8d71d52be5b32b54a45b2c6dab6ed46c8edecf8dac7d600b8d1a64f3e32a4ea8`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-12 实际验证 - 新增 `WeightPaintOptionsIR`/bounded helper:`normalize`、`limit`(1--32)、`mirror`、 `mirrorAxis`(X/Y/Z)和 `mirrorTolerance`((0,1])进入 schema;重复顶点、越界值、 非法组合和超预算输入在 Worker/纯协议层结构化拒绝。已有 pointer-session 目标可选携带 同一策略,commit 仍只产生一个 `setVertexWeights` Main 命令。 - Blender Main `setVertexWeights` 的固定顺序为写入/移除目标组 -> verified local-coordinate reciprocal mirror -> limit lowest influences -> normalize all remaining influences。镜像先 建立空间桶并验证每个顶点的反射 counterpart 和 reciprocal identity;无法验证或超过 100k 顶点稳定返回 `CAPABILITY_MISSING`/`PAINT_BUDGET_EXCEEDED`,不修改 Main。limit 与 mirror 的 affected vertices 一起进入同一 undo/save transaction。 - 新增 `tools/web/generate-weight-paint-golden.py` 和 `tests/golden/M9-12/weight-paint.json`, 使用官方 Blender 5.2.0 LTS 在 `rigged_shape_scene.blend` 上生成 initial、normalize、 limit-normalize、mirror 四个逐顶点 group weight 快照;`check-weight-paint-golden.mjs` 对 WASM snapshot 和 save/reopen 逐项比较,误差门 `1e-6`。 - Properties Paint 面板新增 normalize、influence limit、mirror 和轴选择;Apply Weight 将这些选项直接提交到 Main,未引入 UI 副本或绕过 revision/undo 协议。 - 验证命令与结果: `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8` 通过(Blender 头文件既有 4 条 char conversion warning);stable `web_engine.js/.wasm` 与构建产物同步后,`npm --prefix web run typecheck`、`npm --prefix web run lint`、 `npm --prefix web test`(120/120)、`npm --prefix web run build`(73 modules)和 `git diff --check` 均退出 0。 - `npm --prefix web run test:paint-roundtrip`:normalize/limit/mirror/undo/save/reopen 全通过; `npm --prefix web run test:weight-paint-golden`:Blender 5.2 golden 四步、WASM 与重开全通过; `node --test web/tests/unit/weight-paint.test.mjs web/tests/unit/paint-stroke-session.test.mjs`:7/7。 - 未计入完成的首跑失败:golden 首次使用旧 stable WASM 导致 limit 结果未更新,定位为构建 产物未同步到 `web/app/src/vendor/blender`;同步后从头重跑通过,未保留失败结果为 READY 证据。 - M9-12 protocol/native/UI/worker/golden/unit/package/WASM SHA-256(按上述文件顺序): `edbf8e9ef9270c6ca36b88d3ebccbe138c37c52e717556aaf35ef0e0d24677cc` / `915be99077af68e456d799a786476cd7ed92628089713327df36f56e31b92791` / `6ade55f27ea68bbe68c4ceb3a1cd728376b537fe023271a7c962b65883074b3b` / `d7f8a6c9aae526f9cc744b584aa99b716eb1a3ebe57b3a87141dde65cb813b89` / `0a34ba598336b87e82dc14e284050be77e2ee92bd32ec266c35fad443387009d` / `d54dcf6a2403152579e22f60353f07907e422317f9778fa4c9fdd1a5927e9883` / `3b9d1805ee80ad1efa0f483c3dab4faabffb834fe6f7b596a0f6f565f48c906a` / `e97b9ef38064cce235d179fd8c547305a2c1195a5cffdfe4b5fde1135bf71b14` / `76d9cf460e4d9571464951036fe7dd9fa7abc9937fc1cfca6da0acf8ebb6e5a5` / `15edc2b3849efa6b7ee7940ba479d009e0a6c354337f7feabc00994fd16b5c8b` / `0418284f19eb94ecc3d76f00dedbbab9a332d60a32f25f452f1dedfcc694aca3` / `6ec17c56d361216128e982bb2de622435b7927680efddba8107445841a17901b` / `4ce0c45d59f64c8838e3ee0e8f16039b7652212b2b80ac9a2ea77070e1f9dbaa` / `966c5b20af5e5c66fc161a56d2dc27b431a35c993f0dbc09a089359d1a076fea` / `9b6d30050d199f7aa9cd6ea4b6a0079808cb39652144b6ac4c3dbf5b9c39210e` / `94602f0ee8f0b954f1d6d3dd07c955880a4cc32b731ebfb14349251517de066e`。 - 生产双 variant 重新构建并安装成功:single WASM `6e096facf58911f01bff0fa2a649b3b77bdc98cbb8b06533d067583f2902ae21`、 pthread WASM `6463dc2afb84a64c7d1f4159acc93440e02be83f8a8f246fc96c92b238962553`,manifest `938619cee619d578165eb33dcd445f22e34d5d3c8fa521d42697eabc98cf646c`;stable full-Main 检查入口继续绑定 `build_web_blender6`,避免把 native smoke stub 误当作 Main 写回证据。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M9-13 实际验证 - 新增 `paint-pbvh-capability` schema v1,以 Blender 5.2 `DNA_brush_enums.h` 冻结 46 个活跃 brush:Sculpt 32、Vertex Color 4、Weight 4、Texture 6。请求严格绑定 operation、domain、 brush、object/mesh stable ID 和 Main base revision;未知字段、伪造 ID、跨域 brush 和 stale revision 在能力结果发布前失败关闭。 - WebEngine Worker 直接检查生产模块是否导出 `_web_engine_apply_pbvh_stroke`;stable、single、 pthread 三个 JS glue 均确认未导出,因此全部 46 项稳定返回 `N-017/BLOCKED/PAINT_PBVH_UNAVAILABLE`。没有把 uniform-grid、GPU depth 或 bounded patch 冒充 PBVH;即使未来出现同名入口,session context 和逐 brush desktop/WASM golden 未就绪时 仍分别返回 `PAINT_PBVH_CONTEXT_UNAVAILABLE` 和 `PAINT_PBVH_BRUSH_UNVERIFIED`。 - 真实 `attribute_scene.blend` Chromium 逐项查询 46 个 brush;查询前后 Main revision、live handles 和 WASM allocated bytes 完全不变。stale 请求优先返回 `REVISION_CONFLICT`;绕过 TypeScript 注入 `proxySuccess` 的请求返回包含 code/severity/message/recoverable 的标准 `PAINT_SCHEMA_INVALID`,未进入 Main。 - `WEB_TEST_PORT=5427 npm --prefix web run test:paint-pbvh-capability`:unit 4/4、真实 Chromium 1/1;`npm --prefix web test`:全量 unit 124/124。`npm --prefix web run test:paint-roundtrip`、 `npm --prefix web run test:weight-paint-golden` 和 `WEB_TEST_PORT=5425 npm --prefix web run test:paint-stroke-session` 均通过,确认既有 bounded Paint Main/undo/save 路径未回归。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build`、 `npm --prefix web run check:local-deps` 和 `git diff --check` 均退出 0;production build 73 modules transformed。M9 进度更新为 13/14,N-017 仍为 parity `BLOCKED`、V1 release `READY`。 - 未计入完成的重跑失败:`WEB_TEST_PORT=5426` 功能结果全部正确,但 E2E 对标准错误对象做整对象 比较时漏写预期 `message`;补齐稳定消息断言后改用新端口 5427 从 unit 到 Chromium 全量重跑通过。 - M9-13 protocol/capability-gates/error/WebEngine protocol/client/Worker/unit/e2e/package/Blender inventory/WASM SHA-256(按上述文件顺序): `749eb772f0cdeb0fe79c058391a47fdf680dc331db300a91a22d324e535f32c5` / `8702afe367fd62d39868156b74e69eb46bbf0c522e30d847dae02459fcb25c45` / `a15d9e2d3e84884245505d18226f9e1484469d8313aa6534aff480fa4746264d` / `8bcbe72bc02ebd2af73e92657093697ef513f8e0fc31ea17f5967d3fd2c8ed6b` / `7627509efe48ff377e72d0cc8c144b7858e784a23733e07b26438a5c4975166b` / `4a65547e6b1fea16a120b4e72eb37d4d9f7c7ced4342f535796535262ff65fcc` / `a2efa988f50a3e4ea9363021130798d6bf7b8ed1669a980b879197f9c3fb5bff` / `03d13687f78995fe6ae4c683ece3783be77217daf8ec85df66e77451717a7729` / `38a9a0ba0c7ee6b6435209965af4498377c245c4f197f2c3534358103047009e` / `c56dfd81a52096c32a9f3c7756f8b86599906763fad33d26f5a9bf52e4fbfa39` / `94602f0ee8f0b954f1d6d3dd07c955880a4cc32b731ebfb14349251517de066e`。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 关键当前构件 - binary archive SHA-256:8af6c782b8e4b31020219597b821160b7634439749c455fd31d9d919676e2e2e - source archive SHA-256:ee09b3e43e715b3d5497573bbf63a449cbea146150d56c08c6506afd5fce2871 - SBOM SHA-256:7d0fb22790c44bada5f01e5ebc12f6050e1c0436a53f58dceb2e979c17bb593a - RC manifest SHA-256:862d332b3c931cb5c0898bb7f66e02f0dd4562053b18d0c87a7cea390ebaacdf - M6-17E rehearsal report SHA-256:b953dd89165b5dd9260d75c7ec6e982a69cfeea358fbc2ce35c75e99544cac2c - quick/Chromium/release report SHA-256:dcaa32be911fa7ed36127b5cb1458bb07dcca19d562cabc64e022f13b094f911 / 90b19d057957f1edce264c7137f89d6701643e46feb88001054eea1bf0a18eb5 / 7d28a5018b78ba45935f832388d6b4e632c6198476a2fdcb4a0abef3066c5ec6 - HEAD commit:7c16b279d52899d2494e64d58ba9897a9b69dabc M9-14 实际验证 - 新增 `web/protocol/editing-domain-recovery.ts` schema v1,固定 `CURVE`、 `GREASE_PENCIL`、`PAINT` 三个编辑域的 baseline identity、Worker restart、OOM、GPU release 和 small-scene evidence。解析器严格校验 SHA-256、稳定 data/object ID、 revision/hash 关系、`GPU_GEOMETRY_UPLOAD -> GPU_GEOMETRY_BUDGET_EXCEEDED` 映射、 token 资源清理、一次 release/一次 reinit 和非空像素;重复域、身份漂移、释放次数漂移均 稳定拒绝。`summarizeEditingDomain` 只收集当前可见且属于目标编辑域的对象。 - 新增 `web/app/src/testing/editing-domain-recovery.ts` 真实 runner。Curve 使用真实 `setCurveControlPoints`/`setCurveTopology` Main writer,Grease Pencil 使用真实整帧 `setGreasePencilStrokes`,Paint 使用真实 `setVertexColors`;每域保存后由全新 `WebEngineClient`/Worker 重开并以 identity hash 复核。由于新序列化 `.blend` 的 Main logical revision 从基线重新开始,恢复门以内容 identity hash 为权威并记录 revision reset。 - OOM 阶段使用 token-isolated `OOMFaultSession`:先保留一个可释放 GPU lease,再在 `GPU_GEOMETRY_UPLOAD` 注入失败,关闭 session 后 live resources 为 0、released bytes 大于 0,未授权 token 不能消费 fault session。GPU 阶段分别创建 Curve line、Grease Pencil points 和 Paint mesh 的 WebGL2 小场景,释放 geometry/material/renderer 恰好一次,再创建 新 renderer;两次读回均有非零像素。 - 新增 `tests/golden/M9-14/manifest.json`、`web/tests/unit/editing-domain-recovery.test.mjs` 和 `web/tests/e2e/editing-domain-recovery.spec.ts`;package script 为 `npm --prefix web run test:editing-domain-recovery`。 - fixture SHA-256:Curve `ae8ef85d606aa120ce6b7611fc03407fd80bb60311e94a6ef73f6384d0b6c8b4`;Grease Pencil `3a8525077807f9178dac3a5ba84b524e5f8e80874b15c54e2a6658ecb80315a3`;Paint `12fa75bb79f8c38e660d3d2a8fc9cc16dd3df4fc9208b0e2ad94fb1f8aa68f71`。 - `WEB_TEST_PORT=5435 npm --prefix web run test:editing-domain-recovery`:unit 3/3、真实 Chromium 三域 1/1;每域四阶段均 `RECOVERED`,identity hash、data IDs、对象计数和非空 像素门通过。 - `npm --prefix web test`:全量 unit 127/127;`npm --prefix web run typecheck`、 `npm --prefix web run lint`、`npm --prefix web run build`(73 modules)和 `git diff --check` 均退出 0。 - M9-14 文件 SHA-256:protocol `42ab53dde3161ec31ca7de420046a2c06f58408b3ac4919c9904e02d875af258`;runner `2bb9805795fc2104e5443207a08951ac7684e67913064d6795c9d165b0c54c7e`;unit `ca565149e7769b40f59e865e42d2dfb0f4ecb2a4655371004678c14536ec9ef6`;e2e `7ab3421d1b44eb78d13525f67a26f1f6ed20816ae9b43c010c9ed3ebdf32c09a`;golden `f548052f39f6259f30b0569528160512aad955e61e8e8559e0d553c30d5619f9`。 - `docs/status/M9-14.md`、`docs/CURRENT_EXECUTION_PLAN.md` 和 `docs/PROJECT_STATUS_AND_NEXT_WORK.md` 已同步为 M9 `14/14`;N-015/N-016/N-017 全域 parity 仍保持 `BLOCKED`,仅新增有界故障恢复切片证据。 - 未计入完成的失败:前三次 E2E 发现 Curve fixture 的控制点只在 binary geometry 中、 以及 save/reopen 后 logical revision 重置;runner 已改用已发布 Curve topology fallback 与内容 hash 恢复门,换用端口 5435 从 unit 到 Chromium 全量重跑通过。 - 后续领取点:机器队列的最新 `nextTask`;本文不手工维护任务名称。 M10-01 实际验证(2026-08-16 America/New_York) - 按主计划领取 M10-01。现有实现新增 `GeometryNodeGraphIR` 的 Main/WASM reader:从 Blender 5.2 `bNodeTree` 读取图接口、节点、socket 数据类型/有限默认值和 link;稳定 ID 使用 node identifier、socket identifier 和 typed ID reference,不使用显示名称;`__extend__` UI 扩展 socket 被明确排除。每图预算固定为 4096 graphs、4096 nodes、16384 links、65536 sockets、4096 interface sockets,异常和超预算输入 fail-closed。 - `geometryNodeGraphs` 作为 SceneIR schema 1 的可选字段发布;现有 `web/protocol/schema-version` 仍为 `1`,因为本任务只增加可选字段,不改变已有字段含义或 持久化 schema。未支持节点保留原始 metadata,未宣称 Geometry Nodes 求值能力,交由 M10-02 allowlist gate 处理。 - 真实 fixture `tests/files/web/modifier_geometry_nodes_scene.blend` SHA-256: `f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9`;desktop golden `tests/golden/W-075/modifier_geometry_nodes_scene.json` SHA-256: `93c21e5158daefce10f2d4df674e636bf3f6ed3dd43e1576c45a02a8592f5886`;M10-01 manifest `tests/golden/M10-01/geometry-node-main-reader.json` SHA-256: `ca4f0a1c23466f4a70612c7bbb78d888f7300988b74820b174bad42968d300cd`。 - `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8`: 通过,`ninja: no work to do`;稳定 WASM reader 运行通过。 - `node --test web/tests/unit/geometry-nodes.test.mjs`:3/3; `node tools/web/check-geometry-node-main-reader.mjs`:3 graphs、10 nodes、7 links、9 defaults, stable ID、graph hash、desktop golden、save/reopen、unsupported Simulation preservation 全通过。 - `WEB_TEST_PORT=5440 npm --prefix web run test:geometry-node-main-reader`:unit 3/3、reader 1/1、 Chromium Worker 1/1 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、`npm --prefix web run build` (73 modules)和 `git diff --check` 均退出 0。 - M10-01 文件 SHA-256:protocol `667c07b3561c35c9ce75c0034ecafc407d6a7435b4b5535354168c16b7ee0925`; SceneIR `0d6c74bb39bd8ffdf748f369aee7f11e553b022a61bf6e557a21b948ebe35aee`;Main reader `510b4017c540fc4d1ac135c1ce7251cc5d7143f31d8604e1d545de36716da9a2`;API `b1050443141f664322fa2e9f11209f5b2b7dfe4e4927ed9af177bce0f8d74549`;unit `922d9435b5f8b0ef648784957feba8f8716f6407f099eaad8d62e99db4f4f908`;E2E `aa8e79f5ddc40bb78afea4587aa80fde21eba5b00838b5d0c5f3be2c48f41953`;WASM `2875acccbb8d262526c3522c635ab5cf0aa0e7e2ac9b1e3c54cce00151460793`。 - `docs/status/M10-01.md` 已新增;M10 计数更新为 1/15;N-012 全域仍为 `in_progress`, 不支持节点 evaluator/Simulation 等后续项未提前关闭。后续领取点:机器队列的最新 `nextTask`,本文不缓存任务名称。 M10-02 实际验证(2026-08-16 America/New_York) - 导出并冻结 `GEOMETRY_NODE_ALLOWLIST_SCHEMA=1` 和 16 项 `GEOMETRY_NODE_ALLOWLIST`:Group Input/Output、Transform/Set Position、Join/Separate、 Realize Instances、Store Named Attribute、Int/Vector Input、Value、Compare、Math 以及 Object/Collection/Image Info。外部资源节点继续受 stable ID、缺失/linked/corrupt 和 owner cycle 门约束。 - 新增 `tests/golden/M10-02/geometry-node-allowlist.json`、M10-02 unit 断言和独立真实 Chromium Worker spec。真实 Main `WebGeometryNodesSimulation` 中的 `GeometryNodeSimulationInput/Output` 保持原数据;提交该图稳定返回 `GN_NODE_UNSUPPORTED`,失败前后 graph JSON、graph SHA-256 和 Main revision 完全不变。 - allowlist 内 `WebGeometryNodes` 通过协议门后仍由生产 Worker 返回 `CAPABILITY_MISSING`, 因为 M10-03 的逐节点 evaluator desktop/WASM golden 尚未完成;同样不改变 Main 或图数据。 本任务只关闭 allowlist/无损阻断,不扩大 N-012 全域求值声明。 - `WEB_TEST_PORT=5441 npm --prefix web run test:geometry-node-allowlist`:unit 4/4、真实 Chromium 1/1;`WEB_TEST_PORT=5442 npm --prefix web run test:geometry-node-main-reader`: M10-01 unit 4/4、reader 1/1、Chromium 1/1 回归通过。 - `npm --prefix web test`:全量 131/131;`npm --prefix web run typecheck`、 `npm --prefix web run lint`、`npm --prefix web run build`(73 modules)和 `git diff --check` 均退出 0。 - M10-02 文件 SHA-256:protocol `23c2289ec2acbdce0beba47c0b6539bc3f14f5a71ce29927df86cf6c705d6ec3`;unit `e60933ed0f946bdaa96f5322ba8d80b26c8425c623dd6e87da33016a1592c299`;E2E `ff2c838b5c16d86eff13699586a0cd1121ee1a86d5ea52d7b89c01d35632bb77`;golden `471fec9c5382ab7522b6c18ab580a6926eaa59eb5a8b72d23968670b9b9ab37a`;production Worker `4a65547e6b1fea16a120b4e72eb37d4d9f7c7ced4342f535796535262ff65fcc`;package `b86395d256e46ac4e8298e18e1d594861a5ca757fdae2193120e7b38182c28fb`。 - `docs/status/M10-02.md` 和 N-012 状态已同步;M10 计数更新为 2/15。后续领取点: 机器队列最新 `nextTask`,本文不缓存任务名称。 M10-03 实际验证(2026-08-16 America/New_York) - 新增有界 `WebGeometryNodeEvaluator`,从 active Group Output 按需执行 schema 1 的 16 项 allowlist。Geometry 使用 Blender `GeometrySet`、join/realize/transform 与 mesh attribute API;Object/Collection 只读取同一 Main 的 evaluated depsgraph 资源,Image Info 读取真实 image dimensions。求值次数最多 4096;未支持 socket/operation/resource/cycle 继续稳定返回 `GEOMETRY_NODES_EVALUATOR_UNSUPPORTED`,Simulation Zone 不放行。 - 新增官方 Blender 5.2.0 LTS 生成器、`geometry_node_allowlist_evaluator.blend` 和 `M10-03/geometry-node-evaluator.json`。11 个最小场景让 Group I/O、Transform/Set Position、 Join/Separate/Realize、Store Named Attribute、Int/Vector/Value/Compare/Math 以及 Object/Collection/Image Info 全部进入可观测输出;golden 固定 topology、positions、bounds、 point Float attribute 与误差门(position max `1e-5`、RMS `1e-6`、attribute `1e-6`、 bounds `1e-5`)。 - `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generate-geometry-node-evaluator-golden.py -- `:生成 11 cases; 排除输出路径导致的 fixture path/hash 字段后,与仓库 golden 逐字段一致。Blender 自动备份 `geometry_node_allowlist_evaluator.blend1` 已移除,不作为交付输入。 - `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8`: 通过,`ninja: no work to do`,当前 full-Main 构件已由该 evaluator 源生成且与稳定 runtime 同步。 - `WEB_TEST_PORT=5443 npm --prefix web run test:geometry-node-evaluator-golden`:unit 4/4;Node full-Main WASM 16 nodes/11 cases,maximum/RMS position error 均为 0、attribute 通过;真实 Chromium Worker 打开/求值/保存/重开 1/1 通过。 - M10-01/M10-02 回归分别使用端口 5444/5445:Main reader 4/4 + reader 1/1 + Chromium 1/1; allowlist unit 4/4 + unsupported graph 无损阻断 Chromium 1/1,均通过。 - `npm --prefix web test`:全量 unit 131/131;`npm --prefix web run typecheck`、lint、production build(73 modules)、`check:local-deps` 和 `git diff --check` 均退出 0。 - M10-03 native/generator/checker/fixture/golden/Chromium/package/WASM SHA-256: `b896c5c52a611e7a309f80ca4bf8323ccded458584f65ab8f6841df24d70cc42` / `f42ba309e4935a4534eabcb8ab1978abc08d863e2d18d80a70607f31dd3a3066` / `76a02d4aae70a597f0c26c12de3104d56e3f1cc9fded1d4824a05d7ddc59c1b5` / `0cb3e33df570b436e32d783eef0a6c2daad04ca5bb4ccb4f0286b3d723ff7978` / `363ae47cfb50b8c95d0a55116e8663e41d27c7aa332cffe9b702bbe9b8cbfe1c` / `83b1c96518eb64bef2c8830c778a84eb13d8da0ea62c2488471ed5fefea975c8` / `f9130696e8f53ab5aa0ab9d8d27b45dd0cd868fe2eb2741e41a05b70b81b2584` / `432c5c9efb03b23a506c1b8f57f0d06ee683274bbdfe415f894f0d3c29db0b77`。 - `docs/status/M10-03.md`、主计划、项目状态和 N-012 状态已同步为 M10 `3/15`。M10-03 只关闭保存图的有界常量/实例求值;任意 field/domain、完整 lazy-function、图写回、linked resource 与 Simulation Zone 均未扩大声明。后续领取点:机器队列最新 `nextTask`,本文不缓存任务名称。 M10-04 实际验证(2026-08-16 America/New_York) - 新增 field materialization schema 1,绑定 graph ID/hash、Main revision、source/target domain、 data type、transport 和完整七域 cardinality。POINT/EDGE/FACE/CORNER/CURVE/INSTANCE/LAYER 元素上限分别为 1M/2M/2M/4M/100k/100k/4096;单批最多 64 fields、32 次真实 domain conversion、4M 目标元素和 64 MiB。Boolean/Int/Float/Vector/Color 的 scalar/byte 数均由 parser 安全乘法推导,不接受调用方伪造计数。 - JSON 单 field 上限固定为 65,536 scalar;更大 field 只允许 `BINARY`,原生 Depsgraph 当前 point Float 回执若越界则只报告 `BINARY_REQUIRED/GN_FIELD_JSON_BUDGET_EXCEEDED`,不展开 attribute JSON。协议拒绝内嵌 `values/jsonValues`、未知字段、未知/缺失 domain、伪造数据类型、 重复 field、批次聚合溢出和非数组 batch。 - full-Main Depsgraph 现从 evaluated Mesh 发布 POINT/EDGE/FACE/CORNER 真实基数,并让 `m10_value` 回执携带 schema、元素/scalar/byte 数。parser 交叉核对 vertex count、domain cardinality、Float32 byte layout、JSON 阈值和实际 attribute payload;回执与 payload 不能漂移。 - `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8`: 通过;仅保留 Blender 头文件既有 5 条 warning。full-Main 构件已同步到 src/public stable runtime,三处 WASM SHA-256 一致为 `1bb4a947da4332471f3d7bab8f3f628c83d1703244093a554a188668ddafafd7`。 - `WEB_TEST_PORT=5448 npm --prefix web run test:geometry-node-field-budget`:unit 6/6、真实 Chromium Worker 1/1。`M10GN_StoreAttribute` 返回七域 `8/12/6/24/0/0/0`、schema 1、 8 个 Float scalar、32 bytes 和 8 个 `0.375`;POINT 基数漂移、byte-length 漂移和隐藏 `values` 数组三种负例全部阻断。 - 未计入完成的首次重跑:端口 5447 的原生正例已经运行,但负例在浏览器内用相对动态 import, 被解析成不存在的 `/protocol/depsgraph.ts`。负例改为 Playwright Node 侧静态协议 import 后, 换端口 5448 从 unit 到 Chromium 完整重跑通过。 - M10-01/M10-02/M10-03 回归分别使用端口 5449/5450/5451,Main reader、allowlist 无损阻断和 16 nodes/11 cases desktop/full-Main WASM/Chromium golden 全部通过;M10-03 maximum/RMS position error 仍为 0。 - `npm --prefix web test`:全量 133/133;typecheck、lint、production build(73 modules)、 `check:local-deps`、`git diff --check` 全部退出 0;`npm --prefix web run test:depsgraph` 的 empty/basic/rigged 三 fixture 连续 100 次通过。 - M10-04 Geometry Nodes protocol/Depsgraph protocol/native/unit/E2E/package/error/WASM SHA-256: `8d04291c29e9ce30e3f2f6d4141bc4101d49529bf7f7edf109d67d059efa58b1` / `df7e0e29422f5b605f20fd5ab939d170d35048020968d2f6aea86603d0633cd6` / `5bcc17416fd4d45985bc1529288127b9eeed4a30b47836e687dc5321182c0b11` / `1aa4df021731d7ba4c4191d56f88c663b223443f78c9fdc1b88c2a43423239c7` / `95d8380d6a17a5b85df695a3cb850dffa8705f574ae0b9c97422bb802899eb8e` / `26fc36cc7fde0beb14dc70430cba7ddd748f5e488d58962266a42f85d6e5912a` / `b98391bd0007d23391a9c0c884350aa433406d4c9a56097e6c02b40c49c95937` / `1bb4a947da4332471f3d7bab8f3f628c83d1703244093a554a188668ddafafd7`。 - `docs/status/M10-04.md`、主计划、项目状态、N-012 和专项细分已同步为 M10 `4/15`。 本任务只关闭预算/transport/回执一致性,不宣称任意 domain 实际求值、完整 Blender lazy-function、图写回或 Simulation Zone。后续领取点:机器队列最新 `nextTask`,本文不缓存任务名称。 M10-05 实际验证(2026-08-16 America/New_York) - 将 `SimulationCacheManifestIR` 升为 schema 2,增加 committed `sourceRevision` 与可复算 的完整 `revisionHash`。hash 使用带 v2 domain marker 的 JSON-array canonical encoding,绑定 graph ID/hash、source blend SHA-256、source revision、input hash、Blender version 和 frame range;cache key 从三个 hash 前 16 位改为 `sim2-` 加完整 64 位 revision hash,避免截断碰撞。 - manifest/frame 使用 exact-key 校验;legacy schema、未知字段、invalid frame/revision、graph/ source/input/range 漂移在 payload 处理前稳定阻断。`verifySimulationCache` 先验 revision identity,再复验总 payload SHA-256 与逐帧 SHA-256。 - Storage Worker put/full read/frame read/list 全部进入 per-project lock。put 先核对当前 committed revision/hash,再计算和写入 payload;read/frame 再验证 manifest identity 与当前项目;list 校验所有 manifest,仅返回当前 revision/hash,旧 revision 保留在存储但不进入当前列表,显式 读取返回 `SIMULATION_CACHE_REVISION_MISMATCH`。 - `WEB_TEST_PORT=5455 npm --prefix web run test:simulation-cache-identity`:unit 3/3、真实 Chromium 1/1。revision 7 cache Worker 重启后精确恢复;保存到 revision 8 后旧 key 读取被拒绝、 列表为空,新 revision key 可写入并列出。负例覆盖 forged graph/source、stale read/put、input/ revision/frame range drift、legacy schema、未知字段和 frame payload drift。 - `WEB_TEST_PORT=5456 npm --prefix web run test:simulation-cache`:identity + 既有 Worker restart smoke 2/2;`WEB_TEST_PORT=5457 npm --prefix web run test:simulation-cache-performance`:600/600 frame、OPFS、600 published、pending=0、总耗时 5,072 ms,低于 30,000 ms。 - 首次全量静态门唯一失败是 read-path 重构后遗留未使用 `parseSimulationCacheManifest` import; 删除后 lint、typecheck、production build(73 modules)、local deps、git diff --check 均通过。 - `npm --prefix web test`:全量 unit 136/136;M10-04、M10-01/02/03 既有回归未受影响。 - M10-05 simulation protocol/worker/unit/identity E2E/smoke/performance/package/error SHA-256: `974b006f1ad4cd1d3d294122fc777c89c3a7da04fdaa7aebedea12b545bc65e5` / `a7b31eeb601e9e71c74eaceda95704f1d120653e9ade6bfbee6d262a42edaa74` / `591582a4ce77b699a4462e30d587eb89034f29ec0a22a94c81f8ab7306f2524f` / `2446060a9c3955ef466adb479966bf424fd9e9c351b65cd8525e90a1a1032e4d` / `0c8c001290c8c6b3482eeebc105b2f217c55b2eded0c62b4fee4595ec277a11d` / `f6c465b7afa012030dd8516d676e2663f4dd8298aa156defb905b3fa0229a84b` / `f9e28fb23af28720f56f97b249cb636599ebd92955ab2ff6d234b821e6d5ea44` / `4c6045b1cab8348f0acf180a1e618a0d691ddc5092822ca288f974904e5e13a5`。 - `docs/status/M10-05.md`、主计划、项目状态、N-012 和专项细分已同步为 M10 `5/15`。 该任务只关闭 graph/source/revision identity;M10-06 的取消/LRU/重启损坏隔离与播放能力仍未领取。 后续领取点:机器队列最新 `nextTask`,本文不缓存任务名称。 M10-06 实际验证(2026-08-16 America/New_York) - 新增 Worker 生命周期级播放准入:新 Storage Worker 必须先通过 `prepareSimulationCachePlayback` 完整复验 manifest revision binding、总 payload SHA-256 和 每帧 SHA-256,逐帧读取才从 `SIMULATION_CACHE_NOT_READY` 切换为可用;`release` 同时撤销 readiness 和 active playback 保护。完整 cache read 也会建立 verified readiness,以兼容既有调用方。 - StorageClient 的 cache put/full read/frame read/prepare 接受 `AbortSignal`;取消会立即移除 pending、 向 Worker 发送 `cancelRequest`,Worker 在总 hash 和逐帧 hash 间检查取消。真实 `BrowserTransformCachePlaybackSession.cancel()` 返回 `CANCELLED`、应用/发布 0 帧、pending=0; 取消 cache 写入不发布 manifest,已写 content asset 在无引用时清理。 - 新增确定性 `planSimulationCacheLRU` 与 `pruneSimulationCaches`:排序键固定为 `lastAccessAt -> createdAt -> cacheKey`,active playback 和显式 protected key 不可淘汰;若保护项 自身超过预算返回 `budgetSatisfied=false`,不破坏活动播放。被淘汰 manifest 的无引用 Simulation asset metadata 与 OPFS bytes 同步删除。 - IndexedDB 升为 schema 7,新增 `simulation_quarantine`。manifest/key 或 payload 缺失、截断、 hash 漂移时,坏 row 原子移出 `simulation_manifest` 进入 quarantine,保留诊断证据且不阻断其他 cache list/playback;专项使用独立临时数据库实测 v6 -> v7 migration record/store。 - `WEB_TEST_PORT=5464 npm --prefix web run test:simulation-cache-lifecycle`:unit 5/5、真实 Chromium 1/1,覆盖重启前 NOT_READY、full verify、播放/写入取消、active LRU、release、OPFS 篡改、隔离、 schema migration 和 0 pending。 - `WEB_TEST_PORT=5460 npm --prefix web run test:simulation-cache-identity`:unit 5/5、Chromium 1/1; `WEB_TEST_PORT=5461 npm --prefix web run test:simulation-cache`:identity + 既有重启 smoke 2/2; `WEB_TEST_PORT=5462 npm --prefix web run test:simulation-cache-performance`:600/600 帧、OPFS、 完成/发布 600 帧、6,639 ms、0 pending、Worker 重启恢复,通过 30,000 ms 门。 - schema/snapshot 定向 smoke 2/2、recent-project recovery 4/4;全量 unit 138/138;typecheck、lint、 production build(73 modules)、local-dependencies、status-consistency(12 parity BLOCKED、0 release BLOCKED、17 evidence、0 missing)和 `git diff --check` 全部通过。 - 未计入完成的首次 Chromium 失败:端口 5458 的所有功能流程已执行,但测试 helper 把 `DOMException.code=20` 当成业务码,导致预期 `AbortError` 的断言失败;只接受字符串业务码后在 5459 全量重跑通过,增加播放取消/migration 断言后又在 5464 从头通过。另两次 `npm --prefix web exec` 定向命令在测试前因从仓库根解析不到 `playwright.config.ts` 退出;改用 `web/` 工作目录后 schema/snapshot 2/2 和 recent recovery 4/4 通过,这两次命令错误不计为测试失败证据。 - M10-06 protocol/storage/error/Worker/client/migration/OPFS/unit/lifecycle/identity/performance/package SHA-256:`3025db84bd4e0151b8894a457c51da630d628afb1760e2f0caeec003f0efce3f` / `2711dbab0c52a566679b83d5e4d793ec0ffd3f991e744dce765b6bdc54d25c13` / `7ebff554dd6346b539215a6545c67806bca2ead33953700b79c0910fd0cfb408` / `e31d7dcf93c5dcefb7e6c4cfd7874c748f972849ee7d93adb6294f82aafcf236` / `aaa3a03e3b91452e90a661566407c261c7a16b1671ed55ec948de7626d49bfa4` / `8de1fcbbda9d7a4e7496995306c4e9fc83224211a516cf7241496b6a145953b5` / `2e8ef9d72194bf803a7e823fb2b7de30b9f10ae6dd4b031b81b97ff82eee9cc6` / `4ece0f5051667b04fab78c81a847def7a0c77d9267bd9e4fa2bbe4b9308125bf` / `861d370f72896987cef65d2e4d78ab3edcc1d4828d4a0fa0b5301b72a4a2932a` / `aa305871e8651018342b123112beab10a43dab3313e2c9765e450dc91c08b6e1` / `d7083c24789fc5877a7841bf611aee0ff471cc191621de1b30720d637635b44c` / `fe90c0bd741a7840f6184726737a1a93c606841b8408dd7fd6dec823a8352cf6`。 - `docs/status/M10-06.md`、主计划、项目状态、N-012、专项切片和 storage migration 状态已同步为 M10 `6/15`。Simulation Zone evaluator、浏览器 bake 和 GN modifier seek 仍未声明。后续领取点: 机器队列最新 `nextTask`,本文不缓存任务名称。 M10-07 至 M10-09 实际验证(2026-08-16 America/New_York) - M10-07 新增 schema 1 有界 Shader compiler,固定 RGB/Value、六项 Math、Image Texture、 Normal Map、Principled 和 Output allowlist,以及 nodes/links/depth/textures/identifier 预算。 Engine Worker 在 `setShaderGraph` Main transaction 前失败关闭;主线程与 Offscreen 共用 `createPBRMaterial` 和同一纹理 binding report。 - `WEB_TEST_PORT=5521 npm --prefix web run test:shader-compile`:M10-07 unit 5/5、Chromium 3/3。默认 5173 端口首次被既有进程占用,测试未启动且未计入功能失败;改用独立端口完整通过。 - M10-08 新增 64 字节十六进制 `compileKey`:对 report schema、graph hash、renderer backend 和按 usage/image 排序后的 imageId/assetId/asset SHA-256/colorSpace 做确定性 SHA-256。ImageIR 增加可选 SRGB/NON_COLOR/LINEAR;未知 backend 和非法纹理 digest 结构化阻断。 - `WEB_TEST_PORT=5523 npm --prefix web run test:shader-compile-key`:unit 7/7、Chromium 1/1; 纹理 hash 和 color-space 任一变化都会改变 key。端口 5522 首次因测试从 Vite 未暴露的仓库根 `/protocol` 导入而在编译器执行前失败;改由应用 PBR 入口后完整重跑通过。 - M10-09 新增 `PBRMaterialPipeline`:失败候选只记录 `shaderCompileFailure` 并释放自身,不替换/ 释放上一份可用材质;后续成功候选才替换旧材质。`WEB_TEST_PORT=5525 npm --prefix web run test:shader-pipeline`:Chromium 1/1,验证对象身份、稳定错误码和下一次成功替换。 - M10-07 回归 `WEB_TEST_PORT=5524 npm --prefix web run test:shader-compile`:unit 7/7、Chromium 3/3;typecheck、lint、production build(74 modules)、status-consistency(12 parity BLOCKED、 0 release BLOCKED、17 evidence、0 missing)和 `git diff --check` 通过。 - M10-08 compiler/SceneIR/render-assets/Engine Worker/PBR/unit/E2E/golden SHA-256: `acd5f8deb2912f6823533df12baba8049c5e64d440c17a6dc3f90741f71774b2` / `a65ef3b4be5303b1b86b3ee6829c795870dcc2490ba58d3a66b8bed8172d6442` / `840c09a6c2ec56cc75a9ca72bcbdde6957612a7c61b19ab83be47c571eca8b67` / `668728f7e5b6edf9e1cee3e6152238d16ac19f43f030e94e77bfe24e7ff50489` / `8a9cb52c8e7b1481096017cc659d93541c21724c1203d22755e37e1e3c365250` / `9ae9bb4c778d9e31a607d0c7d678ecf3448ed4e5b57c88ab4ba767a2f0850cc7` / `a09ebfa451e76c33f421bc8402fac4c77faedee88020431a505602f317b4eb65` / `187666d9dfb9d9cdd5bd6195cc2f7ee57bb78fa0d05d6020762c06a4ab015984`。 - M10-09 pipeline E2E/golden SHA-256: `e6771f672e885250db199cbf97a0a3866084ab9bb3f2ad25d17f5c53edaa99af` / `5dbb916e512935a76dacde37242b123707897f54ab10d7b99e246f57afbc94ac`。 - `docs/status/M10-07.md` 至 `M10-09.md`、主计划、项目状态、N-013 和专项切片已同步为 M10 `9/15`。global protocol schema 保持 1;当前领取 M10-10,任意 Shader 节点仍未声明。 M10-10 实际验证(2026-08-16 America/New_York) - `RenderCapabilityRequest.ARBITRARY_SHADER.nodeTypes` 放宽为任意字符串;gate 对未知类型去重、 排序并返回稳定 `PBR-012/ARBITRARY_SHADER` block,错误码 `SHADER_NODE_UNSUPPORTED`、 recoverable=true。既有 ShaderGraph validator/Worker gate 保留原图并在 Main 前阻断。 - `WEB_TEST_PORT=5526 npm --prefix web run test:shader-capability`:Chromium 1/1;`VORONOI`、 `CUSTOM_OSL` 以及反向输入顺序返回完全相同的 task/capability/status/code/message。 - typecheck、lint 和 `git diff --check` 通过。 - M10-10 gate/spec/golden/package SHA-256: `322929e9c7b627a9e79b8a6f11d5e9b0c7c05a5754f82d41c45c1134bbaaf385` / `6337801f10b9115ba7b53a43152ae69a324b5baa61c8e455cc61505437228cbf` / `b7182bb57e10d0b302b4c7dc9bc43160721a2c9414b056c86173c3b5c2501739` / `d6d4dcaf4f5c852f884ba2064da96a8c30519c661bf4a16c59e115742aa37e8a`。 - `docs/status/M10-10.md`、主计划、项目状态、N-013 和专项切片已同步为 M10 `10/15`; 当前领取 M10-11,仍不开放任意 Shader、NLA operator 或 Physics solver。 M10-11 实际验证(2026-08-16 America/New_York) - 新增桌面 Blender 5.2 layered Action fixture `tests/files/web/nla_time_mapping_scene.blend`: `M10_NLA_TimeMapping` 的 `M10 Time Mapping` Track 含 `M10 Scaled Clip`(scene 20..40、 action 1..11、scale=2)和 `M10 Reverse Repeat Clip`(scene 45..65、action 1..11、 reverse、repeat=2),均为 `REPLACE`/`NOTHING`。 - `node tools/web/check-nla-evaluation-golden.mjs`:WASM Main reader/Depsgraph 1 Track、 2 Strip、12 帧通过,desktop matrix 最大误差 `0`;每帧读取前后的 NLA/Action JSON 相同。 - `WEB_TEST_PORT=5527 npm --prefix web run test:nla-evaluation-golden`:Node/WASM checker 和 Chromium Worker `1/1` 通过。 - `npm --prefix web run typecheck`、`npm --prefix web run lint`、 `npm --prefix web run check:local-deps`、`python3 -m py_compile` 和 `git diff --check`:通过。 - M10-11 文件 SHA-256:fixture generator `a941ecb850ddd165ede117f6411615c6daed4d6bdaffaeac8228a308b7fbe745`;golden generator `941a63cc9edbaa0d8dd25025872e3fc44bf64df54d5a9232ad4128e6ac0cd5c5`;checker `2ce9db0fcbceaf30e398e8feb5c002a60395ac34e61382d9414e980e51e6fdd5`;fixture `b32f783debe213a1345ec4528e5ed27f0f4de00d7896b626df39756289119855`;golden `2d148ac0cbc2ac9281d430da20dba8373ad1bb0de6ec5fa578adf36296455fbe`;Chromium spec `c12f105d206a03dae5b73b076cc3b0a758d597cea7532b6720f4653568df0245`。 - `docs/status/M10-11.md`、`docs/status/N-014.md`、N-014 专项计划、主计划和项目状态已 同步为 M10 `11/15`;当前领取点继续只读取机器队列最新 `nextTask`,不把 M10-12 operator transaction 提前标为完成。 M10-12 实际验证(2026-08-16 America/New_York) - `moveNLAStrip` 要求精确 `baseRevision`,仅移动一个已有 Action Clip,保留原 duration 和 time mapping;纯 helper 对 source stack 做 structured clone,拒绝空身份、未知 track/strip、 overlap、非有限值和超过 +/-1e6 frame budget 的输入。 - Engine Worker 校验 owner/revision 后把候选栈转换为 native `setNLAStack`,由现有 Main transaction 统一完成 revision、history、undo/redo、save/reopen;stale command 在 Main mutation 前返回 `REVISION_CONFLICT`。 - `node --test web/tests/unit/nla.test.mjs`:2/2;`WEB_TEST_PORT=5528 npm --prefix web run test:nla-operator`:unit 2/2、Chromium 1/1。浏览器覆盖 stale revision、20..40 -> 5..25、 revision/delta、undo/redo、save/reopen 和 frame-10 native evaluation X=2.5。 - `npm --prefix web run test:authoring-roundtrip`、`npm --prefix web run typecheck`、 `npm --prefix web run lint`、`npm --prefix web run test:status-consistency` 和 `git diff --check`:通过。 - M10-12 文件 SHA-256:`web/protocol/nla.ts` `03d5abce5cb2f0a3a38e42eedbced7f4de6e2052d18e53a3dcde3b3ca1e6020d`; `web/protocol/web-engine.ts` `48f2290ead27aeda1f17b279f01ae278776b50b4cb4de065d94b0e1d44717dbb`; `web/app/src/workers/web-engine.worker.ts` `4ccad87c1619db8e39d2855ebca9918883484ce3e5dfc8a325ccee9a8220397c`; `web/tests/unit/nla.test.mjs` `d8bac2dd3e4ec1a1342de7c7401a51beb9879ea5ba2b34df7d615ae0449081a7`; `web/tests/e2e/nla-operator.spec.ts` `1658d52eb0b8cf329f73be552e9b2649ed6dc96b21edb48ade9dd4a725a37ae0`; `web/package.json` `e9d5c6e4f7132921faac8ecbee40215098497fe374d56309f2c76fab152c33d6`。 - `docs/status/M10-12.md`、主计划、项目状态、N-014/N-014-B2 和交接文档已同步为 M10 `12/15`;M10-13 继续按机器队列领取,本文不缓存任务名。 M10-13 实际验证(2026-08-16 America/New_York) - `probePhysicsSolverCapabilities` 按固定七 family 顺序检查 runtime export、初始化结果、 SINGLE/PTHREAD 要求和 2 GiB 内的可用内存;异常、非法环境、NaN/越界结果均 fail-closed。 - 只有四门全过的单个 family 才得到 `LOCAL_SOLVER/READY`;其余 family 独立返回明确 probe 原因并路由 `DESKTOP_SERVER_BAKE`。生产 inventory 未安装 solver adapter,因此七类默认均为 `EXPORT_UNAVAILABLE`,合成 RIGID_BODY 正例只验证门,不计作真实 solver。 - `node --test web/tests/unit/physics-solver-probe.test.mjs`:3/3;`WEB_TEST_PORT=5530 npm --prefix web run test:physics-solver-probe`:unit 3/3、Chromium Worker 1/1。 - `WEB_TEST_PORT=5531 npm --prefix web run test:e2e -- --grep "N-018 physics"`:Chromium 1/1; `npm --prefix web run test:physics-main-reader`:CLOTH/SOFT_BODY Main reader、save/reopen 通过, playback/solver 继续 BLOCKED。 - typecheck、lint、production build(74 modules)和 `git diff --check` 通过。 - M10-13 文件 SHA-256:protocol `adc57a12c7f57c6b1d5f99590d3c36cefa83636aca86c780c2520f3f41148981`;unit `e499d55770d2024c75803ce1acc1c234814c027279f2b40f42195fd480977653`;Worker `fbad383de186a659440da42dcad988310ca2e483db27e30d74342c8f57a0f49a`;Chromium spec `1419b98d68da9b0ab0bf41b37843442741593655e2693159d84e069f1dec3f09`;golden `bcc8f9094e2b0d8f41ef01fda0daa2a29693d188e602447d6d06358aaa751df4`;package `875162709315e2a8116c5d28023576a4b95fb076b79453de8b21acdbff2df9dc`。 - `docs/status/M10-13.md`、`docs/status/N-018.md`、主计划、项目状态和交接文档已同步为 M10 `13/15`;下一领取点继续只读取机器队列最新 `nextTask`。 M10-14 实际验证(2026-08-16 America/New_York) - Physics cache schema 1 对七 family 分别绑定 cache family、desktop/server bake 来源、Blender 5.2、source blend/settings/input/cache SHA-256、frameStart/frameEnd、总 byteLength,以及每帧 byteOffset/byteLength/SHA-256;`COMPLETE` 强制全帧,`PARTIAL` 仍要求 frame 有序且 bytes 连续。 - `verifyPhysicsCachePayload` 在消费前复算当前 source blend、完整 payload 和逐帧 SHA-256; source drift 返回 `PHYSICS_CACHE_SOURCE_MISMATCH`,payload/frame drift 返回 `PHYSICS_CACHE_HASH_MISMATCH`,version/budget/range/unknown field 均稳定失败关闭。 - `node --test web/tests/unit/physics-cache-family.test.mjs`:3/3;`WEB_TEST_PORT=5533 npm --prefix web run test:physics-cache-family`:unit 3/3、Chromium Worker 1/1。 - M10-13 probe 回归 unit 3/3 + Chromium 1/1;Physics Main reader 通过;M10-05 Simulation cache identity 回归 unit 5/5 + Chromium 1/1;typecheck、lint、production build(74 modules)和 `git diff --check` 通过。 - M10-14 文件 SHA-256:error protocol `6972a144bdc61c2a4270c88df2d86c75640bb5f24b5ac3b7f9a02d69d3c500fd`;Physics protocol `b02b820503d79cd26b0323a4d2033e79d0eeb3032befd26fafe5eab55634584c`;existing test Worker `453c6e9e683b9da0ef7ce4bd0e4e430b97102d80ddb9b14cc9d075319b37d818`;unit `e1c6f07ec58ce4c4c987bd8a36f270497ae3a0f521d6ed27d7f199debeeaccb2`;cache Worker `8af676506cc0ff1501816431d92d82ca15316b40095d617ecb664b9608e209e0`;Chromium spec `6a2788587f6692bf5bf19d76400810fa277a6985d1a6ecc1b8d1adb85c609249`;golden `b220d1fd73f307213078ce3cbd6212544f97ade84a45d54847f107cef69d302d`;package `9baeb319d8c740f67f3e7615942c78f920e7a56b0d654a5a8f47d68de7243eb4`。 - `docs/status/M10-14.md`、`docs/status/N-018.md`、主计划、项目状态和交接文档已同步为 M10 `14/15`;下一领取点继续只读取机器队列最新 `nextTask`。 M10-15 实际验证(2026-08-16 America/New_York) - 新增四个隔离 Chromium Worker 会话的联合门;每域依次执行有界性能负载、超预算输入、恶意 graph/manifest,再以同会话小输入证明恢复。OOM 项是 evaluator/payload 分配前的确定性 budget gate,不扩大为任意浏览器 heap exhaustion 声明。 - 实测:GN 10 x 512 nodes 为 54 ms(门 5,000 ms);Shader 100 compile 为 17 ms(门 5,000 ms);NLA 20 x 256 strips 为 62 ms(门 5,000 ms);Simulation 64 frame hashes 为 2 ms(门 10,000 ms)。 - 超预算/恶意输入稳定码:GN `GN_GRAPH_BUDGET_EXCEEDED`/`GN_DEPENDENCY_CYCLE`;Shader `SHADER_NODE_UNSUPPORTED`/`SHADER_GRAPH_CYCLE`;NLA `NLA_BUDGET_EXCEEDED`/ `NLA_INVALID_STACK`;Simulation `SIMULATION_CACHE_BUDGET_EXCEEDED`/ `SIMULATION_CACHE_INVALID`。四域失败后小输入均成功。 - `WEB_TEST_PORT=5536 npm --prefix web run test:m10-domain-gates`:Node 23/23、Chromium 1/1。 首次未带独立端口时 23/23 Node 已通过,但浏览器因既有 5173 进程未启动;修正为 5536 后从头 完整重跑通过,未把端口失败计为功能证据。 - 回归:GN field budget unit 6/6 + Chromium 1/1;Shader compile 7/7 + 3/3;NLA operator 4/4 + 1/1;Simulation lifecycle 6/6 + 1/1;typecheck、lint、production build(74 modules) 和 `git diff --check` 通过。 - M10-15 文件 SHA-256:error protocol `88119782307cb9a61e131f2d5e2e25127256c1e68a333fc7fc3206158b8a1019`;NLA protocol `96ae7cf9ca3fadbaf98ca15a38937329f203b0bc4a9c39ef685987e7f55353dd`;Simulation protocol `a1302e42129420a96416e363cbc857d082d4646655685520c9e81f877ce3d9b8`;NLA unit `e11aa1f395970613cee5d37a9eb21c3fac3422f0080c75c78eb8777effb77adc`;Simulation unit `2be82cdda991b47fbf8955cfbf2f92cb1fdc7b7c0debb0c8102d4f35e8fce8e3`;Worker `bc508e1c81ca6efefd67b5c572f93c27dd71bd602319ae887c50e27f8a309a31`;Chromium spec `2973a596df8613a9cfdb0bd4d300d95b71a8e818e615278a39fb777db6c5cf03`;golden `580051434ec6673251bac755cc189939de1f887aad088497e16a7657f3a83963`;package `092931cebf9cb14814951703af26e2d0e4c5e0295c1ba4cb748bfe4ee49448c2`。 - `docs/status/M10-15.md`、N-012/N-013/N-014 状态、主计划、项目状态和交接文档已同步为 M10 `15/15`;下一领取点继续只读取机器队列最新 `nextTask`。 M11-01 实际验证(2026-08-16 America/New_York) - `tests/golden/M11-01/lighting-field-parity.json` 覆盖 CameraIR 20、LightIR 17、WorldIR 14、 Scene render/color-management 9 个叶字段;每项分别记录 reader/writer/main/Offscreen 状态和 aggregate parity。Orthographic/Panoramic/Custom、DOF 视觉、radius/area spread/sun angle、World rotation/visual Mist、AgX/look/gamma/white balance 等缺口保持 PARTIAL/BLOCKED。 - `tools/web/check-lighting-field-parity.mjs` 使用 TypeScript AST 从 `scene-ir.ts` 实时枚举字段, 拒绝漏项、重复、非法状态、缺失 evidence 路径、COMPLETE 过度声明和关键阻断项漂移。 - `npm --prefix web run test:lighting-field-parity`:字段 60/60,24 COMPLETE、17 PARTIAL、 19 BLOCKED;真实 Main `lighting-roundtrip` 同命令通过 Camera/DOF、Light、World/Mist、拒绝门、 undo/redo、save/reopen 和 white-balance integrity gate。 - `WEB_TEST_PORT=5541 npm --prefix web run test:e2e -- --grep "N-019"`:Chromium 2/2; typecheck、lint、production build(74 modules)、status-consistency 和 `git diff --check` 通过。 - M11-01 SHA-256:parity table `b7fee80b4f2469cf119902c939f9091e640a6f0e1307e97ba29f0afa8942c4ed`;checker `cf910a087f9af72e0782d62e67341f90fd4af1c6c8eddf54169ee6275e24bd9c`;package `cd7174b04b19e61a280e03e6c61e2ffd20fd507c0716c820b8faa31ea2438ebf`。 - `docs/status/M11-01.md`、`docs/status/N-019.md`、主计划、项目状态和交接文档已同步为 M11 `1/14`;下一领取点继续只读取机器队列最新 `nextTask`。 M11-02 实际验证(2026-08-16 America/New_York) - 复用生产 `setCameraProperties`/`setLightProperties`/`setWorldProperties` Main transaction, 一个 Chromium 流程逐域执行 edit、undo、redo,保存为 `.blend` 后用全新 Engine Worker 重开。 - 字段断言覆盖 Camera lens、双 sensor dimension/fit、shift、clip、ortho/DOF;Light color、 energy/exposure、temperature、shadow、spot/area;World color/exposure/Mist。共享 PBR 映射另核对 水平/垂直 FOV、film gauge/offset、温度线性 RGB、强度、shadow、spot/area 和背景色。 - `WEB_TEST_PORT=5545 npm --prefix web run test:lighting-field-roundtrip`:原生 Main roundtrip 通过,Chromium 1/1;revision 从打开开始每个 edit/undo/redo 均严格 +1。 - 未计入完成的前两次专项运行:端口 5542 在 World Float32 color 严格相等处失败;改为递归 `1e-5` 数值容差后,端口 5543 又在 camera near 的剩余严格标量断言失败。统一所有 Blender Float32 字段的容差、同时保持结构/字符串/布尔严格比较后,端口 5544 通过;补齐 horizontal sensor-fit 与 temperature color 视口断言后,端口 5545 从原生到 Chromium 再次完整通过。 - 全量 unit `156/156`;typecheck、lint、production build(74 modules)和 `git diff --check` 全部退出 0。 - M11-02 golden/Chromium/native checker/protocol/Main writer/PBR/package SHA-256: `ac6d84c0099b12cf6c96df2dbbb4281e3308c36f0bda49c92d7548e58ccc286e` / `9f75c7b88c70ab42c6c418b0056dcffcab3b8851003258891902db9615fcfe67` / `023e3e43bc37fb38c3063d33c20e59043308013874fce20bc3a49d508b850e6c` / `48f2290ead27aeda1f17b279f01ae278776b50b4cb4de065d94b0e1d44717dbb` / `510b4017c540fc4d1ac135c1ce7251cc5d7143f31d8604e1d545de36716da9a2` / `78352e46c62d0c8d9bf25408ea1d725a843a42068ea3eb304bb3d78f8d612e0b` / `8074d80265a1378fb3f284206c343ff1e388a5ea43e57946a1d4092076d72ea8`。 - `docs/status/M11-02.md`、`docs/status/N-019.md`、主计划、项目状态和交接文档已同步为 M11 `2/14`;下一领取点继续只读取机器队列最新 `nextTask`。 M11-03 实际验证(2026-08-16 America/New_York) - 新增 schema 1 `PBRRenderBudget`。THREE_WEBGL2 固定总 16 lights、4 x 1024 shadow maps, 其中内置 viewport lights/shadow 也占 2/1 保留槽;THREE_WEBGPU 固定 64 lights、8 x 2048, runtime adapter limit 只能向下收紧。纹理上限同时覆盖 256 assets、16K 单边、512 MiB aggregate payload;WebGL2/WebGPU decoded RGBA 上限分别为 512 MiB/1 GiB。 - planner 按 SceneIR node 顺序保留确定性 light/shadow 前缀,返回 dropped/blocked stable IDs 和 `GPU_LIGHT_BUDGET_EXCEEDED`/`GPU_SHADOW_BUDGET_EXCEEDED`。主线程与生产 Offscreen Worker 都在 canvas 发布同一 report;WebGL2 实际 Three scene 复核为总 16 lights/4 shadows。 - `GPUTextureStore` 在 hash/decode/GPU allocation 前按现有资源+候选批次计算 aggregate budget; 257 个候选在两条 viewport 路径均 loaded=0/bytes=0。先加载真实 8x8 PNG 后再提交超限批次, 原 Texture asset identity/hash 保持不变。 - `WEB_TEST_PORT=5548 npm --prefix web run test:render-resource-budget`:unit 3/3、Chromium 3/3。 20 个 scene lights 中渲染 14、丢弃 6;14 个 scene shadow 请求中渲染 3、阻断 11。 - 未计入完成的一次重跑:端口 5547 的主线程/Offscreen 预算 2/2 已通过,新增纹理保留 case 在业务代码前因 Vite 不暴露仓库根 `/protocol/render-assets.ts` 动态导入失败;改为浏览器 `crypto.subtle` 生成 hash、只导入生产 TextureStore 后在 5548 从 unit 到 Chromium 全量通过。 - 回归:M11-02 原生+Chromium 1/1;4K texture 64 MiB decoded、8K texture 256 MiB decoded 均通过;packed texture 主线程/Offscreen 2/2。全量 unit 159/159,typecheck、lint、production build(75 modules)、local-dependencies 和 `git diff --check` 全部通过。 - M11-03 protocol/PBR/texture store/main viewport/Offscreen Worker/unit/E2E/golden/package SHA-256: `d7784690358e38b71c6ad3ccc5baf82869d897714d5257f219bbd00dc7e7b0f7` / `934874434afa6778eaf783c78650ad221a428352741f3ff7173cb3c17a0c3c14` / `0f18f3bcf04c5c99175d4cac8bbf1bc028fc54d635701fb6a92791e06c335fb6` / `dcb502ca892fd5431cbf1a13823aec5d83a2aa0a1b40487cb66fa630c6e461b3` / `c95bce10f0bd73591f002c21415bfbc6f709ecbe61e97a3b5b05bcec2b0e0bef` / `4bde90788bbf9a94317d83bd398acd321bbcf4e53e26bf40165a889bacff03a2` / `90834dfff09e61a2d32732d3a8f0db4b9c71414ac4991412d93d322119ef2de7` / `c312bf5ed8415ad51e5cccb3a2653f65cd9fee46488be2f860e6a5a8d5a7901d` / `c718983c3f3a552f4c68d9390376777e45a3f23e6999afd5cb4ddc786a12a278`。 - `docs/status/M11-03.md`、`docs/status/N-019.md`、主计划、项目状态和交接文档已同步为 M11 `3/14`;下一领取点继续只读取机器队列最新 `nextTask`。 M11-04 实际验证(2026-08-17 America/New_York) - 新增 `web/protocol/render-image-comparison.ts` schema 1 和 app wrapper。输入固定为等尺寸、 有界 RGBA8;颜色空间为 `SRGB8`、alpha 为 `STRAIGHT`。每个报告保留实际值、阈值、比较方向 和通过状态,检查 MAE、RMS、P95 channel、max channel、坏像素比例、以 reference corner median 为背景的前景 IoU,以及 alpha coverage delta;尺寸/字节/阈值/4,194,304 pixel budget 在计算前拒绝,失败返回 `RENDER_REFERENCE_MISMATCH`。 - `tools/web/generate-m11-render-reference.py` 由 Blender 5.2 `BLENDER_EEVEE` 生成 `tests/files/web/m11_render_reference.blend` 和 `tests/golden/M11-04/blender-eevee-reference.png`。 固定 256×256、camera orbit 对应位置、黑色 rough/specular=0 material、World color、 `taa_render_samples=1` 和 `dither_intensity=0`。PNG container bytes 可能因路径元数据变化, `check-render-reference.mjs` 以 committed PNG SHA-256 锁构件完整性,并让 Blender 逐像素解码 复验重渲染像素 max=0。 - `WEB_TEST_PORT=5552 npm --prefix web run test:render-reference`:unit 3/3、Blender reference 复验通过、Chromium 3/3(main 1/1、Offscreen 1/1、错误构图负例 1/1)。两条生产路径报告 完全一致:MAE `2.0433349609375`、RMS `5.448994264342599`、P95 `4`、max channel `110`、 bad-pixel ratio `0.0047760009765625`、foreground IoU `0.9853400565736072`、alpha delta `0`。 收紧后阈值为 MAE 4、RMS 12、P95 12、坏像素比 0.02、IoU 0.97、alpha delta 0。 - 回归:`npm --prefix web run typecheck`、`npm --prefix web run lint`、production build(75 modules)、`npm --prefix web run test:status-consistency`、`npm --prefix web run release:evidence-sync` 和 `git diff --check` 通过。status consistency 为 12 parity BLOCKED、0 release BLOCKED、 17 evidence、0 missing;M11 更新为 `4/14`,完整色彩管理、Cycles/复杂 Eevee、高级 shadow、 Volume 深度合成和全场景 pixel parity 仍保持 BLOCKED。 - M11-04 hashes:protocol `4345cc0d02b4482201de34292cbf5198009bf615e69c80cc00bc3e76116efec2`; app wrapper `ad97fd594d0d964e05d4da2bffc84a64ef737fef700045c252b5222250f1ffc7`;error protocol `e8ea483466b16debaf803ff1640ade07a858a802781e3040d3547028ecb5d19f`;generator `118c98c77d98922e72660898bfb65842e11743fc77f4124c9f5088a76cb6a94a`;reference checker `ead3500f054e98c2db4cd6596c983586a622e929bc8a587e9fbd38d94a7df7d1`;unit `f9800745760b85700e80abc5e389f44d7f7ea3b9e41e1002f4e5449bcb620f67`;Chromium spec `349c7da0dfd60baec80139cced52079312bd5e892a42f000ba0b4f55c6a4a61d`;fixture `d2bea55fe4de0b00e73a9241b4d1b0c802c2eb0e6159c0cd48e007b97b9d3963`;PNG `f5c22636a232bcbb0ed0f772418cb12fced18ff72f4999804197e42caa61480a`;golden manifest `e9551f86f0b9704d7be35c03f07321bec5d2481ffee4208ae766156d9c9a0135`;package `38ba6a722a2e0bc2c91d6edbd2b7df5e3609342e3b7ef2ec9646b9c6ce0d25a6`。 - `docs/status/M11-04.md`、`docs/status/N-019.md`、`docs/CURRENT_EXECUTION_PLAN.md`、 `docs/PROJECT_STATUS_AND_NEXT_WORK.md`、parity ledger/release evidence 和本文件均已同步。 后续领取点继续只读取机器队列最新 `nextTask`,本文不缓存任务名称。 - M11-04 台账回归补充:首次全量 unit 为 `161/162`,唯一失败是把 post-V1 的 `web:test:render-reference` 误加入冻结 V1 acceptance,导致计数从 50 declarations/49 unique 漂到 51/50;从 ledger 的 V1 acceptance 删除该项、保留 M11/N-019 专项记录并重新同步 evidence 后,全量 unit `162/162`、status consistency 和 `git diff --check` 全部通过。 M11-05 实际验证(2026-08-17 America/New_York) - 新增 schema 1 `RenderRoutingRequestIR/RenderRoutingResultIR`。`target` 与 endpoint availability 分离:bounded Eevee + WebGL2 返回 `WEB_LOCAL_BOUNDED/READY`;WebGPU 只有 browser capability 与 renderer bundle 同时存在才可 READY,否则保持 `WEBGPU_RENDERER_UNAVAILABLE`。 - `BLENDER_CYCLES`/`CYCLES`、complex Eevee、Workbench final render,以及 CUDA、OptiX、HIP、 Metal、oneAPI 一律返回 `SERVER_JOB`。生产默认 `serverRenderAvailable=false` 时状态为 BLOCKED、 code=`SERVER_JOB_UNAVAILABLE`;合成 endpoint context 只把同一 server target 变为 READY,未调用 submit,也未提前声明 M11-06 的 source/build/settings/output hash。 - SceneIR `renderEngine` 按有界大写身份串处理;未知但合法的 engine 返回 `SERVER_JOB/BLOCKED/UNSUPPORTED_RENDER_ENGINE/PLATFORM_CAPABILITY_UNAVAILABLE`,非法 identity 与 backend 在路由前以 `INVALID_ARGUMENT` 拒绝。 - `WEB_TEST_PORT=5556 npm --prefix web run test:render-routing`:unit 3/3、Chromium 1/1。浏览器 先由生产 WebEngine Worker 打开 `m11_render_reference.blend` 并读取真实 `renderEngine=BLENDER_EEVEE`,再验证 bounded/Cycles/complex/OptiX/configured-server/WebGPU/ unknown-engine 全矩阵;机器 golden 为 `tests/golden/M11-05/render-routing.json`。 - 回归:typecheck、lint、production build(75 modules)、release evidence ledger sync 和 `git diff --check` 通过。M11 更新为 `5/14`;真实 server job、hash/progress/cancel 和结果消费 仍保持 M11-06 阻断。 - M11-05 hashes:protocol `2d41d48609635c810572aaae95979df2fe9e49bbd130c60d70f64042c5d0f097`; app wrapper `f360c05fa62aa830a486c5be4747488fcbb5ba9b68d82b4f7187e1267da46fa6`;unit `4ac2e7a6c2265f948d971f72effb4ff9ad1c51839ab6c06d496fc2b0768c4fa8`;Chromium spec `e5572d9ad9426f1dcc1856fe426261910093fa2f5460117e4ffdcfc7b23b10a1`;golden `53c5d3a2e51f251d14953594567081597be4250be5b1236832370e74805bd35d`;package `716a5331990618892bca97f48c7eef589a5af6c5131b8cf3ae52a1b9d923644c`;parity ledger `4ce36890f5772c2a22338dd4fda1c33d3241a5b328b25c5455c28f4f74f1964c`;release evidence `8887db65eeab9777c9313b001e70c5cd4f65e8b6d36411ece8bb6fd2ccf062d2`。 - `docs/status/M11-05.md`、N-019、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;下一领取点继续只读取机器队列最新 `nextTask`,本文不缓存任务名称。 M11-06 实际验证(2026-08-17 America/New_York) - 新增 schema 1 `ServerRenderJobRequestIR/ServerRenderJobResultIR`:source `.blend` SHA-256、 byte length、Main revision、Blender 5.2 version/build SHA-256、严格 settings allowlist/hash 和 request hash 构成提交 identity;成功结果必须回显同一 identity,并增加 output MIME/bytes/ SHA-256 和 result hash。schema 1 每份输出只允许一个 still frame,settings 只接受 engine、 frame、resolution、percentage、samples、PNG/OpenEXR 和 transparent,不接受“哈希但不执行”的 未声明字段。 - `npm --prefix web run test:server-render-job`:unit `3/3`;loopback HTTP server 用真实 `build_blender_5.2.0/bin/blender` 5.2.0 headless 打开上传的 M11 fixture,并显式应用上述 settings 后渲染 PNG。成功报告 source `d2bea55fe4de0b00e73a9241b4d1b0c802c2eb0e6159c0cd48e007b97b9d3963`、settings `97bb832618bd27e8763722afa0d250ef74383fb355f0ff38763930f57ba1590b`、本轮 output `564b95cd501da2636085aeada88814c4a3b7af7b1f0188543a1863fe34dd091e`、3915 bytes;source、 build、settings、output 四类篡改均返回对应稳定 code。 - M11-06 hashes:protocol `e2b5b95032b0dbcb346aa35d1a10a3b55d6c006603f16b9e72c3de45763906c5`; errors `747ea52fd96b3ec7ede9ce72c15f56fdc454836ba5bf924cc60198096d4986de`;unit `c84f86365006360f146601839d7e1394f3f7bc7fa71dcbf62d8d4e4321cdd16d`;server checker `6dd49fbd1be202a88fa714b2fb81305018da6df5f9d73c95e048e3697742764e`;Blender driver `48950b0884a52a40ae234f8bbe590a0cb89e58c4d2a2de40ea638f491d111aff`;golden `36f083f8da7585f850e748e6ac78fc57cd6e8d59bce03d77eee3acd2fa042ae7`;package `628191a76c7614393a74969bd000faa8a6302d887265d13a1ad49dcfc401c2fc`;parity ledger `08a2db12253a06d7c9e188032ef4f5eeaad671698cd8244f3050d13377a3939e`;release evidence `7f514fee95de3d38634c54c7abf342ad44686a9ed5fabe658d04a538cf136c1b`。 - 回归:typecheck、lint、全量 Node `168/168`、status consistency(12 parity blocked、0 release blocked)、release evidence(17 records、0 missing)、production build(75 modules)和 `git diff --check` 全部通过;V1 acceptance 未加入 post-V1 M11 专项,冻结计数保持不变。 - `docs/status/M11-06.md`、N-019、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;M11 更新为 `6/14`。真实远程队列、进度、取消、Freestyle/denoise 以及 M11-07 compositor allowlist 均未提前声明。下一领取点继续只读取机器队列最新 `nextTask`。 M11-07 实际验证(2026-08-17 America/New_York) - 领取 M11-07:Compositor allowlist 每新增一个 node 单独增加 CPU/WebGPU golden。生产 `web/protocol/compositor.ts` 新增 schema 1 WebGPU plan,只允许 `CONSTANT_COLOR`、`EXPOSURE`、`INVERT`、`COMPOSITE` 的无资源、单输入线性 sRGB Float32 链;`CompositorWebGPU.ts` 使用真实 Chromium WebGPU compute 执行同一 plan,其他节点、 资源输入、断链和错误 socket 在 shader 编译前返回 `COMPOSITOR_NODE_UNSUPPORTED` 或 `COMPOSITOR_GRAPH_INVALID`。 - Blender 5.2 生成的 `m11_compositor_allowlist.blend` 含 Constant、Exposure、Invert、Chain 四个独立场景。Main/WASM reader 读取真实 graph 后,CPU executor 与 Chromium WebGPU 对 2x2 `LINEAR_SRGB` RGBA 输出逐字节一致;四例最大绝对误差 `0`,CPU/WebGPU golden hash 均匹配 committed manifest。 - `WEB_TEST_PORT=5562 npm --prefix web run test:compositor-node-golden`:Node `3/3`、 Blender 5.2/native golden `1/1`、Chromium WebGPU `1/1`。首次未设置独立端口的运行只在 5173 占用处停止,Node/native 已通过但未计入;端口 5562 从头重跑通过。 - 回归:`npm --prefix web test` 全量 Node `171/171`;typecheck、lint、production build (75 modules)、`test:status-consistency`(12 parity blocked、0 release blocked、17 evidence、0 missing)、`test:release-evidence`(READY)和 `git diff --check` 全部通过。 - M11-07 hashes:compositor protocol `e35fbfafd67e3026c0dba1ffa1d5ca27c5c659e7baa8a577059d23b2779e2dca`;CPU adapter `dfa5be2b01f964ec39c939928aa7b29d30fd88cb3f3705508166983f50442950`;WebGPU adapter `8db2ea4764941c7ab08eca1ab0027d267bb085f4820beb424468506d9ddd1332`;unit `3e5ea2ed500a002fa7acd656ef902d190368f7972d97dffcbecfda1a6864d093`;Chromium spec `ee16413f049e55cd3de3b4f4bb7c133f401ca600eeef8f01ed2a0ccf47740daf`;native checker `668d8ef946df787a2c3d3eee814c71655c8cc6e35976f2e21c6750d5abdaf32`;fixture generator `1389998aac849065311c85ef559a7d381274c0ebe1987afc3b6783c66a9a678e`;fixture golden `fcdd0e875ff799d3c8b7ee34a63b5c88694ef6af3a19fed5d1c51b5330c60c95`;M11-07 status `103291f56e3623825f83de8813348dc437b400eb743b3644715d29f35a7851c4`;package `5529339c7d876c6ed01cc89e2d2d19449a69f6b96e987e4368474d1903cc6189`;N-020 `8c5364401ec33ed25b335773e73e35174ebdd3c0d2af5d8f60006eec490406bc`;parity ledger `06b7b1daccdf55989e580fc1f97867a1c7e66142084d1f659db6ccf4927c183d`;release evidence `fe80fada4b0fb6e4d507750ba866c0a8d76b522bcc6c830bf97b834c2913a2b4`。 - `docs/status/M11-07.md`、N-020、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;M11 更新为 `7/14`。不把 M11-08 unsupported graph preservation、通用 WebGPU、HDR、 资源/分支 compositor 或服务端执行提前声明。下一领取点继续只读取机器队列最新 `nextTask`。 M11-08 实际验证(2026-08-17 America/New_York) - 领取 M11-08 后复核发现:Main reader 已保留 Unsupported Glare,capability gate 也返回 `COMPOSITOR_NODE_UNSUPPORTED`,但 CPU executor 会忽略未连接到 Composite 的 Unsupported 节点继续出图,cached 入口还可能在执行 gate 前命中旧结果。现已将排序/去重的完整 graph Unsupported 预检放到 CPU 求值和 cache lookup 之前,两条入口都 fail-closed。 - 专项 unit 证明 Unsupported 失败发生在 cancellation callback/像素分配之前,并预置同 key cache 后确认仍被阻断;输入 graph 深比较不变。真实 Blender 5.2 `compositor_scene.blend` 经 Main/WASM reader 后,Glare name、`UNSUPPORTED` type、`CompositorNodeGlare`、完整 graph JSON 和 Main revision 在 gate/CPU/cached 三次阻断前后均不变。 - `WEB_TEST_PORT=5565 npm --prefix web run test:compositor-unsupported-gate`:unit `2/2`、 native Main reader 通过、Chromium `1/1`。`WEB_TEST_PORT=5566 npm --prefix web run test:e2e -- --grep "N-020"`:支持图 CPU 执行与真实 Unsupported Main graph 阻断 `2/2`。 - 第一次新增 unit 全量为 `172/173`:cached API 是 async,但测试误用同步 `assert.throws`,实际 rejection code 已是预期值但落在测试结束后。改为 `await assert.rejects` 后专项与全量从头 重跑,最终 Node `173/173`;该首次失败不计完成证据。 - 回归:typecheck、lint、production build(75 modules)、status consistency(12 parity blocked、0 release blocked、17 evidence、0 missing)、release evidence(READY)和 `git diff --check` 全部通过;冻结 V1 acceptance 未加入 post-V1 M11-08 专项。 - M11-08 hashes:compositor protocol `4a977cf9e39be1aa75ff14244660589a556039a05550a029ff2c0628a9357b6f`;unit `ab87a04f15f408a2f605b35bc72e67537f2954bee3543ea767f9b2ac04ffdf84`;Chromium spec `c5e4097afb010235f6a245fd8fbe92b5d50eed5ff752ac802fd031f3ffc3adbd`;N-020 smoke `c525c50eb09e3307675d92c59b76b466fba1d736ea2f2ec486ca5467e2777bc6`;golden `6a29952726ff883933d42f069be9591bce7499029ffd1abde17dac21adce831b`;package `fddbbf2158b39cafae0bc5fdec02e5b43737278dce52a5a04e25082802926051`;M11-08 status `60f5b83aecff41cc1d54e5e8e9089a2ec1dac96ef9a0f47d1f65d0a148e0dfa7`;N-020 `ff0d330abda09f83993ad4669c89ca62cd83eab6170a2778390f552f58b0978e`;parity ledger `5ea3e379b1ff48659e487ccd65980929cd673c7efa0cae96a2cccc2d44351d17`;release evidence `c43b4d2779956494eb0ebc0b68f91b8b60c5265c977de4c0b85d239f1520819b`。 - `docs/status/M11-08.md`、N-020、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;M11 更新为 `8/14`。通用 WebGPU、资源/分支节点、HDR/色彩管理、服务端 Compositor 与 M11-09 media codec probe 均未提前声明。下一领取点继续只读取机器队列最新 `nextTask`。 M11-10 实际验证(2026-08-17 America/New_York) - 领取 M11-10:新增 schema 1 `SequencerMediaCacheManifestIR`。cache identity 对完整 MOVIE source family/MIME/byte length/SHA-256、source-bound READY decode receipt、规范化 RGBA8 profile 和 source frame 做确定性 SHA-256;`decoded` 字段按 family 显式排序,JSON 属性顺序 不影响 identity。proxy payload 另绑定 byte length/SHA-256。 - 生产 `SequencerMediaProxyCache` 在任何 HTMLMedia decode 前复算 source bytes hash 并检查 receipt/source gate;只生成初始 decoded frame 的 SRGB8/STRAIGHT RGBA8 proxy,不提前声明 M11-11 精确 seek/revision gate。profile 不得超过实际 decoded dimensions,单帧和总 LRU budget 上限均为 64 MiB。 - `WEB_TEST_PORT=5573 npm --prefix web run test:sequencer-media-cache`:unit `3/3`、Chromium `1/1`。真实 16x16 H.264 fixture 生成 8x8/256-byte proxy,identity 固定为 `68a3af14865841e81f69bd75f2605461de4819fe025d158ac3723fa0cdf31525`;一帧预算下 frame 1 确定性淘汰 frame 0,`clear()` 释放 256 bytes 后 entries/bytes 均为 0。 - Chromium 将 proxy payload 与 manifest 分别通过 Storage Worker 写入 content-addressed OPFS/IndexedDB asset,终止 writer 后由新 Storage Worker 读取并按当前 runtime receipt 复验。 source drift、READY receipt metadata drift、payload mutation 和 bad source bytes 分别返回 `SEQUENCER_CACHE_SOURCE_MISMATCH`、`SEQUENCER_CACHE_CAPABILITY_MISMATCH` 或 `SEQUENCER_CACHE_HASH_MISMATCH`。 - 两次未计入完成的首轮问题均只在测试:unit 首轮错误地把恰好 64 MiB 当作超限,修正为 64 MiB 加一行后通过;Chromium 首轮在调用 `clear()` 后才采集 `statsBeforeClear`,调整采样 顺序后端口 5572/5573 均从头通过。 - 回归:M11-09 codec probe unit `3/3` + Chromium `1/1`;100 万帧 long-media `1/1`, 10,001 strips/11,914 references、71 次 LRU 淘汰、双 Worker 重开和固定 session hash 通过; Sequencer Main reader 通过;全量 Node `179/179`;typecheck、lint、production build(75 modules)、status consistency(12 parity blocked、0 release blocked、17 evidence、0 missing)、 release evidence(READY)和 `git diff --check` 全部通过。 - M11-10 hashes:protocol `1dd5ee8cade2642723bac6f0c8e34d09cf178d000beba6eb63626284ee35fd5e`;browser adapter `57070b1a42129afdfb8121ec11a48b0792b3de9d84f7e8a78017c7d6e12343aa`;app exports `8ca82257c758580f5fe91a3a5cd21f8ae9e9ce10f9fa71fcd7cf1f30e0b6367b`;unit `f4cc1171dd6875bf079e242beed846409a1d1f53b9497882aa475bd2773b43c7`;Chromium spec `6d9d26e3639a74b173f77ec5d67e53e5ec42b88dd6e34bda54c8168b8251423e`;golden `39a71f8d97f0045da6ec913b6a0231ac3363f67a420eea5ab3fabaa8f1d47c33`;package `2c7fb9f8657155088e4a080443b8a0ba9c13aae9f46f1807ff3b8820640c44c4`;M11-10 status `0569c1881a74522ae7fd83e8d9e6b2f21e6e8b0b507ca1569c7b1a9a2245a02d`;parity ledger `b41f56a687bb95ca584a263ac7fc42111930fc63bc6ee780ef11c2bf3056aeb1`;release evidence `8cb240e06078e5ce49a345b4ea68b1d9eb543040acd2da5caef0fe4bc6a56fca`。 - `docs/status/M11-10.md`、N-021、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;M11 更新为 `10/14`,machine slice 计数为 188 completed/58 blocked。精确 seek/scrub revision gate、多帧 proxy、waveform、A/V sync、设备恢复和最终编码均未提前声明。下一领取点 继续只读取机器队列最新 `nextTask`,本文不缓存任务名称。 M11-11 实际验证(2026-08-17 America/New_York) - 领取 M11-11:新增 schema 1 `SequencerMediaRevisionRequestIR/ResultIR/StateIR`,SEEK、SCRUB、 DECODE 三类操作共享 timeline ID/revision 与单调 request revision;completed result 必须逐字段 回显 request identity,并增加有界 source frame 与 payload SHA-256。未知字段、非法 operation、 小数 revision 和非法 hash 在 revision gate 前拒绝。 - 生产 `SequencerMediaRevisionGate` 的每次 `begin` 先推进 request revision;timeline replacement 再推进一次 revision token 以使全部 pending request 失效,同 timeline revision 不允许倒退或 重复。`resolve` 只有在纯 gate 返回 `PUBLISH` 后才调用 callback,因此 stale result 不会更新 visible frame 或写 decode cache。 - `WEB_TEST_PORT=5576 npm --prefix web run test:sequencer-media-revision` 首次完整运行即通过: unit `4/4`、Chromium `1/1`。浏览器让 SEEK@1 晚于 SCRUB@2 返回,只有 SCRUB 发布;真实 H.264 DECODE@3 在 timeline 7->8 换代后完成并被阻断;当前 DECODE@5 发布并成为唯一 cache write; requestId 伪造的 SEEK@6 同样为 `STALE/REVISION_CONFLICT`。 - machine golden 固定五项决策和副作用:`SCRUB@2 PUBLISH`、`SEEK@1 STALE`、 `DECODE@3 STALE`、`DECODE@5 PUBLISH`、`SEEK@6 STALE`;published 仅 `[SCRUB@2,DECODE@5]`,cacheWrites 仅 `[DECODE@5]`。该任务关闭的是结果发布竞态门,不把 synthetic SEEK/SCRUB completion 扩写为帧精确 WebCodecs seek。 - 回归:M11-10 unit `3/3` + Chromium `1/1`;M11-09 unit `3/3` + Chromium `1/1`;100 万帧 long-media `1/1`;全量 Node `183/183`;typecheck、lint、production build(75 modules)、 status consistency(12 parity blocked、0 release blocked、17 evidence、0 missing)、release evidence(READY)和 `git diff --check` 全部通过。 - M11-11 hashes:protocol `326f1525f50af3b2c4132ff58508ed6174ba3aa4a5075b2a6660e549c280826a`;production controller `29a44404bb28e46d67439eec0622a69ce4cd7264ce45da77a3f320c8687b7006`;app exports `be2eca8482a60e437878b99f69d3178f47fee61618886d141760320e3a3ed1e1`;unit `2099f738120897dfdfbb8662741831774b5f9150d51924dfa7832907177de5e7`;Chromium spec `e47f105360ce0e2d4d561d3cf790ceec9f41dd6bac7361965914ada307db843c`;golden `672b4fde6e27f8b15cd51d839cacb5efb128c0d0f4c7f6aa4e184c713f9b45e5`;package `5d17b17d67ee587191552c3dfe226cd8f2e5a872791224d8e6c22aafa1177ebe`;M11-11 status `bc246287b4a97735c9e19642029257ff83498c262490c289ea6791bdec0c038b`;parity ledger `e5d5078364184def026573cb0645b566770dc03412246de27fc493971ddcdba0`;release evidence `81ac36f001f09567fe3f837ed31f9b0c601939962162fbdfb192494a1ac89d77`。 - `docs/status/M11-11.md`、N-021、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;M11 更新为 `11/14`,machine slice 计数为 189 completed/58 blocked。帧精确 WebCodecs seek、多帧 proxy、最终编码、音频设备恢复和跨域 fault lifecycle 均未提前声明。 下一领取点继续只读取机器队列最新 `nextTask`,本文不缓存任务名称。 M11-12 实际验证(2026-08-17 America/New_York) - 领取 M11-12:新增 schema 1 `SequencerFinalExportRequestIR/RouteIR`,将 Main timeline ID/revision、source `.blend` SHA-256、帧范围/有理帧率、分辨率和声明的 container/video/audio codec 绑定为 settings/request 两级 SHA-256。帧范围与 Blender/server render 合同一致支持 -1,000,000..1,000,000,但总帧数最多 1,000,000;非法组合、未知字段和超预算输入在路由前拒绝。 - 生产路由唯一结果为 `SERVER_EXPORT`。endpoint 缺失返回 `BLOCKED/SEQUENCER_EXPORT_SERVER_UNAVAILABLE`;endpoint 存在只返回 `SERVER_EXPORT_REQUIRED`。浏览器 `VideoEncoder` 仅记录探测事实,存在与否都不能改变 route, `localEncoding` 始终为 `BLOCKED`;真实 server encode、上传/进度/取消、混音和输出验证未提前声明。 - `WEB_TEST_PORT=5579 npm --prefix web run test:sequencer-final-export` 首次完整运行通过:unit `4/4`、Chromium `1/1`。浏览器通过 WebEngine Main 打开真实 Blender 5.2 `sequencer_scene.blend`,使用 timeline `sequencer:scene:SequencerScene` revision 1、frames 1..250、24000/1001 FPS 建立请求;无 server、有 server/无 encoder、有 server/注入 encoder 和实际 Chromium scope 四种路径均保持本地编码阻断。 - machine golden 固定 source blend `5f5212487bb6b5df62b5ca915c75133f1ca45678614712ea4c7d902d823cd90c`、settings `01e39d1fdd88c75aecad7bc48a2b756bbcd645929963528b42ceb180b51e5566` 和 request `20d3a9e333804e014a993a9892a557842293fc44902229dd6eb65661f0691cfc`。 - 回归:M11-09 unit `3/3` + Chromium `1/1`;M11-10 unit `3/3` + Chromium `1/1`;M11-11 unit `4/4` + Chromium `1/1`;100 万帧 long-media `1/1`;Sequencer Main reader;全量 Node `187/187`;typecheck、lint、production build(75 modules)、status consistency(12 parity blocked、0 release blocked、17 evidence、0 missing)、release evidence(READY)和 `git diff --check` 全部通过。 - M11-12 hashes:protocol `559516163ce9a9c60917033455c71a1ae6be2f34666371f12723a056ddfdb3dd`;browser adapter `f9f193eb71afa48a23b4eb618cd98b5c0064c59943b3652fb6a601b545ac175c`;app exports `d30783528fabaaefe8835998e11d75da357d265ee06db67713e57e4b85b58d7d`;error contract `747894b216db59c753b24ce85eb946925e64340f63684311e5d9628c9a6a9c8e`;unit `6f5030852e89160fd898b2aff4dc9911963342bd6c2301a2c0e8a3d518ddbcbd`;Chromium spec `d8cba79c9a330c1e5c777c8f0ed08362b29f50702c31d8229fd65f4304bce363`;golden `c0061f82ef156e53ad4dfc6aedf7c6a8f53e616d8d9fa1435fd9491ba3d07e01`;package `83ee5bfa50a0e5b742048d4563ae815171232a121cf3df4a1e813f21313a6509`;M11-12 status `fc849c33261969db9ea32e7c55ffc713e0e715c62a19532a8c9f42dc12c1fb96`;N-021 `5acf3e554512ae715dd887deb039637179b51b6ee64442d74a1f7c8e0ce5a04f`;parity ledger `7f548c66ca871bca059deb9553ee50ac9bd9d3909f1e9be9cce004c7b938154e`;release evidence `9cb2a4b8f315c0e1d2baa5ed5899ea2241d4f03d43188709b2e9d904e96dfdf0`。 - `docs/status/M11-12.md`、N-021、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;M11 更新为 `12/14`,machine slice 计数为 190 completed/58 blocked。M11-13 音频 context/device 恢复和 M11-14 跨域 fault lifecycle 均未提前声明。下一领取点继续只读取机器 队列最新 `nextTask`,本文不缓存任务名称。 M11-13 实际验证(2026-08-17 America/New_York) - 领取 M11-13:新增 schema 1 `SequencerAudioSessionReportIR`,将 context 的 `UNAVAILABLE/SUSPENDED/RUNNING/CLOSED` 与 output 的 `BLOCKED/SILENT/ENABLED` 分离;每个 initialize/resume/suspend/mute/recover/close 操作推进单调 revision,并绑定 muted、有效 gain 和稳定 issue code。矛盾状态(例如 suspended/muted 却 ENABLED)在协议层拒绝。 - 生产 `SequencerAudioSession` 独占一个 `AudioContext` 和 master `GainNode`。mute 将 gain 设为 0,unmute 恢复配置的 0.75;resume/suspend 必须观察到真实目标 state 才返回成功。close 先归零、 disconnect,再关闭 context 并丢弃引用。缺 API/构造失败、resume failure 和 suspend failure 分别保持静音并返回稳定结构化 code,不把 API 存在当作设备 READY。 - `WEB_TEST_PORT=5586 npm --prefix web run test:sequencer-audio-recovery` 首次完整运行通过:unit `3/3`、Chromium `1/1`。浏览器在真实 click handler 内创建原生 `AudioContext`,依次通过 suspend、mute、muted resume、unmute、二次 suspend/resume 和 close;machine golden 序列中 muted resume 为 `RUNNING/SILENT/gain=0`,unmute 为 `RUNNING/ENABLED/gain=0.75`,close 为 `CLOSED/SILENT/gain=0`。显式缺设备 scope 返回 `UNAVAILABLE/BLOCKED/SEQUENCER_AUDIO_DEVICE_UNAVAILABLE`。 - 回归:M11-09 unit `3/3` + Chromium `1/1`;M11-10 unit `3/3` + Chromium `1/1`;M11-11 unit `4/4` + Chromium `1/1`;M11-12 unit `4/4` + Chromium `1/1`;100 万帧 long-media `1/1`;Sequencer Main reader;全量 Node `190/190`;typecheck、lint、production build(75 modules)、status consistency(12 parity blocked、0 release blocked、17 evidence、0 missing)、 release evidence(READY)和 `git diff --check` 全部通过。 - M11-13 hashes:protocol `0b1b75c7630b599723914bbced9ee0a107bd8c0ac4382ced1f1c5114dac8fd01`;production controller `c09914d2581ee454e042ed6a9ef5b8c0f6f7b0688eadb1deff45163263742109`;app exports `e630f647ddd3680a04e07ce7388cf03f54268d4e2d839aa5991cb9ceb6a53bda`;error contract `6589f712058a39a2177cb174cc355c01777a549d254c4b9eac2301a344c619f2`;unit `1a888d1b19a3d12091e6edd05287a5bcc19912415cf7f2ed73a028d12846a298`;Chromium spec `1b94ea07ab5fafb0b06fbd73742c77d6b69d745a546fc60def85857844afc719`;golden `584aea46687fd5cec8d89e8fac51314acc9a8d05af2a8d762e8d6a74483e0940`;package `8d87390f9b1b7382bf9c0ba189f7a9d95daa3ee15d1d422a8d856fa4eb6d3cca`;M11-13 status `51b28251b41468450553699c1d6766343c6ea286b97cab078f27eeb7936ef500`;N-021 `e9b9b64cc9521acf51c59b3051996c12644fe47a80c4b89a24e1e68dfed6f66c`;parity ledger `0a9b4c1026c42b5f77869f222b1531601ed229184a1d1737e74047c7b3406730`;release evidence `c6da09f4c7c584d7f0139c324fd3e80f33a33a28d866d6c7f8dadf9f7507076c`。 - `docs/status/M11-13.md`、N-021、主计划、项目状态、parity ledger/release evidence 和本文件 已同步;M11 更新为 `13/14`,machine slice 计数为 191 completed/58 blocked。waveform、A/V sync、实际多 strip 混音/设备选择和 M11-14 跨域 fault lifecycle 均未提前声明。下一领取点 继续只读取机器队列最新 `nextTask`,本文不缓存任务名称。