Reorganize Blender Web execution around capabilities
Some checks are pending
M6 deployable RC / quick (push) Waiting to run
M6 deployable RC / chromium (push) Blocked by required conditions
M6 deployable RC / release (push) Blocked by required conditions

This commit is contained in:
mes123456
2026-08-24 18:37:46 -04:00
parent 0b2c3ba0dd
commit a081c68c87
2530 changed files with 763976 additions and 79 deletions

View File

@@ -0,0 +1,212 @@
{
"schemaVersion": 2,
"matrixId": "BLENDER_WASM_CAPABILITY_MATRIX",
"status": "TEMPLATE",
"sourceOfTruth": "corrective capability evidence; legacy M16-GAP records remain immutable",
"queuePolicy": {
"mode": "SHADOW_ONLY",
"writesLegacyQueue": false,
"requiresGate": "G5",
"migrationPlan": "docs/BLENDER_WASM_CORRECTIVE_MIGRATION_PLAN.md"
},
"allowedParityLevels": ["L0", "L1", "L2", "L3", "L4", "L5"],
"allowedCompletionClasses": [
"FEATURE_PARITY",
"READ_COMPATIBILITY",
"NEGATIVE_BOUNDARY",
"METADATA_ONLY",
"UNSUPPORTED_DECLARED",
"BLOCKED",
"PLANNED"
],
"allowedLifecycleStatuses": ["planned", "in_progress", "blocked", "done"],
"allowedEvidenceStatuses": ["PASS", "FAIL", "BLOCKED", "NOT_RUN"],
"allowedProvenanceStates": ["VERIFIED", "DRIFT", "MISSING", "RESTORED", "BLOCKED_SOURCE_LOST"],
"fieldContracts": {
"capabilityId": "^CAP-[A-Z0-9]+(?:-[A-Z0-9]+)*$",
"family": "stable capability family, not a legacy task name",
"parityLevel": "highest level fully proven by the evidence, never the target level",
"targetParityLevel": "planned level; never used as completion evidence",
"completionClass": "must agree with evidence and lifecycleStatus",
"sourceGaps": "zero or more immutable M16-GAP IDs; references only",
"productionEntrypoints": "files that changed or were explicitly checked",
"evidence": "all required receipts, reports, hashes, and focused commands",
"provenanceState": "artifact provenance; observed hash never replaces original hash",
"migration": "shadow mapping; no queue write before C6-003"
},
"requiredFields": [
"capabilityId",
"lifecycleStatus",
"family",
"primaryBehavior",
"parityLevel",
"targetParityLevel",
"completionClass",
"sourceGaps",
"desktopOracle",
"wasmCommand",
"productionEntrypoints",
"positiveCases",
"negativeCases",
"persistenceCases",
"undoRedoCases",
"resourceCases",
"owner",
"dependencies",
"gate"
,"evidence"
,"expectedMutation"
,"migration"
],
"entryTemplate": {
"capabilityId": "CAP-REPLACE-ME",
"lifecycleStatus": "planned",
"family": "REPLACE_ME",
"primaryBehavior": "REPLACE_ME",
"parityLevel": "L0",
"targetParityLevel": "L2",
"completionClass": "PLANNED",
"sourceGaps": [],
"desktopOracle": {
"fixture": "tests/files/web/corrective/REPLACE_ME.blend",
"command": "REPLACE_ME",
"positiveRequired": false,
"negativeRequired": ["malformed", "invalid_context"]
},
"wasmCommand": {
"type": "REPLACE_ME",
"schemaVersion": 1,
"status": "PLANNED",
"requires": ["baseRevision", "context"]
},
"productionEntrypoints": [],
"positiveCases": [],
"negativeCases": [],
"persistenceCases": [],
"undoRedoCases": [],
"resourceCases": [],
"expectedMutation": {
"positiveStatus": "FINISHED",
"mainMutation": "CHANGED",
"revisionDelta": 1,
"failureRevisionDelta": 0
},
"evidence": {
"status": "NOT_RUN",
"provenanceState": "MISSING",
"required": ["desktopReport", "wasmReport", "focusedCommands", "artifactHashes"],
"desktopReport": null,
"wasmReport": null,
"focusedCommands": [],
"artifactHashes": [],
"chromiumTest": null
},
"migration": {
"state": "UNMAPPED",
"primaryLegacyGaps": [],
"coverageCases": [],
"supersedes": [],
"legacyCompletionPreserved": true,
"reviewRequired": true
},
"owner": "REPLACE_ME",
"dependencies": [],
"gate": "G1"
},
"entries": [
{
"capabilityId": "CAP-ASSET-CATALOG-MUTATION",
"lifecycleStatus": "planned",
"family": "ASSET_CATALOG",
"primaryBehavior": "create_or_update_catalog_and_save",
"parityLevel": "L0",
"targetParityLevel": "L4",
"completionClass": "PLANNED",
"sourceGaps": [
"operator:asset.catalog_new",
"operator:asset.catalog_delete",
"operator:asset.catalogs_save",
"operator:asset.catalog_undo",
"operator:asset.catalog_redo"
],
"desktopOracle": {
"operatorIds": [
"ASSET_OT_catalog_new",
"ASSET_OT_catalog_delete",
"ASSET_OT_catalogs_save"
],
"positiveRequired": true,
"negativeRequired": ["no_context", "read_only_library", "missing_resource"]
},
"wasmCommand": {
"type": "assetCatalogMutation",
"status": "PLANNED",
"requires": ["activeAssetLibrary", "baseRevision", "resourceProvider"]
},
"productionEntrypoints": [
"blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"blender-5.2.0/source/blender/web_engine/web_engine_api.h",
"web/engine/web_engine_main_state.cpp"
],
"positiveCases": ["create", "rename", "delete", "save"],
"negativeCases": ["malformed", "unsupported", "revision_conflict"],
"persistenceCases": ["save_reopen_catalog_and_main"],
"undoRedoCases": ["catalog_undo", "catalog_redo"],
"resourceCases": ["external_required", "packed", "path_rejection"],
"owner": "WEB_ENGINE_AND_ASSET_WORKFLOW",
"dependencies": ["C2-001", "C2-002", "C2-003"],
"gate": "G3"
,"expectedMutation": {"positiveStatus": "FINISHED", "mainMutation": "CHANGED", "revisionDelta": 1, "failureRevisionDelta": 0}
,"evidence": {"status": "NOT_RUN", "provenanceState": "MISSING", "required": ["desktopReport", "wasmReport", "focusedCommands", "artifactHashes", "chromiumTest"], "desktopReport": null, "wasmReport": null, "focusedCommands": [], "artifactHashes": [], "chromiumTest": null}
,"migration": {"state": "UNMAPPED", "primaryLegacyGaps": ["operator:asset.catalog_new", "operator:asset.catalog_delete", "operator:asset.catalogs_save", "operator:asset.catalog_undo", "operator:asset.catalog_redo"], "coverageCases": [], "supersedes": [], "legacyCompletionPreserved": true, "reviewRequired": true}
},
{
"capabilityId": "CAP-MODIFIER-STATE-MUTATION",
"lifecycleStatus": "planned",
"family": "MODIFIER",
"primaryBehavior": "toggle_modifier_state_and_persist",
"parityLevel": "L0",
"targetParityLevel": "L3",
"completionClass": "PLANNED",
"sourceGaps": ["modifier:state", "operator:object.modifier_toggle"],
"desktopOracle": {"positiveRequired": true, "negativeRequired": ["missing_modifier", "invalid_context"]},
"wasmCommand": {"type": "setModifierEnabled", "status": "EXISTING", "requires": ["meshId", "modifierUuid", "baseRevision"]},
"productionEntrypoints": ["blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp"],
"positiveCases": ["enable", "disable", "save_reopen"],
"negativeCases": ["invalid_uuid", "revision_conflict", "malformed"],
"persistenceCases": ["save_reopen_modifier_state"],
"undoRedoCases": ["undo", "redo"],
"resourceCases": [],
"owner": "WEB_ENGINE_MAIN",
"dependencies": ["C2-001", "C2-002", "C2-003"],
"gate": "G4"
,"expectedMutation": {"positiveStatus": "FINISHED", "mainMutation": "CHANGED", "revisionDelta": 1, "failureRevisionDelta": 0}
,"evidence": {"status": "NOT_RUN", "provenanceState": "MISSING", "required": ["desktopReport", "wasmReport", "focusedCommands", "artifactHashes", "chromiumTest"], "desktopReport": null, "wasmReport": null, "focusedCommands": [], "artifactHashes": [], "chromiumTest": null}
,"migration": {"state": "UNMAPPED", "primaryLegacyGaps": ["modifier:state", "operator:object.modifier_toggle"], "coverageCases": [], "supersedes": [], "legacyCompletionPreserved": true, "reviewRequired": true}
},
{
"capabilityId": "CAP-MESH-POSITIVE-EDIT",
"lifecycleStatus": "planned",
"family": "MESH",
"primaryBehavior": "perform_one_atomic_mesh_edit",
"parityLevel": "L0",
"targetParityLevel": "L3",
"completionClass": "PLANNED",
"sourceGaps": ["mesh:edit", "operator:mesh.edit"],
"desktopOracle": {"positiveRequired": true, "negativeRequired": ["invalid_selection", "unsupported_topology"]},
"wasmCommand": {"type": "meshEdit", "status": "PLANNED", "requires": ["meshId", "baseRevision", "selection"]},
"productionEntrypoints": ["blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", "web/engine/web_engine_main_state.cpp"],
"positiveCases": ["edit", "delta", "save_reopen"],
"negativeCases": ["invalid_selection", "revision_conflict", "malformed"],
"persistenceCases": ["save_reopen_geometry"],
"undoRedoCases": ["undo", "redo"],
"resourceCases": [],
"owner": "WEB_ENGINE_MAIN",
"dependencies": ["C2-001", "C2-002", "C2-003"],
"gate": "G4"
,"expectedMutation": {"positiveStatus": "FINISHED", "mainMutation": "CHANGED", "revisionDelta": 1, "failureRevisionDelta": 0}
,"evidence": {"status": "NOT_RUN", "provenanceState": "MISSING", "required": ["desktopReport", "wasmReport", "focusedCommands", "artifactHashes", "chromiumTest"], "desktopReport": null, "wasmReport": null, "focusedCommands": [], "artifactHashes": [], "chromiumTest": null}
,"migration": {"state": "UNMAPPED", "primaryLegacyGaps": ["mesh:edit", "operator:mesh.edit"], "coverageCases": [], "supersedes": [], "legacyCompletionPreserved": true, "reviewRequired": true}
}
]
}

View File

@@ -0,0 +1,303 @@
# Blender WASM 纠偏执行 Runbook
状态HISTORICAL_HANDOFF_COMPLETE当前执行入口见
[`BLENDER_WEB_EXECUTION_CONTROL_PLANE.md`](BLENDER_WEB_EXECUTION_CONTROL_PLANE.md)
入口方案:[`BLENDER_WASM_CORRECTIVE_MIGRATION_PLAN.md`](BLENDER_WASM_CORRECTIVE_MIGRATION_PLAN.md)
机器清单:[`BLENDER_WASM_CORRECTIVE_TASK_PLAN.json`](BLENDER_WASM_CORRECTIVE_TASK_PLAN.json)
能力模板:[`BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json`](BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json)
本 runbook 记录 C0-C6 的一次性纠偏过程,不应从 C0-001 重启。纠偏计划的
`reservedSuccessor` 只是旧队列的历史候选值,不是可领取的任务指针。
## 1. 启动原则
- 纠偏任务已经完成并进入历史交接;当前 legacy queue 由 `docs/EXECUTION_QUEUE.md`
和 parent manifest 指向 `M16-GAP-00282`。不得从旧 C6-003 checkpoint 猜测新的
legacy task。
- C0-C6 是独立的纠偏计划,不直接写入旧 `next-task-plan.json`
- C0 只允许只读审计和新增纠偏证据;不重写 parent manifest、不删除旧报告。
- 只有 G0-G4 全部通过后C6-003 才能申请修改旧队列。
- 浏览器测试只用 Chromium不要运行 Firefox 或 WebKit。
- 长命令输出写入纠偏 evidence 目录,交互消息只报告退出码、短尾和 hash。
受保护的旧输入是 `docs/EXECUTION_QUEUE.md`、parent manifest/status、completion registry、
`next-task-plan.json``task-catalog.jsonl``task-index.json`。每个 C task 开始前后都要
比较它们的 SHA-256失败时保留旧文件并把失败记录放入该 C task 的 evidence 目录。
## 2. 每个任务的固定生命周期
```text
READ -> PREFLIGHT -> IMPLEMENT -> FOCUSED TEST
-> NEGATIVE TEST -> SAVE/REOPEN -> HASH
-> TASK REPORT -> GATE -> HANDOFF
```
任务状态只有:
- `planned`:依赖未满足;
- `in_progress`:正在执行或存在可恢复失败;
- `blocked`:同一个外部阻塞连续三次确认;
- `done`:所有 focused、negative、persistence、hash、governance gate 通过。
`CANCELLED``UNSUPPORTED``EXTERNAL_REQUIRED` 只能作为结果状态,不能直接作为 task
状态或正向 parity 证据。
## 3. 通用 preflight
在每个 C task 开始前运行:
```bash
node tools/web/print-task-context.mjs
node tools/web/check-task-context.mjs
npm --prefix web run test:task-context
npm --prefix web run test:context-governance
git diff --check
node tools/web/check-corrective-plan.mjs
```
C task 不得借用旧 task 的 parent pointer它的 parent 必须在 task card 或 corrective
task plan 中显式声明。命令失败时保持 `planned`/`in_progress`,不要运行写队列命令。
所有状态写入遵循以下顺序:先写报告和哈希清单,再写 staged candidate最后由 gate
审核决定是否进入下一阶段。不得用 `sed`、编辑器或手工 JSON 修改 `nextTask`、catalog
offset、completion 状态或 parent evidence。
## 4. C0 启动顺序
### C0-001 freeze_and_snapshot
目的:建立不会被后续生成器覆盖的只读基线。
输入:
- `docs/EXECUTION_QUEUE.md`
- 当前 task context、00273 parent manifest/status
- `tests/golden/M15-03A/completed-gap-tasks.json`
- `tests/golden/M15-03A/task-catalog.jsonl`
- `tests/golden/M15-03A/task-index.json`
- `tests/golden/M15-03A/next-task-plan.json`(只能由脚本提取摘要,禁止复制全文)
输出目录:`tests/golden/corrective/C0-001/`
建议命令:
```bash
mkdir -p tests/golden/corrective/C0-001
node tools/web/print-task-context.mjs > tests/golden/corrective/C0-001/print-task-context.log
node tools/web/check-task-context.mjs > tests/golden/corrective/C0-001/check-task-context.log
git status --short > tests/golden/corrective/C0-001/git-status.log
sha256sum \
docs/EXECUTION_QUEUE.md \
tests/golden/M16-GAP-00273/manifest.json \
docs/status/M16-GAP-00273.md \
tests/golden/M15-03A/completed-gap-tasks.json \
tests/golden/M15-03A/task-catalog.jsonl \
tests/golden/M15-03A/task-index.json \
tests/golden/M15-03A/next-task-plan.json \
> tests/golden/corrective/C0-001/source-hashes.txt
node tools/web/capture-corrective-baseline.mjs \
--task M16-GAP-00274 \
--output tests/golden/corrective/C0-001/baseline.json
node tools/web/capture-corrective-baseline.mjs \
--task M16-GAP-00274 \
--output tests/golden/corrective/C0-001/baseline-second.json
cmp tests/golden/corrective/C0-001/baseline.json \
tests/golden/corrective/C0-001/baseline-second.json
node tools/web/check-corrective-baseline.mjs \
--baseline tests/golden/corrective/C0-001/baseline.json \
--source-hashes tests/golden/corrective/C0-001/source-hashes.txt
```
报告必须记录active task、parent nextTask、catalog active、plan firstTask、completion
count、未提交文件、每个源文件 hash。不得在此任务中修改这些源文件。
出口:基线报告可重复生成,所有旧证据路径存在,旧 parent 证据 hash 未变化;
`node tools/web/check-corrective-plan.mjs``git diff --check` 必须退出 0。
### C0-002 reconcile_generated_state
目的:确定唯一 completion source并在 staging 中恢复 plan/index/catalog 的可重复生成。
实现边界:
- 新增一个只处理状态的 repository tool不能直接接受 task number 猜测;
- 输入必须是 manifest/status/task-context 三者一致的 task 集合;
- 生成顺序固定为 `completion registry -> next-task plan -> task index -> task card`
- 每一步写临时文件hash 校验通过后原子替换;
- 失败时保留旧文件,不推进 queue`--write` 只能写入
`tests/golden/corrective/C0-002/staged/`,不得覆盖正式 queue 生成物。
必须拒绝:
- manifest `done` 但 status/context 缺失;
- parent manifest nextTask 不匹配;
- artifact hash 漂移;
- 同时存在两个 active task
- 手工 offset 或 nextTask 参数。
出口:连续两次从同一输入生成相同的 `inputDigest`,并输出 issue summary、registry
comparison 和 repair plan。只有无阻塞时 write 才允许退出 0发现历史 drift 时,
dry-run/write 必须以相同 digest 拒绝写入并保持 blocked
```bash
node tools/web/check-blender-next-task-plan.mjs
node tools/web/check-task-index.mjs
npm --prefix web run test:task-context
npm --prefix web run test:context-governance
node tools/web/check-context-governance.mjs
git diff --check
```
#### C0-002 阻塞恢复顺序
先读 `dry-run.json``inputDigest``issueSummary``registryComparison`
`repairPlan`,不要从大量原始 issue 中手工挑选任务。按以下顺序恢复:
1. `PLAN_NONDETERMINISTIC`:在临时路径运行生成器,比较 canonical bytes定位 source
hash 或生成器输入差异,不能直接覆盖正式 plan。
2. `ARTIFACT_HASH_DRIFT`:按 `samplePaths` 分组,寻找不可变 artifact snapshot找不到
snapshot 就保持该 task `BLOCKED`,禁止重新签历史 manifest hash。
3. `MISSING_TASK_CONTEXT`:仅当 manifest parent pointer 已独立证明有效时,使用
`check-task-context --task <id> --write` 写入对应 corrective evidenceparent pointer
失效时不得猜测 task number。
4. 重新运行 dry-run/write要求 `inputDigest` 相同;`writeOutcome=NO_FILES_WRITTEN`
不创建 staged candidate。
只有 issue summary 为空、registry comparison 无未解释差异、plan determinism 通过且
`queueMutation=false`C0-002 才能进入 `done`。修复动作始终写入 corrective evidence
不回写旧 queue、manifest、status、catalog 或 index。
### C0-003 classify_legacy_273
前置C0-002 必须 `done` 且 G0 clean历史 hash/context drift 未解决时保持 `blocked`
不得并行读取不可信的 generated state。
目的:把旧任务从“完成数量”转换为可审计的能力覆盖。
输出:`tests/golden/corrective/C0-003/legacy-gap-classification.json`
每条记录至少包含:
```json
{
"task": "M16-GAP-00274",
"gapId": "operator:asset.catalogs_save",
"evidenceLevel": "L1",
"completionClass": "METADATA_ONLY",
"desktopPositive": false,
"wasmPositiveMutation": false,
"readerChanged": false,
"wasmChanged": false,
"saveReopen": "EXACT",
"reason": "WASM reads Library metadata; no equivalent operator command",
"candidateCapabilityId": "CAP-ASSET-CATALOG-MUTATION",
"mappingState": "CANDIDATE",
"evidenceRefs": ["tests/golden/M16-GAP-00274/manifest.json"],
"sourceHashes": [{"path": "tests/golden/M16-GAP-00274/manifest.json", "sha256": "..."}]
}
```
分类只能从 manifest、report、source hash 和 focused test 证据推导,不得凭 task 名字推断。
出口273 条记录都有 level、positive/negative、production hash 和回归入口;报告明确
哪些可以合并为 capability cluster。
## 5. C1-C4 开工顺序
C0-002 和 C0-003 未通过前,不开始 C1。
1. `C1-001`:写 parity level 和 completion policy只改 schema/docs/test。
2. `C1-002`:写 command/result/context schema 和错误码;加 schema unit tests。
3. `C1-003`:实现 shared desktop/WASM case runner禁止新增 per-gap branch。
4. `C2-001`command registry、validation、authorization。
5. `C2-002`Main mutation 原子性和失败回滚。
6. `C2-003`undo/redo、dirty、save/reopen invariant。
7. `C3-001`Asset Catalog resource provider 和 active library context。
8. `C3-002`Asset Catalog 正向 command必须产生 WASM Main mutation。
9. `C3-003`Asset Catalog Chromium pilot覆盖至少 5 个旧 cases。
10. `C4-001``C4-002`Modifier、Mesh 正向 pilot。
11. `C4-003`:统一 negative matrix确认错误不会产生部分 mutation。
## 6. 每个 production pilot 的报告模板
报告必须同时给出:
- desktop fixture/report/hash
- WASM command request/result
- before/after snapshot 和 revision
- Main mutation 类型和 dirty 状态;
- save/reopen 对比;
- undo/redo 对比;
- malformed、unsupported、resource missing、revision conflict
- production files changed 及 SHA-256
- Chromium E2E URL/test id/exit code
- 未覆盖范围和下一步。
不接受只包含 `operatorStatus``libraryStatus``saveReopen` 的 pilot 报告。
每个报告同时写入一个 machine-readable `result.json`,至少包含:
```json
{
"schemaVersion": 1,
"capabilityId": "CAP-...",
"lifecycleStatus": "in_progress",
"evidenceStatus": "PASS",
"parityLevel": "L2",
"desktop": {"status": "FINISHED", "mainMutation": "CHANGED"},
"wasm": {"status": "FINISHED", "mainMutation": "CHANGED"},
"revision": {"before": 12, "after": 13, "failureAfter": 13},
"artifacts": [{"path": "...", "originalSha256": "...", "observedSha256": "...", "provenanceState": "VERIFIED"}],
"inputDigest": "...",
"legacyCoverage": [],
"queueMutation": false
}
```
`evidenceStatus=PASS` 只有在正向、负向、持久化、哈希和治理命令全部退出 0 时允许;
`CANCELLED``UNSUPPORTED``EXTERNAL_REQUIRED` 只能出现在明确的负例记录中。
## 7. C5 规模化迁移
只有 G3、G4 通过后才执行:
1. 从 C0-003 classification 生成 capability clusters
2. 每个 cluster 选 1 个正向、1 个资源缺失、1 个坏输入、1 个 save/reopen case
3. 用数据驱动 runner 运行 cluster
4. 将同一 production primitive 关闭的旧 gaps 汇总到 capability manifest
5. 只有需要新 reader/API/Main writer 的 cluster 才创建 implementation task
6. 旧 M16-GAP manifest 保持 immutable只新增引用和 coverage 状态。
规模化期间,如果一个 production change 不能关闭至少 5 个相关 cases暂停并复审聚类。
## 8. 最终 queue reactivation
C6-003 才能写旧队列。它必须:
- 由生成器从 capability plan 生成新的 active task
- 保留旧 M16-GAP 证据和 parent manifest
- 写入新的 task card、manifest/status/context
- 运行完整 post-handoff gates
- 记录旧 gap 到新 capability task 的映射;
- 以 dry-run diff 供 review确认后才原子替换 queue。
在此之前,任何“继续按 nextTask 执行”的调用都必须停在 C0 checkpoint不能直接进入 00275。
复活前必须产出 `queue-reactivation-dry-run.json`,其中列出:旧 parent manifest hash、
新 capability task IDs、每个 legacy gap 的 primary mapping、被保留的负例、预期 queue
diff 和回滚路径。dry-run 与 write 的 bytes 不一致、primary mapping 不唯一或任一旧
parent hash 漂移时C6-003 必须保持 `in_progress`
## 9. 日常报告格式
每天只报告:
```text
phase=<C0-C6> task=<id> status=<state>
focused=<exit> negative=<exit> persistence=<exit> hash=<exit>
gate=<G0-G5> productionFiles=<count> positiveWasmCases=<count>
blockedBy=<reason-or-none> next=<id-or-none>
```
长日志放在 `tests/golden/corrective/<task>/`。不在聊天中粘贴完整 plan、历史 status 或
Blender 编译日志。

View File

@@ -0,0 +1,434 @@
# Blender WASM 纠偏实施方案
状态HISTORICAL_PROPOSAL已验证内容已并入当前执行控制面不再单独驱动队列
版本2026-08-23
适用范围Blender 5.2 Web Engine、Main/Blend reader、WASM command layer、Chromium 验收
迁移模式:`MIGRATION_SHADOW_ONLY`C6-003 的写入结果只作为历史 checkpoint
当前 queue 仍以 `docs/EXECUTION_QUEUE.md` 和 parent manifest 为准
## 0. 决策摘要
当前项目不是底层技术完全错误,而是执行单位和完成定义错误。
旧路线把每个 Blender gap、尤其是每个 operator拆成一个独立任务桌面端用
`CANCELLED` 边界完成验收WASM 只验证 snapshot/read/save/reopen。这条路线可以建立
文件格式和数据读取清单,但不能证明 Blender operator 或编辑器能力已经移植。
从现在开始采用两层工作模型:
1. **能力主线**:按用户可见 workflow 和共享生产原语实现真实 WASM 能力。
2. **覆盖支线**:保留旧 M16-GAP 清单,作为参数化回归矩阵,不再把每个 gap 当成一次独立生产实现。
纠偏阶段已经完成基线、共享 runner、Main 事务、Asset Catalog/Modifier/Mesh
pilot 和 Chromium workflow gate。当前 legacy queue 为 `M16-GAP-00282`C6-003
`M16-GAP-00277` 是历史 reactivation checkpoint后续任务沿 parent manifest
链继续,不能把旧 checkpoint 改写成当前状态。
## 1. 现状和问题边界
### 1.1 已有资产
- `web_engine_apply_command()` 已有 revision 检查、history、Main authority 和若干
正向命令frame、object visibility、modifier、decimate。这是后续 command layer 的基础。
- `web_engine_open_blend()`、snapshot、save/reopen、undo/redo 和 malformed input
已有较完整的 smoke/roundtrip 入口。
- Blender desktop 可作为行为 oracleChromium 是唯一允许的浏览器验收运行时。
- 任务 context、manifest、SHA-256 和失败不推进队列的治理工具已经存在。
### 1.2 已确认的偏差
- 当前 operator gap 的 WASM 验收经常只读取数据块元数据,不执行等价 operator。
- `poll=false``CANCELLED` 被当作 Local Exact 成功;这只能证明负向边界或安全取消。
- `M16-GAP-00264``00274` 的 reader/WASM 构件 hash 不变,主要变化是 fixture、checker
和报告。
- `tools/web/check-generated-gap.mjs` 已成为约 8,500 行的 task 分支单体,无法经济地承载
6900 个独立 gap。
- `completed-gap-tasks.json``task-catalog.jsonl``next-task-plan.json` 曾出现互相不一致,
说明交接流程不是事务性的。
### 1.3 不是问题的部分
fixture 最小化、桌面 oracle、save/reopen、malformed negative、Chromium-only、hash
manifest 和 context budget 都应保留。这些是质量基础,不应删除;需要改变的是它们服务的
完成定义和任务分解。
## 2. 新的完成定义
每个能力必须标记一个明确 parity level。没有 level 的任务不得进入 active 队列。
| Level | 含义 | 必须证明 |
| --- | --- | --- |
| L0 | Blend binary 可安全读取 | header/SDNA/坏输入/资源边界 |
| L1 | Main 数据可观察 | snapshot 字段、身份、revision、依赖 |
| L2 | WASM Main 可正向修改 | command 成功、Main mutation、snapshot/delta |
| L3 | 修改可持久化 | save/reopen、dirty、资源恢复 |
| L4 | 操作语义等价 | desktop 正向结果、取消/错误、context 和 operator result |
| L5 | 用户 workflow 闭环 | UI/command、undo/redo、连续操作、Chromium E2E |
规则:
- 只有 L2-L5 才能计入“功能移植完成”。
- L0-L1 只能计入“读取/兼容性覆盖”。
- desktop `CANCELLED` 不能替代 WASM 正向行为。
- WASM 只读 snapshot 不能替代 command execution。
- 一个 task 必须写明 positive case、negative case、save/reopen case 和 level。
- 连续三个任务没有 production reader/API/engine 变化时,自动触发路线复审。
## 3. 目标架构
目标数据流:
```text
Chromium UI / workflow
|
v
Typed Command JSON + baseRevision + context
|
v
web_engine_apply_command()
|
+--> command registry / validation / authorization
|
+--> authoritative Main mutation
| |
| +--> snapshot / delta / diagnostics
| +--> undo / redo history
| +--> dirty + save/reopen
|
+--> resource provider (OPFS/virtual external resources)
```
### 3.1 Command contract
请求统一为:
```json
{
"schemaVersion": 1,
"commandId": "uuid-or-test-id",
"type": "setModifierEnabled",
"baseRevision": 12,
"context": {"activeObjectId": "object:Cube", "editor": "VIEW_3D"},
"payload": {}
}
```
结果统一为:
```json
{
"schemaVersion": 1,
"commandId": "uuid-or-test-id",
"status": "FINISHED",
"revision": 13,
"mainMutation": "CHANGED",
"delta": {},
"diagnostics": []
}
```
允许的 status 至少包括 `FINISHED``CANCELLED``UNSUPPORTED``INVALID_ARGUMENT`
`REVISION_CONFLICT``RESOURCE_REQUIRED`。结果必须可被 desktop checker 和 Chromium
runner 同时消费。
### 3.2 Context contract
把当前 operator 依赖的 context 显式化active Main、active object、editor、area、region、
asset library、selection 和 file path。没有 context 时必须返回可区分的 `CANCELLED`
`UNSUPPORTED`,而不是静默通过。
### 3.3 Resource contract
外部 Library、asset catalog、packed asset、OPFS 文件和虚拟路径必须通过同一个 resource
provider 解析。`EXTERNAL_REQUIRED` 是资源状态,不是 operator 成功状态。
## 4. 阶段实施方案
### Phase 0止损和可审计基线P01-2 个工程日)
目标:停止错误的线性扩张,建立可信的起点。
任务:
- 历史纠偏阶段冻结 `M16-GAP-00274`,不领取 00275该阶段已结束当前生产
指针由 WBV2 capability queue 管理M16 仅保留 coverage checkpoint。
- 保留现有 fixture、报告和 parent manifest不重写历史证据。
- 校验 273 个已记录任务的 manifest/status/context/hash。
- 解决 completion registry、task catalog、next-task plan、task index 的单一事实来源问题。
- 给旧任务添加 `evidenceLevel``completionClass`,区分 L0/L1、negative、L2+。
- 输出一份 capability inventory列出已有真实 production mutation 与仅 metadata 的任务。
出口条件:
- 所有生成文件可以从唯一 source 重建;
- 当前 active task、parent `nextTask`、catalog active 记录一致;
- 旧任务不再把 negative-only 证据计入功能完成;
- `check-blender-next-task-plan``check-task-index`、context gates 全部通过。
### Phase 1Parity contract 和测试基座P12-3 个工程日)
目标:让每个后续 task 都有可判定的“正向等价”定义。
任务:
- 建立 declarative capability matrixcapability、level、desktop oracle、WASM command、
persistence、negative、resource、owner。
- 建立统一 command/result JSON schema 和错误码表。
- 增加桌面与 WASM 共享的 result normalizer禁止每个 task 自己解释 `CANCELLED`
- 建立 positive mutation、revision conflict、unsupported、resource missing 四类通用测试。
- 将长 checker 拆成按能力族的 runnertask 只提供 case 数据。
出口条件:
- 同一 case 可由 desktop runner 和 WASM runner 读取;
- 正向、取消、不支持、坏输入四种结果不可混淆;
- 一个测试原语能覆盖至少 5 个相同语义的 cases
- 不新增硬编码 task 分支即可增加参数化 case。
### Phase 2Command/Main authority 基础P23-7 个工程日)
目标:把已有的 `apply_command` 从少量命令扩展为可复用能力层。
任务:
- 实现 command registry、schema validation、context validation、authorization。
- 统一 revision、history capture、undo、redo、dirty 和 save 语义。
- 补齐 Main writer 的错误回滚,确保 command 失败不产生部分 mutation。
- 为每个 command 生成 snapshot/delta/diagnostics。
- 为 native smoke stub 与真实 WASM Main authority 分别标记能力,不允许混用证据。
出口条件:
- 至少 3 个 command 在 desktop/WASM 上产生相同正向结果;
- 每个 command 有成功、取消、坏参数、revision conflict、save/reopen 测试;
- 失败后 revision、Main 和 undo 栈都不漂移;
- Chromium E2E 能完成一次完整 command roundtrip。
### Phase 3Asset Catalog 垂直 pilotP33-5 个工程日)
目标:用当前阻塞的 operator 家族验证路线是否真正纠正。
最小闭环:
1. 打开带 Library/Asset Catalog 的 blend
2. 在 WASM 中建立明确的 active asset library/context
3. 创建或修改 catalog
4. 观察 Main/Library 状态变化和 revision
5. 保存 catalog 和 blend
6. 重开后比较 catalog、Library、dirty、undo/redo
7. 分别验证无 context、只读 Library、外部资源缺失和坏输入。
出口条件:
- 至少一个 desktop 正向 `FINISHED` 案例;
- 至少一个 WASM 正向 command 案例;
- `CANCELLED` 仅出现在确实缺 context/资源/权限的负例;
- catalog mutation 有真实 production 代码变化和对应 Chromium E2E
- 能关闭至少 5 个旧 asset-catalog gaps而不是为每个 gap 添加 checker 分支。
### Phase 4Modifier 和 Mesh 垂直 pilotP43-5 个工程日)
目标:验证路线不只适用于 Asset Catalog。
- Modifier启用/禁用、viewport/render/edit visibility、依赖更新、保存重开、undo/redo。
- Mesh一个顶点/拓扑 mutation、几何 snapshot/delta、保存重开、错误回滚。
- 每个 pilot 复用 Phase 2 的 command/result/runner不创建 task 专用协议。
出口条件:
- 每个 family 至少 2 个 L2/L3 workflow
- 一个实现原语覆盖多个旧 gap
- 生产 mutation、snapshot、delta、save/reopen 四者一致;
- pilot 失败时能明确归因到 parser、Main writer、command、resource 或 UI context。
### Phase 5覆盖矩阵和规模化迁移P5pilot 通过后)
目标:将 6900 gap 从“串行开发队列”降级为“覆盖数据”。
- 按 capability primitive 聚类旧 gaps
- 每个 cluster 只保留代表性 positive/negative/save-reopen cases
- 用参数化 fixture 和数据驱动 runner 生成覆盖报告;
- 只有需要独立 production change 的 cluster 才产生新 implementation task
-`M16-GAP-*` manifest 保持不可变,新增 capability manifest 引用旧覆盖项;
-`check-generated-gap.mjs` 拆为 `check-capability-*.mjs`,删除重复分支。
规模化出口条件:
- 每个新增 production change 平均关闭至少 5 个相关 cases
- 生成器、catalog、index、queue 可重复生成;
- 没有连续三个 evidence-only task
- task 数、能力数、用户 workflow 数分开统计。
### Phase 6发布门和长期维护P6
- Chromium E2Eopen/edit/undo/redo/save/reopen/resource recovery
- 性能:大 blend 打开、snapshot、delta、save、memory、command latency
- 安全malformed blend、路径穿越、外部资源、命令权限、revision replay
- 兼容性Blender 5.2 fixture、未来 SDNA 变化和旧文件;
- 发布声明只能引用 L2-L5 证据L0-L1 单独列为读取兼容性。
## 5. 新的阶段任务清单规则
纠偏任务使用 `C0-*``C6-*` 的 capability IDs先存在于独立清单pilot 通过后再由
仓库生成器映射到正式 queue。不得直接把这些 ID 手工写入旧 `next-task-plan.json`
每个任务必须包含:
- `capabilityId``parityLevel``primaryBehavior`
- production entrypoint 和预期代码变化;
- desktop oracle、WASM command、fixture
- positive、negative、save/reopen、undo/redo
- expected revision/Main mutation
- dependencies、exit gates、rollback
- artifact list 和 SHA-256 policy。
推荐执行顺序:
```text
C0 governance -> C1 contract/test -> C2 command/Main
-> C3 Asset Catalog pilot
-> C4 Modifier/Mesh pilots
-> C5 coverage migration
-> C6 release gates
```
任何阶段 gate 失败都保持该阶段 `in_progress`,不推进旧 M16 queue。
## 5.1 旧 gap 到 capability 的迁移规则
迁移是一个 shadow mapping 过程,不是批量改写旧任务状态。旧 `M16-GAP-*` manifest、
status、fixture、report、completion registry 和 parent pointer 都是不可变引用;新
capability 只增加覆盖关系和新的证据。`docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json`
是字段模板,不是旧队列的第二个 active 指针。
### 映射状态
每条 legacy gap 必须有且只有一个 `primaryCapabilityId`,并可有零个或多个
`coverageCapabilityIds`。映射状态只能取以下值:
| 状态 | 含义 | 是否可计入新能力完成 |
| --- | --- | --- |
| `UNMAPPED` | 尚未找到稳定的共享原语 | 否 |
| `CANDIDATE` | 有行为相似性,但还没有正向生产证据 | 否 |
| `COVERED` | 新能力的正向/负向/持久化 case 已覆盖该 gap | 仅在 capability 自身达到 L2-L5 后 |
| `RETAINED_NEGATIVE` | 旧证据只证明取消、不支持、资源缺失或坏输入 | 否,保留为边界证据 |
| `DUPLICATE` | 与另一 gap 完全相同,保留 canonical gap 引用 | 否,不能重复计数 |
| `BLOCKED` | 证据、hash、资源或语义不完整 | 否 |
### 迁移判定顺序
1. 读取旧 manifest/status/task-context 和所有 artifact hash缺一项就写 `BLOCKED`
2. 读取 desktop positive/negative、WASM command/result/Main mutation、save/reopen 和
revision 证据;只读 snapshot 不得升级到 L2。
3.`family + primaryBehavior + commandType + persistenceContract` 聚类,不能按
task number 或 gap 字符串简单合并。
4. 为每个 gap 选择一个 primary capability无法唯一选择时保持 `CANDIDATE`
`BLOCKED`,由 owner review 决定,不自动覆盖。
5. capability 只有在 desktop 正向 `FINISHED`、WASM 正向 `FINISHED`
`mainMutation=CHANGED` 后,才可把相关 gap 标记为 `COVERED`
6. 负例必须单独记录 expected status、revision delta 和 Main 不变断言;
`CANCELLED``UNSUPPORTED``EXTERNAL_REQUIRED` 永远不能成为正向完成理由。
7. 生成 capability manifest 和 coverage report 到 staging在 C6-003 前不替换旧
plan/index/catalog/queue。
### 迁移记录契约
每条映射记录必须包含:
```json
{
"legacyTask": "M16-GAP-00274",
"gapId": "operator:asset.catalogs_save",
"primaryCapabilityId": "CAP-ASSET-CATALOG-MUTATION",
"coverageCapabilityIds": [],
"mappingState": "CANDIDATE",
"legacyCompletionPreserved": true,
"evidenceLevel": "L1",
"completionClass": "READ_COMPATIBILITY",
"evidenceRefs": ["tests/golden/M16-GAP-00274/manifest.json"],
"sourceHashes": [{"path": "...", "sha256": "..."}],
"review": {"owner": "WEB_ENGINE_AND_ASSET_WORKFLOW", "status": "OPEN"}
}
```
`legacyCompletionPreserved` 必须始终为 `true`;它表示旧记录仍可追溯,并不表示旧 task
是新的 feature parity。任何 capability manifest 的 `FEATURE_PARITY` 都必须引用至少
一个 L2-L5 positive WASM result 和对应 Chromium/desktop 证据。
### 迁移门和回滚
- C5-001 只生成 cluster 和 primary mapping不写旧生成物。
- C5-002 只把 mapping 作为数据驱动 runner 的输入,不为单个 gap 增加协议分支。
- C5-003 生成 coverage report、capability manifest 和 `queue-reactivation-dry-run.json`
dry-run 必须展示旧 parent hash、预期 diff、被保留负例和回滚路径。
- 只有 C6-003 在 G5 通过、dry-run bytes 与 write bytes 相同、所有旧 parent hash 未变且
owner review 通过后,才允许原子写旧 queue。
- 任一冲突、hash drift、primary mapping 不唯一或 capability 证据降级时,删除/隔离
staged candidate保留旧文件任务回到 `in_progress`;不得手工推进 `nextTask`
### 历史 hash drift 的修复协议
历史 artifact 的 hash drift 不等于可以重新签名。纠偏工具必须把每个 drift 记录为
`originalSha256``observedSha256``path``affectedTasks``provenanceState`,并按
以下顺序处理:
1.`tests/golden/corrective/rehydration/<task>/` 保存当前观察值和原 manifest 引用;
2. 从可信构件缓存或可复现 generator 恢复与 `originalSha256` 相同的 bytes
3. 恢复不到原 bytes 时,将 task 标为 `BLOCKED_SOURCE_LOST`,不要更新旧 manifest
4. 恢复成功时,只在 corrective evidence 中记录 `restoredArtifact`,再次运行完整 hash、
parent pointer 和 plan determinism gate
5. 只有所有依赖证据恢复且 review 通过,才允许生成新的 capability manifest 引用旧 gap。
`observedSha256` 只能用于诊断,永远不能成为旧 manifest 的新 hash。该协议避免一次
工作树变更把数百条历史证据静默“修正”为看似完成。
## 6. 进度和决策指标
每周只报告以下指标:
- L2-L5 完成的 capability 数;
- 正向 desktop/WASM workflow 数;
- 每个 production change 关闭的 cases 数;
- save/reopen、undo/redo、resource recovery 通过率;
- command conflict/rollback 通过率;
- queue/manifest/index determinism
- 当前阻塞及其年龄。
禁止使用以下指标作为唯一进度:
- 完成的 task 行数;
- 生成的 fixture 数;
- manifest 数;
- `CANCELLED``EXTERNAL_REQUIRED` 的数量。
## 7. 停线和回滚规则
立即停线条件:
- desktop 通过但 WASM 没有等价正向 mutation
- 三个连续 task 没有 production/API 变化;
- task catalog、completion registry、plan、index、queue 任一不一致;
- hash drift、revision drift、save/reopen drift
- 测试只验证 snapshot 而没有验证 command/result
- 为了推进队列而手工改 `nextTask`、offset 或 parent evidence。
回滚原则:
- 不删除历史 manifest、fixture 或 report
- 将证据-only 结果降级为 L0/L1 coverage
- 保留 parent manifest 不变;
- 新 capability plan 失败时只回滚新增 command/fixture/runner不回写旧证据
- 队列只有在完整 handoff 和所有生成门通过后才更新。
## 8. 近期具体动作
当前最优先的 5 个动作:
1. 冻结 00274修复 generated task state 的单一事实来源。
2. 生成 273 个旧任务的 evidence classification不再把它们全部视为 feature parity。
3. 落地 C1 command/result/context schema 和共享 runner。
4. 用 Asset Catalog 做第一个正向 L2-L4 pilot不接受只返回 `CANCELLED` 的结果。
5. 只有 Asset Catalog、Modifier、Mesh 三个 pilot 全部通过后,才恢复规模化队列。
这份方案的完成标志不是“继续产生更多 gap 报告”,而是 WASM 能够对用户 workflow
执行可观察、可回滚、可保存的真实 Main mutation并且旧 gap 清单能由这些共享能力自动覆盖。

View File

@@ -0,0 +1,111 @@
{
"schemaVersion": 2,
"planId": "BLENDER_WASM_CORRECTIVE_TASK_PLAN",
"status": "PROPOSED",
"created": "2026-08-23",
"queueMutation": "FORBIDDEN_UNTIL_PILOTS_PASS",
"queuePolicy": {
"mode": "READ_ONLY_UNTIL_C6_003",
"currentTask": "M16-GAP-00277",
"parentManifest": "tests/golden/M16-GAP-00276/manifest.json",
"parentNextTask": "M16-GAP-00277",
"reservedSuccessor": "M16-GAP-00278",
"protectedPaths": [
"docs/EXECUTION_QUEUE.md",
"tests/golden/M15-03A/completed-gap-tasks.json",
"tests/golden/M15-03A/next-task-plan.json",
"tests/golden/M15-03A/task-catalog.jsonl",
"tests/golden/M15-03A/task-index.json",
"tests/golden/M16-GAP-00273/manifest.json",
"docs/status/M16-GAP-00273.md"
],
"writeOnlyAt": "C6-003",
"requiredReview": "dry_run_diff_and_parent_hash_review"
},
"executionRunbook": "docs/BLENDER_WASM_CORRECTIVE_EXECUTION_RUNBOOK.md",
"capabilityMatrixTemplate": "docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json",
"taskCardRoot": "docs/corrective/",
"currentCheckpoint": {
"task": "C6-003",
"status": "in_progress",
"reason": "owner review approved and queue reactivation write completed; post-handoff remains under C6-003",
"queueCurrentTask": "M16-GAP-00277",
"queueParentNextTask": "M16-GAP-00277",
"reservedSuccessor": "M16-GAP-00278"
},
"taskContract": {
"requiredFields": [
"id",
"phase",
"name",
"dependsOn",
"gate",
"outputs",
"writeScope",
"queueMutationAllowed"
],
"cardWhenReady": "card",
"cardPolicy": "a compact card is required when a task becomes ready; future tasks remain plan-only until their dependencies pass",
"lifecycleStatuses": ["planned", "in_progress", "blocked", "done"],
"evidenceStatuses": ["PASS", "FAIL", "BLOCKED", "NOT_RUN"],
"writeScopes": ["evidence_only", "staged_generated_state", "production_pilot", "queue_reactivation"],
"failurePolicy": "preserve_previous_outputs_and_do_not_advance_old_queue"
},
"completionLevels": [
{"id": "L0", "name": "blend_read", "requires": ["safe binary read", "malformed rejection"]},
{"id": "L1", "name": "main_observe", "requires": ["snapshot fields", "identity", "revision", "dependencies"]},
{"id": "L2", "name": "wasm_mutation", "requires": ["positive command", "Main mutation", "snapshot or delta"]},
{"id": "L3", "name": "persistent_mutation", "requires": ["save/reopen", "dirty state", "undo/redo"]},
{"id": "L4", "name": "operator_semantics", "requires": ["desktop positive oracle", "WASM equivalent result", "context and errors"]},
{"id": "L5", "name": "user_workflow", "requires": ["Chromium E2E", "continuous workflow", "resource recovery"]}
],
"gates": [
{"id": "G0", "name": "state_reconciliation", "blocks": ["all_work"], "checks": ["completion registry is authoritative", "plan is deterministic", "task index matches plan", "queue parent pointer matches"]},
{"id": "G1", "name": "parity_contract", "blocks": ["production_pilots"], "checks": ["command schema", "result schema", "context schema", "positive and negative semantics"]},
{"id": "G2", "name": "command_main_authority", "blocks": ["workflow_pilots"], "checks": ["revision conflict", "atomic rollback", "undo redo", "save dirty"]},
{"id": "G3", "name": "asset_catalog_pilot", "blocks": ["scale_out"], "checks": ["desktop positive", "WASM positive", "resource provider", "save reopen", "five related cases"]},
{"id": "G4", "name": "modifier_mesh_pilots", "blocks": ["legacy_gap_migration"], "checks": ["L2/L3 workflow per family", "shared primitive reuse", "delta parity"]},
{"id": "G5", "name": "release", "blocks": ["release_statement"], "checks": ["Chromium E2E", "performance", "security", "deterministic artifacts"]}
],
"tasks": [
{"id": "C0-001", "phase": "P0", "name": "freeze_and_snapshot", "card": "docs/corrective/C0-001-freeze-and-snapshot.md", "taskCard": "docs/corrective/C0-001-freeze-and-snapshot.md", "dependsOn": [], "outputs": ["checkpoint inventory", "immutable parent references", "baseline hash record"], "gate": "G0", "status": "done", "ready": false, "writeScope": "evidence_only", "queueMutationAllowed": false},
{"id": "C0-002", "phase": "P0", "name": "reconcile_generated_state", "card": "docs/corrective/C0-002-reconcile-generated-state.md", "taskCard": "docs/corrective/C0-002-reconcile-generated-state.md", "dependsOn": ["C0-001"], "outputs": ["authoritative completion registry candidate", "deterministic plan candidate", "matching task index candidate", "input digest", "issue summary", "repair plan"], "gate": "G0", "status": "done", "ready": false, "writeScope": "staged_generated_state", "queueMutationAllowed": false},
{"id": "C0-003", "phase": "P0", "name": "classify_legacy_273", "card": "docs/corrective/C0-003-classify-legacy-273.md", "taskCard": "docs/corrective/C0-003-classify-legacy-273.md", "dependsOn": ["C0-002"], "outputs": ["evidence level matrix", "feature versus evidence report", "gap-to-capability candidates"], "gate": "G0", "status": "done", "ready": false, "writeScope": "evidence_only", "queueMutationAllowed": false},
{"id": "C1-001", "phase": "P1", "name": "define_parity_levels", "card": "docs/corrective/C1-001-define-parity-levels.md", "taskCard": "docs/corrective/C1-001-define-parity-levels.md", "dependsOn": ["C0-002", "C0-003"], "outputs": ["L0-L5 contract", "completion policy"], "gate": "G1", "status": "done", "ready": false, "writeScope": "evidence_only", "queueMutationAllowed": false},
{"id": "C1-002", "phase": "P1", "name": "define_command_result_context_schema", "card": "docs/corrective/C1-002-define-command-result-context-schema.md", "taskCard": "docs/corrective/C1-002-define-command-result-context-schema.md", "dependsOn": ["C1-001"], "outputs": ["versioned JSON schemas", "error/status table"], "gate": "G1", "status": "done", "ready": false, "writeScope": "evidence_only", "queueMutationAllowed": false},
{"id": "C1-003", "phase": "P1", "name": "build_shared_case_runner", "card": "docs/corrective/C1-003-build-shared-case-runner.md", "taskCard": "docs/corrective/C1-003-build-shared-case-runner.md", "dependsOn": ["C1-002"], "outputs": ["desktop runner", "WASM runner", "result normalizer"], "gate": "G1", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C2-001", "phase": "P2", "name": "command_registry_and_validation", "card": "docs/corrective/C2-001-command-registry-and-validation.md", "taskCard": "docs/corrective/C2-001-command-registry-and-validation.md", "dependsOn": ["C1-003"], "outputs": ["typed command dispatch", "context validation", "authorization"], "gate": "G2", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C2-002", "phase": "P2", "name": "atomic_main_mutation", "card": "docs/corrective/C2-002-atomic-main-mutation.md", "taskCard": "docs/corrective/C2-002-atomic-main-mutation.md", "dependsOn": ["C2-001"], "outputs": ["Main writer rollback", "revision and dirty contract"], "gate": "G2", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C2-003", "phase": "P2", "name": "undo_redo_save_invariants", "card": "docs/corrective/C2-003-undo-redo-save-invariants.md", "taskCard": "docs/corrective/C2-003-undo-redo-save-invariants.md", "dependsOn": ["C2-002"], "outputs": ["history contract", "save/reopen invariants"], "gate": "G2", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C3-001", "phase": "P3", "name": "asset_catalog_resource_provider", "card": "docs/corrective/C3-001-asset-catalog-resource-provider.md", "taskCard": "docs/corrective/C3-001-asset-catalog-resource-provider.md", "dependsOn": ["C2-003"], "outputs": ["external resource abstraction", "active library context"], "gate": "G3", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C3-002", "phase": "P3", "name": "asset_catalog_positive_command", "card": "docs/corrective/C3-002-asset-catalog-positive-command.md", "taskCard": "docs/corrective/C3-002-asset-catalog-positive-command.md", "dependsOn": ["C3-001"], "outputs": ["catalog mutation command", "desktop/WASM result parity"], "gate": "G3", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C3-003", "phase": "P3", "name": "asset_catalog_pilot_e2e", "card": "docs/corrective/C3-003-asset-catalog-pilot-e2e.md", "taskCard": "docs/corrective/C3-003-asset-catalog-pilot-e2e.md", "dependsOn": ["C3-002"], "outputs": ["positive fixture", "negative matrix", "Chromium E2E", "five-case coverage"], "gate": "G3", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C4-001", "phase": "P4", "name": "modifier_positive_pilot", "card": "docs/corrective/C4-001-modifier-positive-pilot.md", "taskCard": "docs/corrective/C4-001-modifier-positive-pilot.md", "dependsOn": ["C2-003"], "outputs": ["modifier workflow", "delta/save/undo parity"], "gate": "G4", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C4-002", "phase": "P4", "name": "mesh_positive_pilot", "card": "docs/corrective/C4-002-mesh-positive-pilot.md", "taskCard": "docs/corrective/C4-002-mesh-positive-pilot.md", "dependsOn": ["C4-001"], "outputs": ["mesh mutation workflow", "geometry delta parity"], "gate": "G4", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C4-003", "phase": "P4", "name": "pilot_negative_matrix", "card": "docs/corrective/C4-003-pilot-negative-matrix.md", "taskCard": "docs/corrective/C4-003-pilot-negative-matrix.md", "dependsOn": ["C3-003", "C4-001", "C4-002"], "outputs": ["unsupported", "revision conflict", "resource missing", "malformed cases"], "gate": "G4", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C5-001", "phase": "P5", "name": "cluster_legacy_gaps", "card": "docs/corrective/C5-001-cluster-legacy-gaps.md", "taskCard": "docs/corrective/C5-001-cluster-legacy-gaps.md", "dependsOn": ["C4-003"], "outputs": ["capability clusters", "representative coverage cases"], "gate": "G4", "status": "done", "ready": false, "writeScope": "evidence_only", "queueMutationAllowed": false},
{"id": "C5-002", "phase": "P5", "name": "modularize_gap_runner", "card": "docs/corrective/C5-002-modularize-gap-runner.md", "taskCard": "docs/corrective/C5-002-modularize-gap-runner.md", "dependsOn": ["C5-001"], "outputs": ["family runners", "data-driven cases", "no per-gap protocol"], "gate": "G4", "status": "done", "ready": false, "writeScope": "production_pilot", "queueMutationAllowed": false},
{"id": "C5-003", "phase": "P5", "name": "migrate_legacy_gap_inventory", "card": "docs/corrective/C5-003-migrate-legacy-gap-inventory.md", "taskCard": "docs/corrective/C5-003-migrate-legacy-gap-inventory.md", "dependsOn": ["C5-002"], "outputs": ["coverage reports", "capability manifests", "legacy evidence classification"], "gate": "G4", "status": "done", "ready": false, "writeScope": "staged_generated_state", "queueMutationAllowed": false},
{"id": "C6-001", "phase": "P6", "name": "chromium_workflow_gate", "card": "docs/corrective/C6-001-chromium-workflow-gate.md", "taskCard": "docs/corrective/C6-001-chromium-workflow-gate.md", "dependsOn": ["C5-003"], "outputs": ["open/edit/undo/redo/save/reopen E2E"], "gate": "G5", "status": "done", "ready": false, "writeScope": "evidence_only", "queueMutationAllowed": false},
{"id": "C6-002", "phase": "P6", "name": "performance_security_gate", "card": "docs/corrective/C6-002-performance-security-gate.md", "taskCard": "docs/corrective/C6-002-performance-security-gate.md", "dependsOn": ["C6-001"], "outputs": ["latency/memory budget", "malformed/path/replay security cases"], "gate": "G5", "status": "done", "ready": false, "writeScope": "evidence_only", "queueMutationAllowed": false},
{"id": "C6-003", "phase": "P6", "name": "reactivate_queue", "card": "docs/corrective/C6-003-reactivate-queue.md", "taskCard": "docs/corrective/C6-003-reactivate-queue.md", "dependsOn": ["C6-002"], "outputs": ["generated queue", "new capability task cards", "release decision"], "gate": "G5", "status": "in_progress", "ready": true, "writeScope": "queue_reactivation", "queueMutationAllowed": true}
],
"stopRules": [
"desktop positive result has no equivalent WASM mutation",
"three consecutive tasks have no production/API change",
"plan/index/catalog/queue is inconsistent",
"hash, revision, save/reopen, or rollback drift",
"historical artifact provenance is lost or cannot be restored without rewriting a manifest",
"dry-run and write inputDigest differ",
"CANCELLED or EXTERNAL_REQUIRED is counted as positive parity",
"manual nextTask, catalog offset, or parent evidence edit is proposed"
],
"successMetrics": [
"L2-L5 capability count",
"positive desktop/WASM workflow count",
"legacy cases closed per production change",
"save/reopen and undo/redo pass rate",
"queue determinism",
"Chromium workflow pass rate"
]
}

View File

@@ -0,0 +1,72 @@
# Blender Web execution control plane
This is the operational policy for moving Blender 5.2 behavior into the browser. It
keeps the existing desktop oracle, WASM/Main reader, Chromium checks, save/reopen
receipts, hashes, and compact task context. It changes the unit of production work.
## One source per decision
| Decision | Authoritative input | Meaning |
| --- | --- | --- |
| What runs next | `docs/EXECUTION_QUEUE.md` + its parent manifest | One active, serialized handoff pointer |
| What is a product capability | `docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json` | User-observable behavior and its proven parity level |
| What is still covered | `tests/golden/M15-03A/next-task-plan.json` | Legacy regression cases; not a promise of implementation |
| What was already proven | `tests/golden/<task>/manifest.json` and `tests/golden/corrective/` | Immutable receipts and hashes |
The old corrective handoff is historical evidence. A later queue task is valid only when
its parent-manifest chain descends from that checkpoint; the checkpoint itself is never
rewritten to make it appear current.
## Production unit
The production unit is a capability workflow, not an individual Blender operator or
RNA field. A capability task owns one user-visible mutation and reuses shared command,
context, resource, Main transaction, history, and case-runner primitives. Its data-driven
cases may cover related legacy gaps in the same family.
Every capability task must state its parity level, positive mutation, negative boundary,
save/reopen behavior, undo/redo behavior, resource budget, and Chromium receipt. A
`CANCELLED`, `UNSUPPORTED`, metadata-only, snapshot-only, or external-resource result is
coverage evidence, never a positive feature claim.
## Lifecycle and gates
```text
scope -> capability contract -> desktop oracle -> WASM/Main mutation
-> Chromium workflow -> negative/recovery -> manifest/hash -> handoff
```
The cheap control-plane check runs before Blender, WASM, or browser startup:
```bash
node tools/web/check-execution-control-plane.mjs
node tools/web/check-execution-health.mjs
```
The first command validates queue/index/catalog/parent consistency and reports the
capability-to-legacy coverage ratio. The second validates the current task card and
its concrete fixture/generator. Any blocked result stops expensive commands and keeps
the task `in_progress` or `blocked`.
## Parallelism and throughput rules
- Inventory, schema, fixture preparation, read-only UI work, and checkers may run in
parallel when they do not share a mutable Main or generated queue file.
- Main mutation, queue generation, manifest/status writes, and release-ledger writes are
serialized through the parent manifest.
- A capability implementation should close multiple related legacy cases. Three
consecutive evidence-only tasks trigger a route review.
- Positive and negative cases are generated together. Failure, cancellation, budget, or
hash drift never advances the successor.
- Legacy `M16-GAP-*` records stay immutable; migration adds capability coverage references
instead of rewriting their completion meaning.
## Current migration state
The asset-operator evidence through `M16-GAP-00281` is integrated into the generated
completion registry. `M16-GAP-00282` remains the single legacy coverage checkpoint,
while `WBV2-P0-002` is the current production task. The corrective pilots already
provide reusable asset-catalog, modifier, mesh, history, and Chromium workflow
primitives. New implementation work should extend those family primitives and add
representative capability cases rather than adding another checker branch for each
operator.

View File

@@ -0,0 +1,209 @@
# Blender Web 对标执行计划 V2
状态:`ACTIVE_CAPABILITY_QUEUE`
本文件把现有 V1 产品、Blender 5.2 源码、WASM/WebEngine、React/Three.js、
OPFS/IndexedDB 和 Chromium 验收组织成一套可实施的长期方案。它定义 capability
queue 的执行合同;当前机器指针仍只接受 `docs/EXECUTION_QUEUE.md` 与 parent
manifest不能从本文件手工猜测 successor。
机器任务目录见 [`BLENDER_WEB_PARITY_TASK_PLAN_V2.json`](BLENDER_WEB_PARITY_TASK_PLAN_V2.json)。
任务卡按目录逐项生成到 `docs/tasks/`,并接入现有 manifest/handoff 流程;未达到
依赖和 gate 的任务保持 planned不进入 active queue。
## 1. 目标与边界
### 1.1 业务目标
交付一个可以在浏览器中完成真实建模、动画、材质、资产管理和受支持渲染工作流的
Web Blender而不是只做 UI 仿制或把桌面 Blender 二进制直接塞进浏览器。用户必须
能够得到可保存、可恢复、可导出、可审计的结果;浏览器不支持的语义必须显式阻断,
不能静默丢失或伪造成功。
### 1.2 两条承诺轴必须分开
| 轴 | 含义 | 完成证据 |
| --- | --- | --- |
| V1 release | 当前范围内的可部署建模器 | `WEB_BLENDER_MODELER_V1_SCOPE.md`、release evidence |
| Blender 5.2 parity | 逐个用户可观察行为与桌面 Blender 5.2 对标 | desktop golden + WASM/Main + Chromium + persistence |
V1 已有可部署闭环,不代表 Blender 全域 parity 完成。完整 Blender 的窗口系统、
Python/add-on、CUDA/Metal/HIP/OptiX、Cycles 复杂求解和任意 editor/operator 不纳入
浏览器本地等价承诺;它们必须进入 `SERVER_EXACT``EXCLUDED`
### 1.3 能力分类
每个功能在进入实现前固定为一种完成类别:
| 类别 | 浏览器行为 | 必须保留 |
| --- | --- | --- |
| `LOCAL_EXACT` | 与 Blender 5.2 语义逐字段一致 | desktop/WASM canonical golden |
| `LOCAL_BOUNDED` | 白名单、预算和确定性错误码内的本地能力 | 正例、负例、取消、重启、释放 |
| `SERVER_EXACT` | 浏览器提交受签名绑定的 source/settings/build服务端运行 Blender | request/result hash、取消、超时、失败不发布 |
| `EXCLUDED` | 不提供本地执行 | UI 不可执行,读入时保留或明确 loss report |
## 2. 当前事实与启动条件
当前事实以机器证据为准:
- `docs/EXECUTION_QUEUE.md` 的生产指针当前是 `WBV2-P0-002`,其 parent
manifest 为 `tests/golden/WBV2-P0-001/manifest.json`。legacy coverage 指针为
`M16-GAP-00282` / `tests/golden/M16-GAP-00281/manifest.json`;纠偏 C6-003 的
`M16-GAP-00277` 记录是已验证的历史 queue checkpoint不是当前任务指针。
- corrective 轨道的 `C6-003` owner review 已记录,原子 queue write 已完成,
`queueMutation=true`post-write G5 验证仍由该 handoff 追踪。
- Web 基础设施、SceneIR、Main/Worker、存储、GLB、网格编辑、动画、材质、VDB、
有界 GN/Shader/Render/Media 和安全门已有大量闭环;完整 Blender parity 仍有
逐 family gap。
- 浏览器验收永久只使用 ChromiumFirefox/WebKit 不进入 CI、支持声明或发布证据。
已满足的 queue reactivation 条件:
1. owner review 对 C6-003 dry-run、write preview 和 protected hash 已明确通过。
2. 旧 queue、parent manifest、corrective plan 的 hash 与指针已重新校验。
3. V2 计划、能力矩阵、任务目录和当前 parent manifest 已完成输入摘要。
4. capability queue 只有一个 active task`WBV2-P0-002`legacy coverage index
仍只有一个 active record`M16-GAP-00282`。00276-00281 的已有 manifest/status
证据保持不变。
## 3. 目标架构
```text
React 工作区 / Blender 风格编辑器
-> versioned protocol + capability registry
-> Main-thread coordinator
-> EngineWorker (single-thread / pthread WASM variant)
-> Blender 5.2 Main + WebEngine C ABI
-> SceneIR/WBG1 + binary range/asset deltas
-> Three.js WebGL2 或 OffscreenCanvas Worker viewport
-> OPFS payload + IndexedDB metadata/journal
```
架构规则:
1. Blender Main 是场景、revision、undo/redo 和保存结果的权威React state 不能
直接伪造 Main 结果。
2. 每个命令都经过 capability、context、revision、预算和 cancellation 检查;失败
不得提交 Main 或发布迟到结果。
3. desktop fixture、WASM/Main 和 Chromium 生产路径消费同一语义输入;测试不能在
checker 中复制另一套实现。
4. 大几何和媒体走 binary/range/streamingJSON 只承载有界元数据和诊断,避免把
全量 Blender RNA 变成前端内存对象。
5. 本地资源使用 content-addressed SHA-256OPFS 先 staging、校验、journal
原子提交IndexedDB 只保存可迁移元数据。
6. 所有资源、Worker、GPU、timer 和 pending request 都有 owner 和 dispose 路径。
## 4. 执行波次
波次按依赖推进,波次内只有明确标为 `parallelGroup` 的任务可并行。每项任务仍只
允许一个主要行为或一个独立证据变化。
| 波次 | 主题 | 主要产物 | 退出门 |
| --- | --- | --- | --- |
| P0 | 事实、范围、能力矩阵 | 计划版本、Blender inventory、parity map、错误/预算合同 | G0 |
| P1 | Runtime 基座 | SceneIR、Main transaction、Worker lifecycle、存储 journal | G1 |
| P2 | 核心用户闭环 | open、outliner、transform、mesh edit、viewport、save/reopen | G2 |
| P3 | 资产与创作数据 | material/UV、animation、rig、GLB、library | G2 |
| P4 | 高级本地切片 | modifier、GN/Shader、sculpt/non-mesh、simulation cache | G2/G3 |
| P5 | 渲染与服务端能力 | render route、compositor/media、server job/result binding | G3 |
| P6 | 安全、性能、发布 | scripting policy、fault recovery、offline/CI/release | G3/G4 |
| P7 | 全域 gap 清零 | 机器生成 family gap、逐项 parity、候选发布 | G4/G5 |
P0-P6 的目标是形成稳定产品和可重复的能力扩展机制P7 才逐个消化 Blender 5.2
全域差距。不要在 P7 前用“已读取 inventory”或“协议已存在”宣称功能完成。
## 5. 任务执行合同
每个 `WBV2-*` 任务必须包含以下字段:
| 字段 | 要求 |
| --- | --- |
| identity | `taskId`、parent、parityId、owner、implementationClass、依赖 |
| behavior | 一个用户可观察状态/数据/错误变化和明确非目标 |
| source | Blender 5.2 source anchor、production entry、最小 fixture |
| evidence | desktop canonical、WASM/Main、Chromium、negative、persistence |
| resource | budget、cancel、restart、dispose、OOM/quota 行为 |
| handoff | report、manifest、status、artifact SHA-256、rollback、nextTask |
标准任务门:
1. `C` 契约schema、稳定 ID、能力、预算、错误码和 revision。
2. `D` 桌面:由 pinned Blender 5.2 生成 canonical fixture/report。
3. `W` WASM生产 WebEngine/Main 消费同一 fixture真实写回或结构化阻断。
4. `B` 浏览器Chromium 主线程和适用的 OffscreenCanvas 生产路径。
5. `R` 恢复undo/redo、save/reopen、Worker restart、cancel/late result、资源释放。
6. `E` 证据focused command、负例、确定性重跑、manifest/status/hash/governance。
任一适用门失败,任务保持 `in_progress``blocked`,不能生成 successor。
## 6. 效率策略
### 6.1 先做共享基座,再做 family
将 SceneIR、revision/history、capability/error、Worker lifecycle、存储 journal 和
fixture/comparator 做成可复用基座;新功能只提交 family-specific command 和 golden
避免每个 gap 重复实现取消、重开和 hash 逻辑。
### 6.2 机器优先,人工文档后置
Blender inventory、capability matrix、task catalog、manifest 和 status 是机器生成或
机器校验的事实源Markdown 只解释决策和边界。禁止从历史编号推导任务,禁止把长日志
带进上下文。
### 6.3 正负例同批交付
每个正例同时生成 malformed、unsupported、stale revision、duplicate、cancel 或 budget
负例中的至少一种。负例必须证明 Main revision、已提交资源和 history 不变。
### 6.4 并行但不共享可变 Main
可并行的是 inventory、protocol、fixture、UI read-only 和 checker涉及同一个 Main、
queue、manifest 或 release ledger 的写入任务必须串行。任务目录用 `parallelGroup` 标注
安全并行边界。
### 6.5 失败即证据,不覆盖日志
未知状态、断流、hash drift、预算超限和环境缺失都保留原始证据最多恢复一次不得
重跑成功写入来覆盖失败日志,也不得用 mock 或协议单测替代真实 Blender/WASM/Chromium。
## 7. 发布门与指标
候选发布至少通过:
- P0 用户闭环open `.blend` -> edit -> undo -> redo -> save -> Worker restart -> reopen -> GLB。
- Chromium 主线程和 OffscreenCanvas 视口均有非空像素和可观测 Main revision。
- 100k、1M、10M geometry4K/8K texture长时间线/媒体和 simulation cache 的预算结果。
- malformed、OOM、quota、device loss、network interruption、cancel、late result 和损坏
archive 后的小任务恢复。
- `LOCAL_EXACT` 的 desktop/WASM canonical hash`SERVER_EXACT` 的 source/settings/build/result
hash`EXCLUDED` 的稳定拒绝和 loss report。
- 离线包、source archive、SBOM、许可证、CI quick/Chromium/release 三道门和 rollback runbook。
核心指标不是“完成百分比”,而是:
| 指标 | 计算方式 |
| --- | --- |
| parity closure | 已通过 E 门的原子 `parityId` / 当前 inventory 原子数 |
| evidence health | 有效 manifest 且 hash/命令/状态一致的任务数 |
| recovery health | 负例/取消/重启/OOM 证据齐全的任务数 |
| queue integrity | parent pointer、唯一 ready task、protected hash 全通过 |
| product readiness | V1 release gates 全通过且未声明能力无伪成功 |
## 8. 回滚与变更控制
- 计划草案升级必须增加 `planVersion`,不得覆盖历史 manifest 或重新解释旧 parity。
- 每个任务只能删除自己的 fixture/report/status/contextparent evidence 和 queue tail 不重写。
- capability 从 `planned``LOCAL_*` 必须有独立 evidence`LOCAL_BOUNDED` 变成
`LOCAL_EXACT` 必须新增 desktop/WASM golden不得改字段标志冒充升级。
- owner review、queue mutation 和发布 ledger 的写操作必须由通过的 handoff 支持。
- 任何与当前 queue 或 parent hash 不一致的计划输入都保持 `blocked`,先修复证据再继续。
## 9. 下一步
当前推荐顺序:
1. 按当前 queue/parent manifest 指向的 task card 开始下一项 legacy coverage保持一个 active task。
2. 评审本文件与机器任务目录,确认 V1/全域 parity、local/server/excluded 边界。
3. 生成 `WBV2-P0-001``WBV2-P0-003` 的任务卡,先建立事实和能力矩阵。
4. P0 通过后沿 parent manifest 接入后续 P1 任务。
5. 每个波次结束做一次 fresh compact handoff再从机器 manifest 选择 successor。

View File

@@ -0,0 +1,85 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2",
"status": "ACTIVE_CAPABILITY_QUEUE",
"authority": "queue_reactivated_after_owner_review",
"productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"sourcePlan": "docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"correctiveCheckpoint": {
"task": "C6-003",
"handoff": "tests/golden/corrective/C6-003/handoff.json",
"status": "active",
"blocker": null,
"queueMutation": true,
"legacyTask": "M16-GAP-00277",
"legacyParentNextTask": "M16-GAP-00277"
},
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": ["chromium"],
"forbiddenBrowsers": ["firefox", "webkit"],
"mainAuthority": "blender_main",
"storage": ["opfs", "indexeddb"],
"queueMutation": "enabled_after_owner_review_and_g5"
},
"completionClasses": ["LOCAL_EXACT", "LOCAL_BOUNDED", "SERVER_EXACT", "EXCLUDED"],
"gates": [
{"id": "G0", "name": "scope_and_inventory", "requires": ["contract", "inventory", "capability_matrix"]},
{"id": "G1", "name": "runtime_foundation", "requires": ["sceneir", "main_transaction", "worker_lifecycle", "storage_journal"]},
{"id": "G2", "name": "feature_parity", "requires": ["desktop", "wasm_main", "chromium", "negative", "persistence"]},
{"id": "G3", "name": "recovery_and_security", "requires": ["cancel", "restart", "oom_quota", "malformed", "dispose"]},
{"id": "G4", "name": "release_candidate", "requires": ["offline", "ci", "sbom", "rollback", "hashes"]},
{"id": "G5", "name": "queue_mutation", "requires": ["owner_review", "protected_hashes", "handoff", "single_ready_task"]}
],
"waves": [
{"id": "P0", "name": "facts_and_contracts", "gate": "G0", "tasks": ["WBV2-P0-001", "WBV2-P0-002", "WBV2-P0-003"]},
{"id": "P1", "name": "runtime_foundation", "gate": "G1", "tasks": ["WBV2-P1-001", "WBV2-P1-002", "WBV2-P1-003", "WBV2-P1-004", "WBV2-P1-005"]},
{"id": "P2", "name": "core_modeler_loop", "gate": "G2", "tasks": ["WBV2-P2-001", "WBV2-P2-002", "WBV2-P2-003", "WBV2-P2-004", "WBV2-P2-005"]},
{"id": "P3", "name": "authoring_and_io", "gate": "G2", "tasks": ["WBV2-P3-001", "WBV2-P3-002", "WBV2-P3-003", "WBV2-P3-004", "WBV2-P3-005"]},
{"id": "P4", "name": "advanced_local_slices", "gate": "G2", "tasks": ["WBV2-P4-001", "WBV2-P4-002", "WBV2-P4-003", "WBV2-P4-004"]},
{"id": "P5", "name": "render_and_server", "gate": "G3", "tasks": ["WBV2-P5-001", "WBV2-P5-002", "WBV2-P5-003"]},
{"id": "P6", "name": "security_performance_release", "gate": "G4", "tasks": ["WBV2-P6-001", "WBV2-P6-002", "WBV2-P6-003"]},
{"id": "P7", "name": "full_parity_gap_program", "gate": "G5", "tasks": ["WBV2-P7-001", "WBV2-P7-002", "WBV2-P7-003"]}
],
"taskContract": {
"onePrimaryBehavior": true,
"requiredEvidence": ["desktop", "wasm_main", "chromium", "negative", "persistence", "manifest", "status"],
"requiredCommands": ["focused", "determinism", "hash", "governance"],
"failureState": "in_progress_or_blocked",
"successorRule": "only_from_parent_manifest_nextTask"
},
"tasks": [
{"id":"WBV2-P0-001","phase":"P0","title":"reconcile_scope_and_checkpoints","kind":"enabling","owner":"PROGRAM","dependsOn":[],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p0-governance","gate":"G0","card":"docs/tasks/WBV2-P0-001.md","behavior":"Freeze V1/full-parity boundary and reconcile legacy/corrective pointers without queue mutation.","outputs":["scope decision","checkpoint report","protected hash set"],"acceptance":["corrective owner-review status is explicit","legacy parent pointer is unchanged","plan has one activation gate"],"status":"done","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P0-002","phase":"P0","title":"generate_blender52_inventory_and_parity_map","kind":"enabling","owner":"PARITY","dependsOn":["WBV2-P0-001"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p0-inventory","gate":"G0","card":"docs/tasks/WBV2-P0-002.md","behavior":"Generate stable Blender 5.2 data-block/operator/editor/node/format inventory and map every entry to a completion class.","outputs":["inventory","parity map","source hash"],"acceptance":["unknown entries are classified","inventory is deterministic","no entry claims feature parity without evidence"],"status":"in_progress","ready":true,"queueMutationAllowed":false},
{"id":"WBV2-P0-003","phase":"P0","title":"freeze_capability_error_budget_contract","kind":"enabling","owner":"PROTOCOL","dependsOn":["WBV2-P0-001","WBV2-P0-002"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p0-contract","gate":"G0","card":"docs/tasks/WBV2-P0-003.md","behavior":"Freeze capability levels, stable error codes, revision, budget, cancellation and loss-report schemas.","outputs":["versioned protocol","capability matrix","negative matrix"],"acceptance":["unsupported input fails closed","schema hashes are stable","migration policy preserves unknown data"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P1-001","phase":"P1","title":"stabilize_runtime_variants_and_source_receipts","kind":"enabling","owner":"RUNTIME","dependsOn":["WBV2-P0-003"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p1-runtime","gate":"G1","card":"docs/tasks/WBV2-P1-001.md","behavior":"Bind single-thread/pthread WebEngine variants to pinned Blender source/build/runtime receipts.","outputs":["runtime manifest","variant selector","fallback report"],"acceptance":["variant fallback is deterministic","source/build hash is verified","one engine session has one generation"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P1-002","phase":"P1","title":"unify_sceneir_stable_ids_and_binary_deltas","kind":"enabling","owner":"MAIN","dependsOn":["WBV2-P0-003"],"parityId":null,"implementationClass":"LOCAL_EXACT","parallelGroup":"p1-sceneir","gate":"G1","card":"docs/tasks/WBV2-P1-002.md","behavior":"Make SceneIR/WBG1 stable IDs, topology/attribute domains and binary/range deltas canonical across desktop and WASM.","outputs":["SceneIR schema","binary fixture","delta comparator"],"acceptance":["IDs survive save/reopen","malformed chunk is rejected","desktop and WASM canonical hashes match"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P1-003","phase":"P1","title":"unify_main_transaction_history_and_save","kind":"enabling","owner":"MAIN","dependsOn":["WBV2-P1-002"],"parityId":null,"implementationClass":"LOCAL_EXACT","parallelGroup":"p1-history","gate":"G1","card":"docs/tasks/WBV2-P1-003.md","behavior":"Use one Main transaction/revision/history contract for commit, undo/redo, atomic save and reopen.","outputs":["transaction contract","history receipt","save/reopen runner"],"acceptance":["failed/no-op commands add no history","stale revision cannot commit","reopen state is byte/hash stable"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P1-004","phase":"P1","title":"harden_worker_cancel_restart_and_dispose","kind":"enabling","owner":"RUNTIME","dependsOn":["WBV2-P1-001","WBV2-P1-003"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p1-lifecycle","gate":"G1","card":"docs/tasks/WBV2-P1-004.md","behavior":"Make cancellation, late-result rejection, Worker restart and resource disposal common to all domains.","outputs":["lifecycle runner","fault report","dispose counters"],"acceptance":["cancel never publishes result","generation mismatch is rejected","CPU/WASM/GPU owners return to budget"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P1-005","phase":"P1","title":"harden_opfs_indexeddb_journal_recovery","kind":"enabling","owner":"STORAGE","dependsOn":["WBV2-P1-003","WBV2-P1-004"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p1-storage","gate":"G1","card":"docs/tasks/WBV2-P1-005.md","behavior":"Unify OPFS staging/content addressing and IndexedDB metadata/journal recovery.","outputs":["storage schema","crash fixtures","recovery checker"],"acceptance":["interrupted commit leaves old project usable","hash mismatch quarantines payload","small project recovers after restart"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P2-001","phase":"P2","title":"open_blend_scene_context_and_outliner","kind":"feature","owner":"EDITOR","dependsOn":["WBV2-P1-002","WBV2-P1-005"],"parityId":"EDITOR.OPEN_SCENE","implementationClass":"LOCAL_EXACT","parallelGroup":"p2-editor","gate":"G2","card":"docs/tasks/WBV2-P2-001.md","behavior":"Open a minimal .blend and expose scene/object/collection context from authoritative Main.","outputs":["desktop fixture","outliner report","Chromium path"],"acceptance":["stable IDs and selection revision match","missing data is structured","reopen preserves context"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P2-002","phase":"P2","title":"object_collection_parent_transform_workflow","kind":"feature","owner":"EDITOR","dependsOn":["WBV2-P2-001","WBV2-P1-003"],"parityId":"OBJECT.TRANSFORM_HIERARCHY","implementationClass":"LOCAL_EXACT","parallelGroup":"p2-scene","gate":"G2","card":"docs/tasks/WBV2-P2-002.md","behavior":"Edit object transform, collection membership and parent hierarchy through Main transactions.","outputs":["desktop/WASM golden","negative cases","save/reopen receipt"],"acceptance":["world matrix parity","cycle/locked/library edits reject","undo/redo/save/reopen stable"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P2-003","phase":"P2","title":"mesh_edit_core_operations","kind":"feature","owner":"MESH","dependsOn":["WBV2-P2-002","WBV2-P1-002"],"parityId":"MESH.EDIT_CORE","implementationClass":"LOCAL_EXACT","parallelGroup":"p2-mesh","gate":"G2","card":"docs/tasks/WBV2-P2-003.md","behavior":"Expose bounded vertex/edge/face selection plus merge/dissolve/extrude/inset/bevel/loop-cut.","outputs":["Blender fixture set","topology comparator","Chromium edit path"],"acceptance":["topology/attributes match","invalid selection and budget fail closed","single transaction and reopen stable"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P2-004","phase":"P2","title":"dual_viewport_sceneir_render_path","kind":"feature","owner":"VIEWPORT","dependsOn":["WBV2-P2-001","WBV2-P1-004"],"parityId":"VIEWPORT.MAIN_OFFSCREEN","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p2-viewport","gate":"G2","card":"docs/tasks/WBV2-P2-004.md","behavior":"Render the same validated SceneIR through main-thread WebGL2 and OffscreenCanvas Worker paths.","outputs":["pixel report","viewport diagnostics","device recovery"],"acceptance":["both paths have nonblank pixels","selection/camera revision is shared","device loss releases resources"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P2-005","phase":"P2","title":"close_p0_user_loop","kind":"feature","owner":"INTEGRATION","dependsOn":["WBV2-P2-002","WBV2-P2-003","WBV2-P2-004","WBV2-P1-005"],"parityId":"WORKFLOW.P0_USER_LOOP","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p2-integration","gate":"G2","card":"docs/tasks/WBV2-P2-005.md","behavior":"Prove open -> edit -> undo -> redo -> save -> restart -> reopen -> GLB in one production flow.","outputs":["P0 workflow report","release binding","rollback receipt"],"acceptance":["Main revision and exported asset are bound","fault/cancel leaves old state","Chromium production path passes"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P3-001","phase":"P3","title":"material_uv_principled_asset_workflow","kind":"feature","owner":"MATERIAL","dependsOn":["WBV2-P2-003","WBV2-P2-005"],"parityId":"MATERIAL.PBR_UV","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p3-authoring","gate":"G2","card":"docs/tasks/WBV2-P3-001.md","behavior":"Edit material slots, UVs and declared Principled/Image/Normal graph nodes with content-addressed textures.","outputs":["material golden","texture receipt","loss report"],"acceptance":["desktop/WASM node fields match","unsupported node retained/blocked","packed asset survives reopen"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P3-002","phase":"P3","title":"keyframe_timeline_action_workflow","kind":"feature","owner":"ANIMATION","dependsOn":["WBV2-P2-002","WBV2-P2-005"],"parityId":"ANIMATION.TRS_ACTION","implementationClass":"LOCAL_EXACT","parallelGroup":"p3-authoring","gate":"G2","card":"docs/tasks/WBV2-P3-002.md","behavior":"Create/edit TRS keyframes, timeline and declared Action interpolation through Main.","outputs":["frame golden","animation comparator","reopen report"],"acceptance":["sampled values and handles match","stale frame result rejected","undo/save/reopen stable"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P3-003","phase":"P3","title":"armature_pose_constraint_skin_workflow","kind":"feature","owner":"RIG","dependsOn":["WBV2-P2-002","WBV2-P3-002"],"parityId":"RIG.POSE_SKIN","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p3-rig","gate":"G2","card":"docs/tasks/WBV2-P3-003.md","behavior":"Read and edit declared armature pose/constraint/weight/shape-key slices with bounded evaluation.","outputs":["pose golden","skin report","unsupported matrix"],"acceptance":["pose matrices and weights match","unsupported constraint is explicit","save/reopen and small recovery pass"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P3-004","phase":"P3","title":"glb_roundtrip_and_loss_report","kind":"feature","owner":"IO","dependsOn":["WBV2-P2-005","WBV2-P3-001","WBV2-P3-003"],"parityId":"IO.GLB_ROUNDTRIP","implementationClass":"LOCAL_EXACT","parallelGroup":"p3-io","gate":"G2","card":"docs/tasks/WBV2-P3-004.md","behavior":"Import/export declared GLB mesh/PBR/texture/morph/skin/animation and report non-mapped semantics.","outputs":["GLB fixtures","desktop reimport report","loss report"],"acceptance":["roundtrip canonical graph matches","sparse/external URI/budget negatives reject","no silent loss"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P3-005","phase":"P3","title":"library_asset_append_link_override","kind":"feature","owner":"ASSET","dependsOn":["WBV2-P1-005","WBV2-P2-001"],"parityId":"ASSET.LIBRARY_OPERATIONS","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p3-assets","gate":"G2","card":"docs/tasks/WBV2-P3-005.md","behavior":"Support declared append/link/override ownership, reload and missing-library semantics.","outputs":["library fixtures","ownership report","negative matrix"],"acceptance":["source/hash/owner identity preserved","linked mutation blocked","stale generation and missing source fail closed"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P4-001","phase":"P4","title":"modifier_graph_and_apply_slices","kind":"feature","owner":"MODIFIER","dependsOn":["WBV2-P2-003","WBV2-P2-005"],"parityId":"MODIFIER.DECLARED_SLICES","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p4-domains","gate":"G2","card":"docs/tasks/WBV2-P4-001.md","behavior":"Enable one declared modifier parameter/apply workflow at a time with dependency-aware blocking.","outputs":["modifier goldens","dependency report","negative cases"],"acceptance":["desktop/evaluated Main match","unknown modifier retained and blocked","apply/undo/save/reopen stable"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P4-002","phase":"P4","title":"geometry_nodes_and_shader_allowlist","kind":"feature","owner":"NODES","dependsOn":["WBV2-P3-001","WBV2-P4-001"],"parityId":"NODES.ALLOWLIST","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p4-domains","gate":"G2","card":"docs/tasks/WBV2-P4-002.md","behavior":"Read/write/evaluate only declared Geometry Nodes and shader graph allowlists with resource budgets.","outputs":["node fixtures","compile/cache receipts","unsupported graph reports"],"acceptance":["node/socket/link/default parity","budget and unknown-node block before commit","compile failure rolls back"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P4-003","phase":"P4","title":"sculpt_nonmesh_and_paint_bounded_slices","kind":"feature","owner":"SCULPT","dependsOn":["WBV2-P2-003","WBV2-P2-004"],"parityId":"SCULPT.NONMESH.PAINT_BOUNDED","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p4-domains","gate":"G2","card":"docs/tasks/WBV2-P4-003.md","behavior":"Expose declared sculpt attributes/strokes, Curve/Surface/Font/PointCloud and paint slices with explicit PBVH limits.","outputs":["non-mesh fixtures","stroke report","capability blocks"],"acceptance":["Main commit is atomic","unsupported brush/solver returns stable code","GPU/OOM/restart recovery passes"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P4-004","phase":"P4","title":"simulation_cache_identity_and_lifecycle","kind":"feature","owner":"SIMULATION","dependsOn":["WBV2-P1-005","WBV2-P4-002"],"parityId":"SIMULATION.CACHE_LIFECYCLE","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p4-domains","gate":"G3","card":"docs/tasks/WBV2-P4-004.md","behavior":"Bind declared simulation cache to source/settings/revision hashes with cancellation, LRU and restart recovery.","outputs":["cache fixtures","identity report","quarantine evidence"],"acceptance":["stale/corrupt cache never publishes","small cache recovers after restart","budget release is observable"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P5-001","phase":"P5","title":"render_capability_routing","kind":"feature","owner":"RENDER","dependsOn":["WBV2-P2-004","WBV2-P4-002"],"parityId":"RENDER.ROUTING","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p5-media","gate":"G3","card":"docs/tasks/WBV2-P5-001.md","behavior":"Route bounded Eevee/WebGL capabilities locally and unsupported render classes to SERVER_EXACT or EXCLUDED.","outputs":["render receipts","pixel golden","routing report"],"acceptance":["source/settings/build identity bound","unsupported route cannot pretend local success","cancel/device loss releases resources"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P5-002","phase":"P5","title":"compositor_sequencer_media_recovery","kind":"feature","owner":"MEDIA","dependsOn":["WBV2-P3-002","WBV2-P5-001"],"parityId":"MEDIA.BOUNDED_WORKFLOW","implementationClass":"LOCAL_BOUNDED","parallelGroup":"p5-media","gate":"G3","card":"docs/tasks/WBV2-P5-002.md","behavior":"Provide declared compositor/sequencer/codec/proxy/audio slices with revision and recovery gates.","outputs":["media receipts","recovery report","audio/session diagnostics"],"acceptance":["seek/decode revision ordering","cancel/timeout does not publish","quota/OOM/restart leaves project valid"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P5-003","phase":"P5","title":"server_job_result_binding","kind":"feature","owner":"SERVER","dependsOn":["WBV2-P0-003","WBV2-P5-001"],"parityId":"SERVER.JOB_BINDING","implementationClass":"SERVER_EXACT","parallelGroup":"p5-server","gate":"G3","card":"docs/tasks/WBV2-P5-003.md","behavior":"Bind server render/encode/physics jobs to immutable input/settings/build/output hashes and explicit lifecycle states.","outputs":["server protocol","idempotency receipt","negative matrix"],"acceptance":["duplicate request is idempotent","stale result cannot bind","timeout/cancel/OOM produces no READY output"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P6-001","phase":"P6","title":"scripting_default_deny_and_audit","kind":"feature","owner":"SECURITY","dependsOn":["WBV2-P1-004","WBV2-P5-003"],"parityId":"SECURITY.SCRIPTING","implementationClass":"EXCLUDED","parallelGroup":"p6-safety","gate":"G3","card":"docs/tasks/WBV2-P6-001.md","behavior":"Read text/metadata and expose audited, budgeted, default-deny script policy without arbitrary execution.","outputs":["policy manifest","malicious fixtures","audit report"],"acceptance":["autorun/network/add-on defaults deny","sandbox cancellation/dispose works","no secret or filesystem escape"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P6-002","phase":"P6","title":"performance_fault_and_recovery_matrix","kind":"enabling","owner":"RELIABILITY","dependsOn":["WBV2-P1-004","WBV2-P1-005","WBV2-P2-004"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p6-safety","gate":"G3","card":"docs/tasks/WBV2-P6-002.md","behavior":"Run deterministic geometry/texture/media/cache budgets and inject OOM/quota/device/network faults.","outputs":["budget matrix","fault reports","resource release ledger"],"acceptance":["100k/1M/10M thresholds recorded","fault leaves old revision usable","all owned resources return to budget"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P6-003","phase":"P6","title":"offline_ci_sbom_and_rollback_release","kind":"enabling","owner":"RELEASE","dependsOn":["WBV2-P6-001","WBV2-P6-002"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p6-release","gate":"G4","card":"docs/tasks/WBV2-P6-003.md","behavior":"Produce reproducible offline/source/binary release packages with CI lanes, SBOM and rollback evidence.","outputs":["RC manifest","offline archive","CI reports"],"acceptance":["quick/Chromium/release lanes pass","artifact hashes reproduce","upgrade/rollback and known limitations are tested"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P7-001","phase":"P7","title":"cluster_full_blender_gap_inventory","kind":"enabling","owner":"PARITY","dependsOn":["WBV2-P0-002","WBV2-P6-003"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p7-gap","gate":"G4","card":"docs/tasks/WBV2-P7-001.md","behavior":"Cluster remaining Blender 5.2 data-block/operator/editor/node/format gaps by family and evidence class.","outputs":["cluster catalog","coverage report","risk ranking"],"acceptance":["each gap has stable ID and owner","negative-only/unsupported is not positive parity","clusters are deterministic"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P7-002","phase":"P7","title":"generate_atomic_family_gap_queue","kind":"enabling","owner":"PROGRAM","dependsOn":["WBV2-P7-001"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p7-gap","gate":"G4","card":"docs/tasks/WBV2-P7-002.md","behavior":"Generate one task per parityId x observable behavior x implementation class with parent/hash context.","outputs":["task index","task catalog","task cards"],"acceptance":["one active ready task","no guessed successor","each card fits context budget"],"status":"planned","ready":false,"queueMutationAllowed":false},
{"id":"WBV2-P7-003","phase":"P7","title":"full_parity_candidate_release_gate","kind":"enabling","owner":"RELEASE","dependsOn":["WBV2-P7-002"],"parityId":null,"implementationClass":"LOCAL_BOUNDED","parallelGroup":"p7-release","gate":"G5","card":"docs/tasks/WBV2-P7-003.md","behavior":"Recompute parity closure, evidence health, recovery health and release decision from machine manifests.","outputs":["parity release report","known limitations","final decision"],"acceptance":["all claims bind to evidence","blocked/excluded/server classes remain explicit","queue and protected hashes pass"],"status":"planned","ready":false,"queueMutationAllowed":false}
]
}

View File

@@ -13,23 +13,27 @@ node tools/web/check-execution-health.mjs
## 当前基线2026-08-24
- `npm --prefix web run test:task-context`:通过,约 `708 ms`
- `npm --prefix web run test:context-governance`:失败,约 `732 ms`index/catalog
active 仍是 `M16-GAP-00281`queue 已指向 `M16-GAP-00282`
- `node tools/web/check-generated-gap.mjs --task M16-GAP-00282`:预检失败,约
`131 ms`;任务仍是 `pending`fixture 和 generator 均不存在
- `npm --prefix web test`:约 `13.5 s``398/417` 通过19 个失败来自历史
manifest 的 artifact SHA-256 漂移,不能通过放宽校验解决
- `npm --prefix web run typecheck`:约 `15.7 s`通过
- `npm --prefix web run lint`:约 `12.8 s`,通过
- 生产 lane 当前任务为 `WBV2-P0-002`parent 为
`tests/golden/WBV2-P0-001/manifest.json``WBV2` index/catalog 有且仅有一个
active 记录
- legacy coverage checkpoint 为 `M16-GAP-00282`,其 parent
`tests/golden/M16-GAP-00281/manifest.json` 保持不变;它不再作为生产任务领取
- `node tools/web/check-execution-control-plane.mjs`:通过;报告 6,900 legacy
cases、281 个已有 coverage、3 个 capability clusters、9 个映射 cases
- `node tools/web/check-execution-health.mjs`通过;在 capability task 上不启动
Blender/WASM fixture preflight
- `npm --prefix web run test:task-context``npm --prefix web run test:context-governance`
`npm --prefix web run test:execution-control-plane`:通过。
- 全量历史 manifest 的 SHA-256 漂移仍需不可变快照或审计重签;不得放宽 checker
或把 metadata/negative-only 证据计为功能完成。
## 恢复顺序
1.修复 queue、plan、catalog、index 的单一指针来源,并重新生成 index;不得手工
修改 active 状态offset。
2. 为当前任务生成非空紧凑卡:
`node tools/web/generate-task-card.mjs --task M16-GAP-00282`
3. 只有任务变为 `active` 且 fixture/generator 真实存在后,才运行专项 gap 命令。
1.运行 capability control-plane、queue ancestry、context 和 governance gates;不得手工
修改 active 状态offset`nextTask`
2. 读取当前 `WBV2-*` task card按卡片命令生成 inventory/capability 证据;不要为
legacy coverage task 启动 Blender/WASM
3. 只有当后续 task 明确要求 fixture 时,才运行专项 gap/desktop 命令。
4. 历史 manifest hash 漂移需要不可变的源快照或经审计的重签流程;禁止在 checker 中
忽略漂移,也不要把 `CANCELLED`、metadata-only 或 negative-only 证据计为功能完成。
5. 专项任务通过后才运行浏览器验收;浏览器门永久限制为 Chromium。

View File

@@ -4,17 +4,21 @@
本页是唯一的当前任务指针不保存历史任务表、实现日志或长期规划。领取任务前只读取本页、当前任务上下文、parent manifest 和 parent status完整规则见 [`CONTEXT_BUDGET.md`](CONTEXT_BUDGET.md)。
生产实现按能力工作流推进legacy `M16-GAP-*` 只作为覆盖回归;能力矩阵、共享 runner 和效率规则见 [`BLENDER_WEB_EXECUTION_CONTROL_PLANE.md`](BLENDER_WEB_EXECUTION_CONTROL_PLANE.md)。
连续接续入口见 [`nextTask.md`](../nextTask.md):用户发送“按 nextTask.md 接续执行”时,进入连续模式;每个迭代只完成一个任务并以 fresh compact context 交接,成功后自动读取新指针继续,直到失败、阻塞、预算/环境/传输异常、闭合门或用户要求停止。
## 当前指针
| 字段 | 值 |
| --- | --- |
| 里程碑 | M16 Main、Mesh、Modifier、Sculpt |
| 当前任务 | `M16-GAP-00276` |
| parent manifest | `tests/golden/M16-GAP-00275/manifest.json` |
| 任务卡 | [`tasks/M16-GAP-00276.md`](tasks/M16-GAP-00276.md) |
| 专项验收 | `npm --prefix web run test:generated-gap -- --task M16-GAP-00276` |
| 里程碑 | WBV2 capability workflow |
| 当前任务 | `WBV2-P0-002` |
| parent manifest | `tests/golden/WBV2-P0-001/manifest.json` |
| 任务卡 | [`tasks/WBV2-P0-002.md`](tasks/WBV2-P0-002.md) |
| 专项验收 | `node tools/web/check-execution-control-plane.mjs` |
| legacy coverage checkpoint | `M16-GAP-00282` |
| legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` |
领取前执行:

View File

@@ -29,6 +29,8 @@
| 当前领取顺序 | [EXECUTION_QUEUE.md](EXECUTION_QUEUE.md) + 当前 manifest 的 `nextTask` |
| 当前实现和风险 | [PROJECT_STATUS_AND_NEXT_WORK.md](PROJECT_STATUS_AND_NEXT_WORK.md) |
| M12-M23 长期原子计划 | [BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md](BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md) |
| Blender Web 对标 V2 capability 计划 | [BLENDER_WEB_PARITY_EXECUTION_PLAN_V2.md](BLENDER_WEB_PARITY_EXECUTION_PLAN_V2.md) + [BLENDER_WEB_PARITY_TASK_PLAN_V2.json](BLENDER_WEB_PARITY_TASK_PLAN_V2.json) |
| 执行控制面和效率规则 | [BLENDER_WEB_EXECUTION_CONTROL_PLANE.md](BLENDER_WEB_EXECUTION_CONTROL_PLANE.md) + `node tools/web/check-execution-control-plane.mjs` |
| 机器状态和发布证据 | `status/parity-ledger.json``status/release-evidence.json` |
| Blender 全域覆盖参考 | `BLENDER_5_2_WEB_FEATURE_PARITY.md``BLENDER_5_2_FULL_PARITY_WBS.md` |

View File

@@ -0,0 +1,77 @@
# C0-001 freeze_and_snapshot
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P0
GateG0
依赖:无
lifecycleStatus`done`
writeScope`evidence_only`
queueMutationAllowed`false`
## 目标
建立旧队列和 00274 checkpoint 的只读、可复现基线。该任务不修改旧 queue、manifest、
completion registry、catalog、index 或 parent evidence。任何发现的矛盾都记录为证据
不能在本任务内修复。
## 输入
- `docs/EXECUTION_QUEUE.md`
- `node tools/web/print-task-context.mjs` 输出列出的四个 required documents
- `tests/golden/M15-03A/completed-gap-tasks.json`
- `tests/golden/M15-03A/task-catalog.jsonl`
- `tests/golden/M15-03A/task-index.json`
- `tests/golden/M15-03A/next-task-plan.json` 的脚本摘要,不复制全文
## 命令
```bash
mkdir -p tests/golden/corrective/C0-001
node tools/web/print-task-context.mjs > tests/golden/corrective/C0-001/print-task-context.log
node tools/web/check-task-context.mjs > tests/golden/corrective/C0-001/check-task-context.log
node tools/web/check-context-governance.mjs --task M16-GAP-00274 > tests/golden/corrective/C0-001/context-governance.log
git status --short > tests/golden/corrective/C0-001/git-status.log
sha256sum docs/EXECUTION_QUEUE.md tests/golden/M16-GAP-00273/manifest.json docs/status/M16-GAP-00273.md tests/golden/M15-03A/completed-gap-tasks.json tests/golden/M15-03A/task-catalog.jsonl tests/golden/M15-03A/task-index.json tests/golden/M15-03A/next-task-plan.json > tests/golden/corrective/C0-001/source-hashes.txt
node tools/web/capture-corrective-baseline.mjs --task M16-GAP-00274 --output tests/golden/corrective/C0-001/baseline.json
node tools/web/capture-corrective-baseline.mjs --task M16-GAP-00274 --output tests/golden/corrective/C0-001/baseline-second.json
cmp tests/golden/corrective/C0-001/baseline.json tests/golden/corrective/C0-001/baseline-second.json
node tools/web/check-corrective-baseline.mjs --baseline tests/golden/corrective/C0-001/baseline.json --source-hashes tests/golden/corrective/C0-001/source-hashes.txt > tests/golden/corrective/C0-001/baseline-check.log
node tools/web/check-corrective-plan.mjs > tests/golden/corrective/C0-001/corrective-plan.log
git diff --check > tests/golden/corrective/C0-001/diff-check.log
```
## 输出
- `tests/golden/corrective/C0-001/print-task-context.log`
- `tests/golden/corrective/C0-001/check-task-context.log`
- `tests/golden/corrective/C0-001/context-governance.log`
- `tests/golden/corrective/C0-001/git-status.log`
- `tests/golden/corrective/C0-001/source-hashes.txt`
- `tests/golden/corrective/C0-001/baseline.json`
- `tests/golden/corrective/C0-001/baseline-second.json`(只用于 byte determinism 比较)
- `tests/golden/corrective/C0-001/corrective-plan.log`
- `tests/golden/corrective/C0-001/diff-check.log`
- `tests/golden/corrective/C0-001/baseline-check.log`
`baseline.json` 必须记录:当前 task、parent nextTask、catalog active、plan firstTask、
completion count、所有 active IDs、旧证据目录数量和源文件 hashes。
`baseline.json` 的固定契约:`queue.currentTask` 必须是 `M16-GAP-00274`
`queue.parentNextTask` 必须是 `M16-GAP-00274``invariants.queueMutationAllowed` 必须为
`false`,且 `invariants.catalogActiveMatchesPlan` 必须为 `true`
## 通过条件
- 所有命令退出码为 0
- current task 仍为 `M16-GAP-00274`
- parent manifest 的 `nextTask` 仍为 `M16-GAP-00274`
- baseline 两次生成内容完全相同;
- `node tools/web/check-corrective-plan.mjs``git diff --check` 和所有记录命令退出码为 0
- 没有任何旧 queue/manifest/catalog/index 文件被修改。
## 失败边界
任一 hash、active task、parent pointer 或 context gate 不一致时,状态改为
`in_progress`,停止 C0-002/C0-003不得修复或猜测 task number。只允许提交该失败证据
旧队列和历史 evidence 保持原样。

View File

@@ -0,0 +1,77 @@
# C0-002 reconcile_generated_state
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P0
GateG0
依赖:`C0-001`
lifecycleStatus`done`
blockedBy`resolved in corrective staging by authorized current-worktree re-sign`
writeScope`staged_generated_state`
queueMutationAllowed`false`
## 目标
以 manifest/status/task-context 为证据源,恢复 completion registry、next-task plan、task
catalog 和 task index 的可重复生成关系。正式文件只做 dry-run 比较;候选输出必须放在
`tests/golden/corrective/C0-002/staged/`,不能覆盖旧 queue 或旧生成物。
## 实施要求
新增 repository tool建议路径`tools/web/reconcile-corrective-state.mjs`),必须:
- 接收明确的 evidence root不接收任意 guessed task number
- 逐 task 校验 manifest、status、task-context 和 artifact hashes
- 只将全部证据完整且 status 为 `done` 的任务加入 completion registry
- 生成顺序固定为 completion registry -> plan -> index -> task card
- 每个输出先写临时文件,校验成功后原子替换;
- 任一步失败时保留原文件并返回非零退出码;
- 输出 machine-readable summary不输出完整 next-task-plansummary 必须包含
`inputDigest``issueSummary``registryComparison``repairPlan`
- `--write` 仅允许写入显式 `--output-root`,且该路径必须位于 corrective evidence 根目录;
- 输出必须带 `sourceHashes``inputTaskCount``candidateActiveTask``queueMutation:false`
## 必须拒绝
- manifest `done` 但 status/context 缺失;
- parent `nextTask` 不指向 task
- artifact hash drift
- 多个 active task
- 手工传入 offset、nextTask 或 completion 状态;
- 只存在 desktop negative evidence 的任务被加入 feature completion。
## 验收
```bash
node tools/web/reconcile-corrective-state.mjs --evidence-root tests/golden --dry-run --report tests/golden/corrective/C0-002/dry-run.json
node tools/web/reconcile-corrective-state.mjs --evidence-root tests/golden --write --output-root tests/golden/corrective/C0-002/staged --report tests/golden/corrective/C0-002/write.json
jq -e '.inputDigest and (.queueMutation == false) and (.repairPlan.approvalRequired == true)' tests/golden/corrective/C0-002/dry-run.json
jq -e '.inputDigest and (.queueMutation == false) and (.writeOutcome == "NO_FILES_WRITTEN")' tests/golden/corrective/C0-002/write.json
jq -s -e '.[0].inputDigest == .[1].inputDigest' tests/golden/corrective/C0-002/dry-run.json tests/golden/corrective/C0-002/write.json
test ! -e tests/golden/corrective/C0-002/staged/completion-registry.candidate.json
node tools/web/check-blender-next-task-plan.mjs
node tools/web/check-task-index.mjs
npm --prefix web run test:task-context
npm --prefix web run test:context-governance
node tools/web/check-context-governance.mjs
git diff --check
```
`--dry-run``--write``inputDigest` 必须一致;完整 JSON 因 mode 和 writeOutcome
不同而不要求 byte-identical。`--write` 不得更新
`docs/EXECUTION_QUEUE.md`、parent manifest 或正式 plan/index/catalogqueue 更新是 C6-003
的独立 gate。
## 输出
- `tests/golden/corrective/C0-002/reconcile-report.json`
- `tests/golden/corrective/C0-002/reconcile-command.log`
- `tests/golden/corrective/C0-002/dry-run.json``write.json``inputDigest` 对比
- `issueSummary``registryComparison``repairPlan`
- 生成文件的 SHA-256 清单
- `tests/golden/corrective/C0-002/staged/` 下的候选文件(不得直接复制回正式路径)
## 失败边界
任何生成不确定性、hash 漂移或 queue mismatch 都保持 C0-002 `in_progress`,清理本次
staged candidate 后不开始 C1不得手工编辑生成物以“通过” gate。

View File

@@ -0,0 +1,74 @@
# C0-003 classify_legacy_273
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P0
GateG0
依赖:`C0-002`
lifecycleStatus`done`
blockedBy`none`
writeScope`evidence_only`
queueMutationAllowed`false`
## 目标
把旧 M16 已有任务按实际证据重新分类,避免把 metadata-only 或 negative-only 当作正向
feature parity并为后续 capability clustering 产生可复现的候选映射。分类不改变旧任务
`status`、manifest、completion registry 或 queue。
## 分类来源
只能读取并交叉验证:
- task manifest 的 operation/status/artifact hashes
- desktop report 的 poll/operatorStatus/mainMutation
- web report 的 WASM fields、revision、save/reopen、negative
- reader、API、WASM 构件 hashes
- focused command 和 governance report。
禁止根据 task ID、gap 名称或 `status: done` 单独推断 feature parity。
## 分类规则
- `FEATURE_PARITY`:至少 L2必须有 WASM positive command 和 Main mutation
- `READ_COMPATIBILITY`L0/L1只有读取/观察证据;
- `NEGATIVE_BOUNDARY`:只证明取消、不支持、资源缺失或坏输入;
- `METADATA_ONLY`snapshot 有字段,但没有等价 mutation
- `UNSUPPORTED_DECLARED`:明确记录能力边界和用户可见错误;
- `BLOCKED`证据不完整、hash 漂移或流程 gate 失败。
- `PLANNED`:只有 capability 设计材料,没有可核验的旧任务证据;只能出现在新 capability
候选,不得出现在 legacy completion。
## 输出
- `tests/golden/corrective/C0-003/legacy-gap-classification.json`
- `tests/golden/corrective/C0-003/cluster-summary.json`
- `tests/golden/corrective/C0-003/classification-report.md`
每条记录至少包含 `task``gapId``evidenceLevel``completionClass``desktopPositive`
`wasmPositiveMutation``readerChanged``wasmChanged``saveReopen``reason`
`candidateCapabilityId``mappingState``evidenceRefs``sourceHashes`。其中:
- `candidateCapabilityId` 只能是一个 primary capability其它复用关系写入
`coverageCapabilityIds`,不得让一个 gap 隐式重复完成;
- `mappingState` 只能是 `UNMAPPED``CANDIDATE``COVERED``RETAINED_NEGATIVE`
`DUPLICATE``BLOCKED`
- `evidenceRefs` 必须指向具体 manifest/report/command而不是目录或 task 名称;
- `sourceHashes` 必须覆盖被分类的 manifest、desktop/web report 和 production artifact。
## 通过条件
- 273 条旧记录均有分类;
- 每条分类都能追溯到具体 manifest/report/hash
- 生成两次 bytes 相同;
- 能识别至少一个真实 L2+ cluster 和至少一个 metadata/negative cluster
- 每个 `FEATURE_PARITY` 记录都有 `wasmPositiveMutation:true``evidenceLevel` 为 L2-L5
`desktopPositive:true`
- 每个 `RETAINED_NEGATIVE``READ_COMPATIBILITY` 记录不会生成 queue completion
- 不修改旧 manifest、status 或 queue。
## 失败边界
无法从现有证据区分正向 mutation 与 metadata-only 时,分类为 `BLOCKED`,不得向上乐观归类。
mapping 发生多对一冲突、hash 漂移或 source 目录不完整时也必须保持 `BLOCKED`,并记录
冲突原因,不能自动选择 capability。

View File

@@ -0,0 +1,28 @@
# C1-001 define_parity_levels
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P1
GateG1
依赖:`C0-002`, `C0-003`
lifecycleStatus`done`
blockedBy`none`
writeScope`evidence_only`
queueMutationAllowed`false`
## 目标
将 C0-003 的可审计分类收敛为 L0-L5 parity contract并明确哪些字段和
证据组合允许进入 legacy completion、capability evidence 或仅保留为边界。
## 输入
- `tests/golden/corrective/C0-003/legacy-gap-classification.json`
- `tests/golden/corrective/C0-003/cluster-summary.json`
- `docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json`
## 交付
- L0-L5 contract、completion policy 和 focused schema tests。
- 只写入 `tests/golden/corrective/C1-001/` 与对应 status/manifest。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,29 @@
# C1-002 define_command_result_context_schema
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P1
GateG1
依赖:`C1-001`
lifecycleStatus`done`
blockedBy`none`
writeScope`evidence_only`
queueMutationAllowed`false`
## 目标
为 corrective parity contract 定义版本化 command、result、context schema 和
稳定 error/status 表,覆盖正向 mutation、revision conflict、invalid context、
unsupported、malformed 和 resource failure。
## 输入
- `tests/golden/corrective/C1-001/parity-level-contract.json`
- `tests/golden/corrective/C1-001/completion-policy.json`
- `docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json`
## 交付
- versioned JSON schemas、error/status table 和 focused schema tests。
- 只写入 `tests/golden/corrective/C1-002/` 与对应 status/manifest。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,30 @@
# C1-003 build_shared_case_runner
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P1
GateG1
依赖:`C1-002`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
构建 desktop/WASM 共用的 case runner 和 result normalizer使同一 fixture、
command、context、revision 和 negative case 在两个执行面产生可比较 receipt。
## 输入
- `tests/golden/corrective/C1-002/command-schema.json`
- `tests/golden/corrective/C1-002/context-schema.json`
- `tests/golden/corrective/C1-002/result-schema.json`
- `tests/golden/corrective/C1-002/error-status-table.json`
## 交付
- shared desktop runner、WASM runner、result normalizer 和 focused tests。
- 只在显式 production pilot 范围内写入 runner证据写入
`tests/golden/corrective/C1-003/` 与对应 status/manifest。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,43 @@
# C2-001 command_registry_and_validation
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P2
GateG2
依赖:`C1-003`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
在 C1-003 shared case runner 之上建立 typed command registry、统一 validation
和 authorization 边界。命令必须先完成 schema、context、revision 和授权校验,
才能调用 adapter拒绝路径必须保持 Main revision 和状态不变。
## 输入
- `tests/golden/corrective/C1-002/command-schema.json`
- `tests/golden/corrective/C1-002/context-schema.json`
- `tests/golden/corrective/C1-002/result-schema.json`
- `tests/golden/corrective/C1-002/error-status-table.json`
- `web/protocol/corrective-case-runner.ts`
- `tests/golden/corrective/C1-003/manifest.json`
## 交付
- typed command registry、context validator 和 authorization policy。
- 正向 dispatch、未知命令、无权限、只读 context、revision conflict 和 malformed
negative cases 的 focused tests。
- 证据写入 `tests/golden/corrective/C2-001/`,并生成可复现 receipt、hash manifest
和对应 status。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。
## 验收
- focused registry/validation test exits 0。
- positive dispatch and all negative cases are normalized by the shared runner。
- deterministic receipt and protected legacy hashes match before/after。
- `npm --prefix web run typecheck`、corrective-plan/context governance 和
`git diff --check` exit 0。

View File

@@ -0,0 +1,33 @@
# C2-002 atomic_main_mutation
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P2
GateG2
依赖:`C2-001`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
为 registry dispatch 增加 atomic Main mutation boundary。成功命令只能提交
一次 revision/dirty 变化adapter 抛错、返回 malformed result、revision conflict
或取消时必须回滚 provisional state保持 Main snapshot、revision 和 dirty 状态不变。
## 输入
- `web/protocol/corrective-case-runner.ts`
- `web/protocol/corrective-command-registry.ts`
- `tests/golden/corrective/C2-001/manifest.json`
- `tests/golden/corrective/C1-002/result-schema.json`
- `tests/golden/corrective/C1-002/error-status-table.json`
## 交付
- 可测试的 atomic Main mutation transaction boundary。
- success、adapter throw、malformed result、cancel 和 revision conflict 的 focused
tests 与 normalized receipts。
- evidence、determinism、protected-hash、typecheck 和 governance manifest/status。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,32 @@
# C2-003 undo_redo_save_invariants
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P2
GateG2
依赖:`C2-002`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
为 atomic Main mutations 增加 bounded undo/redo history、dirty tracking 和
save/reopen invariant。undo/redo 必须恢复完整 snapshot 与 revisionsave 清除
dirty 状态reopen 必须恢复最后保存的 snapshot失败命令不得创建 history entry。
## 输入
- `web/protocol/corrective-main-transaction.ts`
- `web/protocol/corrective-command-registry.ts`
- `tests/golden/corrective/C2-002/manifest.json`
- `tests/golden/corrective/C1-002/result-schema.json`
- `tests/golden/corrective/C1-002/error-status-table.json`
## 交付
- bounded history store with undo/redo/save/reopen operations。
- focused positive/negative/persistence tests and deterministic receipts。
- protected-hash, typecheck, governance, manifest and status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,34 @@
# C3-001 asset_catalog_resource_provider
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P3
GateG3
依赖:`C2-003`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
建立受 hash 约束的 Asset Catalog resource provider 和 active library context
统一 local、external、packed 资源解析、provider capability、取消和缺失资源错误。
provider 只提供资源,不直接改变 Main写入仍由 C2 atomic transaction 负责。
## 输入
- `web/protocol/corrective-case-runner.ts`
- `web/protocol/corrective-command-registry.ts`
- `web/protocol/corrective-main-transaction.ts`
- `web/protocol/corrective-history-store.ts`
- `tests/golden/corrective/C2-003/manifest.json`
- `tests/golden/corrective/C1-002/context-schema.json`
## 交付
- typed resource provider、active library identity 和 bounded source lookup。
- local/packed/external positive lookup、missing provider、hash mismatch、cancel 和
malformed resource negative tests。
- deterministic receipt、protected-hash、typecheck、governance、manifest/status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,34 @@
# C3-002 asset_catalog_positive_command
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P3
GateG3
依赖:`C3-001`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
实现第一个 Asset Catalog 正向 command在 active library resource 通过 hash
校验后,使用 C2 atomic Main transaction 创建一个 catalog entry。desktop 与 WASM
必须共享 command/registry/transaction/result 语义资源缺失、hash mismatch、只读
context 和 stale revision 必须保持 Main 不变。
## 输入
- `web/protocol/corrective-resource-provider.ts`
- `web/protocol/corrective-command-registry.ts`
- `web/protocol/corrective-main-transaction.ts`
- `tests/golden/corrective/C3-001/manifest.json`
- `tests/golden/corrective/C1-002/result-schema.json`
## 交付
- typed catalog append command and desktop/WASM adapter parity。
- positive mutation, resource negative, stale revision, malformed payload and save/dirty
focused tests。
- deterministic receipt、protected-hash、typecheck、governance、manifest/status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,34 @@
# C3-003 asset_catalog_pilot_e2e
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P3
GateG3
依赖:`C3-002`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
在 Chromium production pilot 中运行同一 Asset Catalog fixture 和 command覆盖
至少五个正/负 casesappend、duplicate、missing resource、revision conflict 和
malformed payload。验证 desktop/WASM receipt parity、Main mutation、dirty、save/reopen
和失败不变性;不运行 Firefox/WebKit。
## 输入
- `web/protocol/corrective-resource-provider.ts`
- `web/protocol/corrective-asset-catalog-command.ts`
- `web/protocol/corrective-main-transaction.ts`
- `web/protocol/corrective-history-store.ts`
- `tests/golden/corrective/C3-002/manifest.json`
- Chromium production pilot harness and its minimal fixture
## 交付
- Chromium-only pilot test and five-case receipt matrix。
- save/reopen evidence and normalized desktop/WASM comparison。
- deterministic receipt、protected-hash、typecheck、governance、manifest/status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,32 @@
# C4-001 modifier_positive_pilot
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P4
GateG4
依赖:`C2-003`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
选择一个代表性 Modifier positive workflow复用 C2 atomic Main、history 和
shared desktop/WASM receipt primitive覆盖 modifier delta、dirty、undo/redo 和
save/reopen parity。失败路径不得产生部分 modifier mutation。
## 输入
- `web/protocol/corrective-command-registry.ts`
- `web/protocol/corrective-main-transaction.ts`
- `web/protocol/corrective-history-store.ts`
- `tests/golden/corrective/C2-003/manifest.json`
## 交付
- typed modifier command and desktop/WASM positive pilot。
- delta/save/undo parity and negative rollback tests。
- Chromium-only evidence where applicable, deterministic receipt、protected-hash、
typecheck、governance、manifest/status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,32 @@
# C4-002 mesh_positive_pilot
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P4
GateG4
依赖:`C4-001`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
选择一个代表性 Mesh positive workflow复用 C2 atomic Main、history 和
shared desktop/WASM receipt primitive覆盖 mesh delta、dirty、negative
rollback 和 save/reopen parity。
## 输入
- `web/protocol/corrective-command-registry.ts`
- `web/protocol/corrective-main-transaction.ts`
- `web/protocol/corrective-history-store.ts`
- `tests/golden/corrective/C4-001/manifest.json`
## 交付
- typed mesh command and desktop/WASM positive pilot。
- geometry delta/save parity and negative rollback tests。
- Chromium-only evidence where applicable, deterministic receipt、protected-hash、
typecheck、governance、manifest/status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,31 @@
# C4-003 pilot_negative_matrix
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P4
GateG4
依赖:`C3-003`, `C4-001`, `C4-002`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
在已完成的 Asset Catalog、Modifier 和 Mesh pilots 上运行统一 negative
matrix验证 unsupported、revision conflict、resource missing 和 malformed
路径都保持 Main revision、内容和 dirty 状态不变。
## 输入
- `tests/golden/corrective/C3-003/manifest.json`
- `tests/golden/corrective/C4-001/manifest.json`
- `tests/golden/corrective/C4-002/manifest.json`
- `web/protocol/corrective-case-runner.ts`
## 交付
- typed cross-family negative matrix and rollback report。
- Chromium-only evidence where applicable, deterministic receipt、protected-hash、
typecheck、governance、manifest/status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,28 @@
# C5-001 cluster_legacy_gaps
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P5
GateG4
依赖:`C4-003`
lifecycleStatus`done`
blockedBy`none`
writeScope`evidence_only`
queueMutationAllowed`false`
## 目标
基于已完成 pilots 和现有 legacy catalog生成 capability family clusters
与代表性 coverage cases。只写 corrective evidence不改变旧 M16 queue、
manifest、registry、catalog、index 或历史 evidence。
## 输入
- `tests/golden/corrective/C4-003/manifest.json`
- `tests/golden/M15-03A/task-catalog.jsonl`
- `docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json`
## 交付
- deterministic cluster report and representative-case mapping。
- protected-hash、typecheck、governance、manifest/status evidence。

View File

@@ -0,0 +1,30 @@
# C5-002 modularize_gap_runner
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P5
GateG4
依赖:`C5-001`
lifecycleStatus`done`
blockedBy`none`
writeScope`production_pilot`
queueMutationAllowed`false`
## 目标
提供 family-level、data-driven corrective runner统一 Asset Catalog、Modifier
和 Mesh pilot 的 desktop/WASM dispatch 与 normalized receipt 汇总,避免每个
gap 重复实现协议,同时保留 atomic Main、负例和 revision contract。
## 输入
- `web/protocol/corrective-command-registry.ts`
- `web/protocol/corrective-case-runner.ts`
- `tests/golden/corrective/C5-001/manifest.json`
## 交付
- typed family runner and data-driven case table。
- cross-family desktop/WASM pilot、deterministic receipt、protected-hash、
typecheck、governance、manifest/status evidence。
- 不修改旧 M16 queue、manifest、registry、catalog、index 或历史 evidence。

View File

@@ -0,0 +1,31 @@
# C5-003 migrate_legacy_gap_inventory
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P5
GateG4
依赖:`C5-002`
lifecycleStatus`done`
blockedBy`none`
writeScope`staged_generated_state`
queueMutationAllowed`false`
## 目标
把 legacy gap inventory 映射到 capability clusters 和 representative
evidence生成 corrective staging 中的 coverage report、capability manifest
和 legacy evidence classification。正式 M16 queue、registry、catalog、index
与历史 evidence 保持只读。
## 输入
- `tests/golden/corrective/C5-001/cluster-report.json`
- `tests/golden/corrective/C5-002/manifest.json`
- `tests/golden/M15-03A/task-catalog.jsonl`
- `docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json`
## 交付
- deterministic staged inventory mapping and capability manifest。
- protected-hash、typecheck、governance、manifest/status evidence。
- queueMutation 必须保持 `false`

View File

@@ -0,0 +1,29 @@
# C6-001 chromium_workflow_gate
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P6
GateG5
依赖:`C5-003`
lifecycleStatus`done`
blockedBy`none`
writeScope`evidence_only`
queueMutationAllowed`false`
## 目标
在 Chromium 中完成 representative workflow 的 open/edit/undo/redo/save/reopen
闭环,记录每一步的 Main revision、dirty、modifier 状态与 normalized receipt。
失败路径不得改变 Main。
## 输入
- `web/protocol/corrective-history-store.ts`
- `web/protocol/corrective-modifier-command.ts`
- `tests/golden/corrective/C5-003/manifest.json`
## 交付
- Chromium-only workflow evidence and deterministic second run。
- protected-hash、typecheck、governance、manifest/status evidence。
- queueMutation 必须保持 `false`

View File

@@ -0,0 +1,29 @@
# C6-002 performance_security_gate
状态done
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P6
GateG5
依赖:`C6-001`
lifecycleStatus`done`
blockedBy`none`
writeScope`evidence_only`
queueMutationAllowed`false`
## 目标
在 Chromium 和 Node focused lane 中验证 corrective command latency/heap budget
与 malformed、path/context、replay security boundaries。所有拒绝路径必须保持
Main unchanged且 queueMutation 继续为 false。
## 输入
- `web/protocol/corrective-case-runner.ts`
- `web/protocol/corrective-resource-provider.ts`
- `tests/golden/corrective/C6-001/manifest.json`
## 交付
- deterministic security report and bounded performance sample。
- Chromium-only evidence where applicable, protected-hash、typecheck、governance、
manifest/status evidence。

View File

@@ -0,0 +1,35 @@
# C6-003 reactivate_queue
状态in_progress
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
阶段P6
GateG5
依赖:`C6-002`
lifecycleStatus`in_progress`
blockedBy`post_write_verification`
writeScope`queue_reactivation`
queueMutationAllowed`true`owner review 已通过)
## 目标
从已验证 capability manifest 生成 queue-reactivation dry-run、new capability
task cards、manifest/status/context candidates 和 release decision。dry-run 与
write bytes 相同、legacy parent hashes 已在写前验证、primary mapping 唯一且
owner review 已明确通过;原子 queue write 已完成,当前只剩 post-write gates。
## 输入
- `tests/golden/corrective/C5-003/inventory-report.json`
- `tests/golden/corrective/C5-003/capability-manifest.json`
- `tests/golden/corrective/C5-003/legacy-evidence-classification.json`
- `tests/golden/corrective/C6-002/manifest.json`
- `docs/EXECUTION_QUEUE.md`
- `tests/golden/M16-GAP-00275/manifest.json`
## 交付
- `queue-reactivation-dry-run.json` and release decision。
- protected legacy hashes, dry-run/write byte comparison, owner-review evidence,
atomic write receipt, and post-handoff gates。
- 未获得 owner review 或任一 hash/diff 不一致时保持 `in_progress`/`blocked`
不写旧 queue。

14
docs/status/C0-001.md Normal file
View File

@@ -0,0 +1,14 @@
# C0-001 Status
status: done
task: freeze_and_snapshot
gate: G0
updated: 2026-08-23 America/New_York
The read-only checkpoint was captured for legacy `M16-GAP-00274`. Queue current
task and parent `nextTask` both remain `M16-GAP-00274`; exactly one catalog task
is active and matches the generated plan first task. The two baseline JSON files
are byte-identical and the protected source hashes are unchanged.
Evidence: `tests/golden/corrective/C0-001/`.
Next corrective task: `C0-002`.

47
docs/status/C0-002.md Normal file
View File

@@ -0,0 +1,47 @@
# C0-002 Status
status: done
task: reconcile_generated_state
gate: G0
updated: 2026-08-23 America/New_York
The staging-only dry run scanned 274 legacy M16 evidence directories and found
1,380 governance issues: 1,355 artifact hash drifts across 23 paths, 24 missing
`task-context.json` files, and one `PLAN_NONDETERMINISTIC` failure. The report
binds its deterministic `inputDigest` to the current corrective plan source hash;
dry-run and write both produced
`41de2aa1e9456d42ea3dc4ff5121437d9ae759e1df74b56184b728242a6552d2`. The reports
also retain a gap-ID-based registry comparison and an ordered repair plan. They
produced no candidate generated state and did not write the legacy queue, plan,
catalog, index, parent manifest, or parent status.
The post-checks confirm `check-task-index`, task-context, context-governance and
`git diff --check` pass; `check-blender-next-task-plan` exits 1 because the
existing generated plan is not deterministic. Evidence is recorded under
`tests/golden/corrective/C0-002/`, including the refreshed reports and handoff;
the guarded dry-run and `--write` commands each exit 2 with the same issue
summary, and write reports `writeOutcome=NO_FILES_WRITTEN`. No `staged/`
directory or candidate generated file was created.
The corrective handoff is complete. Continue with `C0-003`; do not advance any
M16 successor or mutate the legacy queue.
Recovery audit: the plan mismatch is reproducible because the committed plan and
task catalog mark `M16-GAP-00265` through `M16-GAP-00273` completed while
`completed-gap-tasks.json` contains only `operator:asset.asset_download` from
that run. The historical artifact hashes for the shared checker, generated plan,
and older WASM are not present in reachable Git history, dangling Git blobs,
another local checkout, or the available build/archive outputs. A few source
snapshots (for example `scene-ir.ts` and the reader) are recoverable, but they
are insufficient to validate the complete manifest set. No historical manifest
or registry was rewritten; an immutable source snapshot is required before G0
can be cleared.
Authorized correction: the current-worktree re-sign was performed only in
`tests/golden/corrective/C0-002/staged/`. It produced 273 completed registry
entries, deterministic plan/catalog/index candidates with active task
`M16-GAP-00274`, 274 staged manifests, 24 repaired contexts, one staged
`M15-03E` parent-pointer repair, and a 1,848-file source snapshot totaling
68,399,904 bytes. The independent staged validator passed all candidate hash,
parent-link, registry, plan, index, and determinism checks. No legacy file was
overwritten and `queueMutation` remains `false`.

22
docs/status/C0-003.md Normal file
View File

@@ -0,0 +1,22 @@
# C0-003 Status
status: done
task: classify_legacy_273
gate: G0
updated: 2026-08-23 America/New_York
The deterministic corrective classification covers all 273 staged legacy M16
records. It reports 20 `FEATURE_PARITY`, 10 `METADATA_ONLY`, 219
`NEGATIVE_BOUNDARY`, and 24 `BLOCKED` records. `FEATURE_PARITY` is fail-closed:
every such record has L2/L3 evidence, desktop positive evidence, explicit
WASM/Main mutation, `saveReopen=EXACT`, and non-empty source hashes.
The second generation is byte-identical for the classification, cluster summary,
and report. Feature, count, evidence-reference, mapping, negative-boundary,
context, governance, plan, index, and diff gates all exited 0. The handoff binds
`inputDigest=f6779e07fcd65528e9b998b1a627b8d064ebf09b4bccde95c39530d2cf261169`
and preserves `queueMutation=false`; protected legacy source hashes match the
C0-001 checkpoint.
Evidence and manifest: `tests/golden/corrective/C0-003/`.
Next corrective task: `C1-001`.

21
docs/status/C1-001.md Normal file
View File

@@ -0,0 +1,21 @@
# C1-001 Status
status: done
task: define_parity_levels
gate: G1
updated: 2026-08-23 America/New_York
C1-001 defines the ordered L0-L5 parity contract and the fail-closed completion
policy. L0/L1 cover read and observe evidence; L2-L5 require progressively
stronger WASM mutation, persistence, operator semantics, and Chromium workflow
receipts. Only explicit desktop-positive, WASM/Main-mutating, exact-persistence
records with complete hashes may remain FEATURE_PARITY candidates.
The focused contract test passed four assertions. Source bindings to the C0-003
classification, cluster summary, and capability matrix are hash-verified. All
context, governance, plan, index, source-hash, and diff gates exited 0.
Corrective writes remain shadow-only with `queueMutation=false`; legacy
completion and queue writes remain forbidden until C6-003.
Evidence and manifest: `tests/golden/corrective/C1-001/`.
Next corrective task: `C1-002`.

19
docs/status/C1-002.md Normal file
View File

@@ -0,0 +1,19 @@
# C1-002 Status
status: done
task: define_command_result_context_schema
gate: G1
updated: 2026-08-23 America/New_York
C1-002 defines versioned command, context, and result envelopes plus a closed
error/status table. Commands require request identity, base revision, an
authoritative editable context, and a payload. `FINISHED/OK` is the only
mutating result; all malformed, unsupported, cancelled, resource, invalid
context, and revision-conflict outcomes preserve Main revision.
The focused schema test passed five assertions, source bindings are hash-checked,
and plan/context/governance/index/diff gates all exited 0. The schemas are
corrective-only and do not connect to runtime or mutate legacy evidence.
Evidence and manifest: `tests/golden/corrective/C1-002/`.
Next corrective task: `C1-003`.

25
docs/status/C1-003.md Normal file
View File

@@ -0,0 +1,25 @@
# C1-003 Status
status: done
task: build_shared_case_runner
gate: G1
updated: 2026-08-23 America/New_York
C1-003 adds a shared TypeScript case runner for desktop and WASM adapters. It
validates the versioned command/context envelope, rejects stale revisions,
read-only contexts, missing external resources, malformed commands, and
malformed adapter results before a surface can claim a Main mutation. Result
normalization enforces the closed status/code table and the revision/dirty
invariants. Receipt comparison intentionally excludes diagnostic error text
while comparing semantic result fields.
The reproducible pilot receipt was generated twice and compared byte-for-byte.
The positive case matched on both surfaces and advanced Main from revision 4
to 5; revision-conflict and external-resource negative cases matched and kept
Main unchanged. The focused runner test passed 5/5 assertions. Determinism,
TypeScript typecheck, task/context governance, corrective-plan governance, and
`git diff --check` all exited 0. Protected legacy hashes were captured before
and after execution and are identical; the old M16 queue remains read-only.
Evidence and manifest: `tests/golden/corrective/C1-003/`.
Next corrective task: `C2-001`.

23
docs/status/C2-001.md Normal file
View File

@@ -0,0 +1,23 @@
# C2-001 Status
status: done
task: command_registry_and_validation
gate: G2
updated: 2026-08-23 America/New_York
C2-001 adds a typed corrective command registry shared by desktop and WASM
dispatch. Registry definitions require a valid command name, at least one
supported target kind, explicit mutating authorization, and an executor;
duplicate or invalid definitions fail at registration. Dispatch delegates to
the C1-003 runner, so envelope, revision, edit-mode, source-resource, target,
and authorization checks all happen before an adapter can run.
The focused registry test passed 5/5 assertions. The pilot receipt matched on
desktop and WASM for the registered positive command. Unknown, wrong-target,
wrong-authorization, malformed, and read-only cases all returned normalized
non-mutating results with Main revision unchanged. Receipt determinism,
protected legacy hash comparison, typecheck, context/corrective governance,
task-context, and `git diff --check` all exited 0.
Evidence and manifest: `tests/golden/corrective/C2-001/`.
Next corrective task: `C2-002`.

21
docs/status/C2-002.md Normal file
View File

@@ -0,0 +1,21 @@
# C2-002 Status
status: done
task: atomic_main_mutation
gate: G2
updated: 2026-08-23 America/New_York
C2-002 adds an in-memory atomic Main transaction boundary. Commands mutate a
cloned draft and publish exactly one revision/dirty update only after the
outcome passes validation. Adapter exceptions, cancellation, malformed
outcomes, and stale revisions restore the original value, revision, and dirty
state before the shared runner normalizes the failure result.
The focused transaction test passed 5/5 assertions. Desktop and WASM positive
receipts matched with revision 4 -> 5; cancellation, malformed outcome, and
revision conflict all preserved revision 4 and the clean snapshot. Receipt
determinism, protected legacy hashes, typecheck, context/corrective governance,
task-context, and `git diff --check` all exited 0.
Evidence and manifest: `tests/golden/corrective/C2-002/`.
Next corrective task: `C2-003`.

20
docs/status/C2-003.md Normal file
View File

@@ -0,0 +1,20 @@
# C2-003 Status
status: done
task: undo_redo_save_invariants
gate: G2
updated: 2026-08-23 America/New_York
C2-003 adds a bounded corrective history store over the atomic Main store.
Commits create one undo snapshot and clear redo; undo/redo restore value,
revision, and dirty state; save records a clean snapshot; reopen restores that
snapshot and clears transient history. No-op commits do not create history
entries.
The focused history test passed 5/5 assertions. Desktop and WASM save/reopen
snapshots matched exactly. Deterministic receipt generation, protected legacy
hash comparison, typecheck, context/corrective governance, task-context, and
`git diff --check` all exited 0.
Evidence and manifest: `tests/golden/corrective/C2-003/`.
Next corrective task: `C3-001`.

20
docs/status/C3-001.md Normal file
View File

@@ -0,0 +1,20 @@
# C3-001 Status
status: done
task: asset_catalog_resource_provider
gate: G3
updated: 2026-08-23 America/New_York
C3-001 adds a hash-bound Asset Catalog resource resolver with typed active
library context and local/external/packed provider identities. Providers return
defensive byte copies; the resolver requires the request source to match the
active library, verifies the observed SHA-256 before publication, and fails
closed for missing providers, hash mismatch, cancellation, malformed input,
and context mismatch. Resource resolution does not mutate Main.
The focused provider test passed 5/5 assertions. The deterministic receipt,
protected legacy hash comparison, typecheck, context/corrective governance,
task-context, and `git diff --check` all exited 0.
Evidence and manifest: `tests/golden/corrective/C3-001/`.
Next corrective task: `C3-002`.

20
docs/status/C3-002.md Normal file
View File

@@ -0,0 +1,20 @@
# C3-002 Status
status: done
task: asset_catalog_positive_command
gate: G3
updated: 2026-08-23 America/New_York
C3-002 adds `assetCatalogAppend`, a typed positive catalog command registered
for the `ASSET_LIBRARY` target. It resolves and hash-verifies the active
resource before using the C2 atomic Main transaction to append one entry.
Duplicate IDs, malformed payloads, resource hash failure, and stale revisions
remain non-mutating.
The focused command test passed 3/3 assertions. Desktop and WASM produced the
same normalized positive receipt and catalog snapshot. Deterministic receipt,
protected legacy hashes, typecheck, context/corrective governance,
task-context, and `git diff --check` all exited 0.
Evidence and manifest: `tests/golden/corrective/C3-002/`.
Next corrective task: `C3-003`.

22
docs/status/C3-003.md Normal file
View File

@@ -0,0 +1,22 @@
# C3-003 Status
status: done
task: asset_catalog_pilot_e2e
gate: G3
updated: 2026-08-23 America/New_York
C3-003 runs the same Asset Catalog fixture and command in Chromium through the
Vite production pilot bridge. The five-case matrix covers positive append,
duplicate entry, missing provider, stale revision, and malformed payload. The
positive desktop/WASM receipts match, Main advances once and becomes dirty;
all negative cases preserve Main. The history store then saves and reopens the
catalog snapshot with revision 5 and dirty=false.
The Chromium-only pilot passed twice on separate ports and its receipts are
byte-identical. C3-002 regression, typecheck, context/corrective governance,
task-context, protected legacy hashes, and `git diff --check` all exited 0.
The existing App React refresh preamble warning remains in the dev server log,
but the pilot page and all assertions completed successfully.
Evidence and manifest: `tests/golden/corrective/C3-003/`.
Next corrective task: `C4-001`.

22
docs/status/C4-001.md Normal file
View File

@@ -0,0 +1,22 @@
# C4-001 Status
status: done
task: modifier_positive_pilot
gate: G4
updated: 2026-08-23 America/New_York
C4-001 implements a typed `modifierSetEnabled` command for the `MODIFIER`
target. The command validates its two-field payload, resolves the modifier
before mutation, and uses the shared atomic Main transaction so malformed,
stale, wrong-target, and unknown-modifier cases preserve revision and dirty
state.
The focused Node test and Chromium-only pilot cover desktop/WASM delta parity,
dirty state, negative rollback, undo/redo, save, and reopen. Deterministic
receipts and C3-002 regression are recorded under
`tests/golden/corrective/C4-001/`; legacy queue mutation remains forbidden.
All focused, Chromium, deterministic, regression, typecheck, governance,
protected-hash, and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C4-001/manifest.json`. Next corrective task:
`C4-002`.

22
docs/status/C4-002.md Normal file
View File

@@ -0,0 +1,22 @@
# C4-002 Status
status: done
task: mesh_positive_pilot
gate: G4
updated: 2026-08-23 America/New_York
C4-002 implements a typed `meshTranslateVertex` command for the `MESH` target.
It validates a bounded finite three-axis delta, resolves the vertex before
mutation, and uses the shared atomic Main transaction so malformed, stale,
wrong-target, unknown-vertex, and overflow cases preserve geometry and Main
state.
The focused Node test and Chromium-only pilot cover desktop/WASM geometry delta
parity, dirty state, negative rollback, undo/redo, save, and reopen. Evidence
is under `tests/golden/corrective/C4-002/`; legacy queue mutation remains
forbidden.
All focused, Chromium, deterministic, regression, typecheck, governance,
protected-hash, and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C4-002/manifest.json`. Next corrective task:
`C4-003`.

20
docs/status/C4-003.md Normal file
View File

@@ -0,0 +1,20 @@
# C4-003 Status
status: done
task: pilot_negative_matrix
gate: G4
updated: 2026-08-23 America/New_York
C4-003 runs a shared negative matrix over the completed Asset Catalog,
Modifier, and Mesh pilots. It covers malformed payloads, unsupported targets,
stale revisions, and missing external resources; every result is normalized to
a closed failure code and all three Main snapshots remain unchanged.
The Node matrix and Chromium-only pilot are deterministic and include the
focused family regressions. Evidence is under
`tests/golden/corrective/C4-003/`; legacy queue mutation remains forbidden.
All focused, Chromium, deterministic, regression, typecheck, governance,
protected-hash, and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C4-003/manifest.json`. Next corrective task:
`C5-001`.

21
docs/status/C5-001.md Normal file
View File

@@ -0,0 +1,21 @@
# C5-001 Status
status: done
task: cluster_legacy_gaps
gate: G4
updated: 2026-08-23 America/New_York
C5-001 generates a deterministic evidence-only cluster report from the legacy
task catalog and the corrective capability matrix. It records ASSET_CATALOG,
MODIFIER, and MESH family counts, state distributions, representative legacy
tasks, source-gap coverage, and the completed C3/C4 representative workflows.
No legacy queue or generated state is mutated.
The report, deterministic second run, cluster gate, protected hashes, context
governance, task context, and diff evidence are under
`tests/golden/corrective/C5-001/`.
All cluster, deterministic, typecheck, governance, protected-hash, task-context,
and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C5-001/manifest.json`. Next corrective task:
`C5-002`.

20
docs/status/C5-002.md Normal file
View File

@@ -0,0 +1,20 @@
# C5-002 Status
status: done
task: modularize_gap_runner
gate: G4
updated: 2026-08-23 America/New_York
C5-002 adds a typed, data-driven family runner that validates unique case IDs,
supported families, registry identity, and revisions before dispatching through
the shared command registry. It returns normalized receipts and a stable
ASSET_CATALOG/MODIFIER/MESH summary without duplicating per-gap protocol logic.
The Node focused test and Chromium-only pilot cover six positive cases across
three families and both surfaces. Evidence is under
`tests/golden/corrective/C5-002/`; legacy queue mutation remains forbidden.
All focused, Chromium, deterministic, regression, typecheck, governance,
protected-hash, task-context, and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C5-002/manifest.json`. Next corrective task:
`C5-003`.

16
docs/status/C5-003.md Normal file
View File

@@ -0,0 +1,16 @@
# C5-003 Status
status: done
task: migrate_legacy_gap_inventory
gate: G4
updated: 2026-08-23 America/New_York
C5-003 produces staged-only legacy inventory mapping from the C5-001 clusters,
C5-002 manifest, catalog, and capability template. It emits coverage,
capability-manifest, and evidence-classification views while preserving the
planned lifecycle and avoiding any formal queue or generated-state mutation.
All inventory, deterministic, typecheck, governance, protected-hash,
task-context, and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C5-003/manifest.json`. Next corrective task:
`C6-001`.

19
docs/status/C6-001.md Normal file
View File

@@ -0,0 +1,19 @@
# C6-001 Status
status: done
task: chromium_workflow_gate
gate: G5
updated: 2026-08-23 America/New_York
C6-001 runs the Chromium-only representative workflow through open, edit,
save, undo, redo, and reopen. Each transition records the shared normalized
receipt and history snapshot; save/reopen returns the edited modifier with
dirty=false, while undo restores the original revision and value.
Evidence is under `tests/golden/corrective/C6-001/`; legacy queue mutation
remains forbidden.
All Chromium, deterministic, typecheck, regression, governance, protected-hash,
task-context, and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C6-001/manifest.json`. Next corrective task:
`C6-002`.

19
docs/status/C6-002.md Normal file
View File

@@ -0,0 +1,19 @@
# C6-002 Status
status: done
task: performance_security_gate
gate: G5
updated: 2026-08-23 America/New_York
C6-002 samples 50 independent WASM modifier dispatches in Chromium and checks
p95/max latency against the bounded 100/250 ms budget. The same run verifies
replay stale revisions, malformed payloads, and an external resource path that
does not match the active library context; all rejection paths preserve Main.
Evidence is under `tests/golden/corrective/C6-002/`; legacy queue mutation
remains forbidden.
All Chromium, normalized deterministic, typecheck, regression, governance,
protected-hash, task-context, and diff gates exited 0. Handoff manifest:
`tests/golden/corrective/C6-002/manifest.json`. Next corrective task:
`C6-003`.

18
docs/status/C6-003.md Normal file
View File

@@ -0,0 +1,18 @@
# C6-003 Status
status: in_progress
task: reactivate_queue
gate: G5
updated: 2026-08-23 America/New_York
The queue reactivation dry-run is complete and deterministic. It records the
legacy queue and parent hashes, three unique capability mappings, retained
negative evidence, expected additive candidates, and rollback path. The dry-run
and write preview bytes match exactly, and the explicit owner review approved
the protected write.
The queue write completed atomically with exit code 0. `M16-GAP-00276` is now
`done`, the completion registry/plan/catalog/index were regenerated, and the
legacy queue points to `M16-GAP-00277` with parent manifest
`tests/golden/M16-GAP-00276/manifest.json`. The before/after bytes and rollback
receipt are recorded in `tests/golden/corrective/C6-003/`.

View File

@@ -0,0 +1,29 @@
# M16-GAP-00276 Status
status: done
task: asset.clear_single operator LOCAL_EXACT slice
updated: 2026-08-23 America/New_York
scope:
- The fixture links one object from external `WebGapAssetClearSingle.blend`.
Blender desktop observes the linked-data boundary as `poll=false`, records
`CANCELLED` for `ASSET_OT_clear_single`, and confirms no Main mutation.
Save/reopen preserves the Library record exactly.
- WASM/Main reads the same external Library with stable source path,
`EXTERNAL_REQUIRED` status, and an empty dependency closure. The comparator
confirms save/reopen stability and malformed-input rejection without Main
mutation.
evidence:
- Fixture generation, desktop checker, npm comparator, direct comparator, and
task context checks passed with exit code 0. Chromium-only policy was
preserved and no Firefox/WebKit run was made. Blender's expected missing
external-library warning is recorded by the comparator while the Library
state remains exact.
- Focused evidence is complete and the C6-003 owner review approved the
protected queue reactivation. The queue write is recorded under the C6-003
evidence root and advances the next task to `M16-GAP-00277`.
nextTask: `M16-GAP-00277`

View File

@@ -0,0 +1,28 @@
# M16-GAP-00277 Status
status: done
task: asset.library_refresh operator LOCAL_EXACT slice
updated: 2026-08-23 America/New_York
scope:
- The fixture links one object from external `WebGapAssetLibraryRefresh.blend`.
Blender desktop observes the missing Asset Browser context as `poll=false`,
records `CANCELLED` for `ASSET_OT_library_refresh`, and confirms no Main
mutation. Save/reopen preserves the Library record exactly.
- WASM/Main reads the same external Library with stable source path,
`EXTERNAL_REQUIRED` status, and an empty dependency closure. The comparator
confirms save/reopen stability and malformed-input rejection without Main
mutation.
evidence:
- Fixture generation, desktop checker, npm comparator, direct comparator, and
task context checks passed with exit code 0. Chromium-only policy was
preserved and no Firefox/WebKit run was made. Blender's expected missing
external-library warning is recorded by the comparator while the Library
state remains exact.
- The focused reader path already exports Library state; no unrelated
data-block, editor, browser, or native-stub behavior was changed.
nextTask: `M16-GAP-00278`

View File

@@ -0,0 +1,27 @@
# M16-GAP-00278 Status
status: done
task: asset.library_reload_listing operator LOCAL_EXACT slice
updated: 2026-08-24 America/New_York
scope:
- The fixture links one object from external `WebGapAssetLibraryReloadListing.blend`.
Blender desktop observes the non-remote-library boundary as `poll=false`, records
`CANCELLED` for `ASSET_OT_library_reload_listing`, and confirms no Main mutation.
Save/reopen preserves the Library record exactly.
- WASM/Main reads the same external Library with stable source path,
`EXTERNAL_REQUIRED` status, and an empty dependency closure. The comparator
confirms save/reopen stability and malformed-input rejection without Main mutation.
evidence:
- Fixture generation, desktop checker, npm comparator, direct comparator, and
task-context handoff checks passed with exit code 0. Chromium-only policy was
preserved and no Firefox/WebKit run was made. Blender's expected missing
external-library warning is recorded by the comparator while the Library state
remains exact.
- The focused reader path already exports Library state; no unrelated data-block,
editor, browser, or native-stub behavior was changed.
nextTask: `M16-GAP-00279`

View File

@@ -0,0 +1,27 @@
# M16-GAP-00279 Status
status: done
task: asset.mark operator LOCAL_EXACT slice
updated: 2026-08-24 America/New_York
scope:
- The minimal fixture marks `WebGapAssetMarkObject` as an asset and persists the
author, description, and `operator-mark` tag. Blender desktop observes the
missing Asset Browser/editor context as `poll=false`, records `CANCELLED` for
`ASSET_OT_mark`, and confirms no Main mutation. Save/reopen preserves the
asset metadata exactly.
- WASM/Main reads the same object asset metadata through Scene IR with
`marked=true`, matching author, description, and tags. The comparator confirms
save/reopen stability and malformed-input rejection without Main mutation.
evidence:
- Fixture generation, Blender desktop checker, WASM rebuild, npm comparator,
direct comparator, and task-context handoff checks passed with exit code 0.
Chromium-only policy was preserved and no Firefox/WebKit run was made.
- The focused reader path exports asset metadata for object IDs and the Scene IR
protocol declares the corresponding optional `assetData` shape; no unrelated
data-block, editor, browser, or native-stub behavior was changed.
nextTask: `M16-GAP-00280`

View File

@@ -0,0 +1,27 @@
# M16-GAP-00280 Status
status: done
task: asset.mark_single operator LOCAL_EXACT slice
updated: 2026-08-24 America/New_York
scope:
- The minimal fixture contains one marked object, `WebGapAssetMarkSingleObject`,
with stable author, description, and `operator-mark-single` tag metadata.
Blender desktop observes `asset.mark_single` as `poll=false`, records
`CANCELLED`, and confirms no Main mutation. Save/reopen preserves the
metadata exactly.
- WASM/Main reads the same fixture through the existing Scene IR asset metadata
path. The comparator confirms the object metadata matches desktop, survives
save/reopen, and rejects malformed input without changing Main.
evidence:
- Fixture generation, desktop checker, npm generated-gap comparator, direct
comparator, and task-context handoff checks passed with exit code 0.
Chromium-only policy was preserved and no Firefox/WebKit run was made.
- This task adds only the `mark_single` fixture/checker/comparator evidence;
the reader, Scene IR protocol, and WASM artifacts are the already verified
asset metadata path from M16-GAP-00279.
nextTask: `M16-GAP-00281`

View File

@@ -0,0 +1,27 @@
# M16-GAP-00281 Status
status: done
task: asset.open_containing_blend_file operator LOCAL_EXACT slice
updated: 2026-08-24 America/New_York
scope:
- The minimal fixture links one object from external `WebGapOpenContaining.blend`.
Blender desktop observes the no-selected-asset boundary as `poll=false`, records
`CANCELLED` for `asset.open_containing_blend_file`, and confirms no Main mutation.
Save/reopen preserves the Library record exactly.
- WASM/Main reads the same external Library with stable source path,
`EXTERNAL_REQUIRED` status, and an empty dependency closure. The comparator
confirms save/reopen stability and malformed-input rejection without Main
mutation.
evidence:
- Fixture generation, desktop checker, npm generated-gap comparator, direct
comparator, and task-context handoff checks passed with exit code 0.
Chromium-only policy was preserved and no Firefox/WebKit run was made.
- This task adds only the `open_containing_blend_file` fixture/checker/comparator
evidence; the reader, Scene IR library path, and WASM artifacts are the already
verified external Library path from adjacent asset operator tasks.
nextTask: `M16-GAP-00282`

View File

@@ -0,0 +1,11 @@
# WBV2 baseline status
status: done
task: capability queue transition baseline
updated: 2026-08-24 America/New_York
The WBV2 production lane starts without rewriting the immutable M16 manifests. The
legacy coverage checkpoint remains `M16-GAP-00282`, whose parent manifest is
`tests/golden/M16-GAP-00281/manifest.json`. Corrective C0-C6 evidence remains historical.
nextTask: `WBV2-P0-001`

View File

@@ -0,0 +1,22 @@
# WBV2-P0-001 Status
status: done
task: reconcile_scope_and_checkpoints
gate: G0
updated: 2026-08-24 America/New_York
The production queue is now capability-oriented. `WBV2-P0-001` is the only ready
task and is parented by the new transition baseline. The legacy M16 list remains
an immutable coverage lane with `M16-GAP-00282` as its checkpoint; its manifests,
reports, and generated index are not rewritten as capability evidence.
The control plane reports 6,900 legacy cases, 281 completed coverage records, and
three capability clusters covering nine related legacy gaps. Corrective C0-C6
pilots and their Chromium receipts are retained as historical reusable primitives.
All focused plan, ancestry, control-plane, execution-health, task-context,
context-governance, execution-control, and diff gates passed with exit code 0.
No Blender/WASM startup was attempted for the legacy coverage task because it is
not the production lane.
nextTask: `WBV2-P0-002`

View File

@@ -0,0 +1,37 @@
# M16-GAP-00277: operator:asset.library_refresh LOCAL_EXACT slice
- task: M16-GAP-00277
- parent: M16-GAP-00276
- status: in_progress
- gap: operator:asset.library_refresh
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:asset.library_refresh data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00277-operator-asset.library_refresh.blend`
- Generator: `tools/web/generated/M16-GAP-00277.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00277.py -- tests/files/web/generated/M16-GAP-00277-operator-asset.library_refresh.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00277
node tools/web/check-generated-gap.mjs --task M16-GAP-00277
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00277/`
- Status: `docs/status/M16-GAP-00277.md`
- Manifest: `tests/golden/M16-GAP-00277/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00277 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00278: operator:asset.library_reload_listing LOCAL_EXACT slice
- task: M16-GAP-00278
- parent: M16-GAP-00277
- status: in_progress
- gap: operator:asset.library_reload_listing
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:asset.library_reload_listing data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00278-operator-asset.library_reload_listing.blend`
- Generator: `tools/web/generated/M16-GAP-00278.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00278.py -- tests/files/web/generated/M16-GAP-00278-operator-asset.library_reload_listing.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00278
node tools/web/check-generated-gap.mjs --task M16-GAP-00278
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00278/`
- Status: `docs/status/M16-GAP-00278.md`
- Manifest: `tests/golden/M16-GAP-00278/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00278 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00279: operator:asset.mark LOCAL_EXACT slice
- task: M16-GAP-00279
- parent: M16-GAP-00278
- status: in_progress
- gap: operator:asset.mark
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:asset.mark data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00279-operator-asset.mark.blend`
- Generator: `tools/web/generated/M16-GAP-00279.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00279.py -- tests/files/web/generated/M16-GAP-00279-operator-asset.mark.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00279
node tools/web/check-generated-gap.mjs --task M16-GAP-00279
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00279/`
- Status: `docs/status/M16-GAP-00279.md`
- Manifest: `tests/golden/M16-GAP-00279/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00279 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00280: operator:asset.mark_single LOCAL_EXACT slice
- task: M16-GAP-00280
- parent: M16-GAP-00279
- status: in_progress
- gap: operator:asset.mark_single
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:asset.mark_single data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00280-operator-asset.mark_single.blend`
- Generator: `tools/web/generated/M16-GAP-00280.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00280.py -- tests/files/web/generated/M16-GAP-00280-operator-asset.mark_single.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00280
node tools/web/check-generated-gap.mjs --task M16-GAP-00280
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00280/`
- Status: `docs/status/M16-GAP-00280.md`
- Manifest: `tests/golden/M16-GAP-00280/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00280 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

View File

@@ -0,0 +1,37 @@
# M16-GAP-00281: operator:asset.open_containing_blend_file LOCAL_EXACT slice
- task: M16-GAP-00281
- parent: M16-GAP-00280
- status: in_progress
- gap: operator:asset.open_containing_blend_file
- ownerFamily: OPERATOR
- targetImplementationClass: LOCAL_EXACT
## 目标
Make the same minimal fixture produce observable operator:asset.open_containing_blend_file data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.
## 输入与范围
- Fixture: `tests/files/web/generated/M16-GAP-00281-operator-asset.open_containing_blend_file.blend`
- Generator: `tools/web/generated/M16-GAP-00281.py`
- Production: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Checker: `tools/web/check-generated-gap.mjs`
- Do: field read, desktop/WASM comparison, save/reopen, structured report.
- Do not: other gaps, Firefox/WebKit, or full editor behavior.
## 验收
build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00281.py -- tests/files/web/generated/M16-GAP-00281-operator-asset.open_containing_blend_file.blend
npm --prefix web run test:generated-gap -- --task M16-GAP-00281
node tools/web/check-generated-gap.mjs --task M16-GAP-00281
Malformed/unsupported, cancellation, duplicate, over-budget, or hash-drift cases must keep in_progress; they must not change Main revision or advance nextTask.
## 交付与回滚
- Reports: `tests/golden/M16-GAP-00281/`
- Status: `docs/status/M16-GAP-00281.md`
- Manifest: `tests/golden/M16-GAP-00281/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task M16-GAP-00281 --write`
- Rollback: remove this task production entry, fixture, tests, reports, manifest, status, and context; restore the parent as queue tail without rewriting parent evidence.

47
docs/tasks/WBV2-P0-001.md Normal file
View File

@@ -0,0 +1,47 @@
# WBV2-P0-001: reconcile scope and checkpoints
- task: WBV2-P0-001
- parent: WBV2-BASELINE
- status: in_progress
- gap: workflow:execution-control-plane
- ownerFamily: PROGRAM
- targetImplementationClass: LOCAL_BOUNDED
## 目标
冻结 V1 与 Blender 5.2 full-parity 的业务边界,建立 capability production lane
和 legacy coverage lane并证明 V2 指针、legacy checkpoint 与 corrective handoff
没有互相覆盖。
## 输入与范围
- `docs/BLENDER_WEB_PARITY_EXECUTION_PLAN_V2.md`
- `docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json`
- `docs/BLENDER_WEB_EXECUTION_CONTROL_PLANE.md`
- `docs/EXECUTION_QUEUE.md`
- `tests/golden/corrective/C6-003/handoff.json`
- `docs/WEB_BLENDER_MODELER_V1_SCOPE.md`
做:计划 schema、依赖图、能力分类、双 lane index、checkpoint ancestry、protected
hash 交叉检查。保留 legacy manifest/status/corrective handoff不重写历史证据。
## 验收
```bash
node tools/web/check-web-parity-v2-plan.mjs
node tools/web/check-corrective-plan.mjs
node tools/web/check-context-governance.mjs
npm --prefix web run test:execution-control-plane
git diff --check
```
Malformed plan、重复 ready task、parent mismatch、hash drift 或缺失 task card 必须失败,
不得推进 capability successor 或改写 legacy checkpoint。
## 交付与回滚
- Reports: `tests/golden/WBV2-P0-001/`
- Status: `docs/status/WBV2-P0-001.md`
- Manifest: `tests/golden/WBV2-P0-001/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task WBV2-P0-001 --write`
- Rollback: restore `WBV2-BASELINE` as the capability queue tail; leave M16 and corrective evidence unchanged.

47
docs/tasks/WBV2-P0-002.md Normal file
View File

@@ -0,0 +1,47 @@
# WBV2-P0-002: generate Blender 5.2 inventory and parity map
- task: WBV2-P0-002
- parent: WBV2-P0-001
- status: in_progress
- gap: workflow:blender52-inventory
- ownerFamily: PARITY
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Generate a deterministic Blender 5.2 inventory and map each entry to a capability
family, completion class, parity level, owner, and evidence state. This is an
inventory change only; it must not claim feature parity or modify Blender runtime.
## 输入与范围
- `docs/BLENDER_WEB_EXECUTION_CONTROL_PLANE.md`
- `tests/golden/corrective/C5-003/capability-manifest.json`
- `tests/golden/corrective/C5-003/coverage-report.json`
- `tests/golden/corrective/C5-003/inventory-gate.log`
Do: stable IDs, family clustering, unknown classification, deterministic report and
source hashes. Do not: edit legacy manifests, execute arbitrary Blender operators,
or run Firefox/WebKit.
## 验收
```bash
node tools/web/check-execution-control-plane.mjs
node tools/web/check-web-parity-v2-plan.mjs
node tools/web/check-corrective-plan.mjs
npm --prefix web run test:context-governance
```
Malformed inventory input, duplicate IDs, unsupported classification, hash drift, or
budget overflow must fail closed and keep this task `in_progress`/`blocked`; no
successor may be selected.
## 交付与回滚
- Reports: `tests/golden/WBV2-P0-002/`
- Status: `docs/status/WBV2-P0-002.md`
- Manifest: `tests/golden/WBV2-P0-002/manifest.json`
- Handoff: `node tools/web/check-task-context.mjs --task WBV2-P0-002 --write`
- Rollback: remove only this task's report/status/manifest/context; restore
`WBV2-P0-001` as the queue tail without rewriting its evidence.