Advance M7 workflows and release operations
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Web Blender V1 当前执行计划
|
||||
|
||||
更新时间:2026-08-14
|
||||
更新时间:2026-08-15
|
||||
|
||||
## 1. 交付目标
|
||||
|
||||
@@ -110,21 +110,25 @@ React 工作区和编辑器
|
||||
| 交付 | 离线 binary/source archive、SBOM、SHA-256 可复现 | 正式部署模板、持续发布流水线、跨机器复验待做 | 本地 V1 RC 已收口 |
|
||||
|
||||
2026-08-15 重新执行 `typecheck`、`lint`、14 个 Node tests、status consistency、release
|
||||
evidence checker 和 `git diff --check`,均退出 0。acceptance runner 解析 12 个 family 的
|
||||
50 条声明,去重为 49 条命令并全部通过,命令总耗时 454,106 ms;清单 SHA-256 为
|
||||
`74c01764987c3dce0601a20cdf494f8076102f6d54262a1d13df953abee96160`。官方 Blender 5.2.0
|
||||
evidence checker 和 `git diff --check`,均退出 0。M6-03 后 acceptance runner 再次解析 12 个
|
||||
family 的 50 条声明,去重为 49 条命令并全部通过,命令总耗时 480,169 ms;清单 SHA-256 为
|
||||
`d5fb0a7b2df92b076f8b05ccd68903d60e3352b9423b0c1404065f6cbcbdd45c`。官方 Blender 5.2.0
|
||||
Linux archive SHA-256 为 `96f6c181a30f4950607839dc84d42a354b250d8a0231b098b59b7bc69c351c48`,
|
||||
运行时 `USD=True`,desktop USD roundtrip 已通过。
|
||||
|
||||
最终 release evidence 生成时间为 `2026-08-15T04:43:09.832Z`,17 条 record 均为 exit code 0、
|
||||
非空输出和非空构件 hash,总命令耗时 553,427 ms。`v1-user-loop` record 已绑定上述 acceptance
|
||||
第一次重跑误用了本地 `USD=False` Blender,结果为 48/49;该失败证据未标 READY。修正为上述
|
||||
官方 runtime 后完整重跑 49 条,而不是手改失败记录。当前 release evidence 生成时间为
|
||||
`2026-08-15T05:37:25.215Z`,17 条 record 均为 exit code 0、非空输出和非空构件 hash,
|
||||
总命令耗时 553,577 ms。`v1-user-loop` record 已绑定上述 acceptance
|
||||
清单 hash。
|
||||
|
||||
### 4.4 当前阻断与决策顺序
|
||||
|
||||
1. `P0`:V1 本地 RC 已无阻断;下一领取点为 `M6-01` 部署响应头合同。
|
||||
2. `P1`:当前离线包已在本机连续两次可复现,还缺独立目录/独立机器复验和真实 HTTP 部署门。
|
||||
3. `P1`:pthread/single-thread 的生产选择、隔离头、fallback 和缓存升级合同尚未形成发布证据。
|
||||
1. `P0`:V1 可部署 RC 已完成 M6 71/71;M7 已完成 7/18,下一领取点为 `M7-08` Worker 崩溃恢复。
|
||||
2. `P1`:binary/source archive 已在独立目录复验,quick/Chromium/release 三条
|
||||
CI lane 与 RC manifest 已联合校验;发布/限制/恢复和运维合同均已进入离线包。
|
||||
3. `P1`:pthread/single-thread、真实 HTTP、缓存升级、归档离线、OPFS 断网和空目录
|
||||
deploy/upgrade/rollback 均已有可复验证据;M7 开始核心项目体验硬化。
|
||||
4. `P2`:完整 Blender 功能域继续受 VDB demand paging、PBVH、Geometry Nodes evaluator、
|
||||
通用 Shader、完整编辑器/渲染/媒体和安全脚本边界阻断。
|
||||
|
||||
@@ -146,9 +150,19 @@ loss、恶意 blend、zip bomb、离线包和 V1 用户闭环均已在最终 M5
|
||||
| M3 long media | 长时间线索引、seek、取消与重启证据 | 已完成,持续回归 | `performance.longMedia=true` |
|
||||
| M4 OOM | 四类确定性内存故障与恢复证据 | 已完成,持续回归 | `faults.oom=true` |
|
||||
| M5 V1 RC | 可复现离线候选包、SBOM、校验和 | 已完成,持续回归 | release gate `READY`、49/49 acceptance |
|
||||
| M6 可部署 RC | 双 WASM 运行时选择、真实 HTTP、离线包、CI、运维合同 | 已完成,71/71 | single/pthread 可解释,真实部署与归档 P0 通过 |
|
||||
| M7 核心体验硬化 | 项目状态机、恢复、存储、输入和可访问性 | 进行中,7/18 | 30 分钟编辑/保存/重开 soak 通过 |
|
||||
| M8 VDB 自动分页 | GPU 缺页反馈、range/OPFS、LRU、双视口恢复 | 未开始 | 64 MiB sparse bundle 与三视角 golden 通过 |
|
||||
| M9 非 Mesh/GP/Paint | 字体、Curve、Grease Pencil、Paint 增量闭环 | 未开始 | 每个新增 writer 独立通过 Main/undo/save/golden |
|
||||
| M10 GN/Shader/NLA/Simulation | 白名单求值、cache、编译与阻断 | 未开始 | 四域分别通过 desktop/WASM/fault 门 |
|
||||
| M11 Render/Compositor/Media | 灯光、渲染、合成、媒体执行边界 | 未开始 | 本地白名单与 server 边界均可审计 |
|
||||
| M12 Asset/IO/Editors | 资产、格式、编辑器和上下文工作流 | 未开始 | 每个格式/editor 有独立 round-trip 或稳定阻断 |
|
||||
| M13 Scripting/Security | 脚本默认拒绝、服务端隔离、CSP、供应链 | 未开始 | 恶意输入矩阵和 release 安全门通过 |
|
||||
| M14 跨浏览器/设备 | Firefox、WebKit、触控、笔、HiDPI、IME | 未开始 | 新浏览器进入 quick/P0/full CI 后才声明支持 |
|
||||
| M15 全域审计 | Blender 5.2 全域差距和下一发布 | 未开始 | 逐 family 审计,不由聚合 release gate 反推完成 |
|
||||
|
||||
任务严格按 M1 -> M2 -> M3 -> M4 -> M5 领取。里程碑内部允许先写纯校验任务,但不得在
|
||||
前一里程碑失败时把后一里程碑标为完成。
|
||||
M0 至 M5 已完成并转入持续回归;当前严格领取 M6。里程碑内部允许先写纯校验任务,但不得在
|
||||
前一小里程碑失败时把后一小里程碑标为完成,M7 至 M15 不得绕过 M6 发布合同扩功能。
|
||||
|
||||
## 6. M0 范围、状态和 P0 闭环
|
||||
|
||||
@@ -448,9 +462,9 @@ M5 按 `PREP -> STATIC -> ACCEPT -> LOOP -> PERF -> FAULT -> VDB -> PACKAGE -> A
|
||||
- [x] `M5-ACCEPT-19` 使用 SHA-256 校验的官方 USD-enabled Blender 5.2 重跑 desktop USD
|
||||
roundtrip;归档 hash 和 executable hash 均写入 acceptance evidence。
|
||||
- [x] `M5-ACCEPT-20` 运行完整 acceptance runner:50 declarations、49 unique、49 passed、
|
||||
0 failed,总命令耗时 454,106 ms。
|
||||
0 failed;M6-03 后复验总命令耗时 480,169 ms。
|
||||
- [x] `M5-ACCEPT-21` 将 acceptance evidence SHA-256
|
||||
`74c01764987c3dce0601a20cdf494f8076102f6d54262a1d13df953abee96160` 绑定到最终
|
||||
`d5fb0a7b2df92b076f8b05ccd68903d60e3352b9423b0c1404065f6cbcbdd45c` 绑定到最终
|
||||
`v1-user-loop` release record。
|
||||
|
||||
### M5.3 P0 用户闭环和 Chromium 回归
|
||||
@@ -525,7 +539,7 @@ M5 按 `PREP -> STATIC -> ACCEPT -> LOOP -> PERF -> FAULT -> VDB -> PACKAGE -> A
|
||||
- [x] `M5-AUDIT-03` 确认 12 个 family 仍为 `parityStatus=BLOCKED`。
|
||||
- [x] `M5-AUDIT-04` 确认 12 个 V1 required slice 均为 `releaseStatus=READY`。
|
||||
- [x] `M5-AUDIT-05` 运行完整 `release:evidence`,用本轮命令输出和构件 hash 替换旧 records;
|
||||
当前生成时间 `2026-08-15T04:43:09.832Z`,17 条 record,总命令耗时 553,427 ms。
|
||||
当前生成时间 `2026-08-15T05:37:25.215Z`,17 条 record,总命令耗时 553,577 ms。
|
||||
- [x] `M5-AUDIT-06` 检查 17 条 evidence record 均为 exit code 0、非空输出和非空构件 hash。
|
||||
- [x] `M5-AUDIT-07` 检查 evidence 的 ledger SHA-256 与当前文件完全一致。
|
||||
- [x] `M5-AUDIT-08` 运行 `test:release-evidence`,结果 `READY`、`missing=[]`。
|
||||
@@ -541,7 +555,7 @@ SBOM、状态和 evidence SHA-256 相互一致。
|
||||
|
||||
M5 最终 archive SHA-256:binary
|
||||
`f2903a75026a0a28615aeb5f4834a3859af83022c82bc50e28437dcbed68e549`;source
|
||||
`9a9c1b505c68a618de842be7c248f628b104b11b80e8a40d111f62540fcba327`。下一任务:`M6-01`。
|
||||
`9a9c1b505c68a618de842be7c248f628b104b11b80e8a40d111f62540fcba327`。当前下一任务:`M7-08`。
|
||||
|
||||
## 12. V1 后原子里程碑
|
||||
|
||||
@@ -551,40 +565,157 @@ M5 最终 archive SHA-256:binary
|
||||
|
||||
### M6 可部署 RC
|
||||
|
||||
M6 固定按 `runtime -> HTTP -> cache/offline -> archive -> CI -> operations` 串行推进。每个
|
||||
任务只验证一个行为;上一小里程碑未通过时,不把后一小里程碑的准备工作记为完成。
|
||||
|
||||
#### M6.1 single-thread 无隔离启动
|
||||
|
||||
- [x] `M6-01` 新建机器可读部署合同,固定 MIME、缓存、COOP、COEP、CORP 和 Range 响应头;
|
||||
`node tools/web/check-deployment-contract.mjs`、typecheck、lint 和 production build 通过。
|
||||
- [x] `M6-02` 复用 `CapabilityGateResult` 新增纯函数 `gateWasmThreadingCapability`;仅当
|
||||
`crossOriginIsolated`、`SharedArrayBuffer` 和 `Worker` 同时可用时放行 pthread 引擎,
|
||||
缺失项逐条返回稳定结构,single-thread 初始化路径不调用该门。
|
||||
- [ ] `M6-03` 验证 single-thread 引擎在无隔离环境启动。
|
||||
- [ ] `M6-04` 验证 pthread 引擎只在隔离和 SharedArrayBuffer 可用时启动。
|
||||
- [ ] `M6-05` 验证 pthread 初始化失败回退 single-thread,且不重复打开项目。
|
||||
- [ ] `M6-06` 为 engine JS/WASM、Worker、CSS 和 fixture 固定正确 MIME。
|
||||
- [ ] `M6-07` 为 WASM 与大资产验证 byte-range 206、`Content-Range` 和稳定 ETag。
|
||||
- [ ] `M6-08` 验证版本更新后旧 HTML 不加载新旧混合 hash 资源。
|
||||
- [ ] `M6-09` 验证完全断网冷启动离线包,不访问 CDN 或外部字体。
|
||||
- [ ] `M6-10` 验证断网重开 OPFS 项目、编辑、保存和 GLB 导出。
|
||||
- [ ] `M6-11` 在全新临时目录解包 binary archive 并运行 browser smoke。
|
||||
- [ ] `M6-12` 在全新临时目录解包 source archive 并核对 source offer/SBOM。
|
||||
- [ ] `M6-13` 建立 CI quick lane:typecheck、lint、unit、status、evidence schema。
|
||||
- [ ] `M6-14` 建立 CI Chromium lane:P0 用户闭环、双视口和 fault smoke。
|
||||
- [ ] `M6-15` 建立 CI release lane:全 E2E、性能、离线复现和 acceptance evidence。
|
||||
- [ ] `M6-16` 所有 CI lane 输出机器可读 JSON 和构件 SHA-256。
|
||||
- [ ] `M6-17` 写部署/升级/回滚 runbook,命令在空目录实测。
|
||||
- [ ] `M6-18` 生成 RC 版本号、变更说明、已知限制和恢复说明。
|
||||
- [x] `M6-03A` 增加仅供测试使用的无隔离 Vite profile;默认 dev/preview 仍强制部署合同头。
|
||||
- [x] `M6-03B` 在独立 Chromium context 断言文档响应没有 COOP/COEP/CORP,且
|
||||
`crossOriginIsolated=false`、`SharedArrayBuffer` 不可用、`Worker` 可用。
|
||||
- [x] `M6-03C` 断言当前 engine manifest 为 `memory.shared=false`,网络请求不包含 pthread
|
||||
JS/WASM/worker 资产。
|
||||
- [x] `M6-03D` 在上述环境等待 single-thread WebEngine 返回 `ready`,同时证明 pthread gate
|
||||
为 `BLOCKED`,从行为上保证 single-thread 不受该门阻断。
|
||||
- [x] `M6-03E` 使用真实 `basic_scene.blend` 完成 open 和一个 Main edit,证明不是只加载 UI shell。
|
||||
|
||||
M6.1 退出条件:专项命令一次启动独立无隔离服务器,以上五项同进程通过,退出码为 0。
|
||||
|
||||
#### M6.2 pthread 选择与回退
|
||||
|
||||
- [x] `M6-04A` 扩展 engine manifest schema,显式声明 single/pthread variant、JS、WASM、
|
||||
pthread worker、shared memory 和每个文件 SHA-256;v2 纯校验器固定 256 至 32768 pages、
|
||||
variant 资源隔离和稳定错误路径,21 个专项正负例断言通过。生产 manifest/安装路径保持 v1,
|
||||
无隔离 single-thread 专项回归通过。
|
||||
- [x] `M6-04B` 安装脚本从两个独立构建目录复制 variant 资产到显式 single/pthread URL,
|
||||
生成绑定四个物理文件 SHA-256 的生产 schema v2 manifest;同目录和缺失资产负例不会改写目标,
|
||||
Node 专项、manifest/local dependency、build 和无隔离 Chromium 回归通过。旧 single Worker 入口
|
||||
只作为 `M6-05` fallback 接线前的完整 Main 兼容路径保留。
|
||||
- [x] `M6-04C` 新增纯函数选择 engine variant;输入仅为 manifest、用户策略和平台能力,
|
||||
frozen input 重复调用结果一致,未知策略稳定拒绝。
|
||||
- [x] `M6-04D` `AUTO` 在完整 pthread gate `READY` 时选择 pthread;隔离、SharedArrayBuffer 或
|
||||
Worker 任一缺失时选择 single,五组能力矩阵通过。
|
||||
- [x] `M6-04E` `PTHREAD_REQUIRED` 在任一能力缺失时返回 `selectedVariant=null` 和原样 M6-02
|
||||
结构,不向调用方暴露可请求的 pthread URL。
|
||||
- [x] `M6-04F` 隔离 Chromium 实际加载 pthread JS/WASM,校验 manifest hash、
|
||||
`SharedArrayBuffer`、pool worker 二次 JS 请求和 native handle 创建/释放。
|
||||
- [x] `M6-04G` 同一 manifest 在无隔离 Chromium 由 AUTO 实际加载 single JS/WASM,确认非共享
|
||||
内存、无 pthread 请求,并继续用完整 single Main 打开和编辑真实 `.blend`。
|
||||
- [x] `M6-05A` 为 pthread factory 增加仅测试可用的确定性初始化失败注入点。
|
||||
- [x] `M6-05B` `AUTO` 下 pthread 初始化失败只回退一次 single,不形成重试循环。
|
||||
- [x] `M6-05C` fallback 前终止已创建的 pthread worker、timer 和 pending request。
|
||||
- [x] `M6-05D` fallback 过程中未打开项目时只初始化;已有待打开项目时只执行一次 open。
|
||||
- [x] `M6-05E` fallback 结果公开 selected/attempted/fallbackReason,UI 不显示 pthread READY。
|
||||
|
||||
M6.2 退出条件:isolated pthread、unisolated single、forced failure fallback 三个专项测试均通过,
|
||||
每种路径的资产请求、Worker 数和 open 次数可断言。
|
||||
|
||||
#### M6.3 HTTP MIME 与 byte range
|
||||
|
||||
- [x] `M6-06A` 从 deployment contract 生成测试用扩展名到 MIME 的唯一映射,不复制常量。
|
||||
- [x] `M6-06B` 对 HTML、JS、CSS、WASM、JSON、PNG、WAV、BLEND、NVDB 分别执行 GET。
|
||||
- [x] `M6-06C` 对 engine JS/WASM、pthread worker 和 fixture 分别执行 HEAD,断言状态与
|
||||
`Content-Type`,且 HEAD 无响应体。
|
||||
- [x] `M6-06D` MIME 错误时测试必须报告 URL、expected、actual,不能只返回布尔失败。
|
||||
- [x] `M6-07A` 对 WASM、BLEND、NVDB 各执行一个闭区间 range,断言 `206` 和精确字节。
|
||||
- [x] `M6-07B` 分别验证 open-ended 与 suffix range;若合同不支持则稳定返回 `416`。
|
||||
- [x] `M6-07C` malformed、倒序、越界和 multi-range 分别返回 `416`,不得返回截断的 `200`。
|
||||
- [x] `M6-07D` `206` 同时具有 `Accept-Ranges`、`Content-Range`、`Content-Length` 和强 ETag。
|
||||
- [x] `M6-07E` 相同内容跨请求 ETag 稳定;内容变化后 ETag 必须变化。
|
||||
- [x] `M6-07F` `If-Range` 匹配时返回对应 `206`,不匹配时返回完整 `200`。
|
||||
- [x] `M6-07G` 中断后从精确 offset 续传并校验合并后的 SHA-256,不复用旧 revision 字节。
|
||||
|
||||
M6.3 退出条件:同一真实 HTTP server 同时通过 MIME 和 range 正负例矩阵。
|
||||
|
||||
#### M6.4 缓存、升级与离线运行
|
||||
|
||||
- [x] `M6-08A` HTML 和 engine manifest 固定 `no-cache`,每次启动都能重新验证版本。
|
||||
- [x] `M6-08B` content-hashed JS/CSS/Worker 固定 immutable;稳定 engine URL 必须重新验证 hash。
|
||||
- [x] `M6-08C` manifest 为每个 variant 绑定同一 releaseId,禁止跨 release 混用 JS/WASM/worker。
|
||||
- [x] `M6-08D` 模拟发布切换:旧 HTML 只加载旧 manifest 全套或明确刷新,不加载混合版本。
|
||||
- [x] `M6-08E` hash 不匹配时保持旧项目未打开并返回稳定错误,不进入 fallback 的错误 variant。
|
||||
|
||||
`npm --prefix web run test:deployment-cache` 从 production build 临时副本启动合同服务器:`/`、
|
||||
`/index.html`、manifest 和 4 个 stable engine 资源均为 `no-cache`;实际构建的入口 JS、CSS 和
|
||||
3 个 Worker 共 5 项均具有 Vite 内容 hash 且为 immutable。HTML、manifest、stable engine 对相同
|
||||
ETag 返回无 body `304`,换代后对旧 ETag 返回完整 `200` 和新 ETag,临时换代不改写 `web/dist`。
|
||||
- [x] `M6-09A` 从 binary archive 解包后使用合同服务器启动,不读取工作区文件。
|
||||
- [x] `M6-09B` 新浏览器 profile 冷启动时拦截所有非 loopback 请求,断言请求数为 0。
|
||||
- [x] `M6-09C` 断开外网但保留本地合同服务器,完成 manifest、WASM、字体和基础 UI 冷启动。
|
||||
- [x] `M6-10A` 在线创建 OPFS 项目、编辑并原子保存,记录 revision、blend hash 和 stable IDs。
|
||||
- [x] `M6-10B` 重建 Worker 并切换到外网断开状态,从 OPFS 重开同一 revision。
|
||||
- [x] `M6-10C` 离线重开后继续 Main edit、undo/redo 和保存,revision 单调增加。
|
||||
- [x] `M6-10D` 离线导出 GLB 并严格回读,且无非 loopback 请求。
|
||||
|
||||
M6.4 退出条件:版本切换负例、archive 冷启动和 OPFS 离线闭环分别有独立命令与报告。
|
||||
|
||||
#### M6.5 归档独立复验
|
||||
|
||||
- [x] `M6-11A` 使用 `mktemp -d` 解包 binary archive,禁止引用仓库 `web/dist`。
|
||||
- [x] `M6-11B` 校验 `SHA256SUMS.txt`、deployment contract、license、SBOM 和 binary manifest。
|
||||
- [x] `M6-11C` 从临时目录启动合同服务器并运行 browser smoke,退出后释放端口和临时 profile。
|
||||
- [x] `M6-12A` 在另一个空临时目录解包 corresponding source archive。
|
||||
- [x] `M6-12B` 校验 source offer 指向的版本、许可证、lockfile、CMake 与 Web 源码全部存在。
|
||||
- [x] `M6-12C` 扫描 source archive,拒绝 build、dist、release、cache、trace、绝对开发路径和凭据。
|
||||
- [x] `M6-12D` 从 source archive 执行 lockfile install、typecheck、build,并比对可重现清单。
|
||||
|
||||
M6.5 退出条件:binary/source 两个归档均在独立目录复验,报告包含 archive 与关键文件 SHA-256。
|
||||
|
||||
#### M6.6 CI 分层与机器报告
|
||||
|
||||
- [x] `M6-13A` 确定仓库实际 CI provider、runner OS、Node/Chrome/Blender/Emscripten 版本矩阵。
|
||||
- [x] `M6-13B` quick lane 从 lockfile 安装,执行 typecheck、lint、unit、status 和 evidence schema。
|
||||
- [x] `M6-13C` quick lane 缓存只以 lockfile/toolchain key 命中,不缓存 release evidence。
|
||||
- [x] `M6-14A` Chromium lane 执行 P0 user loop 和主线程/Offscreen 双视口 smoke。
|
||||
- [x] `M6-14B` Chromium lane 执行 network、device-loss、OOM、quota 与 malicious-input fault smoke。
|
||||
- [x] `M6-14C` Chromium lane 每个 browser server 使用独立动态端口,失败后也必须清理。
|
||||
- [x] `M6-15A` release lane 顺序执行全 E2E、性能矩阵、VDB、acceptance 和离线复现。
|
||||
- [x] `M6-15B` release lane 只在受保护 ref 或显式 dispatch 运行,不由普通 quick push 重复触发。
|
||||
- [x] `M6-15C` 任一 release 子命令失败时证据状态为失败,不能上传旧 READY JSON。
|
||||
- [x] `M6-16A` 三条 lane 均输出 schema-versioned JSON:命令、exitCode、duration、environment。
|
||||
- [x] `M6-16B` 报告绑定 commit、lockfile、ledger、engine、archive 和测试构件 SHA-256。
|
||||
- [x] `M6-16C` 上传前运行 schema 与 hash checker;报告和构件采用固定 retention。
|
||||
|
||||
2026-08-15 完整 release lane 的 19/19 子命令通过,总命令耗时
|
||||
1,245,732 ms;full E2E 126/126,V1 acceptance 49/49。quick 6/6、Chromium 9/9 和
|
||||
release 19/19 报告由 `check-ci-report.mjs` 联合校验,同时绑定 commit
|
||||
`17ab961485fe2ea1574c5f0b7d3ef9608a2bf424`。失败注入返回 exit code 17 并仅写入
|
||||
`FAILED` 报告。当前 binary/source archive SHA-256 分别为
|
||||
`ca09540e8f5c0157bb85d62c98aeb3291ea195a29585bc8e05afb308747a8ff5` 和
|
||||
`95b3a747425081a205b1966c004a08da4cb37aab7ba0a649ff076713f7010f74`。
|
||||
|
||||
M6.6 退出条件:fresh runner 上 quick/Chromium/release 三条 lane 通过,失败注入不会保留成功证据。
|
||||
|
||||
#### M6.7 运维与 RC 冻结
|
||||
|
||||
- [x] `M6-17A` 部署 runbook 从空目录安装 binary archive,并验证 HTTPS/loopback 前置条件。
|
||||
- [x] `M6-17B` 升级 runbook 覆盖新旧 manifest、cache、OPFS schema 和 Worker 版本切换。
|
||||
- [x] `M6-17C` 回滚 runbook 保留项目数据,只回滚 app/engine releaseId,并验证旧版可读策略。
|
||||
- [x] `M6-17D` 故障诊断表覆盖 MIME、range、isolation、hash、quota、Worker 和 GPU 错误。
|
||||
- [x] `M6-17E` 在一个全新临时目录逐条实跑部署、升级、回滚命令并记录输出。
|
||||
- [x] `M6-18A` 固定 RC semver、commit、releaseId、binary/source/SBOM SHA-256。
|
||||
- [x] `M6-18B` 变更说明只列已验证 V1 能力,并链接明确 excluded/server/blocked 清单。
|
||||
- [x] `M6-18C` 已知限制包含 Chromium-only、single/pthread 选择、存储和 GPU 预算。
|
||||
- [x] `M6-18D` 发布恢复说明包含项目备份、升级失败回滚和证据校验命令。
|
||||
- [x] `M6-18E` 最终运行 quick、Chromium、release lane,所有结果绑定同一 RC commit。
|
||||
|
||||
M6 退出条件:离线包和一个真实 HTTP 部署均通过同一 P0 流程;single/pthread 选择可解释;
|
||||
CI 可从 lockfile 和对应源码重现当前 binary/source hash。
|
||||
|
||||
### M7 核心项目体验硬化
|
||||
|
||||
- [ ] `M7-01` 记录 import/open/save/save-as/export 五个用户动作的状态机。
|
||||
- [ ] `M7-02` 对重复 open、并发 save 和 close-during-save 建立互斥规则。
|
||||
- [ ] `M7-03` 大文件导入显示真实字节进度并支持取消。
|
||||
- [ ] `M7-04` 取消 import 后释放 input buffer、native handle 和 staging 文件。
|
||||
- [ ] `M7-05` save 中断时旧 revision 和旧 hash 保持不变。
|
||||
- [ ] `M7-06` dirty state 只由成功 Main transaction 改变。
|
||||
- [ ] `M7-07` undo 回到保存 revision 时 dirty state 清除。
|
||||
- [x] `M7-01` 记录 import/open/save/save-as/export 五个用户动作的状态机。
|
||||
- [x] `M7-02` 对重复 open、并发 save 和 close-during-save 建立互斥规则。
|
||||
- [x] `M7-03` 大文件导入显示真实字节进度并支持取消。
|
||||
- [x] `M7-04` 取消 import 后释放 input buffer、native handle 和 staging 文件。
|
||||
- [x] `M7-05` save 中断时旧 revision 和旧 hash 保持不变。
|
||||
- [x] `M7-06` dirty state 只由成功 Main transaction 改变。
|
||||
- [x] `M7-07` undo 回到保存 revision 时 dirty state 清除。
|
||||
- [ ] `M7-08` Worker 崩溃时展示可恢复错误,不清空当前项目列表。
|
||||
- [ ] `M7-09` 重启 Worker 后恢复 selection、frame、workspace 和项目 revision。
|
||||
- [ ] `M7-10` recent projects 对缺失/损坏 OPFS 条目执行隔离和修复提示。
|
||||
|
||||
Reference in New Issue
Block a user