Advance Blender 5.2 web parity through M12-03D
This commit is contained in:
@@ -2,19 +2,23 @@
|
||||
|
||||
更新时间:2026-08-15
|
||||
|
||||
> 本文保留为 Blender 全产品覆盖检查表和 F00-F24 taxonomy 参考。M12-M23 的执行分类、
|
||||
> 原子任务、证据合同与发布门以 `BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` 为准;
|
||||
> 本文的 F 任务不能直接作为当前 `nextTask`,也不能独立改变机器状态。
|
||||
|
||||
## 1. 目标与事实边界
|
||||
|
||||
本文把“对标 Blender 全部功能”定义为:以仓库内 `blender-5.2.0` 的 RNA、operator、
|
||||
data-block、modifier、node、editor、文件格式和运行时后端为冻结基线,逐项给出
|
||||
`LOCAL_EXACT`、`LOCAL_BOUNDED`、`SERVER` 或 `EXCLUDED` 结论,并为结论保存可复验的正例、
|
||||
阻断例和数据保真证据。
|
||||
本文以仓库内 `blender-5.2.0` 的 RNA、operator、data-block、modifier、node、editor、
|
||||
文件格式和运行时后端为覆盖基线。本文原有 `LOCAL_EXACT/LOCAL_BOUNDED/SERVER/EXCLUDED` 是
|
||||
V1 盘点术语;完整对标结论必须按新计划转换为 `LOCAL_EXACT/LOCAL_EQUIVALENT/SERVER_EXACT`
|
||||
和独立 `parityStatus`,并保存可复验的正例、阻断例和数据保真证据。
|
||||
|
||||
当前 `Web Blender Modeler V1` 已达到其有界发布范围,但不等于完整 Blender。机器账本中
|
||||
N-015 至 N-026 的 12 个 family 全部仍为 `parityStatus=BLOCKED`。因此以下任务默认均为未完成;
|
||||
只有 `docs/status/parity-ledger.json` 和对应专项证据同时更新后才允许改变状态。
|
||||
|
||||
短周期唯一领取顺序仍以 `docs/CURRENT_EXECUTION_PLAN.md` 为准。本文负责完整产品范围和细粒度
|
||||
工作包,不取代当前执行队列。
|
||||
短周期唯一领取顺序仍以 `docs/CURRENT_EXECUTION_PLAN.md` 为准。本文负责验证新计划没有遗漏
|
||||
产品域;与新计划冲突时按新计划解释,不取代当前执行队列或长期实施事实源。
|
||||
|
||||
## 2. 原子任务完成定义
|
||||
|
||||
@@ -481,7 +485,8 @@ N-015 至 N-026 的 12 个 family 全部仍为 `parityStatus=BLOCKED`。因此
|
||||
- [ ] `F23-09` 完成 user preferences schema、migration 和项目无关 persistence。
|
||||
- [ ] `F23-10` 完成 locale 切换、数字/日期格式和翻译 fallback。
|
||||
- [ ] `F23-11` 完成 theme、font scale、reduced motion 和高对比偏好。
|
||||
- [ ] `F23-12` native window/file watcher/CUDA/Metal/HIP/OptiX 明确 EXCLUDED。
|
||||
- [ ] `F23-12` native window/file watcher/CUDA/Metal/HIP/OptiX 实现细节明确不复制,其用户能力
|
||||
按新计划映射到 platform-equivalent 或 server exact 路径。
|
||||
- [ ] `F23-13` 每个新增浏览器加入 quick/P0/full 三层 CI。
|
||||
- [ ] `F23-14` 1280x720、1440x900、4K 和窄屏无重叠截图门。
|
||||
|
||||
@@ -501,18 +506,22 @@ N-015 至 N-026 的 12 个 family 全部仍为 `parityStatus=BLOCKED`。因此
|
||||
- [ ] `F24-12` CI 报告绑定 commit、lockfile、inventory、ledger、engine、archive hash。
|
||||
- [ ] `F24-13` binary/source archive 在两个空临时目录独立复验。
|
||||
- [ ] `F24-14` 完成 SBOM、license、source offer 和供应链审计。
|
||||
- [ ] `F24-15` 每个 parity ID 都有 LOCAL 正例、SERVER 闭环或 EXCLUDED 保真证据。
|
||||
- [ ] `F24-15` 每个 parity ID 都有 LOCAL_EXACT、LOCAL_EQUIVALENT 或 SERVER_EXACT 完整证据。
|
||||
- [ ] `F24-16` inventory 未分类、隐式 loss、proxy-success 三项计数均为 0。
|
||||
- [ ] `F24-17` 独立机器复验全部构件和关键证据 hash。
|
||||
- [ ] `F24-18` 发布说明逐项列出支持、受限、server 和 excluded 能力。
|
||||
- [ ] `F24-18` 发布说明逐项列出 local exact、platform-equivalent 和 server exact 能力。
|
||||
|
||||
里程碑 F24:不能由聚合 release gate 反推 family 完成。只有 inventory 的每个单项都达到自身
|
||||
退出条件,N-015 至 N-026 才能逐项从 `BLOCKED` 改为 `COMPLETE`。
|
||||
退出条件,全部生成的 owner family 才能逐项从 `BLOCKED` 改为 `COMPLETE`。
|
||||
|
||||
## 29. 当前领取点
|
||||
|
||||
截至 2026-08-15,M6 已完成 35/71:single/pthread 选择与回退、真实 HTTP MIME/range、
|
||||
releaseId/hash 升级负例和缓存合同均有专项证据。HTML、manifest、stable engine 未变化时均返回
|
||||
`304`,换代后均返回 `200` 且 ETag 变化;production build 的 1 个入口 JS、1 个 CSS、3 个
|
||||
Worker 均使用 8 位内容 hash 文件名并返回 `immutable`。当前唯一下一任务为 `M6-09A`:从
|
||||
binary archive 解包后使用合同服务器启动,不读取工作区文件。
|
||||
截至 2026-08-17,M6-M11 已按当前计划完成,M11 最终以 Render、Compositor、Media 三域故障
|
||||
生命周期专项门收口,M12-01A-I 已完成 catalog schema/migration;M12-02A-H 又完成 PreviewImage
|
||||
inventory、identity、decode budget、OPFS commit、dedupe、quarantine、project-scoped reference GC
|
||||
与 desktop/browser 双显示路径像素闭环。本文的 F00-F24
|
||||
条目只作为覆盖检查表,不能直接领取;M12-03A 又冻结 Append/Link/Override 的 36 类 root 与
|
||||
实际 ID pointer dependency closure;M12-03B 固定 source/owner/read-only/invalidation identity;
|
||||
M12-03C 冻结 Blender 5.2 单 Object append 的 Object/Mesh/Material/Image local stable mapping;
|
||||
M12-03D 已通过 WASM Main 单 transaction 创建同一 local dependency closure。当前唯一下一任务为
|
||||
`BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` 中的 `M12-03E`。
|
||||
|
||||
615
docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md
Normal file
615
docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md
Normal file
@@ -0,0 +1,615 @@
|
||||
# Blender 5.2 完整 Web 对标实施计划
|
||||
|
||||
更新时间:2026-08-17
|
||||
|
||||
本文是 M12 及以后完整 Blender 5.2 Web 迁移的长期规范事实源,负责执行分类、原子任务、
|
||||
依赖、证据和完整发布门。它不覆盖 `WEB_BLENDER_MODELER_V1_SCOPE.md` 的 V1 产品契约,也不
|
||||
改写 V1 已冻结的 `LOCAL_EXACT/LOCAL_BOUNDED/SERVER/EXCLUDED` 发布分类。
|
||||
|
||||
文档职责固定如下:
|
||||
|
||||
| 事实 | 权威来源 |
|
||||
| --- | --- |
|
||||
| V1 承诺、非目标和发布标准 | `WEB_BLENDER_MODELER_V1_SCOPE.md` |
|
||||
| 当前唯一可领取任务 | `CURRENT_EXECUTION_PLAN.md` 与机器 `nextTask` |
|
||||
| M12-M23 完整对标规则和长期任务 | 本文 |
|
||||
| 当前实现事实和 family/slice 状态 | `status/parity-ledger.json` 与对应 evidence |
|
||||
| Blender 全域功能说明和覆盖参考 | `BLENDER_5_2_WEB_FEATURE_PARITY.md`、`BLENDER_5_2_FULL_PARITY_WBS.md` |
|
||||
|
||||
描述与机器证据冲突时不得用文字把失败改成成功。M12-01A-I 已收口,M12-02A-G preview
|
||||
inventory/identity/decode budget/OPFS commit/dedupe/quarantine/GC 已完成且未改变 parity 状态;
|
||||
desktop/browser 主线程与 Offscreen preview 像素闭环也已完成;Append/Link/Override 数据块与
|
||||
依赖闭包 inventory、source/owner/read-only/invalidation 合同、desktop 单 Object append fixture
|
||||
及 WASM Main 单 transaction append 已完成,当前唯一 `nextTask` 为 `M12-03E`。
|
||||
|
||||
## 1. 目标与边界
|
||||
|
||||
目标不是制作一个外观类似 Blender 的网页,而是让用户从浏览器完成 Blender 5.2 的可观察
|
||||
功能,并且每项声明都能用真实 Blender 5.2 执行结果复核。浏览器本地不适合承载的 Cycles、
|
||||
完整 Python、部分模拟和硬件后端,必须由隔离的 Blender 5.2 server job 执行;Three.js、
|
||||
WebGPU 或 JavaScript 近似结果不能冒充 Blender 结果。
|
||||
|
||||
“完整 Web Blender”只在以下条件同时满足后成立:
|
||||
|
||||
1. Blender 5.2 的 data-block、operator、node、modifier、editor workflow、import/export 和
|
||||
render/compute family 全部进入机器清单。
|
||||
2. 每个用户可观察能力被标为 `LOCAL_EXACT`、`LOCAL_EQUIVALENT` 或 `SERVER_EXACT`,且有成功
|
||||
证据;`BLOCKED`、`UNINVENTORIED` 或未声明项数量必须为零。
|
||||
3. `LOCAL_EXACT` 使用同一 fixture 比较 Blender desktop 与 WASM/Main 的结构、数值或像素。
|
||||
4. `LOCAL_EQUIVALENT` 只用于浏览器交互外壳;最终 Main、Depsgraph、保存文件和导出语义仍须
|
||||
与 Blender 一致。
|
||||
5. `SERVER_EXACT` 必须真的启动锁定版本 Blender,验证提交、进度、取消、资源隔离、结果 hash
|
||||
和项目绑定,不允许只返回“应走服务端”。
|
||||
6. 完整项目通过保存、关闭、Worker/页面重启、重新打开和 Blender desktop 再打开;未知数据
|
||||
不丢失,不支持的写操作不污染原文件。
|
||||
7. Chromium、Firefox、WebKit 的支持声明分别由自己的 quick/P0/full 证据决定,不互相推断。
|
||||
|
||||
Native window、CUDA/Metal/HIP/OptiX 实现细节不需要在浏览器复制,但它们提供的用户能力必须
|
||||
由 WebGPU、CPU 或 `SERVER_EXACT` 路径覆盖。若没有等价执行路径,就保持 `BLOCKED`,项目不得
|
||||
使用“完整对标”表述。
|
||||
|
||||
### 1.1 完整对标状态不是 V1 发布分类
|
||||
|
||||
全量盘点为每个 `parityId` 使用两个独立轴,禁止把 V1 family 的 `releaseClass` 直接升级为
|
||||
全量完成:
|
||||
|
||||
| 轴 | 允许值 | 含义 |
|
||||
| --- | --- | --- |
|
||||
| `implementationClass` | `LOCAL_EXACT` | Blender 语义在浏览器 Main/WASM 本地执行并经同 fixture 对标 |
|
||||
| `implementationClass` | `LOCAL_EQUIVALENT` | 仅浏览器平台或交互外壳不同,最终 Main、文件、导出和可见语义精确 |
|
||||
| `implementationClass` | `SERVER_EXACT` | 锁定版本的真实 Blender server 执行权威求值,浏览器负责提交和消费 |
|
||||
| `parityStatus` | `UNINVENTORIED` | Blender 基线项尚未进入机器清单 |
|
||||
| `parityStatus` | `BLOCKED` | 已盘点但缺实现、证据或存在超阈值差异 |
|
||||
| `parityStatus` | `IN_PROGRESS` | 唯一原子任务正在实现;仍按未完成计 |
|
||||
| `parityStatus` | `VERIFIED` | 对应 class 的全部强制证据通过 |
|
||||
|
||||
`LOCAL_EQUIVALENT` 不能用于 modifier、node、solver、render、import/export 或其他计算结果的
|
||||
近似实现。它只适用于 native window、文件选择器、菜单布局、输入映射等浏览器平台差异;
|
||||
若操作后的 Main 或文件语义不同,状态只能是 `BLOCKED`。
|
||||
|
||||
### 1.2 本地与 Blender server 路由规则
|
||||
|
||||
执行 class 在写实现前确定,不能根据某次运行是否方便临时切换:
|
||||
|
||||
| 能力特征 | 必选 class | 最低证据 |
|
||||
| --- | --- | --- |
|
||||
| Main/ID 读取写入、selection/context、undo/redo、增量编辑、保存恢复 | `LOCAL_EXACT` | desktop/WASM 同 fixture、单事务、保存重开、Chromium 用户路径 |
|
||||
| native window、系统文件对话框、菜单/快捷键表现等平台外壳 | `LOCAL_EQUIVALENT` | desktop 最终状态、Web Main/文件最终状态、可访问交互和恢复一致 |
|
||||
| WASM 已包含所需 Blender evaluator,且在声明预算内可确定性完成 | `LOCAL_EXACT` | desktop/WASM 语义或像素阈值、浏览器实际执行、故障恢复 |
|
||||
| Cycles、复杂 Eevee、Blender 完整 Compositor、重模拟/烘焙、tracking solve | `SERVER_EXACT`,除非该项另有完整本地证据 | 真实隔离 Blender job、版本/输入/设置/输出绑定、取消和恢复 |
|
||||
| 任意 Python/add-on、需原生库的 USD/Alembic/codec 或 OS/GPU 后端能力 | `SERVER_EXACT` | 权限策略、无隐式网络、资源限制、真实执行和结果复验 |
|
||||
| Three.js/WebGPU 预览、summary、proxy、capability probe、仅路由结果 | 不能单独领取成功 class | 只能作为已分类能力的中间证据;权威结果缺失时保持 `BLOCKED` |
|
||||
|
||||
同一 workflow 可以由多个 `parityId` 组成,例如本地编辑后提交服务端 Cycles 渲染;每个 ID
|
||||
只能有一个权威执行 class。server 路径必须向用户明确上传内容、版本、预算、进度和取消状态;
|
||||
未配置 server、用户不同意上传或 server receipt 失效时必须 fail-closed,不能回退到近似结果。
|
||||
|
||||
### 1.3 阻止“完整对标”声明的差异
|
||||
|
||||
以下任一项存在时,产品、README、发布说明和 UI 都不得使用“完整 Web Blender”或等价表述:
|
||||
|
||||
- inventory 有未映射、重复映射、版本漂移或 `UNINVENTORIED` 条目;
|
||||
- 任一 `parityId` 为 `BLOCKED/IN_PROGRESS`,或只有 summary/proxy/probe/route/mock 证据;
|
||||
- 计算结果超过已批准的数值、拓扑、时序、音频或像素阈值;
|
||||
- 不支持或未知数据在打开、编辑、保存、导出、append/link/override 中丢失或被重写;
|
||||
- writer 缺 undo/redo、保存重开、desktop 再打开,或失败路径改变 Main/项目 revision;
|
||||
- server 能力没有真实 Blender process、隔离、取消、预算、结果 hash 和项目绑定证据;
|
||||
- 用户可进入没有 capability gate 的 UI,或本地近似被显示为 Blender 权威结果;
|
||||
- 已声明浏览器、设备档位、输入方式或离线/server 模式缺自己的通过证据;
|
||||
- clean build、依赖/SBOM/license、安全、性能、故障或独立机器复验未通过。
|
||||
|
||||
## 2. 当前基线
|
||||
|
||||
- 当前交付物是可审计的 Chromium `Web Blender Modeler V1`,不是完整 Blender。
|
||||
- M6 至 M11 已完成;M12-01A-I、M12-02A-G enabling tasks 与 M12-02H preview display
|
||||
parity slice 及 M12-03A-D library-operation inventory/identity/desktop fixture/WASM Main append
|
||||
已完成,当前唯一下一任务为 M12-03E。
|
||||
- N-015 至 N-026 的 V1 `releaseStatus` 为 `READY`,但 12 个 family 的全域
|
||||
`parityStatus` 仍全部为 `BLOCKED`。
|
||||
- 这 12 个 family 是当前 post-V1 账本范围,不覆盖完整 Blender inventory;不能把它们未来的
|
||||
聚合状态当作 Main、Mesh、Modifier 等全域完成证明。M15 必须生成完整 owner family 集合。
|
||||
- 当前完成项只证明已声明的有界切片;任何 summary、proxy、capability probe 或路由结果都不能
|
||||
自动升级为 Blender 功能完成。
|
||||
|
||||
## 3. 真实 Blender 对标流水线
|
||||
|
||||
### 3.1 固定运行时
|
||||
|
||||
- [ ] `FULL-PARITY-RUNTIME-01` 固定官方 Blender 5.2.0 LTS archive SHA-256。
|
||||
- [ ] `FULL-PARITY-RUNTIME-02` 记录 `blender --version`、build hash、平台、Python、USD、
|
||||
Alembic、OpenVDB、Cycles device inventory。
|
||||
- [ ] `FULL-PARITY-RUNTIME-03` desktop runner 拒绝版本或 build hash 漂移。
|
||||
- [ ] `FULL-PARITY-RUNTIME-04` WASM manifest 绑定 Blender source commit、Emscripten、CMake
|
||||
cache、JS/WASM SHA-256。
|
||||
- [ ] `FULL-PARITY-RUNTIME-05` server image 绑定 Blender binary、启动参数、依赖和 image digest。
|
||||
- [ ] `FULL-PARITY-RUNTIME-06` fixture generator 只能在临时目录写文件,运行后逐项 hash。
|
||||
- [ ] `FULL-PARITY-RUNTIME-07` 禁止从开发机未声明插件、偏好设置或环境变量读取能力。
|
||||
- [ ] `FULL-PARITY-RUNTIME-08` CI 在每次 runner 启动时执行 runtime preflight 并写机器报告。
|
||||
|
||||
### 3.2 每项能力的固定证据链
|
||||
|
||||
能力原子执行单元固定为一个 `parityId × 单一用户可观察行为 × implementationClass`,内部走完
|
||||
本节的完整证据链。纯 runtime、inventory、generator 或 schema 基建任务必须标记
|
||||
`enablingTask=true`,列出它解除的依赖,但自身不能把任何 `parityId` 改为 `VERIFIED`。
|
||||
|
||||
M12 的字母 ID 只有在单一性检查通过后才能进入 `nextTask`;任务文字中出现“每种/全部/逐项”
|
||||
时,先按稳定 `parityId` 增加后缀并拆成多个任务。M16-M22 的“差距清零”项只是波次容器,
|
||||
必须先由 M15 展开,不能直接勾选容器。
|
||||
|
||||
每个原子功能任务必须按以下顺序执行,任一步失败都不能领取下一功能:
|
||||
|
||||
- [ ] `PARITY-TEMPLATE-01` 从 Blender RNA/operator/node 清单选取一个最小行为。
|
||||
- [ ] `PARITY-TEMPLATE-02` 写 capability 条目、输入 schema、预算、稳定错误码和保存策略。
|
||||
- [ ] `PARITY-TEMPLATE-03` 写 Blender 5.2 Python fixture generator,不手工伪造期望 JSON。
|
||||
- [ ] `PARITY-TEMPLATE-04` desktop Blender 执行操作并导出 canonical semantic report。
|
||||
- [ ] `PARITY-TEMPLATE-05` desktop 保存 `.blend`,新 Blender 进程重开并再次导出报告。
|
||||
- [ ] `PARITY-TEMPLATE-06` WASM/Main 对同一输入执行同一行为并导出同结构报告。
|
||||
- [ ] `PARITY-TEMPLATE-07` 比较 stable ID、Main revision、数据值、依赖和错误语义。
|
||||
- [ ] `PARITY-TEMPLATE-08` 对 writer 验证一次 transaction、undo、redo、save/reopen。
|
||||
- [ ] `PARITY-TEMPLATE-09` Chromium 主线程和 Offscreen 只消费权威结果并验证可见输出。
|
||||
- [ ] `PARITY-TEMPLATE-10` 加入 unsupported、malformed、stale revision 和预算超限负例。
|
||||
- [ ] `PARITY-TEMPLATE-11` 加入取消、Worker restart、资源释放和小任务恢复。
|
||||
- [ ] `PARITY-TEMPLATE-12` 将 command、duration、stdout 摘要和构件 SHA-256 写入 evidence。
|
||||
- [ ] `PARITY-TEMPLATE-13` 更新 family status、机器 ledger、实施记录和用户可见限制。
|
||||
- [ ] `PARITY-TEMPLATE-14` 独立运行 `typecheck`、lint、unit、专项 E2E 和状态一致性门。
|
||||
|
||||
### 3.3 原子任务与 evidence 机器合同
|
||||
|
||||
每个原子任务进入队列前必须含以下字段;字段不得留空,确实不适用时写 `NOT_APPLICABLE` 和
|
||||
可校验理由,不能直接删除:
|
||||
|
||||
| 字段 | 必填内容 |
|
||||
| --- | --- |
|
||||
| identity | `taskId`、parent ID、`parityId`、`enablingTask`、Blender source anchor、owner、dependency IDs |
|
||||
| classification | `implementationClass`、`parityStatus`、用户可观察行为、非目标 |
|
||||
| fixture | generator command/hash、`.blend`/asset hash、输入预算、license/source |
|
||||
| desktop | Blender command、runtime/build hash、canonical report/hash、保存后新进程重开报告 |
|
||||
| wasm | build manifest、command、Main revision、semantic report/hash;server 项记录本地拒绝/提交门 |
|
||||
| browser | 浏览器/OS/GPU、主线程/Offscreen 适用性、Chromium 用户动作和可见结果 |
|
||||
| persistence | undo/redo、save/close/reopen、Worker/page restart、desktop reopen、unknown-data report |
|
||||
| faults | malformed、unsupported、stale、cancel、timeout、OOM/quota、crash/restart、resource-zero |
|
||||
| server | image/binary digest、policy、job/request/result ID、progress/cancel、resource receipt、output hash |
|
||||
| comparison | comparator version、阈值来源、实际 max/RMS/P95/hash、pass/fail |
|
||||
| provenance | commit、dirty flag、commands、exit code、duration、stdout/stderr 摘要、artifact hashes |
|
||||
|
||||
evidence 只接受一次从干净输入开始的完整成功运行。重试前的失败保留为诊断,不得拼接不同
|
||||
commit、runtime 或 fixture 的局部成功。`parityStatus=VERIFIED` 必须由状态校验器重新计算,
|
||||
不能由 Markdown checkbox 单独决定。
|
||||
|
||||
### 3.4 class 对应的强制执行矩阵
|
||||
|
||||
| 证据 | `LOCAL_EXACT` | `LOCAL_EQUIVALENT` | `SERVER_EXACT` |
|
||||
| --- | --- | --- | --- |
|
||||
| Blender desktop 同 fixture | 必须 | 必须,比较最终语义 | 必须,作为 job 结果基线 |
|
||||
| WASM/Main 实际执行 | 必须 | 必须完成最终 Main/保存语义 | 必须完成读取、校验、提交和结果绑定;权威求值不冒充本地 |
|
||||
| Chromium 实际用户路径 | 必须 | 必须 | 必须,含提交/进度/取消/取回 |
|
||||
| 主线程与 Offscreen | 有可见 viewport 输出时都必须 | 有 viewport 输出时都必须 | 浏览器消费可见结果时按适用路径必须 |
|
||||
| undo/redo/save/reopen | writer 必须 | 改 Main/项目时必须 | 本地准备和结果绑定改变项目时必须 |
|
||||
| Worker/page restart | 必须 | 必须 | 必须,且不得重复提交或绑定迟到结果 |
|
||||
| OOM/quota/cancel/crash 后小任务恢复 | 必须 | 必须 | 浏览器与 server 两侧都必须 |
|
||||
| 真实 Blender server | 禁止作为本地成功替代 | 禁止作为等价外壳成功替代 | 必须 |
|
||||
|
||||
Firefox/WebKit 不在每个早期原子任务的默认完成门中;M14 声明某浏览器支持后,该浏览器对
|
||||
所有已验证 `parityId` 的适用 browser evidence 立即成为强制项,不能由 Chromium 结果代替。
|
||||
|
||||
### 3.5 比较器
|
||||
|
||||
- [ ] `COMPARE-01` 整数、枚举、布尔、ID、拓扑计数和离散索引使用精确比较。
|
||||
- [ ] `COMPARE-02` Float32/Float64 分别记录 max、RMS、P95、NaN/Inf 和阈值来源。
|
||||
- [ ] `COMPARE-03` transform 同时比较 location/rotation/scale 和 world matrix,处理旋转表示等价。
|
||||
- [ ] `COMPARE-04` Mesh 比较 topology hash、position/normal/UV/color/weight 和 attribute domain。
|
||||
- [ ] `COMPARE-05` 动画逐关键帧和区间采样,比较 FCurve、pose matrix、constraint 和 evaluated mesh。
|
||||
- [ ] `COMPARE-06` 图结构比较 node type、socket、default、link、group boundary 和未知节点保留。
|
||||
- [ ] `COMPARE-07` 图像固定色彩空间/alpha,输出 MAE、RMS、P95、坏像素和前景 IoU。
|
||||
- [ ] `COMPARE-08` 音频先统一 sample rate/channel layout,再比较时长、峰值、RMS 和 sample drift。
|
||||
- [ ] `COMPARE-09` 视频比较帧时间戳、关键帧映射、RGBA frame hash、音视频同步和丢帧。
|
||||
- [ ] `COMPARE-10` simulation 比较 frame/source/settings/cache hash 与每帧 canonical state。
|
||||
- [ ] `COMPARE-11` import/export 输出 loss report,未知或不可逆语义禁止静默丢弃。
|
||||
- [ ] `COMPARE-12` UI workflow 比较最终 Main/selection/context,而不是像素位置模仿 desktop UI。
|
||||
|
||||
## 4. 里程碑依赖
|
||||
|
||||
```text
|
||||
M11-14 跨域故障闭环
|
||||
-> M12 Asset / Library / IO / Editors
|
||||
-> M13 Scripting / Security / Server isolation
|
||||
-> M14 Firefox / WebKit / Device input
|
||||
-> M15 全域自动盘点
|
||||
-> M16-M22 按机器差距逐 family 清零
|
||||
-> M23 完整 Web Blender 候选发布
|
||||
```
|
||||
|
||||
M12 至 M15 是当前确定队列。M16 至 M22 的具体领取顺序由 M15 生成的机器差距决定;文档中的
|
||||
顺序是依赖上限,不得用它跳过最新 `nextTask`。
|
||||
|
||||
## 5. M11-14 Render、Compositor、Media 故障收口
|
||||
|
||||
- [x] `M11-14A` schema 固定三域 cancellation code、budget code 和资源归零字段。
|
||||
- [x] `M11-14B` Render 使用真实 `.blend` 验证 open 取消不提交、Worker generation 2 重开、
|
||||
texture aggregate budget 不替换已加载资源、dispose 回执和非空 WebGL 恢复。
|
||||
- [x] `M11-14C` Compositor 使用真实 Main graph 验证周期取消、超尺寸分配前阻断、LRU clear、
|
||||
Worker 重开和 Float32 output hash 恢复。
|
||||
- [x] `M11-14D` Media 使用真实 H.264 验证 proxy decode 取消、cache budget、clear、会话重建和
|
||||
RGBA8 payload hash 恢复。
|
||||
- [x] `M11-14E` Blender 5.2 Eevee 与 Compositor desktop golden、协议负例和 Chromium 三域门
|
||||
由一个专项命令串联。
|
||||
|
||||
本节已由 `npm --prefix web run test:render-compositor-media-recovery`、`M11-14` status、专项
|
||||
evidence 和 family ledger 联合收口。M12-03D 完成后,当前唯一 `nextTask` 为 `M12-03E`。
|
||||
|
||||
## 6. M12 Asset、Library、IO 与 Editor
|
||||
|
||||
### M12.1 Catalog schema 与迁移
|
||||
|
||||
- [x] `M12-01A` 盘点 Blender 5.2 AssetMetaData、catalog、tag、author、license、description 字段;
|
||||
machine inventory 绑定 8 个源码 hash 和真实 Blender 5.2 RNA,覆盖 14 DNA/10 RNA/3 catalog
|
||||
字段并记录 7 个 Web v1 缺口。本项为 enabling task,不改变 parity slice。
|
||||
- [x] `M12-01B` 生成 desktop catalog v1 fixture 和 canonical JSON;锁定 Blender 5.2 生成
|
||||
3 条 CDF v1 catalog、3 类资产及完整 metadata,独立新进程重开后 canonical JSON 精确一致。
|
||||
- [x] `M12-01C` 定义 Web catalog schema、stable catalog/asset ID 和文本/条目预算;schema v2
|
||||
使用 Blender UUID/path 与 AssetWeakReference identity,全部文本预算按 UTF-8 字节执行。
|
||||
- [x] `M12-01D` 定义 schema v1→v2 前向迁移;revision、source/preview/library graph 全部保留,
|
||||
legacy catalog/asset ID 生成确定性 mapping 和 source/target hash report。
|
||||
- [x] `M12-01E` 定义新版数据由旧版读取时的只读/阻断策略;v2 对 v1 reader 只开放
|
||||
hash-bound metadata snapshot,catalog/asset/save 写入统一阻断,未来 schema 完全拒绝。
|
||||
- [x] `M12-01F` 重复 ID、循环父 catalog、超长文本和未知字段负例;9 类 v1/v2 负例均返回
|
||||
稳定 code,失败后原始小正例继续通过。
|
||||
- [x] `M12-01G` IndexedDB migration 失败保持旧 transaction 和旧索引;两个真实 abort 点重开后
|
||||
v1 index、无关 migration 行、数据库版本均不变,成功重试才原子提交 v2 index 与 receipt。
|
||||
- [x] `M12-01H` 页面/Worker 重启后 catalog 顺序和 asset identity 不变;初始页面、reload、两个
|
||||
顺序启动的独立 Worker 返回相同 catalog/asset order、weak-reference identity 和 manifest hash。
|
||||
- [x] `M12-01I` schema fixture、migration report 和 hash 写入 M12-01 evidence;聚合 checker
|
||||
递归核对 A-H 任务链、desktop/Web fixture、canonical 双 hash、runtime fault/restart artifact。
|
||||
|
||||
### M12.2 Preview 与 content-addressed asset
|
||||
|
||||
- [x] `M12-02A` 盘点 Blender preview image 尺寸、颜色空间和无 preview 状态;锁定 DNA/RNA、
|
||||
ICON/PREVIEW 双槽、RGBA8 premultiplied alpha、无颜色空间字段及 3 个 null preview runtime 状态。
|
||||
- [x] `M12-02B` 定义 preview source/content SHA-256、MIME、width/height 和生成器 identity;
|
||||
Blender 5.2 确定性重编码绑定 executable/script/settings,source/content 独立且像素 exact。
|
||||
- [x] `M12-02C` 解码前检查 MIME、像素、字节和压缩比预算;schema 1 在任何 decoder/
|
||||
decoded allocation 前完成 identity、16 MiB encoded bytes、SHA-256、PNG/WebP header、尺寸、
|
||||
16,777,216 像素、64 MiB RGBA8 和 100:1 compression ratio 门,8 类负例后小正例仍可恢复。
|
||||
- [x] `M12-02D` preview 写 OPFS 后才提交 catalog 引用;production coordinator 先写入并回读复验
|
||||
content-addressed payload,再以一次 revision/full-row guarded IndexedDB transaction 提交 v2
|
||||
preview reference 与 hash receipt;三处 fault 均不发布引用,重开后 revision 8/payload 复验通过。
|
||||
- [x] `M12-02E` 相同内容去重,不同 metadata 不覆盖 payload;两个不同 asset/identity 在 revision
|
||||
8/9 绑定同一 content hash,第二次真实 OPFS write 去重且目录只有一份 payload,两条完整
|
||||
non-preview metadata 不变,重开后 head/reference/hash 一致。
|
||||
- [x] `M12-02F` 损坏 preview 隔离且 asset metadata 仍可读取;同长度 hash drift 从 content-addressed
|
||||
namespace 移入已复验 quarantine 文件,catalog revision/reference/两条 metadata 均不变;页面重开
|
||||
从 hash-bound receipt 返回 `QUARANTINED` 和完整 asset metadata,不再发布 bytes。
|
||||
- [x] `M12-02G` 删除引用只回收无其他项目引用的 payload;同项目首删在仍有一个 reference 时
|
||||
RETAINED,末删才 COLLECTED;OPFS project namespace 使另一项目的同 hash payload/reference
|
||||
保持 READY,revision 11 重开后两条 metadata 不变。
|
||||
- [x] `M12-02H` desktop/browser preview 指标与主线程/Offscreen 显示通过;Blender 5.2
|
||||
确定性 RGBA8 reference 与两条 Canvas2D 路径逐字节一致,错误像素由同一指标门阻断。
|
||||
|
||||
### M12.3 Append、Link、Override 语义
|
||||
|
||||
- [x] `M12-03A` 分别盘点 append、link、library override 涉及的数据块和依赖闭包;冻结 36 类
|
||||
selectable root、2 类 append-only、direct/indirect/transitive/embedded/override dependency
|
||||
角色及 17 个 override RNA 字段。
|
||||
- [x] `M12-03B` 为三种操作定义 source library ID、owner、read-only 和 invalidation token;
|
||||
locator/hash 绑定 source,operation/root/owner/generation/revision/closure 共同绑定 token。
|
||||
- [x] `M12-03C` desktop append 单 Object fixture,记录依赖 material/mesh/image stable mapping;
|
||||
Blender 5.2 append 后 Object/Mesh/Material/Image 全部成为可写 local owner,保存重开后依赖图、
|
||||
几何、UV、材质槽和 packed image Float32 像素 hash 保持一致。
|
||||
- [x] `M12-03D` WASM Main append 以一次 transaction 创建本地 owner 数据;Worker 先校验 source
|
||||
hash、closure 和 revision,Blender Main 递归导入 Object/Mesh/Material/packed Image,四个 ID
|
||||
均验证为可写 local owner,并只推进一个 SceneIR revision。
|
||||
- [ ] `M12-03E` append undo/redo/save/reopen 与 desktop canonical report 一致。
|
||||
- [ ] `M12-03F` desktop link fixture 保留 source library 和只读 ownership。
|
||||
- [ ] `M12-03G` linked data writer 全部返回 `LINKED_DATA_MUTATION_BLOCKED`。
|
||||
- [ ] `M12-03H` library reload 只替换匹配 generation 的 linked snapshot。
|
||||
- [ ] `M12-03I` missing library 保留 placeholder 和原始 source,不删除引用。
|
||||
- [ ] `M12-03J` desktop override fixture 记录 reference、local owner 和 property override path。
|
||||
- [ ] `M12-03K` 首个 override writer 只开放一个已验证属性。
|
||||
- [ ] `M12-03L` override stale source/revision 在 Main commit 前阻断。
|
||||
- [ ] `M12-03M` dependency cycle、ID collision、跨库环和重复 reload 负例。
|
||||
- [ ] `M12-03N` append/link/override 各有独立 desktop/WASM/Chromium 命令。
|
||||
|
||||
### M12.4 Origin、路径与 archive
|
||||
|
||||
- [ ] `M12-04A` library source schema 只接受声明的 HTTPS origin、项目 asset 或用户选择文件。
|
||||
- [ ] `M12-04B` 规范化 POSIX/Windows separator、`.`、`..`、percent encoding 和 Unicode 名称。
|
||||
- [ ] `M12-04C` 拒绝绝对路径、UNC、drive path、NUL、控制字符和 origin 逃逸。
|
||||
- [ ] `M12-04D` 符号链接/hardlink entry 在写入前解析并限制在临时根。
|
||||
- [ ] `M12-04E` archive 先读取 central directory/manifest,不先解压 payload。
|
||||
- [ ] `M12-04F` 单 entry 字节、总字节、entry 数、目录深度和文件名长度预算。
|
||||
- [ ] `M12-04G` 压缩比、重叠 range、重复路径、文件/目录前缀冲突负例。
|
||||
- [ ] `M12-04H` 解压取消删除 staging,不修改已提交项目。
|
||||
- [ ] `M12-04I` quota/OOM 后释放临时文件并允许小 archive 恢复。
|
||||
- [ ] `M12-04J` 恶意 ZIP/TAR fixture 进入长期安全回归。
|
||||
|
||||
### M12.5 格式 capability matrix
|
||||
|
||||
- [ ] `M12-05A` 从 Blender 5.2 build/runtime 生成 glTF/GLB、OBJ、STL、PLY、USD、Alembic 清单。
|
||||
- [ ] `M12-05B` 每种格式分别声明 import/export、local/server、geometry/material/animation 支持。
|
||||
- [ ] `M12-05C` matrix 未声明组合在文件选择器和 operator search 中不可执行。
|
||||
- [ ] `M12-05D` 能力由 runtime receipt 决定,不按扩展名推断。
|
||||
- [ ] `M12-05E` 每个 receipt 绑定 source/settings/runtime hash。
|
||||
- [ ] `M12-05F` 伪造、过期或跨版本 receipt 在使用前拒绝。
|
||||
|
||||
### M12.6 GLB round-trip
|
||||
|
||||
- [ ] `M12-06A` desktop 生成 Mesh/PBR/UV/skin/animation GLB fixture 组。
|
||||
- [ ] `M12-06B` Web import 比较 topology、attributes、materials、nodes 和 animations。
|
||||
- [ ] `M12-06C` import 后保存 `.blend`、重开并比较 stable ID。
|
||||
- [ ] `M12-06D` Web export 生成 machine loss report。
|
||||
- [ ] `M12-06E` desktop Blender 再导入 Web GLB 并比较 canonical report。
|
||||
- [ ] `M12-06F` sparse accessor、Draco/extension、外部 URI 和超预算负例。
|
||||
- [ ] `M12-06G` import/export 取消、Worker restart 和 OPFS quota 恢复。
|
||||
|
||||
### M12.7 OBJ、STL、PLY round-trip
|
||||
|
||||
- [ ] `M12-07A` OBJ 单 Mesh 正例:position/normal/UV/material group。
|
||||
- [ ] `M12-07B` OBJ 多对象、负索引、MTL/texture origin 和坏 face 负例。
|
||||
- [ ] `M12-07C` OBJ Web→desktop round-trip 与 loss report。
|
||||
- [ ] `M12-07D` STL binary/ASCII capability 分开声明。
|
||||
- [ ] `M12-07E` STL normal、unit、degenerate triangle 和 trailing bytes 对标。
|
||||
- [ ] `M12-07F` STL Web→desktop round-trip 与材质缺失 loss report。
|
||||
- [ ] `M12-07G` PLY ASCII/binary little-endian capability 分开声明。
|
||||
- [ ] `M12-07H` PLY vertex/face/color/custom property 映射与未知 property loss report。
|
||||
- [ ] `M12-07I` PLY big-endian/坏 list/超大 count 稳定阻断。
|
||||
- [ ] `M12-07J` 三格式分别执行取消、OOM、重启和小文件恢复。
|
||||
|
||||
### M12.8 USD 与 Alembic
|
||||
|
||||
- [ ] `M12-08A` 固定有 USD/Alembic 的 Blender 5.2 server runtime identity。
|
||||
- [ ] `M12-08B` 本地 runtime 缺能力时只能路由 `SERVER_EXACT`,不能静默降级 GLB。
|
||||
- [ ] `M12-08C` USD fixture 覆盖 hierarchy、xform、mesh、material、camera、animation。
|
||||
- [ ] `M12-08D` Alembic fixture 覆盖 topology sample、transform sample 和 frame range。
|
||||
- [ ] `M12-08E` server request 绑定 source/settings/build hash。
|
||||
- [ ] `M12-08F` server output 由新 Blender 进程重开并导出 canonical report。
|
||||
- [ ] `M12-08G` server cancel/timeout/OOM 不产生可绑定 output。
|
||||
- [ ] `M12-08H` 外部引用和不可映射语义进入 loss report。
|
||||
|
||||
### M12.9 统一 Editor context
|
||||
|
||||
- [ ] `M12-09A` 冻结 Workspace/Area/Region/Editor/Mode/Tool context schema。
|
||||
- [ ] `M12-09B` View3D、Outliner、Properties 读取同一 selection revision。
|
||||
- [ ] `M12-09C` 任一 editor selection 更新只提交一次共享 store transaction。
|
||||
- [ ] `M12-09D` stale editor event 不覆盖较新 Main/selection revision。
|
||||
- [ ] `M12-09E` hidden/locked/library object 在三 editor 中保持相同可选规则。
|
||||
- [ ] `M12-09F` frame、active object、mode 和 tool 在 Worker restart 后恢复。
|
||||
- [ ] `M12-09G` editor dispose 移除 DOM listener、pending request、GPU resource 和 timer。
|
||||
- [ ] `M12-09H` workspace/layout 保存只改 UI revision,不改 Blender scene revision。
|
||||
|
||||
### M12.10 专用 Editor 逐项开放
|
||||
|
||||
- [ ] `M12-10A` UV Editor 先只读显示 Main UV 与 selection。
|
||||
- [ ] `M12-10B` UV 单个 writer 通过 desktop/Main/undo/save 后开放。
|
||||
- [ ] `M12-10C` Shader Node Editor 只显示完整图,unsupported node 不可编辑但不得丢失。
|
||||
- [ ] `M12-10D` Geometry Node Editor 只开放已有 Main writer 的 allowlist node。
|
||||
- [ ] `M12-10E` Graph Editor 显示 FCurve/key/handle,单 operator 单独验收。
|
||||
- [ ] `M12-10F` Dope Sheet 与 NLA 共享 frame/selection/action revision。
|
||||
- [ ] `M12-10G` Sequencer editor 只开放已完成 Main writer 的 strip operation。
|
||||
- [ ] `M12-10H` Compositor editor 保留 unsupported graph 并显示执行 gate。
|
||||
- [ ] `M12-10I` Spreadsheet 只读取有预算的 evaluated attributes。
|
||||
- [ ] `M12-10J` 每个 editor 各有 context、dispose、键盘和窄屏 E2E。
|
||||
|
||||
### M12.11 Operator、keymap 与 workflow
|
||||
|
||||
- [ ] `M12-11A` operator search 直接由 capability registry 生成。
|
||||
- [ ] `M12-11B` registry、UI、协议和 Main writer 不维护第二份成功列表。
|
||||
- [ ] `M12-11C` operator poll 使用当前 area/region/mode/selection/tool context。
|
||||
- [ ] `M12-11D` keymap 按 editor→modal→tool→global 确定性解析。
|
||||
- [ ] `M12-11E` 冲突显示来源和胜出规则,不随机采用注册顺序。
|
||||
- [ ] `M12-11F` Escape、Enter、undo、redo 在所有 modal tool 保持一致。
|
||||
- [ ] `M12-11G` 建模 workflow:import→select→edit→undo/redo→save/reopen→export。
|
||||
- [ ] `M12-11H` 动画 workflow:key→curve→NLA→frame seek→save/reopen→export。
|
||||
- [ ] `M12-11I` asset workflow:catalog→append/link→override→reload→package。
|
||||
- [ ] `M12-11J` 三 workflow 各覆盖取消、Worker crash、quota 和诊断导出。
|
||||
|
||||
M12 退出条件:所有上述任务有独立报告;Asset/IO/Editor family 仍有未盘点项时不得宣称完整。
|
||||
|
||||
## 7. M13 Scripting、安全与 Server
|
||||
|
||||
### M13.1 默认拒绝与只读盘点
|
||||
|
||||
- [ ] `M13-01A` 盘点 Text、Python Console、autorun、driver expression、handler 和 add-on 入口。
|
||||
- [ ] `M13-01B` `.blend` 打开时只读取脚本 metadata,不执行任意内容。
|
||||
- [ ] `M13-01C` autorun、register、install、driver execution 默认返回稳定 policy code。
|
||||
- [ ] `M13-01D` UI 不提供绕过协议直接 eval 的入口。
|
||||
- [ ] `M13-01E` 保存/重开保留原 Text 数据块和未知脚本,不重写源码。
|
||||
- [ ] `M13-01F` malicious text、driver、handler 和 embedded module fixture 进入负例。
|
||||
|
||||
### M13.2 Script manifest 与签名
|
||||
|
||||
- [ ] `M13-02A` manifest 限制文本数量、总字节、module、path、dependency 和 permission。
|
||||
- [ ] `M13-02B` canonical serialization 固定签名输入。
|
||||
- [ ] `M13-02C` 定义 signer identity、key rotation、revocation 和 timestamp policy。
|
||||
- [ ] `M13-02D` signature 只批准声明内容,source hash 变化立即失效。
|
||||
- [ ] `M13-02E` permission 默认最小化,未知 permission 阻断。
|
||||
- [ ] `M13-02F` replay、key confusion、过期、撤销和多签顺序负例。
|
||||
|
||||
### M13.3 浏览器 sandbox
|
||||
|
||||
- [ ] `M13-03A` sandbox scope 不暴露 DOM、主 Worker、OPFS、IndexedDB 或网络。
|
||||
- [ ] `M13-03B` CPU、wall time、memory、message 和 output byte budget 固定。
|
||||
- [ ] `M13-03C` host call 使用显式 allowlist 和结构化参数。
|
||||
- [ ] `M13-03D` sandbox crash/timeout 终止当前 job,不污染 Main revision。
|
||||
- [ ] `M13-03E` cancellation 后不得发布迟到 message 或 cache。
|
||||
- [ ] `M13-03F` dispose 后 Worker、port、timer 和 buffer 归零。
|
||||
- [ ] `M13-03G` 小脚本在同会话恢复,审计链保持连续。
|
||||
|
||||
### M13.4 Blender server job isolation
|
||||
|
||||
- [ ] `M13-04A` 每个 job 创建不可预测的一次性目录。
|
||||
- [ ] `M13-04B` source 只读挂载,output 写独立目录。
|
||||
- [ ] `M13-04C` CPU、内存、进程、文件、时间和 output budget 由 OS/container 强制。
|
||||
- [ ] `M13-04D` 默认无网络;声明 origin 使用单独 policy。
|
||||
- [ ] `M13-04E` Blender 只以 background/factory-startup 和固定 startup script 启动。
|
||||
- [ ] `M13-04F` stdout/stderr 截断并过滤凭据/绝对内部路径。
|
||||
- [ ] `M13-04G` cancel 终止 Blender process tree 并清理临时目录。
|
||||
- [ ] `M13-04H` timeout/OOM/exit signal 转换为稳定错误码。
|
||||
- [ ] `M13-04I` result 验证 source/settings/build/output hash 后才进入 OPFS。
|
||||
- [ ] `M13-04J` 同一 request 重试保持幂等,不绑定两个冲突结果。
|
||||
|
||||
### M13.5 CSP、供应链与恶意输入
|
||||
|
||||
- [ ] `M13-05A` CSP 禁止 inline script、eval、data script 和未声明 origin。
|
||||
- [ ] `M13-05B` Worker、WASM、font、image、media 的 CSP 分别验证。
|
||||
- [ ] `M13-05C` 生产依赖、构建依赖、测试依赖分别生成 inventory。
|
||||
- [ ] `M13-05D` severity 门和例外包含 owner、期限、理由和替代控制。
|
||||
- [ ] `M13-05E` SBOM、license、source offer 与 archive/commit hash 绑定。
|
||||
- [ ] `M13-05F` malicious blend/image/font/media/archive/node graph/manifest 全矩阵。
|
||||
- [ ] `M13-05G` fuzz crash 先保存最小样本,再修复,再进入长期回归。
|
||||
- [ ] `M13-05H` audit record 使用严格时间顺序、request ID 和防篡改 hash chain。
|
||||
|
||||
M13 退出条件:任意 Python/add-on 能力只有在本地 sandbox 或 server isolation 实跑后才可从
|
||||
`BLOCKED` 改为成功;仅签名验证通过不等于执行安全。
|
||||
|
||||
## 8. M14 跨浏览器与设备
|
||||
|
||||
### M14.1 Capability probe
|
||||
|
||||
- [ ] `M14-01A` 冻结当前 Chromium release/engine/archive hash。
|
||||
- [ ] `M14-01B` Firefox probe:WASM、Worker、OPFS、IndexedDB、WebGL2、WebGPU、Offscreen、isolation。
|
||||
- [ ] `M14-01C` WebKit probe采用相同字段与错误码。
|
||||
- [ ] `M14-01D` probe 记录浏览器/OS/GPU adapter,不按 user-agent 猜测能力。
|
||||
- [ ] `M14-01E` 缺 WebGPU 只阻断依赖 WebGPU 的功能,不影响可验证 WebGL2/Main。
|
||||
|
||||
### M14.2 Firefox
|
||||
|
||||
- [ ] `M14-02A` Firefox quick:type/protocol/static asset 启动。
|
||||
- [ ] `M14-02B` Firefox P0:open/edit/undo/redo/save/reopen/export。
|
||||
- [ ] `M14-02C` Firefox 主线程 WebGL2 像素和 context loss。
|
||||
- [ ] `M14-02D` Firefox Offscreen 只在主线程通过后领取。
|
||||
- [ ] `M14-02E` Firefox OPFS quota、Worker crash、OOM 和 network interruption。
|
||||
- [ ] `M14-02F` Firefox full family 命令逐项 PASS/BLOCKED,禁止静默 fallback。
|
||||
- [ ] `M14-02G` Firefox quick/P0/full 进入 CI 后才更新支持声明。
|
||||
|
||||
### M14.3 WebKit
|
||||
|
||||
- [ ] `M14-03A` WebKit quick 启动和本地 asset 完整性。
|
||||
- [ ] `M14-03B` WebKit P0 用户闭环。
|
||||
- [ ] `M14-03C` WebKit 主线程 viewport。
|
||||
- [ ] `M14-03D` WebKit Offscreen 独立 gate。
|
||||
- [ ] `M14-03E` WebKit storage/fault/recovery。
|
||||
- [ ] `M14-03F` WebKit full family matrix。
|
||||
- [ ] `M14-03G` WebKit CI 和发布说明。
|
||||
|
||||
### M14.4 设备档位与输入
|
||||
|
||||
- [ ] `M14-04A` GPU/内存预算按声明设备档位选择,不自动扩容。
|
||||
- [ ] `M14-04B` DPR 1/1.5/2/3 下 canvas、raycast、gizmo 和截图一致。
|
||||
- [ ] `M14-04C` pointer mouse、touch、pen 分开记录 pressure/tilt/button/cancel。
|
||||
- [ ] `M14-04D` IME composition 不触发未完成 operator。
|
||||
- [ ] `M14-04E` US、非 US、dead key 和 modifier keymap fixture。
|
||||
- [ ] `M14-04F` 触控 modal cancel、双指导航和笔 stroke 只提交一次 Main transaction。
|
||||
- [ ] `M14-04G` 1440x900、1280x720、平板、手机无重叠/溢出。
|
||||
- [ ] `M14-04H` keyboard-only、screen reader name/role 和 focus restore。
|
||||
|
||||
## 9. M15 全域自动盘点
|
||||
|
||||
- [ ] `M15-01A` 从 Blender 5.2 source/RNA 生成 data-block type 清单。
|
||||
- [ ] `M15-01B` 生成 operator idname、poll context 和主要 property 清单。
|
||||
- [ ] `M15-01C` 生成 modifier、constraint、shader/GN/compositor node 清单。
|
||||
- [ ] `M15-01D` 生成 sequencer strip/effect、physics family 和 import/export 清单。
|
||||
- [ ] `M15-01E` 生成 editor/space/region/workspace/keymap 清单。
|
||||
- [ ] `M15-01F` 为 Main/Scene/Mesh/Depsgraph 和其余现有 V1 core slice 生成同级全量清单,
|
||||
不把“当前范围完成”映射为全量完成。
|
||||
- [ ] `M15-02A` 将每项映射到 owner family、implementation class、tests 和 evidence。
|
||||
- [ ] `M15-02B` 找出未映射、重复映射、只有 summary、只有 proxy 和只有 route 的条目。
|
||||
- [ ] `M15-02C` `LOCAL_EXACT` 缺 desktop/WASM 同 fixture 时降为 `BLOCKED`。
|
||||
- [ ] `M15-02D` `LOCAL_EQUIVALENT` 缺 Main/save 证据时降为 `BLOCKED`。
|
||||
- [ ] `M15-02E` `SERVER_EXACT` 缺真实 job/cancel/isolation/result binding 时降为 `BLOCKED`。
|
||||
- [ ] `M15-02F` unknown data 保存破坏原文件时对应 reader/writer family 降为 `BLOCKED`。
|
||||
- [ ] `M15-03A` 为每个 gap 生成一个最小 `nextTask`,不生成“完成整个 family”大任务。
|
||||
- [ ] `M15-03B` nextTask 包含 fixture、desktop command、Web command、比较器和退出条件。
|
||||
- [ ] `M15-03C` 依赖图无缺失、无环、每次只允许一个 active task。
|
||||
- [ ] `M15-03D` 机器统计分别输出 inventoried/completed/blocked/uninventoried。
|
||||
- [ ] `M15-03E` 所有生成的 owner family(包括当前 N-015 至 N-026)分别达到零 gap,禁止由
|
||||
12-family 或 release 聚合 gate 反推未纳入当前账本的 core family 已完成。
|
||||
|
||||
## 10. M16-M22 全域差距清零波次
|
||||
|
||||
这些里程碑只定义 owner 和顺序。具体任务由 M15 生成,每个任务仍使用第 3 节的 14 步模板。
|
||||
|
||||
### M16 Main、Mesh、Modifier、Sculpt
|
||||
|
||||
- [ ] `M16-01` `.blend` reader/writer unknown-data preservation 差距清零。
|
||||
- [ ] `M16-02` Object/Collection/parent/transform operator 差距清零。
|
||||
- [ ] `M16-03` Mesh create/delete/select/topology/attribute operator 差距清零。
|
||||
- [ ] `M16-04` UV/normal/data-transfer operator 差距清零。
|
||||
- [ ] `M16-05` Modifier family 与 Depsgraph 求值差距清零。
|
||||
- [ ] `M16-06` PBVH Sculpt brush/mask/face-set 差距清零。
|
||||
|
||||
### M17 Rigging、Animation、Constraint、NLA
|
||||
|
||||
- [ ] `M17-01` Armature edit/pose/bone collection 差距清零。
|
||||
- [ ] `M17-02` Constraint family 与 dependency order 差距清零。
|
||||
- [ ] `M17-03` Shape key、driver 安全执行和 property animation 差距清零。
|
||||
- [ ] `M17-04` FCurve/key/handle/modifier/extrapolation 差距清零。
|
||||
- [ ] `M17-05` NLA track/strip/blend/transition/meta/time 差距清零。
|
||||
- [ ] `M17-06` animation export/import loss 差距清零。
|
||||
|
||||
### M18 Non-mesh、Grease Pencil、Paint
|
||||
|
||||
- [ ] `M18-01` Curve/Surface/Text/Metaball 完整 data/operator 差距清零。
|
||||
- [ ] `M18-02` Curves/Hair/PointCloud/Volume data/operator 差距清零。
|
||||
- [ ] `M18-03` Grease Pencil layer/frame/drawing/material/modifier/editor 差距清零。
|
||||
- [ ] `M18-04` Vertex/Weight/Texture Paint 与 PBVH/UDIM 差距清零。
|
||||
- [ ] `M18-05` desktop/browser/export golden 差距清零。
|
||||
|
||||
### M19 Geometry Nodes、Shader、Simulation
|
||||
|
||||
- [ ] `M19-01` Geometry Nodes node/socket/field/domain/group 清单差距清零。
|
||||
- [ ] `M19-02` Geometry Nodes external resource/instance/lazy-function 差距清零。
|
||||
- [ ] `M19-03` Shader node/texture/color/sampler/compiler 差距清零。
|
||||
- [ ] `M19-04` Rigid/Soft/Cloth/Fluid/Dynamic Paint/Particle/Hair simulation 差距清零。
|
||||
- [ ] `M19-05` local/server bake、cache、playback 和 fault 差距清零。
|
||||
|
||||
### M20 Render、Compositor、Sequencer、Tracking
|
||||
|
||||
- [ ] `M20-01` Camera/Light/World/Color Management 完整字段差距清零。
|
||||
- [ ] `M20-02` Eevee/WebGPU/Cycles/server render 差距清零。
|
||||
- [ ] `M20-03` Compositor node/resource/HDR/tile/server 差距清零。
|
||||
- [ ] `M20-04` Sequencer strip/effect/modifier/proxy/mix/encode 差距清零。
|
||||
- [ ] `M20-05` Audio device/mix/sync/waveform 差距清零。
|
||||
- [ ] `M20-06` Tracking/Mask editor/solve/compositor binding 差距清零。
|
||||
|
||||
### M21 Asset、IO、Editors、Scripting
|
||||
|
||||
- [ ] `M21-01` Asset/Library/Override 全清单差距清零。
|
||||
- [ ] `M21-02` Blender 启用的 import/export format 差距清零。
|
||||
- [ ] `M21-03` Editor/context/operator/keymap/workspace 差距清零。
|
||||
- [ ] `M21-04` Python/Text/Add-on/driver 的 local/server 安全能力差距清零。
|
||||
- [ ] `M21-05` help/i18n/accessibility/preferences 差距清零。
|
||||
|
||||
### M22 平台与跨浏览器
|
||||
|
||||
- [ ] `M22-01` Chromium 全矩阵零 gap。
|
||||
- [ ] `M22-02` Firefox 声明矩阵零 gap。
|
||||
- [ ] `M22-03` WebKit 声明矩阵零 gap。
|
||||
- [ ] `M22-04` touch/pen/HiDPI/IME/keymap 零 gap。
|
||||
- [ ] `M22-05` local/server platform capability 零未声明项。
|
||||
|
||||
## 11. M23 完整候选发布
|
||||
|
||||
- [ ] `M23-01` clean checkout 重建 WASM、Web app、server image 和所有 fixture。
|
||||
- [ ] `M23-02` 运行全部 desktop/WASM semantic golden。
|
||||
- [ ] `M23-03` 运行 Chromium/Firefox/WebKit quick、P0、full。
|
||||
- [ ] `M23-04` 运行 geometry/texture/volume/simulation/media 性能矩阵。
|
||||
- [ ] `M23-05` 运行 OOM/quota/network/device/Worker/server fault 矩阵。
|
||||
- [ ] `M23-06` 运行 malicious/fuzz/CSP/dependency/security 矩阵。
|
||||
- [ ] `M23-07` inventory 中每个 `parityId` 均为 `VERIFIED`,所有生成的 owner family 均为
|
||||
`COMPLETE`,blocked/in-progress/uninventoried 均为零。
|
||||
- [ ] `M23-08` binary/source/server archives 在独立机器复验。
|
||||
- [ ] `M23-09` SBOM、license、source offer、runtime 和 archive hash 联合校验。
|
||||
- [ ] `M23-10` 发布说明逐项列出 local/server 实现,不隐去架构差异。
|
||||
- [ ] `M23-11` 从空环境部署、升级、回滚并恢复真实项目。
|
||||
- [ ] `M23-12` 只有上述报告绑定同一 commit 后才允许“完整 Web Blender”声明。
|
||||
|
||||
## 12. 每轮执行规则
|
||||
|
||||
1. 从机器队列领取唯一 `nextTask`。
|
||||
2. 先运行现有正例,确认不是在旧失败上继续扩展。
|
||||
3. 写 fixture/golden 时实际启动锁定 Blender 5.2,不手工填写运行结果。
|
||||
4. 先完成协议和 fail-closed,再接 Main writer,再接浏览器 UI。
|
||||
5. 失败结果记录到工作日志,但不写成成功 evidence。
|
||||
6. 代码完成后运行专项;专项通过后运行全量 Node、typecheck、lint、build、status/evidence。
|
||||
7. 更新 ledger 时只增加本轮真实完成的 slice;family 全域状态保持 `BLOCKED` 直到 gap 为零。
|
||||
8. 每轮保留下一任务的可执行入口,不提前实现无依赖保证的后续功能。
|
||||
@@ -3,7 +3,9 @@
|
||||
更新时间:2026-08-13
|
||||
|
||||
本文件以仓库内 `blender-5.2.0/source/blender/` 为基线,记录 Blender 功能域在 Web
|
||||
项目中的迁移方式和唯一领取顺序。`completed_current_scope` 只表示声明子集通过验收,
|
||||
项目中的迁移方式和当前差距。M12-M23 的唯一长期实施规则和原子任务位于
|
||||
`BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md`;本文不再定义领取顺序。`completed_current_scope`
|
||||
只表示声明子集通过验收,
|
||||
不表示桌面 Blender 全量等价。任何未列入白名单的 operator、node、strip、physics
|
||||
类型或数据块都必须返回机器可读阻断,不能由 Three.js 静默近似。
|
||||
|
||||
@@ -206,8 +208,8 @@ operator search;这不等价于 Blender 全量 operator registry、context men
|
||||
|
||||
## N-026 全域发布门
|
||||
|
||||
1. 生成 machine-readable parity manifest:每个 Blender family 为
|
||||
`LOCAL_EXACT`、`LOCAL_BOUNDED`、`SERVER` 或 `BLOCKED`。
|
||||
1. 当前 V1 machine-readable manifest 保留 `LOCAL_EXACT`、`LOCAL_BOUNDED`、`SERVER` 或
|
||||
`BLOCKED`;完整对标 inventory 按新计划转换为独立 `implementationClass/parityStatus`。
|
||||
2. 全部正例和阻断 fixture 在 Chromium 主线程/OffscreenCanvas、离线包和 Worker restart 下运行。
|
||||
3. 100k/1M/10M 几何、4k/8k texture、100/1000 frame、长媒体和 simulation cache 基准。
|
||||
4. `.blend`/image/media/script fuzz、OPFS quota、OOM、设备丢失、网络中断和恢复验证。
|
||||
|
||||
@@ -18,9 +18,9 @@ React 工作区和编辑器
|
||||
-> OPFS 大文件 + IndexedDB 元数据
|
||||
```
|
||||
|
||||
本计划是当前唯一的短周期领取队列。长期 Blender 功能对标仍记录在
|
||||
`BLENDER_5_2_WEB_FEATURE_PARITY.md` 和 `status/parity-ledger.json`,但不以长期全域差距
|
||||
阻断已明确限定范围的 V1。
|
||||
本计划是当前唯一的短周期领取队列。M12-M23 的长期 Blender 全功能实施规范以
|
||||
`BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` 为准;当前实现状态仍由
|
||||
`status/parity-ledger.json` 和对应 evidence 给出。长期全域差距不阻断已明确限定范围的 V1。
|
||||
|
||||
## 2. 文档与事实源
|
||||
|
||||
@@ -29,7 +29,9 @@ React 工作区和编辑器
|
||||
| `WEB_BLENDER_MODELER_V1_SCOPE.md` | V1 产品契约、支持矩阵、非目标、发布标准 |
|
||||
| `CURRENT_EXECUTION_PLAN.md` | 当前任务顺序、最小任务、依赖和退出条件 |
|
||||
| `PROJECT_STATUS_AND_NEXT_WORK.md` | 已实现能力、风险、验证命令总览 |
|
||||
| `BLENDER_5_2_WEB_FEATURE_PARITY.md` | Blender 5.2 全域长期差距 |
|
||||
| `BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` | M12-M23 完整 Web 对标的长期规范事实源 |
|
||||
| `BLENDER_5_2_WEB_FEATURE_PARITY.md` | Blender 5.2 功能域说明和当前差距参考 |
|
||||
| `BLENDER_5_2_FULL_PARITY_WBS.md` | 完整产品覆盖检查表和历史 F 域映射参考 |
|
||||
| `status/parity-ledger.json` | 功能域和 V1 slice 的机器事实 |
|
||||
| `status/release-evidence.json` | 最近一次可审计发布证据快照 |
|
||||
|
||||
@@ -156,8 +158,8 @@ loss、恶意 blend、zip bomb、离线包和 V1 用户闭环均已在最终 M5
|
||||
| M8 VDB 自动分页 | GPU 缺页反馈、range/OPFS、LRU、双视口恢复 | 已完成,20/20 | 联合重开与 desktop/main/Offscreen 三轴 golden 通过 |
|
||||
| M9 非 Mesh/GP/Paint | 字体、Curve、Grease Pencil、Paint 增量闭环 | 已完成,14/14 | 每个新增 writer 独立通过 Main/undo/save/golden;三域故障恢复闭环通过 |
|
||||
| M10 GN/Shader/NLA/Simulation | 白名单求值、cache、编译与阻断 | 已完成,15/15 | 四域分别通过 desktop/WASM/fault 门 |
|
||||
| M11 Render/Compositor/Media | 灯光、渲染、合成、媒体执行边界 | 进行中,13/14 | 本地白名单与 server 边界均可审计 |
|
||||
| M12 Asset/IO/Editors | 资产、格式、编辑器和上下文工作流 | 未开始 | 每个格式/editor 有独立 round-trip 或稳定阻断 |
|
||||
| M11 Render/Compositor/Media | 灯光、渲染、合成、媒体执行边界 | 已完成,14/14 | 本地白名单、server 边界与三域故障恢复均可审计 |
|
||||
| M12 Asset/IO/Editors | 资产、格式、编辑器和上下文工作流 | 进行中,M12-01A-I、M12-02A-H 与 M12-03A-D 完成 | 每个格式/editor 有独立 round-trip 或稳定阻断 |
|
||||
| M13 Scripting/Security | 脚本默认拒绝、服务端隔离、CSP、供应链 | 未开始 | 恶意输入矩阵和 release 安全门通过 |
|
||||
| M14 跨浏览器/设备 | Firefox、WebKit、触控、笔、HiDPI、IME | 未开始 | 新浏览器进入 quick/P0/full CI 后才声明支持 |
|
||||
| M15 全域审计 | Blender 5.2 全域差距和下一发布 | 未开始 | 逐 family 审计,不由聚合 release gate 反推完成 |
|
||||
@@ -790,7 +792,7 @@ CI 可从 lockfile 和对应源码重现当前 binary/source hash。
|
||||
- [x] `M10-14` 每类 cache 验证 source hash、frame range、字节预算和版本。
|
||||
- [x] `M10-15` GN/Shader/NLA/Simulation 分别建立浏览器性能、OOM 和恶意图输入门。
|
||||
|
||||
### M11 Lighting、Render、Compositor 与 Sequencer(13/14)
|
||||
### M11 Lighting、Render、Compositor 与 Sequencer(14/14)
|
||||
|
||||
- [x] `M11-01` Camera/Light/World/Scene color management 建立字段级 parity 表。
|
||||
- [x] `M11-02` 每个支持字段通过 Main edit、undo、save/reopen 和 viewport 映射。
|
||||
@@ -820,10 +822,16 @@ CI 可从 lockfile 和对应源码重现当前 binary/source hash。
|
||||
- [x] `M11-13` audio context suspend/resume、设备缺失和静音恢复有专项测试;schema 1
|
||||
区分 context/output 状态,真实 Chromium `AudioContext` 通过用户手势、挂起、静音恢复、
|
||||
二次挂起/恢复和 close,缺设备与 resume failure 保持结构化静音阻断。
|
||||
- [ ] `M11-14` render/compositor/media 全部覆盖取消、重启、预算释放和恢复。
|
||||
- [x] `M11-14` render/compositor/media 全部覆盖取消、重启、预算释放和恢复;schema 1
|
||||
固定三域 cancellation/budget code 和资源归零字段,真实 `.blend`、H.264 与 WebGL 输出通过
|
||||
generation 2 重开、失败不提交、显式 clear/dispose 和恢复后 output SHA-256 门。
|
||||
|
||||
### M12 Asset、IO、Editor 与工作流
|
||||
|
||||
本节 M12-M15 仅保留短周期计划形成时的里程碑摘要,不再作为原子任务定义。M12-03D
|
||||
机器证据完成后,唯一下一任务为 `BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` 中的
|
||||
`M12-03E`;后续只能领取该文档或机器差距生成器给出的精确字母任务,不得领取下列整行摘要。
|
||||
|
||||
- [ ] `M12-01` asset catalog schema migration 有向前/向后兼容 fixture。
|
||||
- [ ] `M12-02` append/link/override 分别定义 stable ID、所有权和失效语义。
|
||||
- [ ] `M12-03` library source 只允许声明 origin,路径穿越和符号链接逃逸被拒绝。
|
||||
@@ -872,13 +880,15 @@ CI 可从 lockfile 和对应源码重现当前 binary/source hash。
|
||||
- [ ] `M15-01` 每季度从 Blender 5.2 operator/data-block 清单重新生成 parity 差距。
|
||||
- [ ] `M15-02` 每个 family 的 `COMPLETE` 必须没有 summary-only、proxy-success 或隐式 loss。
|
||||
- [ ] `M15-03` LOCAL_EXACT 必须有相同 fixture 的 desktop/WASM 语义或像素 golden。
|
||||
- [ ] `M15-04` LOCAL_BOUNDED 必须同时验证白名单正例和非白名单稳定阻断。
|
||||
- [ ] `M15-05` SERVER 必须验证提交、取消、隔离、预算、hash 和结果绑定。
|
||||
- [ ] `M15-06` EXCLUDED 必须验证 UI 不开放、文件数据不丢失、保存不破坏原项目。
|
||||
- [ ] `M15-07` 12 个 family 分别达到自身退出条件,禁止由 N-026 聚合状态反推完成。
|
||||
- [ ] `M15-04` LOCAL_EQUIVALENT 只用于平台外壳,必须验证最终 Main/文件语义与 desktop 一致。
|
||||
- [ ] `M15-05` SERVER_EXACT 必须验证真实 Blender 提交、取消、隔离、预算、hash 和结果绑定。
|
||||
- [ ] `M15-06` BLOCKED/UNINVENTORIED 必须保持 UI fail-closed、文件保真和可诊断状态。
|
||||
- [ ] `M15-07` 全部生成的 owner family 分别达到自身退出条件,禁止由当前 12-family 或 N-026
|
||||
聚合状态反推完整 Blender core 已完成。
|
||||
- [ ] `M15-08` 全域发布候选重新跑 clean build、acceptance、性能、fault 和安全矩阵。
|
||||
- [ ] `M15-09` 在独立机器复验 binary/source archive 和所有 hash。
|
||||
- [ ] `M15-10` 发布说明逐项列出支持、受限、server 和 excluded 能力。
|
||||
- [ ] `M15-10` 发布说明逐项列出 local exact、platform-equivalent 和 server exact 能力。
|
||||
|
||||
实际领取顺序固定为:先完成 M5;随后 M6、M7;再按产品需求在 M8 至 M13 中一次选择一个
|
||||
最小闭环;M14 只在 Chromium RC 稳定后开始;M15 是状态审计,不是把剩余功能一次性打包。
|
||||
历史领取顺序为先完成 M5,随后 M6、M7,再在 M8-M11 中一次选择一个最小闭环。当前只领取
|
||||
机器 `nextTask`;M12 起使用完整对标计划的原子任务,M15 是状态审计和差距生成,不是把剩余
|
||||
功能一次性打包。
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
|
||||
当前短周期任务、领取顺序和阶段退出条件统一维护在
|
||||
`docs/CURRENT_EXECUTION_PLAN.md`。本文件保留实现事实、长期能力台账和完整验收命令,不再作为
|
||||
V1 的逐项领取顺序;V1 范围以 `docs/WEB_BLENDER_MODELER_V1_SCOPE.md` 为准。
|
||||
V1 的逐项领取顺序;V1 范围以 `docs/WEB_BLENDER_MODELER_V1_SCOPE.md` 为准,M12-M23 全功能
|
||||
实施规则以 `docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md` 为准。
|
||||
|
||||
## 1. 当前结论
|
||||
|
||||
@@ -29,19 +30,21 @@ SQLite WASM 和 Bitbybit/OCCT 均不在当前依赖范围内。Three.js、WASM
|
||||
| --- | --- | --- | --- |
|
||||
| V1 release family | 12/12 `READY` | 0 | V1 已声明功能闭环完成 |
|
||||
| Blender 5.2 全域 parity | 0/12 complete | 12/12 `BLOCKED` | 不是完整 Blender Web 移植 |
|
||||
| slice 台账 | 191 completed | 58 blocked | blocked 项均留在 M9-M15 长期路线 |
|
||||
| slice 台账 | 195 completed | 58 blocked | blocked 项均留在 M9-M15 长期路线 |
|
||||
| acceptance | 50 declarations / 49 unique passed | 0 failed | 本地 V1 RC 证据完整 |
|
||||
| M6 可部署 RC | 71/71 原子任务 | 0 | 可部署 RC 已冻结 |
|
||||
| M7 核心体验硬化 | 18/18 原子任务 | 0 | 已完成并进入持续回归 |
|
||||
| M8 VDB 自动分页 | 20/20 原子任务 | 0 | 联合重开与 desktop/main/Offscreen 三轴 golden 通过 |
|
||||
| M9 非 Mesh/GP/Paint | 14/14 原子任务 | 0 | `TOGGLE_CYCLIC` 已通过 Main/undo/save/reopen 与 Blender 5.2 golden;GP current-drawing marquee、2D/3D 共享 selection revision 及 layer/frame reorder 已通过 Main/undo/save/reopen 门;Paint 主线程/Offscreen 真实 GPU depth、单 undo 分块 pointer session、normalize/limit/mirror 权重与 Blender 5.2 golden、packed/UDIM dirty tile 原子资产绑定,以及 46 项 PBVH brush 的 WASM 入口显式阻断已通过;Curve、Grease Pencil、Paint 三域的 Worker restart、OOM、GPU release、小场景恢复已通过;PBVH/桌面 brush 求值仍 BLOCKED |
|
||||
| M10 GN/Shader/NLA/Simulation | 15/15 原子任务 | 0 | GN/Simulation cache、Shader、NLA 和 Physics 有界闭环全部完成;M10-15 以四个隔离 Chromium Worker 分别通过性能、超预算/OOM-prevention、恶意输入和同会话小输入恢复门 |
|
||||
| M11 Lighting/Render/Compositor/Media | 13/14 原子任务 | 1 | M11-01/02 已冻结字段 parity 并完成支持字段闭环;M11-03 已让双 viewport 共用资源预算;M11-04 已完成 Blender Eevee reference 图像指标;M11-05/06 已完成最终渲染路由/provenance;M11-07/08 已完成有限 Compositor golden 与 Unsupported 全图阻断;M11-09/10/11/12 已完成 codec/proxy/revision/export gate;M11-13 已完成实时 AudioContext 恢复门 |
|
||||
| M11 Lighting/Render/Compositor/Media | 14/14 原子任务 | 0 | M11-01/02 已冻结字段 parity 并完成支持字段闭环;M11-03 已让双 viewport 共用资源预算;M11-04 已完成 Blender Eevee reference 图像指标;M11-05/06 已完成最终渲染路由/provenance;M11-07/08 已完成有限 Compositor golden 与 Unsupported 全图阻断;M11-09/10/11/12 已完成 codec/proxy/revision/export gate;M11-13 已完成实时 AudioContext 恢复门;M11-14 已完成 Render/Compositor/Media 三域取消、重启、预算、释放和恢复门 |
|
||||
| M12 Asset/IO/Editors | M12-01A-I + M12-02A-H + M12-03A-D 共 21 项 | Append undo/redo/save/reopen、Link/Override 与后续 IO/Editor 仍未完成 | WASM Main 已有单 transaction append slice,但 N-023 全域 parity 仍阻断 |
|
||||
|
||||
当前优先级不是扩 Blender 全域功能。single/pthread、真实 HTTP、缓存升级、离线闭环、
|
||||
独立归档复验、运维 runbook、RC 文档和最终三条 CI lane 均已通过;M7 核心项目体验硬化
|
||||
18/18 已完成并进入持续回归;M9 已完成 14/14;M10 已完成 15/15 并进入持续回归;M11 当前
|
||||
13/14;后续领取点只读取机器队列最新 `nextTask`。
|
||||
18/18 已完成并进入持续回归;M9 已完成 14/14;M10 已完成 15/15 并进入持续回归;M11 已完成
|
||||
14/14;M12-01A-I、M12-02A-H 和 M12-03A-D 已完成,机器队列的当前唯一 `nextTask` 为完整对标计划中的
|
||||
`M12-03E`。
|
||||
|
||||
## 2. 已完成并有测试覆盖的能力
|
||||
|
||||
|
||||
64
docs/status/M11-14.md
Normal file
64
docs/status/M11-14.md
Normal file
@@ -0,0 +1,64 @@
|
||||
# M11-14 Status
|
||||
|
||||
status: done
|
||||
task: close render, compositor, and media cancellation/restart/resource recovery
|
||||
updated: 2026-08-17 America/New_York
|
||||
|
||||
## Scope
|
||||
|
||||
Schema 1 evidence fixes one report for each of `RENDER`, `COMPOSITOR`, and `MEDIA`.
|
||||
Every report binds real source bytes, a domain-specific cancellation code, a domain-specific
|
||||
budget code, generation 1/2 identity and output hashes, positive release receipts, zero
|
||||
owned resources after release, and a non-empty recovered output. The suite parser rejects
|
||||
undeclared fields, missing or duplicate domains, published cancellation results, restart
|
||||
drift, budget mutation, and incomplete release.
|
||||
|
||||
The Chromium production-path case opens real Blender Main fixtures for Render and
|
||||
Compositor and decodes a real H.264 fixture for Media. Render reads an actual WebGL RGBA8
|
||||
frame, Compositor executes the real Main GraphIR into Float32 output, and Media generates
|
||||
the initial RGBA8 proxy frame. This task closes only bounded lifecycle behavior; it does not
|
||||
claim full Eevee/Cycles parity, arbitrary compositor nodes, frame-exact long-video decode,
|
||||
or complete audio/video rendering.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5592 npm --prefix web run test:render-compositor-media-recovery` passed:
|
||||
protocol negatives 3/3, Blender 5.2 Eevee reference checker, Blender 5.2 Compositor
|
||||
golden checker, and Chromium 1/1.
|
||||
- Render used `m11_render_reference.blend`, rejected a pre-cancelled open with
|
||||
`OPEN_CANCELLED`, preserved the active Main, restarted WebEngine at generation 2, and
|
||||
reproduced the same scene identity and WebGL output SHA-256. Aggregate texture overflow
|
||||
returned `GPU_TEXTURE_BUDGET_EXCEEDED` without replacing the retained texture; dispose
|
||||
reported positive released bytes/resources followed by zero owned textures.
|
||||
- Compositor used `m11_compositor_allowlist.blend`, returned `COMPOSITOR_CANCELLED` from the
|
||||
periodic executor check, rejected width 8193 with `COMPOSITOR_BUDGET_EXCEEDED` before
|
||||
cache mutation, reproduced GraphIR/Float32 output after Worker restart, and cleared the
|
||||
LRU to zero.
|
||||
- Media probed and decoded `sequencer-probe.mp4`, rejected a pre-cancelled proxy decode with
|
||||
`SEQUENCER_CANCELLED`, rejected a cache one byte below the frame size with
|
||||
`SEQUENCER_BUDGET_EXCEEDED`, cleared the first cache, then re-probed and re-decoded the
|
||||
H.264 source before reproducing the source/decode/profile identity and RGBA8 payload
|
||||
SHA-256 in a rebuilt session.
|
||||
- Regression passed: full Node 193/193, typecheck, lint, production build (75 modules),
|
||||
render resource budget unit 3/3 plus Chromium main/Offscreen 3/3, Compositor golden unit
|
||||
3/3 plus Chromium 1/1, media proxy cache unit 3/3 plus Chromium 1/1, status consistency,
|
||||
release evidence, and `git diff --check`.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- evidence protocol: `a1b0b36cf93173347d55a955ff2e02f3666f7c28ef7f06442b86f0ee2b272286`
|
||||
- Chromium production suite: `ef9cd58ce3bbd522c72075e82d6423387b61039509996851d8d5ebf3a0d86789`
|
||||
- media proxy cache: `7a1dbf8e838c47e2b99bc8932997e79d3c3cf2636b6285ace083800d833e2e64`
|
||||
- GPU texture store: `a87adefa67b243cfd0cfcad0573a1b646f1e8be8abd0a187e1dc29cab2954d44`
|
||||
- compositor cache: `3ce4819dadb2d6de7305c3676b2708689cd8be95e6fa7894651d6a02c4658b31`
|
||||
- unit: `3cec4a33f28a76423a9678bcb61244cc463f5f2f5939c3f0b6865d34063e1f55`
|
||||
- Chromium spec: `1578848eda7cb26cdf1584fa13f4cc2e252e782959d489dc4454e45c8d06595a`
|
||||
- golden manifest: `87f17b0437d819e00c4a0902146d6549cf713482667ead627a45ba2b46050247`
|
||||
- package: `0e731a5c826a999eef372f875c6c5ce9d697fd369a929025370a74cf18a93582`
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the recovery protocol, browser suite, unit/Chromium tests, M11-14 golden manifest,
|
||||
and package command. Restore the media proxy generator signature, Compositor cache clear,
|
||||
and GPU texture release receipt only if no later caller depends on them. Remove the three
|
||||
family lifecycle slices, restore M11 to 13/14, and move the queue back from M12-01A.
|
||||
59
docs/status/M12-01A.md
Normal file
59
docs/status/M12-01A.md
Normal file
@@ -0,0 +1,59 @@
|
||||
# M12-01A Status
|
||||
|
||||
status: done
|
||||
task: inventory Blender 5.2 AssetMetaData, tag, and catalog fields
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The machine inventory freezes the Blender 5.2 storage and public API surface needed before
|
||||
designing a full-parity Web catalog schema. It covers every `AssetMetaData` DNA member,
|
||||
the `AssetTag` storage and collection operations, actual `AssetMetaData` RNA properties,
|
||||
Blend read/write participation, `AssetCatalog` semantic/runtime fields, catalog definition
|
||||
file version/record order, path hierarchy rules, and the current Web v1 interface snapshot.
|
||||
|
||||
This task deliberately does not create the desktop catalog fixture, Web schema v2,
|
||||
migrations, IndexedDB behavior, or a new verified parity slice. In particular, a source
|
||||
inventory is not evidence that Web preserves or writes the inventoried fields.
|
||||
|
||||
## Findings
|
||||
|
||||
- `AssetMetaData` has 14 DNA members: 10 persisted semantic/UI members, custom
|
||||
`IDProperty` metadata, one runtime type pointer, one derived tag count, and ABI padding.
|
||||
The real Blender runtime exposes 10 RNA properties.
|
||||
- `author`, `description`, `copyright`, and `license` are optional dynamic strings. Empty
|
||||
values are valid Blender state; the existing Web v1 manifest currently requires non-empty
|
||||
author/license and has no description/copyright fields.
|
||||
- `catalog_id` is the authoritative RFC4122 identity. `catalog_simple_name` is a read-only
|
||||
recovery copy and cannot replace the UUID-to-path mapping.
|
||||
- Catalog hierarchy is implicit in a cleaned UTF-8 slash path. CDF v1 records
|
||||
`UUID:path:simple_name`; no parent UUID is stored. Duplicate paths are legal and resolve
|
||||
deterministically by first-loaded state and UUID.
|
||||
- Existing Web v1 directly represents catalog ID, tags, author, and license, but misses seven
|
||||
inventoried metadata semantics and models hierarchy as an explicit `parentId` graph.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-catalog-inventory` passed on the first complete run:
|
||||
`dna=14 rna=10 tag=3 catalog=3 gaps=7 next=M12-01B`.
|
||||
- The checker binds eight source SHA-256 values, extracts the RNA property declarations,
|
||||
launches `Blender 5.2.0 LTS --factory-startup --background`, compares the actual runtime
|
||||
property identifiers/types/read-only flags, verifies Blend IO markers and CDF v1 format,
|
||||
and uses the TypeScript AST to freeze the current Web interfaces.
|
||||
- The inventory manifest SHA-256 is
|
||||
`194d5fd0fef5044f5e82a51931a061e226445f0f53410af9dc0594c70a79e936`;
|
||||
the checker SHA-256 is
|
||||
`38839f47dbe82ad7931e5e444e124e87b64a604d9358be6d71cce7769439e57b`.
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01B`: generate a desktop Blender 5.2 catalog v1 fixture and canonical JSON from the
|
||||
inventoried fields. Do not begin Web schema v2 until that desktop artifact is verified.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the inventory manifest, checker, package command, and this status entry; restore
|
||||
M12-01A to pending and move `nextTask` back from M12-01B. No parity ledger rollback is
|
||||
needed because this enabling task did not change a family slice.
|
||||
55
docs/status/M12-01B.md
Normal file
55
docs/status/M12-01B.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# M12-01B Status
|
||||
|
||||
status: done
|
||||
task: generate a Blender 5.2 catalog v1 fixture and canonical desktop report
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The locked Blender 5.2 runtime generates a catalog definition v1 file and a `.blend`
|
||||
containing Object, Material, and World assets. A separate Blender process reopens the
|
||||
fixture and exports one canonical JSON report from the inventoried AssetMetaData fields.
|
||||
The report covers catalog hierarchy, assigned and nil catalog UUIDs, optional empty text,
|
||||
ordered tags, active tag, preferred import method, custom ID properties, and Blender's
|
||||
automatically generated Object `dimensions` metadata.
|
||||
|
||||
This is an enabling desktop baseline. It does not define Web schema v2, migration behavior,
|
||||
stable Web asset IDs, or catalog mutation parity, and it does not change a ledger slice.
|
||||
The read-only `catalog_simple_name` remains empty because Blender's RNA catalog UUID setter
|
||||
clears it outside an Asset Browser context; the fixture records that behavior rather than
|
||||
inventing a recovery name.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-catalog-v1-fixture` passed from a fresh temporary
|
||||
directory: `catalogs=3 assets=3 metadata=complete next=M12-01C`.
|
||||
- The checker verified the locked Blender version and every artifact hash, regenerated the
|
||||
CDF and `.blend`, opened the generated file in a second Blender process, and compared its
|
||||
canonical report exactly with the checked-in report. It then reopened the checked-in
|
||||
fixture in another Blender process and repeated the exact comparison.
|
||||
- Catalog definition v1 contains three deterministic UUID/path/simple-name records, including
|
||||
one nested path. The canonical report contains three assets across MATERIAL, OBJECT, and
|
||||
WORLD, preserves tag order and custom metadata, and records an uncataloged nil UUID.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- generator: `4156ec6293562d44f87ad5a268de52fbfa31a65da8263a67a2bc45bf22999307`
|
||||
- canonical exporter: `3dbccd8df54d8686aa526f7967f58fd1008336c4c5b1deed01a136ba15aa3e41`
|
||||
- checker: `c2813aa36482eff0b23ca0209f488cfe70ea11e4f39cc6c6036d6c47bbc8e17b`
|
||||
- desktop `.blend`: `8facfe82e3ca0a0605c139ef5bdcbb82d27a6953a6add4e008b68af90bc1211f`
|
||||
- catalog definition: `a72f542acb2d2239951a2b20cda0f92305e1d6d8222f84072ad1aab52e3e4c98`
|
||||
- canonical report: `6fc6def0b9d0e4f51ef40c1d87a1f17074f6340c126a01aee49e5e53271c961e`
|
||||
- manifest: `1ee0abf961b82195e5fb586eb9e59302e4f7f839615f1ebbdf5cdcba8b60accd`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01C`: define Web catalog schema v2, stable catalog/asset identity, and bounded text and
|
||||
collection limits from the verified desktop baseline.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the M12-01B generator, exporter, checker, fixture, CDF, canonical report, manifest,
|
||||
package command, and this status entry. Restore M12-01B to pending and `nextTask` to
|
||||
M12-01B. No parity ledger rollback is required.
|
||||
50
docs/status/M12-01C.md
Normal file
50
docs/status/M12-01C.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# M12-01C Status
|
||||
|
||||
status: done
|
||||
task: define Web catalog schema v2, stable identities, and budgets
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
Schema v2 represents Blender catalogs with canonical RFC4122 UUIDs and cleaned slash paths;
|
||||
hierarchy is derived from `parentPath`, matching CDF semantics instead of retaining the Web v1
|
||||
`parentId` graph. Asset identity binds Blender's `AssetWeakReference` fields
|
||||
(`asset_library_identifier`, `relative_asset_identifier`) into a SHA-256 Web ID. A Blender
|
||||
rename changes the relative identifier and therefore the stable ID, matching Blender's weak
|
||||
reference behavior rather than promising an identity Blender does not provide.
|
||||
|
||||
All text budgets use UTF-8 bytes. Catalog/tag recovery strings keep Blender's 63-byte payload
|
||||
limit, dynamic metadata permits empty strings, and catalog, asset, tag, custom-property,
|
||||
custom-array, per-string, and aggregate-text counts are bounded. The positive schema fixture
|
||||
is generated from the verified M12-01B desktop canonical report through production protocol
|
||||
code. This task does not implement v1 migration, legacy-reader policy, IndexedDB migration, or
|
||||
catalog mutation.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-catalog-v2` passed 4/4.
|
||||
- The suite binds the desktop canonical report and Blender 5.2 weak-reference source, regenerates
|
||||
schema v2 from the desktop report, parses the generated golden, and verifies deterministic
|
||||
local/external identity hashes and exposed UTF-8/collection budgets.
|
||||
- `npm --prefix web run typecheck`, `npm --prefix web run lint`, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- protocol: `0949838efb2f69466368185b80bb1d2e851672d78311fcd5270eb0814576e5d7`
|
||||
- generator: `b20e7dbd8508ca8ecf17d7da507b45b1225315bac7759c55c7b324683d660881`
|
||||
- unit suite: `73038022124ddc7e683602b47a4804297b3a64ecd4819160c7ec086d2f6190ae`
|
||||
- schema golden: `2abe279cebbffd1341dc61b1fdc5366dd1f6f42769ba36171782019ca61fb929`
|
||||
- manifest: `612892b03a689ebe19804e495bd29744634ab43a3b29fff41adc2d7a5d0b67b9`
|
||||
- Blender weak-reference source: `ace3d6468bcdb2f6190431e967495794b7afa35758fd82fc3941b1ce7d374635`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01D`: define and verify schema v1 to v2 forward migration.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the schema v2 protocol, generator, unit suite, M12-01C golden/manifest, package command,
|
||||
and this status entry. Restore M12-01C to pending and `nextTask` to M12-01C. No parity ledger
|
||||
rollback is required.
|
||||
48
docs/status/M12-01D.md
Normal file
48
docs/status/M12-01D.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# M12-01D Status
|
||||
|
||||
status: done
|
||||
task: define and verify schema v1 to v2 forward migration
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The forward migration first validates the current production schema v1 manifest and rejects
|
||||
undeclared fields before conversion. Canonical UUIDs are preserved; legacy catalog IDs map
|
||||
deterministically through RFC 4122 UUIDv5 with a fixed namespace. The v1 parent graph becomes
|
||||
Blender cleaned slash paths, and assets receive SHA-256 IDs from Blender weak-reference identity.
|
||||
|
||||
Logical revision is preserved. Author/license/tag/source bindings, optional source paths,
|
||||
preview receipts, and the complete library dependency graph survive migration. Metadata absent
|
||||
from v1 receives explicit defaults recorded in the migration report. The report binds canonical
|
||||
source/target hashes and every legacy-to-v2 catalog/asset identity mapping.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-catalog-migration` passed 3/3.
|
||||
- A schema v1 fixture with three catalogs, two asset kinds, one preview, two source bindings,
|
||||
and two dependent libraries migrated to the checked-in schema v2 golden and exact report.
|
||||
- Repeating the migration on a cloned source produced byte-equivalent semantic objects and the
|
||||
same source/target SHA-256 values. A canonical source UUID remained unchanged.
|
||||
- M12-01C regression, typecheck, lint, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- migration protocol: `6d74bc5605f94e05208eda82830192d38f88066dfc409058555a8876c785f226`
|
||||
- generator: `954d15c02d68e3f644b57c8c4c136ce09bd037a0af2012bf74b97f681c77dd60`
|
||||
- unit suite: `6b927e7a8238e4e0a77cc0fdf783b099d8add22c5f875df2299012eb32730186`
|
||||
- v1 fixture: `1cc43d181afefd63b53cb9c3626bb58195fad20187d6e534adc1ecbe65f75da5`
|
||||
- v2 fixture: `38e5d1771b3d2d63ce5e10268eac4513f2043b0cbf71ab1799c1868bc2aa97fb`
|
||||
- migration report: `57b972c1bbb9ae326c3f264c225c21546682442ff3194fbc343e1c46a2cd410a`
|
||||
- manifest: `fea9e01b51f64a7e9c15dcfc521b3e84636525ffbe0a849f7a6f1b0be2b02e9d`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01E`: define the read-only/block policy when a schema v1 reader encounters schema v2.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the migration protocol, generator, unit suite, M12-01D fixtures/report/manifest, package
|
||||
command, and this status entry. Restore M12-01D to pending and `nextTask` to M12-01D. No parity
|
||||
ledger rollback is required.
|
||||
45
docs/status/M12-01E.md
Normal file
45
docs/status/M12-01E.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# M12-01E Status
|
||||
|
||||
status: done
|
||||
task: define schema v2 behavior for a schema v1 reader
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
A native schema v1 document remains `READY`. A valid schema v2 document exposed to a v1
|
||||
reader yields a bounded `READ_ONLY` snapshot for metadata inspection, while catalog writes,
|
||||
asset writes, and save all return `ASSET_SCHEMA_DOWNGRADE_BLOCKED`. Unknown future schema
|
||||
versions return non-recoverable `PROTOCOL_MISMATCH` with no snapshot.
|
||||
|
||||
Every result binds a canonical source SHA-256. Inspection does not mutate or downgrade the
|
||||
source document, and no write path can serialize the lossy read-only projection. This task
|
||||
defines compatibility behavior only; it does not implement IndexedDB migration or catalog
|
||||
mutation parity.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-catalog-legacy-reader` passed 4/4.
|
||||
- Generated evidence covers v2 read-only metadata, all three write/save blocks, native v1
|
||||
readiness, future-schema rejection, equal source hashes, and source object immutability.
|
||||
- M12-01C/D regressions, typecheck, lint, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- compatibility protocol: `5d51029b232e03f08fc0778d4933910b2a54818b4d653fbcc185c8d764641349`
|
||||
- error contract: `309ab84d5c755a69466ddb73e4b54e87caf62cbcac0f10f34d904e9f6f4a5f34`
|
||||
- generator: `208f568db092e1712095d77ab28db92d5a1eb11fe62813b237ce466f9268fd4e`
|
||||
- unit suite: `f6477222412044e6784b64c1be83dc9bd6050fe6a955ba5430a4ea963b20dbb4`
|
||||
- compatibility report: `3c2f9241b56ad5bd742dc4152dec703bdc56eef4e6d8d60e6edf163c4571ad54`
|
||||
- manifest: `cf55ea1f9430df04fb55bf07c68c1b2099b044b0da0fdb07a7251b13c459724b`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01F`: add duplicate ID, cyclic parent catalog, overlong text, and unknown-field negatives.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the compatibility protocol, generator, unit suite, M12-01E report/manifest, error code,
|
||||
package command, and this status entry. Restore M12-01E to pending and `nextTask` to M12-01E.
|
||||
No parity ledger rollback is required.
|
||||
40
docs/status/M12-01F.md
Normal file
40
docs/status/M12-01F.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# M12-01F Status
|
||||
|
||||
status: done
|
||||
task: reject duplicate IDs, catalog cycles, oversized text, and unknown fields
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The negative matrix executes production schema v2 and migration parsers against duplicate
|
||||
catalog/asset IDs, a legacy parent cycle, an inconsistent v2 `parentPath`, 64-byte UTF-8
|
||||
simple-name/tag values, and unknown top-level/nested fields in both v1 and v2. The byte cases
|
||||
use multi-byte text to prove limits are not JavaScript character counts.
|
||||
|
||||
Every failure returns a stable asset error code. The valid v2 fixture is parsed after each
|
||||
negative case to prove the failed input did not poison parser state. This task adds negative
|
||||
evidence only and does not change catalog parity status.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-catalog-negatives` passed 2/2 with 9/9 negative cases.
|
||||
- Duplicate/cycle/parent/unknown cases returned `ASSET_MANIFEST_INVALID`; both 64-byte UTF-8
|
||||
payloads returned `ASSET_BUDGET_EXCEEDED`.
|
||||
- Typecheck, lint, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- unit suite: `3a11605ac8666c8c4e1e2e85ccfd423115915820d0de6f92bdf72dff1f01ce41`
|
||||
- negative cases: `74672fa0aec248fd5d9a265743ef4dfe4d417fce8a24622b8b3d6be2f95c8874`
|
||||
- manifest: `127b2b605ac79a891cd6ab516ee031c02624a512e1043b111bfac2ebf1d8278d`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01G`: prove an IndexedDB migration failure preserves the old transaction and index.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the M12-01F negative suite, golden/manifest, package command, and this status entry.
|
||||
Restore M12-01F to pending and `nextTask` to M12-01F. No parity ledger rollback is required.
|
||||
47
docs/status/M12-01G.md
Normal file
47
docs/status/M12-01G.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# M12-01G Status
|
||||
|
||||
status: done
|
||||
task: preserve the old catalog index when an IndexedDB migration fails
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The production IndexedDB migration prepares schema v2 with the existing schema v1 parser and
|
||||
migrator before opening a write transaction. It then rechecks the source row and atomically
|
||||
writes the v2 index and migration receipt while deleting the v1 row. A concurrent source change
|
||||
returns `REVISION_CONFLICT`; a transaction failure returns `STORAGE_TRANSACTION`.
|
||||
|
||||
The browser suite injects failures after the v2 target write and after the v1 source delete.
|
||||
After each abort it closes and reopens the database, proving the database version, complete v1
|
||||
index, unrelated legacy migration row, absent v2 row, and absent receipt are byte-for-byte
|
||||
equivalent to the baseline. A subsequent retry commits the v2 index and receipt together.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5593 npm --prefix web run test:asset-catalog-indexeddb-migration` passed the
|
||||
M12-01D production migration unit suite 3/3, the M12-01G artifact binding unit 1/1, and
|
||||
Chromium 1/1.
|
||||
- Both `AFTER_TARGET_PUT` and `AFTER_SOURCE_DELETE` returned `STORAGE_TRANSACTION`; reopening
|
||||
IndexedDB after either fault produced the exact pre-migration snapshot.
|
||||
- The successful retry preserved revision 7 and the M12-01D source/target hashes, removed only
|
||||
the v1 row, and retained the unrelated migration row.
|
||||
- Typecheck and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- production IndexedDB migration: `283a08bccb5ea301bd2aef8f01d4496972e3962f75e340479336c50e3539ba57`
|
||||
- browser suite: `82c40f38898277b4053a9654537ec9c21bc01a784d1091831e139361575a81e9`
|
||||
- artifact unit: `a4366a16f28b91b3ff213e0232308eaecd392731f27972cfa49a11568eb0feca`
|
||||
- manifest: `2596067956211698f1b7a07d9423411e2db830b72e6b78593354953a568738e7`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01H`: prove catalog ordering and asset identity survive page and Worker restarts.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the IndexedDB migration module, M12-01G unit/browser suites, manifest, package command,
|
||||
and this status entry. Restore M12-01G to pending and `nextTask` to M12-01G. No parity ledger
|
||||
rollback is required.
|
||||
47
docs/status/M12-01H.md
Normal file
47
docs/status/M12-01H.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# M12-01H Status
|
||||
|
||||
status: done
|
||||
task: preserve catalog order and asset identity across page and Worker restarts
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The production catalog index loader validates the stored schema v2 manifest, recomputes its
|
||||
canonical SHA-256, and compares it with the committed migration receipt before publishing a
|
||||
snapshot. The snapshot exposes persisted catalog order, asset order, stable asset IDs, Blender
|
||||
weak-reference components, revision, and manifest identity.
|
||||
|
||||
A page migrates the M12-01D v1 fixture, reloads, and reads the same database again. Two separate
|
||||
module Workers then open the database in sequence, with generation 1 terminated before
|
||||
generation 2 starts. All four contexts must return the same complete snapshot.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5594 npm --prefix web run test:asset-catalog-restart` passed Node 5/5 and
|
||||
Chromium 2/2, including the full M12-01G abort/reopen regression.
|
||||
- Initial page, reloaded page, Worker generation 1, and Worker generation 2 returned exactly the
|
||||
same 3 catalog IDs in order, 2 asset IDs in order, weak-reference components, revision 7, and
|
||||
manifest SHA-256.
|
||||
- A stored receipt whose target hash or revision drifts from the parsed v2 index is rejected as
|
||||
`ASSET_MANIFEST_INVALID` before a snapshot is published.
|
||||
- Typecheck, lint, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- production IndexedDB reader: `283a08bccb5ea301bd2aef8f01d4496972e3962f75e340479336c50e3539ba57`
|
||||
- restart Worker: `e6007d352555be046b89d0becd719692652ee0418cc97087bf7599155f2a538e`
|
||||
- browser suite: `7945ff38dd474a74c265594b66534a280eb69407509137e60d41f1bea3b3c19b`
|
||||
- artifact unit: `eb22b5cc852fa47d9bdd30afec2977facfca0dfa554e7ce738dc1bf8c4bf2122`
|
||||
- manifest: `59138eb83d63ae0d397b152e587fbe005d02bc2d229ee484c279b452ea3f2eae`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-01I`: bind the schema fixture, migration report, and hashes into M12-01 evidence.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the restart snapshot reader, Worker/browser/unit suites, M12-01H manifest, package
|
||||
command, and this status entry. Restore M12-01H to pending and `nextTask` to M12-01H. No parity
|
||||
ledger rollback is required.
|
||||
44
docs/status/M12-01I.md
Normal file
44
docs/status/M12-01I.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# M12-01I Status
|
||||
|
||||
status: done
|
||||
task: bind the schema fixture, migration report, and hashes into M12-01 evidence
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The M12-01 aggregate evidence binds all eight predecessor manifests in exact queue order and
|
||||
recursively verifies their declared source and artifact hashes. It separately binds the locked
|
||||
Blender 5.2 desktop canonical fixture, Web schema v2 golden and protocol, schema v1/v2 migration
|
||||
fixtures, production migration report, IndexedDB transaction implementation, and restart Worker.
|
||||
|
||||
The checker recomputes canonical source and target manifest SHA-256 values, matches them to the
|
||||
migration report, verifies revision and preserved counts, and compares the persisted restart
|
||||
catalog/asset order with the target fixture. This closes the schema/migration evidence section;
|
||||
it does not claim catalog mutation or preview parity.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5595 npm --prefix web run test:asset-catalog-m12-evidence` passed the Blender
|
||||
5.2 inventory and regenerated fixture checks, schema v2 4/4, migration 3/3, legacy-reader 4/4,
|
||||
negatives 2/2, transaction/restart Node 5/5, Chromium 2/2, and final aggregate checker.
|
||||
- The final checker reported `subtasks=8 catalogs=3 assets=2 next=M12-02A`.
|
||||
- Source revision 7 and target revision 7 canonical hashes match the production migration report;
|
||||
all A-H task links and recursive artifact hashes resolve without gaps.
|
||||
- Typecheck, lint, status consistency, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- M12-01 evidence: `2b99f64a207c2ffb966963be8a2150feef67d5bf78946939d3a49a6335b55bc3`
|
||||
- aggregate checker: `7d0d9f5390648d4af79a8da6226627edb1bf99945bae1a7b1acfb2c5e2419a8b`
|
||||
- package command: `a810fec6a9a24cad94cb01475f9529ac2f85da827d391a70ab7ddb57421003f8`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02A`: inventory Blender preview image dimensions, color space, and no-preview state.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the M12-01 aggregate evidence, checker, package command, and this status entry. Restore
|
||||
M12-01I to pending and `nextTask` to M12-01I. No parity ledger rollback is required.
|
||||
43
docs/status/M12-02A.md
Normal file
43
docs/status/M12-02A.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# M12-02A Status
|
||||
|
||||
status: done
|
||||
task: inventory Blender preview dimensions, color semantics, and no-preview state
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The machine inventory binds Blender 5.2 PreviewImage DNA, slot enum, BKE/RNA implementation,
|
||||
Blend reader, asset preview generator, render-size constants, current Web v1/v2 preview protocols,
|
||||
and two runtime fixtures. It records both ICON and PREVIEW slots, persisted dimensions/flags/pixel
|
||||
arrays, runtime-only state, and absent-pointer behavior.
|
||||
|
||||
Preview pixels are packed 32-bit RGBA with four byte components and Blender's deferred load path
|
||||
premultiplies alpha. PreviewImage has no persisted or RNA color-space field, and float access only
|
||||
divides byte components by 255 without a color transform. The inventory therefore records color
|
||||
space as unknown instead of assuming sRGB.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-preview-inventory` launched locked Blender 5.2 twice and
|
||||
reported `slots=2 rna=9 absent=3 loaded=8x8 next=M12-02B`.
|
||||
- The checked-in asset fixture reopened with Object, Material, and World `preview == null`.
|
||||
- A real 8x8 PNG loaded through Blender's preview API produced an 8x8 PREVIEW slot, 32x32 ICON
|
||||
slot, 64/256 image packed/float counts, and 1024 icon packed pixels.
|
||||
- Typecheck, lint, status consistency, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- inventory: `a4427426d94afdf1a2ccf5379d76d1797f8604a742a3f0d15bdca629272864bd`
|
||||
- checker: `c9cc83d21bac5f34c6d68cb1225dffcd92a5ec76c158ddce909b620cbbcb245c`
|
||||
- package command: `04f832a3c5773c8cc5294ecdcf175478eed9710496e48c63698d79043384e328`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02B`: define preview source/content SHA-256, MIME, dimensions, and generator identity.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the M12-02A inventory, checker, package command, and this status entry. Restore M12-02A
|
||||
to pending and `nextTask` to M12-02A. No parity ledger rollback is required.
|
||||
48
docs/status/M12-02B.md
Normal file
48
docs/status/M12-02B.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# M12-02B Status
|
||||
|
||||
status: done
|
||||
task: define preview source, content, dimensions, MIME, and generator identity
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The schema binds source bytes and encoded content as separate SHA-256/length/MIME identities.
|
||||
Encoded content additionally binds width, height, RGBA8, explicit sRGB, and alpha mode. Generator
|
||||
identity binds name, Blender version, executable hash, generator script hash, and canonical
|
||||
settings hash. A domain-separated canonical hash covers the complete record.
|
||||
|
||||
The locked Blender 5.2 generator re-encodes a real 8x8 PNG with explicit PNG RGBA8, compression,
|
||||
display, view-transform, exposure, and gamma settings. The source and content encodings have
|
||||
different hashes and lengths while a second Blender process confirms decoded pixels are exact.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-preview-identity` passed 3/3 protocol tests and the locked
|
||||
Blender generator checker.
|
||||
- Two independent generation runs matched the checked-in 513-byte content SHA-256 exactly; the
|
||||
261-byte source has a different SHA-256, and decoded pixel maximum error is zero.
|
||||
- Source bytes, content bytes, generator settings, dimensions, identity hash, and unknown fields
|
||||
each have fail-closed negative coverage.
|
||||
- Typecheck and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- protocol: `2a1d877af42424014097c669e9d44c21b27e3171be185320554693cbefcd7438`
|
||||
- generator: `753a26be90f7d97828737ebc3a4ab88275a7c655b4f9992406c7c35fba6535ce`
|
||||
- checker: `4d8ece1a5440d202f4e79a48f1f26bc75b3fb11a02d821b8ebc5aee14b11e41a`
|
||||
- unit suite: `5b7b3ccaf410d627365579fa82bf2b48fed9ef17144aad963cdbd4bb7fbd4b5a`
|
||||
- identity golden: `1b1eb8416ce4aa4d83b0dc42b9cb375f1da965e3f0cb9650991289fc619a0a7b`
|
||||
- content PNG: `ff139c4a1c5d388c78c5168dfd3272e80ea0d1b15b3743e29a38cd908e8c70e7`
|
||||
- manifest: `096f125461b963ee2c414f98f6bb00f02034a380a0cc9c43e0d84754324adb17`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02C`: enforce MIME, pixel, byte, and compression-ratio budgets before preview decode.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the preview identity protocol, generator/checker, unit suite, M12-02B goldens, package
|
||||
command, error code, and this status entry. Restore M12-02B to pending and `nextTask` to M12-02B.
|
||||
No parity ledger rollback is required.
|
||||
46
docs/status/M12-02C.md
Normal file
46
docs/status/M12-02C.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# M12-02C Status
|
||||
|
||||
status: done
|
||||
task: enforce MIME, pixel, byte, and compression-ratio budgets before preview decode
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The schema 1 pre-decode planner accepts only the M12-02B content identity and an exact
|
||||
`ArrayBuffer` payload. It checks the 16 MiB encoded-byte limit before hashing, then binds the
|
||||
content SHA-256, declared MIME to the PNG/WebP container header, header dimensions to the identity,
|
||||
and dimensions to pixel and RGBA8 decoded-byte budgets. The final gate limits decoded-to-encoded
|
||||
compression ratio to 100 before any browser image decoder or decoded allocation is invoked.
|
||||
|
||||
PNG dimensions come only from a valid signature and first IHDR header. WebP dimensions come only
|
||||
from a size-bound RIFF/WEBP VP8X, VP8L, or VP8 header. Unsupported headers, content drift, and
|
||||
dimension drift fail closed; a rejected input does not affect a following valid preview plan.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:asset-preview-decode-budget` passed 5/5 M12-02B/C protocol tests.
|
||||
- The positive 513-byte Blender-generated PNG plans 64 pixels and 256 decoded RGBA8 bytes without
|
||||
calling a decoder.
|
||||
- Eight negative cases cover payload hash/length drift, MIME mismatch, dimension mismatch,
|
||||
over-width/height and decoded-byte budget, compression ratio, encoded-byte budget, and corrupt
|
||||
container signature. The checked-in small preview passes immediately after each rejection.
|
||||
- `npm --prefix web run typecheck`, `npm --prefix web run lint`, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- decode protocol: `3d1c491af2503a7a6012541ed43400d680f8e666cc12a54db284aeb6ac18ff63`
|
||||
- unit suite: `1a65df86d568ae8defd7cd9242f426ac900d92637eb3bed2cbb4a0fae2e86c20`
|
||||
- package commands: `8563916637fc3cb29b53432ae9b80d1dcf6269f2f5c092b595e72c6b0ada55ab`
|
||||
- manifest: `934b3ca29d905ad2f5c46f35acff4cf4b9ea291c423fb3aad4afe7e9f10e6244`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02D`: commit a catalog preview reference only after its content-addressed payload is durably
|
||||
written to OPFS.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the preview decode planner, unit suite, M12-02C manifest, package command, and this status
|
||||
entry. Restore M12-02C to pending and `nextTask` to M12-02C. No parity ledger rollback is required.
|
||||
49
docs/status/M12-02D.md
Normal file
49
docs/status/M12-02D.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# M12-02D Status
|
||||
|
||||
status: done
|
||||
task: commit a catalog preview reference only after verified OPFS persistence
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The production coordinator first runs the M12-02C pre-decode gate, writes the content-addressed
|
||||
preview to OPFS, reads it back, and repeats identity verification. Only then may one IndexedDB
|
||||
transaction advance the catalog revision and write both the v2 preview reference and an M12-02D
|
||||
head receipt. The receipt binds project, asset, base/current revision, base/current manifest hash,
|
||||
preview identity, payload identity, and OPFS path.
|
||||
|
||||
The transaction rereads and compares the complete source catalog row before publication. A stale
|
||||
revision or changed row returns `REVISION_CONFLICT`; OPFS and transaction faults return
|
||||
`STORAGE_TRANSACTION`. An OPFS payload left by a failure is unreferenced, never presented as a
|
||||
committed catalog preview.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5596 npm --prefix web run test:asset-preview-opfs-commit` passed the artifact unit
|
||||
test 1/1 and the real Chromium OPFS/IndexedDB test 1/1.
|
||||
- `BEFORE_OPFS_WRITE`, `AFTER_OPFS_WRITE`, and `AFTER_CATALOG_PUT` faults all preserved the complete
|
||||
revision 7 catalog and left no commit receipt. Only the latter two left an unreferenced payload.
|
||||
- Success persisted and reread the 513-byte payload before advancing the catalog to revision 8;
|
||||
closing and reopening IndexedDB reproduced the same preview and receipt and rehashed OPFS bytes.
|
||||
- `npm --prefix web run typecheck`, `npm --prefix web run lint`, and `git diff --check` passed.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- commit coordinator: `36418e480b108eb885b5d8da6633174ed1face1fa62742a64372a45280e727a2`
|
||||
- Chromium suite: `043b9b06d4c0275938cc1d4f9837df95f58f281130f3c0f2b90c10540244592e`
|
||||
- unit suite: `f489a1d9a4c5fb24a99bce6d31841534c7cf3981b53076a0d9e19d106e9d0d74`
|
||||
- manifest: `34fe6c6ab097e58f7b648dd84cb919ecb407a5742e387c513bb3ed53db50eed6`
|
||||
- package commands: `7363a8a03cb5f6b1d6bf40d8eabc90b9d48e91aeb4787b175deb4f242c676243`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02E`: deduplicate identical preview content without allowing different asset metadata to
|
||||
overwrite the shared payload.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the OPFS/catalog commit coordinator, Chromium and unit suites, M12-02D manifest, package
|
||||
command, and this status entry. Restore M12-02D to pending and `nextTask` to M12-02D. No parity
|
||||
ledger rollback is required.
|
||||
45
docs/status/M12-02E.md
Normal file
45
docs/status/M12-02E.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# M12-02E Status
|
||||
|
||||
status: done
|
||||
task: deduplicate identical preview content without merging asset metadata
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
Two catalog assets with distinct Blender weak-reference identities and distinct catalog metadata
|
||||
may bind the same verified preview content. The M12-02D coordinator keys OPFS storage only by the
|
||||
content SHA-256, while catalog entries and preview identity hashes remain asset-specific. A second
|
||||
commit of identical bytes reuses the existing payload after a full readback/hash check.
|
||||
|
||||
No catalog metadata is derived from or stored inside the shared payload record. Each transaction
|
||||
updates only its targeted asset's preview field and advances the guarded catalog revision.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5597 npm --prefix web run test:asset-preview-dedup` passed the artifact unit test
|
||||
1/1 and real Chromium OPFS/IndexedDB test 1/1.
|
||||
- Two distinct asset/identity hashes committed at revisions 8 and 9; the second commit reported
|
||||
`deduplicated=true` and the OPFS content directory contained exactly one final file.
|
||||
- Both catalog entries referenced the same 513-byte/hash payload while their complete non-preview
|
||||
metadata remained byte-for-byte equal to their different baseline records.
|
||||
- Database reopen reproduced revision 9, the second asset head receipt, and the shared preview;
|
||||
stored payload bytes rehashed to the declared content digest.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- Chromium suite: `4e53b7a35eb109b152bd6dc0c3348dcb08879d17619968d37fc761c67aa38b40`
|
||||
- unit suite: `e023fdd33e0f40c1331dfdd73cd287dc684256b9d134971ab17db8cfe2a83835`
|
||||
- manifest: `7d25f1d8335481795257c643c8589d1607a865634b27a7e5d145a57ce2a92a62`
|
||||
- package commands: `5a83676e821bb768f6d3e282ea4728413cf84c5f3d57672fc664fac3883873e5`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02F`: quarantine corrupt preview content while keeping asset metadata readable.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the deduplication Chromium/unit suites, M12-02E manifest, package command, and this status
|
||||
entry. Restore M12-02E to pending and `nextTask` to M12-02E. The shared coordinator and parity
|
||||
ledger do not require rollback.
|
||||
49
docs/status/M12-02F.md
Normal file
49
docs/status/M12-02F.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# M12-02F Status
|
||||
|
||||
status: done
|
||||
task: quarantine corrupt preview content while keeping asset metadata readable
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The preview inspector validates payload byte length and SHA-256 independently from the catalog.
|
||||
Healthy bytes return `READY`. Missing or mismatched bytes return a structured
|
||||
`ASSET_SOURCE_HASH_MISMATCH` quarantine receipt; present corrupt bytes are copied, verified, and
|
||||
then removed from the content-addressed namespace before the receipt is published.
|
||||
|
||||
The catalog row and its preview provenance are not rewritten on corruption. Consumers receive the
|
||||
complete parsed asset metadata together with `preview=null/data=null`, so a broken optional image
|
||||
cannot make the asset name, type, catalog, license, tags, or source metadata unreadable. A matching
|
||||
quarantine receipt is stable across database reopen.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5598 npm --prefix web run test:asset-preview-quarantine` passed the artifact unit
|
||||
test 1/1 and real Chromium OPFS/IndexedDB test 1/1.
|
||||
- The checked-in 513-byte PNG first returned `READY`; same-length byte tampering then returned
|
||||
`QUARANTINED` with a different actual SHA-256 and stable error code.
|
||||
- The corrupt file was absent from the SHA-256 namespace and present as a verified 513-byte file in
|
||||
the quarantine directory. Database reopen returned the exact same receipt without reading it.
|
||||
- Catalog revision 8, the target asset metadata/reference, and the unrelated asset all remained
|
||||
exactly unchanged.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- quarantine protocol: `a5f3330dbd16d9f578d85d9504c980fffea85b834b77340a307ce21ce9b1cb04`
|
||||
- Chromium suite: `d8e1d0741765e8f8bfd47b45cf03213d8629efdbbf77dfd33846785a3ec80c27`
|
||||
- unit suite: `79c836c7a3be4e9f305a962775444c766577cca87fa6d1698811e75eb21f2d9a`
|
||||
- manifest: `d1a9feeb98c5332b1a14a14c5b813d75a29f172601590e1b5cde254c5059a7c5`
|
||||
- package commands: `77b5cd3d3af68ac390d8fbdb9b2f64764fb4521a1d2bf22cd8a89e40d69424f6`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02G`: reclaim a preview payload only after its final project-scoped reference is removed,
|
||||
without touching another project's copy.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the quarantine protocol, Chromium/unit suites, M12-02F manifest, package command, and this
|
||||
status entry. Restore M12-02F to pending and `nextTask` to M12-02F. Catalog and parity ledger data
|
||||
do not require rollback.
|
||||
47
docs/status/M12-02G.md
Normal file
47
docs/status/M12-02G.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# M12-02G Status
|
||||
|
||||
status: done
|
||||
task: reclaim preview payload only after the final project-scoped reference is removed
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
Preview reference removal is a guarded catalog mutation: it validates the v2 row, checks the exact
|
||||
base revision, clears only the target asset's preview, advances revision, and commits a manifest
|
||||
hash receipt. Payload reclamation happens only after that reference transaction has completed and
|
||||
only when the committed manifest has zero remaining references to the content hash.
|
||||
|
||||
OPFS payload ownership remains project-scoped (`projects/<projectId>/assets/sha256/...`). Therefore
|
||||
collection can target only the requested project's file and cannot delete an equal-hash payload
|
||||
owned and referenced by another project. Non-preview asset metadata is preserved.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5599 npm --prefix web run test:asset-preview-reference-gc` passed the artifact unit
|
||||
test 1/1 and real Chromium OPFS/IndexedDB test 1/1.
|
||||
- Project A began with two references to one deduplicated payload. Removing the first at revision
|
||||
9->10 returned `RETAINED`, one remaining reference, and kept the file.
|
||||
- Removing the final reference at revision 10->11 returned `COLLECTED` and removed project A's
|
||||
payload. Project B's equal-hash payload remained present and its preview returned READY/513 bytes.
|
||||
- Reopening project A reproduced revision 11, two null preview references, and unchanged metadata.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- reference GC: `76b9d8ccd3e7992356f33adc694001f9b0ff364788234389eacdb09198d1415e`
|
||||
- Chromium suite: `2e9e9b47883997092c5afb0fb7859a484754764de19006e24a8ff2bdeb24f35a`
|
||||
- unit suite: `c5de3122b5d8aab17daf0179cb4f5bb0b5d299408818849cbe7b18e40a47706e`
|
||||
- manifest: `3449f2ea9488f66ea5e3f5f2423413e8e290d8ffed3b3d941bdeee3f76addd0a`
|
||||
- package commands: `7d1db0932fbe7405ffdbd44b770ce7bf9815b9dfb829c1906a06bfff635ae702`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-02H`: compare desktop/browser preview pixels with explicit metrics and pass both main-thread
|
||||
and Offscreen display paths.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the reference-GC protocol, Chromium/unit suites, M12-02G manifest, package command, and this
|
||||
status entry. Restore M12-02G to pending and `nextTask` to M12-02G. Catalog and parity ledger data
|
||||
do not require rollback.
|
||||
51
docs/status/M12-02H.md
Normal file
51
docs/status/M12-02H.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# M12-02H Status
|
||||
|
||||
status: done
|
||||
task: compare desktop/browser preview pixels and pass main-thread and Offscreen display paths
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: false
|
||||
parityStateChange: true
|
||||
|
||||
## Scope
|
||||
|
||||
The display path validates the content identity, encoded SHA-256, image header, dimensions, decoded
|
||||
byte budget, and compression ratio before invoking a decoder. It then decodes with disabled browser
|
||||
color conversion and alpha premultiplication, draws with copy composition and no smoothing, and
|
||||
publishes a receipt bound to the identity, content, backend, dimensions, RGBA8 hash, and alpha count.
|
||||
|
||||
Blender 5.2 deterministically regenerates the 8x8 `SRGB/RGBA8/STRAIGHT` reference. Main-thread
|
||||
Canvas2D and a dedicated Worker OffscreenCanvas execute the same production display implementation
|
||||
and match all 256 reference bytes. This closes only the bounded preview display slice; arbitrary
|
||||
profiles, Asset Browser UI, and library operations remain outside this task.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `WEB_TEST_PORT=5600 npm --prefix web run test:asset-preview-display` passed the evidence unit 1/1,
|
||||
Blender 5.2 desktop regeneration/hash checker, and Chromium main-thread/Offscreen test 1/1.
|
||||
- Desktop, main-thread, and Offscreen output SHA-256 was
|
||||
`c2ff81750b41193ce1a06d47d0ff18168a756136dbf0f2586cd0638d4bf0ef00`.
|
||||
- Both browser paths reported 8x8, 256 RGBA8 bytes, 64 non-transparent pixels, and closed bitmap
|
||||
ownership. Their MAE, RMS, P95, maximum channel error, bad-pixel ratio, and alpha coverage delta
|
||||
were zero; foreground IoU was 1.
|
||||
- A one-channel mutation returned `BLOCKED/RENDER_REFERENCE_MISMATCH` under the same metric contract.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- display runtime: `e4a46a40291427afc185caf016b02120ea71639ab4ab4ac250a5c3de28ee8d28`
|
||||
- Offscreen Worker: `6322562f54b608b7eaac4ca3bc0f8d861f47bb8e9b37b3c2ae3d61163108724f`
|
||||
- desktop checker: `d03d766e69ea0547be2c247b5d7ef8fd5ceab6b399dc996eba711fa0cac0ca54`
|
||||
- desktop report: `cdf841f5d27362f6df380772ada8b7b1427d051a8b46b5c2c20aab0b597c25d0`
|
||||
- Chromium suite: `340d386c6a854c44cd6f6207e3699f870b8ded2aada4747afd6ff1103c719520`
|
||||
- unit suite: `f10a05900c4d1282251f7a76e7c413a18602910f55fe8400f1713f548eba3873`
|
||||
- manifest: `30e6e4b6f53e07768d2ae8d853fe08a5c0782f8608320a72e41db77f6d87f2c4`
|
||||
- package commands: `2510242fbc0c2da787f558365733a4db6faf9f490e2594f69dc978920ed09f21`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-03A`: inventory the data-block and dependency closures for append, link, and library override.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the display runtime, Worker, desktop checker/report, unit/Chromium suites, M12-02H manifest,
|
||||
package command, completed ledger slice, and this status entry. Restore M12-02H to pending and the
|
||||
queue to M12-02H.
|
||||
55
docs/status/M12-03A.md
Normal file
55
docs/status/M12-03A.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# M12-03A Status
|
||||
|
||||
status: done
|
||||
task: inventory append, link, and library override data-blocks and dependency closures
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The machine inventory separately records Append, Link, and Library Override entry points,
|
||||
selectable data-block roots, non-root ID roles, direct/indirect/transitive/embedded dependency
|
||||
classes, terminal ownership actions, and override reference/hierarchy/property-operation fields.
|
||||
|
||||
The exact closure is an actual Blender Main ID pointer graph walked by
|
||||
`BKE_library_foreach_ID_link`, not a hard-coded Object-to-Mesh table. The inventory therefore
|
||||
preserves cross-library and override-only dependency distinctions needed by later ownership and
|
||||
invalidation contracts. It does not perform a library mutation or add a parity slice.
|
||||
|
||||
## Findings
|
||||
|
||||
- Blender 5.2 exposes 36 selectable library data-block collections. Screen and WorkSpace are
|
||||
append-only; Library is source/transitive metadata, while embedded Key IDs follow their owner.
|
||||
- Append can keep linked, reuse local, make local, or copy local after classifying direct,
|
||||
indirect, and liboverride-only dependencies. Recursive cross-library localization is explicit.
|
||||
- Link retains the source `Library`, direct `ID_TAG_EXTERN`, indirect `ID_TAG_INDIRECT`, and
|
||||
transitive parent-library relationships without localization.
|
||||
- Override retains a linked reference alongside a local override and hierarchy root. Its 17 RNA
|
||||
fields cover reference/root flags, property paths, operations, and local/reference subitems.
|
||||
- Current Web metadata represents only library source, dependency IDs, and read-only state; eight
|
||||
per-ID ownership, override, and invalidation semantics remain absent and mutation stays blocked.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:library-operation-inventory` passed with
|
||||
`roots=36 appendOnly=2 operations=3 overrideFields=17 gaps=8 next=M12-03B`.
|
||||
- The checker binds nine Blender/Web source files and one real nested-library fixture by SHA-256,
|
||||
verifies link/append action and dependency-walk tokens, launches Blender 5.2, and compares the
|
||||
actual append/link operator properties, library collections, nested source, and override RNA.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- inventory: `0dcb16233b52b3c0be2373f489d6bf3c771c9d6564993ff98b5d63dcd322fef7`
|
||||
- checker: `1581490d1923578293202d27a1c379eb2a8c5e13be418547d148cf09c6a783fd`
|
||||
- package commands: `a7cf339b0cf6fab17ef63e9394b2e540af60327f7bf1f7fe95823d182e0d3e63`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-03B`: define source library ID, owner, read-only state, and invalidation token for all three
|
||||
operations.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the library operation inventory, checker, package command, and this status entry. Restore
|
||||
M12-03A to pending and the queue to M12-03A. No parity ledger rollback is required.
|
||||
47
docs/status/M12-03B.md
Normal file
47
docs/status/M12-03B.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# M12-03B Status
|
||||
|
||||
status: done
|
||||
task: define source library identity, owner, read-only state, and invalidation tokens
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
Schema 1 derives `sourceLibraryId` from a canonical source locator and source `.blend` SHA-256.
|
||||
Each operation binding then fixes one source data-block, its operation-specific owner and read-only
|
||||
state, source generation/revision, dependency-closure SHA-256, and a hash-derived invalidation token.
|
||||
|
||||
APPEND owns a writable local Main ID. LINK remains owned by the matching source library and is
|
||||
fully read-only. LIBRARY_OVERRIDE owns a writable local override while retaining a read-only linked
|
||||
reference and hierarchy root. This is a pure protocol task and does not mutate Blender Main.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:library-operation-identity` passed 6/6.
|
||||
- Stable source identity changes when either locator or source bytes change.
|
||||
- APPEND/LINK/LIBRARY_OVERRIDE produce distinct invalidation tokens for the same source root and
|
||||
reject owner substitution, read-only drift, reference substitution, unknown fields, and forgery.
|
||||
- Source library/hash, generation, revision, and dependency closure drift each return
|
||||
`REVISION_CONFLICT`; the unchanged state revalidates the original binding exactly.
|
||||
- The one initial test expectation was corrected to the actual fail-fast exact-schema code, then
|
||||
the complete suite was rerun successfully.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- protocol: `5371133bd98e05935cd75bab582abedec32a36559af8d212f0bc8a534ef19451`
|
||||
- golden bindings: `b39c0f26697ac688c1203ae4e3e27d8a02686c7c9da9afc438c89a0b4d69370f`
|
||||
- unit suite: `0e5b2c82d481180eb8eb22de16ad8cdef5e58fa7423c26011faaffbac788e547`
|
||||
- manifest: `f388aedb9c0901932cf90c058f2f2b83259d9797cd6b144566a25e37a348c64b`
|
||||
- package commands: `48cf41f0d0041bf4f497bc2a454cfa9469874eded1775cea50fe3249d4e0b59e`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-03C`: create a desktop single-Object append fixture and record stable Object, Mesh, Material,
|
||||
and Image mappings.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the library operation identity protocol, golden, unit suite, manifest, package command, and
|
||||
this status entry. Restore M12-03B to pending and the queue to M12-03B. No parity ledger rollback is
|
||||
required.
|
||||
50
docs/status/M12-03C.md
Normal file
50
docs/status/M12-03C.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# M12-03C Status
|
||||
|
||||
status: done
|
||||
task: create a desktop single-Object append fixture and stable dependency mapping
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: true
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
Blender 5.2 creates a source library containing one Object whose dependency closure is one Mesh,
|
||||
one Material, and one packed Image. A clean desktop Main appends only the Object, saves the target,
|
||||
reopens it, and exports the same canonical graph before and after reopen.
|
||||
|
||||
The fixture records stable source-to-local mappings, ownership, read-only state, dependency edges,
|
||||
geometry/UV/material structure, and packed-image metadata and Float32 pixel SHA-256. Container hashes
|
||||
remain session-bound Blender artifacts; the canonical semantic report must reproduce exactly.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `npm --prefix web run test:library-append-desktop` passed.
|
||||
- The generator appended one selected Object and resolved four stable local IDs with three dependency
|
||||
edges.
|
||||
- Object, Mesh, Material, and Image all have null library pointers, no library override, writable
|
||||
`LOCAL_MAIN` ownership, and identical source/local stable names.
|
||||
- Save/reopen preserved 4 vertices, 4 edges, 1 polygon, 4 loops, `UVMap`, the material slot, packed
|
||||
2x2 sRGB RGBA image metadata, and Float32 pixel SHA-256
|
||||
`6f0f8c231d65149e69e6ed12d370bcfa095ef90adc202065492ea8c8ef17e45a`.
|
||||
- A new temporary source/target pair reproduced the canonical report after normalizing only the
|
||||
session-bound `.blend` container hashes.
|
||||
|
||||
## Artifact Hashes
|
||||
|
||||
- generator: `b9d8e3bd24966b0d7d419382d7ef0b35ae8def9ee2c2236dfd3ad1a90aebe66f`
|
||||
- checker: `6f8cc0d51be19423cf6fb7203c3c16f8d27e0fbb3b5b357bad5dec6c5ceb432d`
|
||||
- source `.blend`: `5b60d02926efd588a6ca300ba31414cdf37dbc48786c17b383a70319057c0606`
|
||||
- target `.blend`: `5cde4927f47e33f0338de38184ce5ba971825fcefd1d8dc6feb48d41a6cdb60c`
|
||||
- desktop report: `b1d7b8b9e832d18d69081f63981062800e0f00f0c9aec025b18274510ed76e2a`
|
||||
- manifest: `cbfbd8c919125108334dd24925b9ef8e69880983515e56841e6ead4a2b182aed`
|
||||
- package commands: `b68f2bce48fcd42e4cc1399b47ba33c35495248a6c0405c2280b5b73e3ce581a`
|
||||
|
||||
## Next Task
|
||||
|
||||
`M12-03D`: append the same closure into WASM Main with one transaction and local ownership.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the desktop append generator/checker, source and target fixtures, golden report/manifest,
|
||||
package command, and this status entry. Restore M12-03C to pending and the queue to M12-03C. No
|
||||
parity ledger rollback is required.
|
||||
52
docs/status/M12-03D.md
Normal file
52
docs/status/M12-03D.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# M12-03D Status
|
||||
|
||||
status: done
|
||||
task: append one dependency closure through WASM Main in one transaction
|
||||
updated: 2026-08-17 America/New_York
|
||||
enablingTask: false
|
||||
parityStateChange: false
|
||||
|
||||
## Scope
|
||||
|
||||
The browser Worker validates a source-hash-bound APPEND binding and sends one Object closure to
|
||||
the authoritative Blender Main. Blender's native link/append context recursively imports the
|
||||
Object, Mesh, Material, and packed Image, verifies that every resulting ID is local and writable,
|
||||
and publishes one SceneIR revision. The existing Main history transaction is used for rollback and
|
||||
undo/redo; the source is never treated as a linked read-only snapshot.
|
||||
|
||||
## Evidence
|
||||
|
||||
- `EM_CACHE=/home/mes123456/workinf_Blender_Wasm/.emcache cmake --build build_web_blender6 --target web_engine -- -j2` passed;
|
||||
the generated module exports `_web_engine_append_library_object`.
|
||||
- `npm --prefix web run typecheck` passed.
|
||||
- `WEB_TEST_PORT=5194 npm --prefix web run test:library-main-append` passed in Chromium.
|
||||
- The test opens a clean `.blend`, appends the desktop fixture closure through `WebEngineClient`,
|
||||
verifies `transactionCount=1`, four `LOCAL_MAIN` mappings, stable Object/Mesh/Material/Image
|
||||
IDs, the material-to-image dependency, and a single revision increment.
|
||||
- A stale base revision returns `REVISION_CONFLICT`; a second append colliding with the local IDs
|
||||
returns `ASSET_MANIFEST_INVALID` without changing the revision. Undo removes the closure, redo
|
||||
restores it, and a saved buffer reopens with the same local image and Object dependency.
|
||||
- The Worker closure check accepts both the reader's `material.imageIds` representation and the
|
||||
Blender node-level `imageId` representation; it does not infer ownership from a preview.
|
||||
|
||||
## Artifact hashes
|
||||
|
||||
- test: `7130453cbc81f22eb1bcf598ff3745672ac8177dccb11cef667f5b68b43e87c6`
|
||||
- worker: `e3bb430e401144bf17cdcbd0de13cde0a4f904f1f9ff9d5b10a73d90f0d4c648`
|
||||
- protocol: `bfd98561cbe797d7b8f07c92c53a25460c839a64ab7222b7795cf58d54dff8d7`
|
||||
- source `.blend`: `5b60d02926efd588a6ca300ba31414cdf37dbc48786c17b383a70319057c0606`
|
||||
- clean target `.blend`: `9b1ecbcc3d7f8079ee5469de64193ffcaa0a7b01e0f2ac340bbb18aa88734a63`
|
||||
- WASM JS: `9c831d0351ac9d0714cce3b1da748cba416ced3086e3c59595cf24ac4da459ed`
|
||||
- WASM binary: `7821f408687e455c6f4e185fc3741c199c1c60d409836a2fe1b32f521d81e0ea`
|
||||
- Main append API: `5a71260c542fa559f73c6b82e23e72d39bd2844f5ebe12c6edc809a49d79791b`
|
||||
- Main append implementation: `d0c484ab62e6ec051c8c2f67c49d750a456578aaccc2aa4f461026307af0db95`
|
||||
|
||||
## Next task
|
||||
|
||||
`M12-03E`: append undo/redo/save/reopen and the desktop canonical report must agree.
|
||||
|
||||
## Rollback
|
||||
|
||||
Remove the M12-03D Worker/e2e test, package command, WASM append export and Main append entrypoint,
|
||||
restore the material closure check, and move the machine queue back to `M12-03D`. No V1 release
|
||||
ledger rollback is required.
|
||||
@@ -1,8 +1,8 @@
|
||||
# N-019 灯光与渲染
|
||||
|
||||
状态:`BLOCKED`(Camera/Light/World/Scene metadata、Camera/Light/World 有界 Main 写回、
|
||||
Three exposure/shadow 映射和一条有界 Blender reference 图像指标闭环已落地;Scene 颜色管理
|
||||
writer、全域渲染等价和高级后端仍未实现)
|
||||
Three exposure/shadow 映射、一条有界 Blender reference 图像指标和 Render 故障生命周期闭环
|
||||
已落地;Scene 颜色管理 writer、全域渲染等价和高级后端仍未实现)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -49,6 +49,10 @@ writer、全域渲染等价和高级后端仍未实现)
|
||||
绑定同一 provenance 并公开 output MIME/byte length/output SHA-256/result SHA-256。真实
|
||||
loopback server 由 Blender 5.2 headless 打开 fixture 并输出 PNG;source、settings、build
|
||||
和 output 篡改均在提交或消费前结构化拒绝。
|
||||
14. M11-14 Render fault lifecycle:真实 Eevee `.blend` 在 Chromium WebEngine/Main 打开后生成
|
||||
非空 WebGL RGBA8 输出;预取消 open 返回 `OPEN_CANCELLED` 且不替换当前 Main,Worker
|
||||
generation 2 重开保持 scene identity 和输出 SHA-256。纹理 aggregate budget 超限不替换
|
||||
已加载资源,`GPUTextureStore.dispose()` 返回正数 byte/resource 回执并归零所有 owned texture。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
@@ -75,5 +79,6 @@ WEB_TEST_PORT=5548 npm --prefix web run test:render-resource-budget
|
||||
WEB_TEST_PORT=5552 npm --prefix web run test:render-reference
|
||||
WEB_TEST_PORT=5556 npm --prefix web run test:render-routing
|
||||
WEB_TEST_PORT=5560 npm --prefix web run test:server-render-job
|
||||
WEB_TEST_PORT=5592 npm --prefix web run test:render-compositor-media-recovery
|
||||
WEB_TEST_PORT=5319 npm --prefix web run test:e2e -- --grep "N-019 Scene exposure"
|
||||
```
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# N-020 Compositor
|
||||
|
||||
状态:`BLOCKED`(GraphIR、有界 CPU executor、真实 Main graph reader、四节点 WebGPU golden
|
||||
与 Unsupported 全图执行门已落地;完整节点参数映射、通用 WebGPU、HDR golden 和服务端执行未实现)
|
||||
状态:`BLOCKED`(GraphIR、有界 CPU executor、真实 Main graph reader、四节点 WebGPU golden、
|
||||
Unsupported 全图执行门和故障生命周期闭环已落地;完整节点参数映射、通用 WebGPU、HDR golden
|
||||
和服务端执行未实现)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -35,6 +36,10 @@
|
||||
完整 graph;即使 Unsupported 节点未连接到 Composite,也返回
|
||||
`COMPOSITOR_NODE_UNSUPPORTED`。真实 Blender 5.2 Main fixture 的 Glare node name/type/
|
||||
`blenderType`、graph JSON 与 revision 在失败前后完全不变;预置 cache 不能绕过该门。
|
||||
10. M11-14 Compositor fault lifecycle:真实 Main graph 的 CPU executor 周期取消返回
|
||||
`COMPOSITOR_CANCELLED`,8193 像素超尺寸输入在分配/缓存前返回
|
||||
`COMPOSITOR_BUDGET_EXCEEDED`。generation 2 重开保持 GraphIR identity 与 Float32 output
|
||||
SHA-256,LRU `clear()` 返回已释放字节并把 entries/bytes 归零。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
@@ -54,4 +59,5 @@ WEB_TEST_PORT=5320 npm --prefix web run test:e2e -- --grep "N-020 CPU compositor
|
||||
npm --prefix web run test:compositor-main-reader
|
||||
WEB_TEST_PORT=5562 npm --prefix web run test:compositor-node-golden
|
||||
WEB_TEST_PORT=5565 npm --prefix web run test:compositor-unsupported-gate
|
||||
WEB_TEST_PORT=5592 npm --prefix web run test:render-compositor-media-recovery
|
||||
```
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
状态:`BLOCKED`(strip schema、真实 Main reader、确定性时间编辑、长媒体有界索引/seek/cache、
|
||||
三类实际 runtime codec probe、source/decode-bound 首帧 proxy cache、三类迟到结果 revision
|
||||
gate、最终编码 server-export 路由和实时 AudioContext 恢复门已落地;Main 写回、完整媒体
|
||||
解码/渲染、音频波形、A/V sync、实际混音和真正服务端编码 job 仍未实现)
|
||||
gate、最终编码 server-export 路由、实时 AudioContext 恢复门和媒体故障生命周期闭环已落地;
|
||||
Main 写回、完整媒体解码/渲染、音频波形、A/V sync、实际混音和真正服务端编码 job 仍未实现)
|
||||
|
||||
## 已验证切片
|
||||
|
||||
@@ -63,6 +63,10 @@ gate、最终编码 server-export 路由和实时 AudioContext 恢复门已落
|
||||
mute 将 gain 归零,unmute 恢复 0.75,close 再归零并断开节点。API/构造器缺失与 resume
|
||||
failure 分别稳定返回 `SEQUENCER_AUDIO_DEVICE_UNAVAILABLE` 和
|
||||
`SEQUENCER_AUDIO_RESUME_FAILED`,不会误报输出启用。
|
||||
17. M11-14 Media fault lifecycle:真实 H.264 先通过 HTMLMedia probe 并解出 8x8 RGBA8 frame;
|
||||
预取消 proxy decode 返回 `SEQUENCER_CANCELLED` 且不发布 payload。低于一帧的 cache budget
|
||||
返回 `SEQUENCER_BUDGET_EXCEEDED` 且 entries/bytes 保持 0;首会话 clear 返回正数释放字节,
|
||||
重建会话后 source/decode/profile identity 和 payload SHA-256 保持不变。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
@@ -86,4 +90,5 @@ WEB_TEST_PORT=5573 npm --prefix web run test:sequencer-media-cache
|
||||
WEB_TEST_PORT=5576 npm --prefix web run test:sequencer-media-revision
|
||||
WEB_TEST_PORT=5579 npm --prefix web run test:sequencer-final-export
|
||||
WEB_TEST_PORT=5586 npm --prefix web run test:sequencer-audio-recovery
|
||||
WEB_TEST_PORT=5592 npm --prefix web run test:render-compositor-media-recovery
|
||||
```
|
||||
|
||||
@@ -3,6 +3,97 @@
|
||||
状态:`BLOCKED`(asset catalog、来源/许可证元数据、真实 Main library inventory、库依赖与
|
||||
IO 安全门已落地;Append/Link/Override Main、非 GLB 本地导入和跨桌面重导入未实现)
|
||||
|
||||
## 完整对标盘点基线
|
||||
|
||||
M12-01A 已从 Blender 5.2 DNA、RNA、Blend IO、AssetCatalog/CDF 源码及真实 RNA runtime 盘点
|
||||
14 个 `AssetMetaData` DNA 字段、10 个公开 RNA 属性、3 个 `AssetTag` 存储字段和 3 个 catalog
|
||||
持久语义字段。M12-01B 随后用锁定 Blender 5.2 生成 3 条 CDF v1 catalog、Object/Material/World
|
||||
资产和 canonical JSON,并由独立 Blender 新进程精确重开复验。M12-01C 以 Blender UUID/path
|
||||
和 AssetWeakReference 定义 Web schema v2 stable identity,并冻结 UTF-8 文本及条目预算。三项均为
|
||||
`enablingTask`。M12-01D 又完成 v1→v2 无损前向迁移,保留 revision、source、preview 与 library
|
||||
graph,并输出确定性 ID mapping/hash report。四项只冻结完整对标输入与迁移,不增加本节已验证
|
||||
slice。M12-01E 又固定 v2 对 v1 reader 的 read-only/write-block/future-reject 策略。五项仍不改变
|
||||
`parityStatus=BLOCKED`。
|
||||
|
||||
M12-01F 已补齐 duplicate catalog/asset ID、legacy parent cycle、v2 parentPath drift、UTF-8
|
||||
simple-name/tag budget 和 v1/v2 unknown-field 共 9 类稳定负例;该 enabling evidence 不改变 slice。
|
||||
|
||||
M12-01G 已让 v1→v2 IndexedDB index migration 在同一 readwrite transaction 中提交 target、
|
||||
receipt 和 source delete;写 target 后或删 source 后注入失败均 abort,关闭并重开后旧 v1 index、
|
||||
无关 migration 行和数据库版本精确不变。该 enabling evidence 仍不改变 slice。
|
||||
|
||||
M12-01H 又证明初始页面、reload 和两个顺序重建的独立 Worker 读取相同 catalog/asset 顺序、
|
||||
AssetWeakReference stable identity、revision 和 manifest SHA-256;receipt/hash drift 在发布前阻断。
|
||||
该 enabling evidence 仍不改变 slice。
|
||||
|
||||
M12-01I 将 A-H 八项任务链、Blender 5.2 desktop fixture、Web v2 fixture、production migration
|
||||
report、canonical 双 hash 和 IndexedDB fault/restart artifact 递归绑定为一个 READY evidence。
|
||||
M12.1 schema/migration 已收口,但仍是 enabling evidence,不把 catalog mutation/preview 计为完成。
|
||||
|
||||
M12-02A 已盘点 PreviewImage 的 ICON/PREVIEW 双槽、持久尺寸/rect/flag、RGBA8 packed pixel、
|
||||
premultiplied alpha、runtime deferred/invalid 状态和真正的 null pointer。原生结构/RNA 没有颜色空间
|
||||
字段;现有 Web v1/v2 也缺 slot/colorSpace/alpha/generator 语义。本项仍是 inventory evidence。
|
||||
|
||||
M12-02B 定义 source/content 各自的 byte length、MIME、SHA-256,并让 content 绑定尺寸、RGBA8、
|
||||
sRGB/alpha profile,generator 绑定 Blender version/executable/script/settings。真实 Blender 两次重编码
|
||||
确定性相同,source/content 编码不同但解码像素 exact;本项仍是 enabling identity evidence。
|
||||
|
||||
M12-02C 在任何图像 decoder 或 decoded allocation 前依次检查 identity、16 MiB encoded bytes、
|
||||
content SHA-256、PNG/WebP header、identity-bound dimensions、16,777,216 pixels、64 MiB RGBA8
|
||||
decoded bytes 和 100:1 compression ratio。8 类失败均 fail-closed,随后小 preview 可立即恢复;
|
||||
本项仍是 enabling budget evidence,不把 preview storage/display 计为完成。
|
||||
|
||||
M12-02D 先把 content-addressed preview 写入 OPFS 并回读复验,再用一次 revision/full-row guarded
|
||||
IndexedDB transaction 提交 catalog v2 preview reference 和 hash receipt。OPFS 前后及 catalog put
|
||||
后的三处 fault 都保持旧 catalog;重开后 revision、receipt 和 payload hash 一致。本项仍不把
|
||||
dedupe、损坏隔离或 viewport display 计为完成。
|
||||
|
||||
M12-02E 又让两个不同 Blender weak-reference identity 和不同 metadata 的 asset 共享相同 content
|
||||
SHA-256;第二次写入只复验并复用 OPFS payload,物理文件计数为 1,两个 catalog entry 的完整
|
||||
non-preview metadata 不变,revision 9 重开一致。本项仍不把损坏隔离或 display 计为完成。
|
||||
|
||||
M12-02F 将同长度但 SHA-256 漂移的 bytes 从 content-addressed namespace 移入复验后的 quarantine
|
||||
文件,并写入与 catalog revision/reference 绑定的 receipt。catalog 本身及另一 asset 均不变;重开后
|
||||
仍可读取完整 metadata,只把 preview/data 返回 null。本项仍不把 reference GC/display 计为完成。
|
||||
|
||||
M12-02G 在 catalog reference transaction 完成后按 committed manifest 计数:同项目仍有一个引用时
|
||||
保留 payload,最后一个引用删除后才回收。OPFS project namespace 保证另一项目的同 hash payload
|
||||
和 READY preview 不受影响;revision 11 重开 metadata 不变。本项仍不把 display 计为完成。
|
||||
|
||||
M12-02H 已把 Blender 5.2 确定性重编码的 `SRGB/RGBA8/STRAIGHT` preview 固定为逐字节 reference,
|
||||
主线程 `HTMLCanvasElement` 与独立 Worker `OffscreenCanvas` 共用生产 decode/display 实现。两条路径
|
||||
均先通过 M12-02C 的 identity/header/预算门,再以禁用色彩转换和预乘的 `ImageBitmap` 解码;输出
|
||||
256-byte RGBA8 hash 与 desktop reference 完全一致,MAE/RMS/P95/max/bad-pixel/alpha 指标均为零,
|
||||
前景 IoU 为 1。该项新增一个已验证 preview display parity slice,但不扩大到任意尺寸、色彩空间、
|
||||
asset browser UI 或 Append/Link/Override。
|
||||
|
||||
M12-03A 已分别冻结 Append、Link 与 Library Override 的数据块/闭包边界。真实 Blender runtime
|
||||
公开 36 类 selectable root,其中 Screen/WorkSpace 为 append-only;Library 是来源/传递依赖元数据,
|
||||
Key 等 embedded ID 随 owner 进入闭包。Append 由实际 ID pointer graph 区分 direct、indirect、
|
||||
cross-library、override dependency 与 reusable local;Link 保留 `ID.lib`、EXTERN/INDIRECT 和
|
||||
`Library.runtime.parent`;Override 另记录 linked reference、local owner、hierarchy root、property/
|
||||
operation 与 system dependency。该 inventory 仍不创建 ownership contract 或 Main transaction。
|
||||
|
||||
M12-03B 已定义 schema 1 library operation identity。`sourceLibraryId` 同时绑定 canonical source
|
||||
locator 与 `.blend` SHA-256;APPEND 只能由 `LOCAL_MAIN` owner 持有且可写,LINK 只能由匹配的
|
||||
`SOURCE_LIBRARY` owner 持有且 root/reference 均只读,LIBRARY_OVERRIDE 由 `LOCAL_OVERRIDE`
|
||||
持有、local 可写但 linked reference 只读。invalidation token 还绑定 operation、root、owner、
|
||||
source generation/revision 与 dependency-closure hash;任一漂移稳定返回 `REVISION_CONFLICT`。
|
||||
|
||||
M12-03C 已生成真实 Blender 5.2 desktop 单 Object append fixture。选中的 Object 自动带入 Mesh、
|
||||
Material 和 packed Image 依赖,四个 ID 在 target Main 中均无 source library/override 指针并映射为
|
||||
可写 `LOCAL_MAIN` owner。新 Blender load 路径重开 target 后,3 条依赖边、4/4/1 geometry、UVMap、
|
||||
material slot、2x2 sRGB RGBA image 和 Float32 pixel SHA-256 均与 source canonical report 一致。
|
||||
本项只冻结 desktop 权威 fixture,不提前声明 WASM Main append、undo/redo 或完整 append parity。
|
||||
该合同没有提前执行 Append 或开放 writer。
|
||||
|
||||
M12-03D 已把同一 source-hash-bound closure 送入 WASM Worker 的 authoritative Blender Main。Native
|
||||
link/append context 递归导入 Object、Mesh、Material 和 packed Image,Main commit 前核对 source
|
||||
locator、root、closure 与 base revision;四个 ID 均无 `ID.lib`/override、映射为可写 `LOCAL_MAIN`,
|
||||
并只产生一个新的 SceneIR revision。stale revision 与 local ID collision 在 Main mutation 前阻断,
|
||||
失败路径回滚完整 history state。该项只证明单 transaction Main append,undo/redo/save/reopen 与
|
||||
desktop canonical report 的联合一致性仍由 M12-03E 验证。
|
||||
|
||||
## 已验证切片
|
||||
|
||||
1. N-023-A:版本化 manifest 覆盖 catalog、asset kind/tag、preview、author、license、
|
||||
@@ -29,11 +120,13 @@ IO 安全门已落地;Append/Link/Override Main、非 GLB 本地导入和跨
|
||||
已完成;大 bundle 性能仍未实现。
|
||||
9. VDB 独立资源库包含 generated/official/source/derived/report/manifest/license,14 条记录逐项绑定
|
||||
byte length 与 SHA-256;官方 sphere 使用 CC-BY-4.0 和 Git LFS 权威 hash,未放入仓库工作树。
|
||||
10. N-023-A(preview display):Blender 5.2 desktop RGBA8 reference、主线程 Canvas2D 与
|
||||
OffscreenCanvas 的像素 SHA-256 精确一致;错误像素返回 `RENDER_REFERENCE_MISMATCH`。
|
||||
|
||||
## 仍然阻断
|
||||
|
||||
- N-023-B:Append/Link/Library Override、reload/relocate 和真实 Main transaction;只读 library
|
||||
inventory 已完成。
|
||||
- N-023-B:Append undo/redo/save/reopen、Link/Library Override、reload/relocate 和完整真实 Main
|
||||
parity;M12-03D 的单 transaction append 已有独立证据,但不解除本项阻断。
|
||||
- N-023-C/D:GLTF/OBJ/PLY/STL、USD/Alembic import/export/save/reopen/desktop reimport。
|
||||
- N-023-E:真实 zip decoder/fuzz、OPFS quota/recovery、license/source offer 发布审计和大文件
|
||||
流式性能;archive 路径冲突、双向字节预算与确定性 range plan 已完成。
|
||||
@@ -44,6 +137,23 @@ IO 安全门已落地;Append/Link/Override Main、非 GLB 本地导入和跨
|
||||
```bash
|
||||
WEB_TEST_PORT=5323 npm --prefix web run test:e2e -- --grep "N-023 asset"
|
||||
npm --prefix web run test:library-main-reader
|
||||
npm --prefix web run test:asset-catalog-inventory
|
||||
npm --prefix web run test:asset-catalog-v1-fixture
|
||||
npm --prefix web run test:asset-catalog-v2
|
||||
npm --prefix web run test:asset-catalog-migration
|
||||
npm --prefix web run test:asset-catalog-legacy-reader
|
||||
npm --prefix web run test:asset-catalog-negatives
|
||||
npm --prefix web run test:asset-preview-inventory
|
||||
npm --prefix web run test:asset-preview-identity
|
||||
npm --prefix web run test:asset-preview-decode-budget
|
||||
npm --prefix web run test:asset-preview-opfs-commit
|
||||
npm --prefix web run test:asset-preview-dedup
|
||||
npm --prefix web run test:asset-preview-quarantine
|
||||
npm --prefix web run test:asset-preview-reference-gc
|
||||
npm --prefix web run test:asset-preview-display
|
||||
npm --prefix web run test:library-operation-inventory
|
||||
npm --prefix web run test:library-operation-identity
|
||||
npm --prefix web run test:library-main-append
|
||||
npm --prefix web run test:vdb
|
||||
npm --prefix web run test:vdb-native
|
||||
```
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
"v1RequiredSlices": ["B-world-scene-render-delta-roundtrip", "B-C-nanovdb-float32-wgsl-bounded-ray-integration"],
|
||||
"v1ExcludedSlices": ["A", "B", "C", "D", "E", "B-C-nanovdb-production-viewport-paging-advanced-material", "E-volume-desktop-chromium-pixel-golden"],
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-camera-light-world-scene-reader-partial", "A-main-camera-dof-properties-partial", "A-main-light-world-properties-partial", "A-white-balance-integrity-gate", "B-three-exposure-shadow-mapping-partial", "B-bounded-kelvin-linear-light-color", "B-world-scene-render-delta-roundtrip", "B-volume-material-manifest-boundary", "B-C-nanovdb-float32-wgsl-bounded-ray-integration", "D-final-render-server-routing-fail-closed", "D-server-render-source-build-settings-output-hash-binding", "E-bounded-realtime-blender-reference-image-metrics"],
|
||||
"completedSlices": ["A-camera-light-world-scene-reader-partial", "A-main-camera-dof-properties-partial", "A-main-light-world-properties-partial", "A-white-balance-integrity-gate", "B-three-exposure-shadow-mapping-partial", "B-bounded-kelvin-linear-light-color", "B-world-scene-render-delta-roundtrip", "B-volume-material-manifest-boundary", "B-C-nanovdb-float32-wgsl-bounded-ray-integration", "D-final-render-server-routing-fail-closed", "D-server-render-source-build-settings-output-hash-binding", "E-bounded-realtime-blender-reference-image-metrics", "E-render-fault-lifecycle-recovery"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E", "B-C-nanovdb-production-viewport-paging-advanced-material", "E-volume-desktop-chromium-pixel-golden"],
|
||||
"acceptance": ["web:test:lighting-roundtrip", "web:e2e:N-019 Scene exposure"],
|
||||
"dependencies": ["N-018"]
|
||||
@@ -86,7 +86,7 @@
|
||||
"v1RequiredSlices": ["B-real-main-exposure-invert-cpu-chain", "D-unsupported-node-preservation-gate"],
|
||||
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-graph-resource-cycle-schema", "A-main-graph-structure-reader-partial", "A-main-exposure-default-invert-parameter-reader", "B-bounded-cpu-executor-partial", "B-real-main-exposure-invert-cpu-chain", "B-webgpu-constant-exposure-invert-golden-partial", "B-D-unsupported-full-graph-execution-block", "C-image-operation-budget-cancel-partial", "C-content-addressed-frame-lru-cache", "D-unsupported-node-preservation-gate"],
|
||||
"completedSlices": ["A-graph-resource-cycle-schema", "A-main-graph-structure-reader-partial", "A-main-exposure-default-invert-parameter-reader", "B-bounded-cpu-executor-partial", "B-real-main-exposure-invert-cpu-chain", "B-webgpu-constant-exposure-invert-golden-partial", "B-D-unsupported-full-graph-execution-block", "C-image-operation-budget-cancel-partial", "C-content-addressed-frame-lru-cache", "C-E-compositor-fault-lifecycle-recovery", "D-unsupported-node-preservation-gate"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:compositor-main-reader", "web:e2e:N-020 CPU compositor"],
|
||||
"dependencies": ["N-019"]
|
||||
@@ -100,7 +100,7 @@
|
||||
"v1RequiredSlices": ["B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate"],
|
||||
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-strip-resource-schema", "A-main-strip-timeline-reader-partial", "B-deterministic-move-trim-split-partial", "B-source-frame-seek", "B-active-frame-dependency-resolution", "B-cross-transition-progress-input-resolution", "B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate", "C-runtime-image-sound-movie-byte-decode-probe", "C-source-decode-bound-movie-proxy-cache", "C-seek-scrub-decode-revision-gate", "C-audio-context-suspend-device-mute-recovery", "D-final-export-server-routing-fail-closed"],
|
||||
"completedSlices": ["A-strip-resource-schema", "A-main-strip-timeline-reader-partial", "B-deterministic-move-trim-split-partial", "B-source-frame-seek", "B-active-frame-dependency-resolution", "B-cross-transition-progress-input-resolution", "B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate", "C-runtime-image-sound-movie-byte-decode-probe", "C-source-decode-bound-movie-proxy-cache", "C-seek-scrub-decode-revision-gate", "C-audio-context-suspend-device-mute-recovery", "C-media-fault-lifecycle-recovery", "D-final-export-server-routing-fail-closed"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E"],
|
||||
"acceptance": ["web:test:sequencer-main-reader", "web:e2e:N-021 sequencer"],
|
||||
"dependencies": ["N-020"]
|
||||
@@ -128,7 +128,7 @@
|
||||
"v1RequiredSlices": ["C-glb-export-usd-analysis-gates", "E-archive-path-conflict-compressed-budget-range-plan", "E-nanovdb-opfs-tamper-rollback-quota-recovery"],
|
||||
"v1ExcludedSlices": ["A", "B", "C", "D", "E", "E-nanovdb-large-bundle-performance"],
|
||||
"roadmapStatus": "planned",
|
||||
"completedSlices": ["A-catalog-asset-license-source-schema", "A-content-addressed-opfs-capability", "A-preview-content-signature-dimension-verification", "A-vdb-external-resource-license-sha-catalog", "B-library-dependency-order-partial", "B-main-library-inventory-reader", "C-glb-export-usd-analysis-gates", "E-archive-path-ratio-budget", "E-archive-path-conflict-compressed-budget-range-plan", "E-nanovdb-http206-range-hash-streaming-boundary", "E-nanovdb-http-retry-if-range-body-resume", "E-nanovdb-opfs-atomic-binding-worker-reopen-bundle-lru", "E-nanovdb-opfs-tamper-rollback-quota-recovery", "E-nanovdb-gpu-resident-page-lru"],
|
||||
"completedSlices": ["A-catalog-asset-license-source-schema", "A-content-addressed-opfs-capability", "A-preview-content-signature-dimension-verification", "A-preview-desktop-browser-main-offscreen-display", "A-vdb-external-resource-license-sha-catalog", "B-library-dependency-order-partial", "B-main-library-inventory-reader", "C-glb-export-usd-analysis-gates", "E-archive-path-ratio-budget", "E-archive-path-conflict-compressed-budget-range-plan", "E-nanovdb-http206-range-hash-streaming-boundary", "E-nanovdb-http-retry-if-range-body-resume", "E-nanovdb-opfs-atomic-binding-worker-reopen-bundle-lru", "E-nanovdb-opfs-tamper-rollback-quota-recovery", "E-nanovdb-gpu-resident-page-lru"],
|
||||
"blockedSlices": ["A", "B", "C", "D", "E", "E-nanovdb-large-bundle-performance"],
|
||||
"acceptance": ["web:test:library-main-reader", "web:test:vdb-faults", "web:e2e:N-023 asset"],
|
||||
"dependencies": ["N-022"]
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"schemaVersion": 4,
|
||||
"source": "docs/status/parity-ledger.json",
|
||||
"sourceSha256": "0a9b4c1026c42b5f77869f222b1531601ed229184a1d1737e74047c7b3406730",
|
||||
"generatedAt": "2026-08-17T08:22:00.415Z",
|
||||
"sourceSha256": "c8d73374c338f46c2016f6089d99efdd7b3331fc0100d64dad0f416fe66e3eb6",
|
||||
"generatedAt": "2026-08-17T15:09:53.894Z",
|
||||
"families": [
|
||||
{
|
||||
"id": "N-015",
|
||||
@@ -277,7 +277,8 @@
|
||||
"B-C-nanovdb-float32-wgsl-bounded-ray-integration",
|
||||
"D-final-render-server-routing-fail-closed",
|
||||
"D-server-render-source-build-settings-output-hash-binding",
|
||||
"E-bounded-realtime-blender-reference-image-metrics"
|
||||
"E-bounded-realtime-blender-reference-image-metrics",
|
||||
"E-render-fault-lifecycle-recovery"
|
||||
],
|
||||
"blockedSlices": [
|
||||
"A",
|
||||
@@ -324,6 +325,7 @@
|
||||
"B-D-unsupported-full-graph-execution-block",
|
||||
"C-image-operation-budget-cancel-partial",
|
||||
"C-content-addressed-frame-lru-cache",
|
||||
"C-E-compositor-fault-lifecycle-recovery",
|
||||
"D-unsupported-node-preservation-gate"
|
||||
],
|
||||
"blockedSlices": [
|
||||
@@ -372,6 +374,7 @@
|
||||
"C-source-decode-bound-movie-proxy-cache",
|
||||
"C-seek-scrub-decode-revision-gate",
|
||||
"C-audio-context-suspend-device-mute-recovery",
|
||||
"C-media-fault-lifecycle-recovery",
|
||||
"D-final-export-server-routing-fail-closed"
|
||||
],
|
||||
"blockedSlices": [
|
||||
@@ -456,6 +459,7 @@
|
||||
"A-catalog-asset-license-source-schema",
|
||||
"A-content-addressed-opfs-capability",
|
||||
"A-preview-content-signature-dimension-verification",
|
||||
"A-preview-desktop-browser-main-offscreen-display",
|
||||
"A-vdb-external-resource-license-sha-catalog",
|
||||
"B-library-dependency-order-partial",
|
||||
"B-main-library-inventory-reader",
|
||||
|
||||
Reference in New Issue
Block a user