Reorganize Blender Web execution around capabilities
This commit is contained in:
@@ -2143,6 +2143,36 @@ std::string read_raw_string(const ParsedBlend &blend,
|
||||
return std::string(data, strnlen(data, available));
|
||||
}
|
||||
|
||||
std::optional<json> asset_metadata_from_id(const ParsedBlend &blend, const ElementRef &element)
|
||||
{
|
||||
const std::optional<ElementRef> id = embedded_element(*blend.sdna, element, "id");
|
||||
if (!id) return std::nullopt;
|
||||
const std::optional<uint64_t> asset_pointer = read_pointer(*blend.sdna, *id, "asset_data");
|
||||
if (!asset_pointer || *asset_pointer == 0) return std::nullopt;
|
||||
const std::optional<ElementRef> metadata = element_for_pointer(blend, *asset_pointer);
|
||||
if (!metadata) return std::nullopt;
|
||||
|
||||
auto dynamic_string = [&](const char *member) {
|
||||
const std::optional<uint64_t> pointer = read_pointer(*blend.sdna, *metadata, member);
|
||||
return pointer ? read_raw_string(blend, *pointer, 4096) : std::string();
|
||||
};
|
||||
json tags = json::array();
|
||||
for (const ElementRef &tag : linked_list_elements(blend, *metadata, "tags")) {
|
||||
const std::string name = read_string(*blend.sdna, tag, "name");
|
||||
if (!name.empty()) tags.push_back(name);
|
||||
}
|
||||
return json{{"marked", true},
|
||||
{"author", dynamic_string("author")},
|
||||
{"description", dynamic_string("description")},
|
||||
{"copyright", dynamic_string("copyright")},
|
||||
{"license", dynamic_string("license")},
|
||||
{"catalogSimpleName", read_string(*blend.sdna, *metadata, "catalog_simple_name")},
|
||||
{"activeTag", read_integer(*blend.sdna, *metadata, "active_tag").value_or(0)},
|
||||
{"preferredImportMethod",
|
||||
read_integer(*blend.sdna, *metadata, "preferred_import_method").value_or(0)},
|
||||
{"tags", std::move(tags)}};
|
||||
}
|
||||
|
||||
std::optional<json> script_source_from_record(const ParsedBlend &blend,
|
||||
const ElementRef &element,
|
||||
const IdRecord &record)
|
||||
@@ -3572,11 +3602,14 @@ json scene_ir_from_blend(const ParsedBlend &blend,
|
||||
{"selectable", (visibility_flags & 2) == 0},
|
||||
{"localMatrix", matrix},
|
||||
{"worldMatrix", matrix},
|
||||
{"transform",
|
||||
{"transform",
|
||||
{{"translation", float_array_or(location, {0.0f, 0.0f, 0.0f})},
|
||||
{"rotationEuler", float_array_or(rotation, {0.0f, 0.0f, 0.0f})},
|
||||
{"scale", float_array_or(scale, {1.0f, 1.0f, 1.0f})},
|
||||
{"rotationMode", read_integer(*blend.sdna, element, "rotmode").value_or(1)}}}};
|
||||
if (const std::optional<json> asset_data = asset_metadata_from_id(blend, element)) {
|
||||
node["assetData"] = *asset_data;
|
||||
}
|
||||
json constraints = json::array();
|
||||
for (const ElementRef &constraint : linked_list_elements(blend, element, "constraints")) {
|
||||
const int64_t constraint_type = read_integer(*blend.sdna, constraint, "type").value_or(0);
|
||||
|
||||
212
docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json
Normal file
212
docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json
Normal 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}
|
||||
}
|
||||
]
|
||||
}
|
||||
303
docs/BLENDER_WASM_CORRECTIVE_EXECUTION_RUNBOOK.md
Normal file
303
docs/BLENDER_WASM_CORRECTIVE_EXECUTION_RUNBOOK.md
Normal 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 evidence;parent 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 编译日志。
|
||||
434
docs/BLENDER_WASM_CORRECTIVE_MIGRATION_PLAN.md
Normal file
434
docs/BLENDER_WASM_CORRECTIVE_MIGRATION_PLAN.md
Normal 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 可作为行为 oracle;Chromium 是唯一允许的浏览器验收运行时。
|
||||
- 任务 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:止损和可审计基线(P0,1-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 1:Parity contract 和测试基座(P1,2-3 个工程日)
|
||||
|
||||
目标:让每个后续 task 都有可判定的“正向等价”定义。
|
||||
|
||||
任务:
|
||||
|
||||
- 建立 declarative capability matrix:capability、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 拆成按能力族的 runner,task 只提供 case 数据。
|
||||
|
||||
出口条件:
|
||||
|
||||
- 同一 case 可由 desktop runner 和 WASM runner 读取;
|
||||
- 正向、取消、不支持、坏输入四种结果不可混淆;
|
||||
- 一个测试原语能覆盖至少 5 个相同语义的 cases;
|
||||
- 不新增硬编码 task 分支即可增加参数化 case。
|
||||
|
||||
### Phase 2:Command/Main authority 基础(P2,3-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 3:Asset Catalog 垂直 pilot(P3,3-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 4:Modifier 和 Mesh 垂直 pilot(P4,3-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:覆盖矩阵和规模化迁移(P5,pilot 通过后)
|
||||
|
||||
目标:将 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 E2E:open/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 清单能由这些共享能力自动覆盖。
|
||||
111
docs/BLENDER_WASM_CORRECTIVE_TASK_PLAN.json
Normal file
111
docs/BLENDER_WASM_CORRECTIVE_TASK_PLAN.json
Normal 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"
|
||||
]
|
||||
}
|
||||
72
docs/BLENDER_WEB_EXECUTION_CONTROL_PLANE.md
Normal file
72
docs/BLENDER_WEB_EXECUTION_CONTROL_PLANE.md
Normal 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.
|
||||
209
docs/BLENDER_WEB_PARITY_EXECUTION_PLAN_V2.md
Normal file
209
docs/BLENDER_WEB_PARITY_EXECUTION_PLAN_V2.md
Normal 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。
|
||||
- 浏览器验收永久只使用 Chromium;Firefox/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/streaming;JSON 只承载有界元数据和诊断,避免把
|
||||
全量 Blender RNA 变成前端内存对象。
|
||||
5. 本地资源使用 content-addressed SHA-256,OPFS 先 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 geometry,4K/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/context,parent 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。
|
||||
85
docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json
Normal file
85
docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json
Normal 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}
|
||||
]
|
||||
}
|
||||
@@ -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。
|
||||
|
||||
@@ -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` |
|
||||
|
||||
领取前执行:
|
||||
|
||||
|
||||
@@ -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` |
|
||||
|
||||
|
||||
77
docs/corrective/C0-001-freeze-and-snapshot.md
Normal file
77
docs/corrective/C0-001-freeze-and-snapshot.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# C0-001 freeze_and_snapshot
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P0
|
||||
Gate:G0
|
||||
依赖:无
|
||||
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 保持原样。
|
||||
77
docs/corrective/C0-002-reconcile-generated-state.md
Normal file
77
docs/corrective/C0-002-reconcile-generated-state.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# C0-002 reconcile_generated_state
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P0
|
||||
Gate:G0
|
||||
依赖:`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-plan;summary 必须包含
|
||||
`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/catalog;queue 更新是 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。
|
||||
74
docs/corrective/C0-003-classify-legacy-273.md
Normal file
74
docs/corrective/C0-003-classify-legacy-273.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# C0-003 classify_legacy_273
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P0
|
||||
Gate:G0
|
||||
依赖:`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。
|
||||
28
docs/corrective/C1-001-define-parity-levels.md
Normal file
28
docs/corrective/C1-001-define-parity-levels.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# C1-001 define_parity_levels
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P1
|
||||
Gate:G1
|
||||
依赖:`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。
|
||||
@@ -0,0 +1,29 @@
|
||||
# C1-002 define_command_result_context_schema
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P1
|
||||
Gate:G1
|
||||
依赖:`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。
|
||||
30
docs/corrective/C1-003-build-shared-case-runner.md
Normal file
30
docs/corrective/C1-003-build-shared-case-runner.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# C1-003 build_shared_case_runner
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P1
|
||||
Gate:G1
|
||||
依赖:`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。
|
||||
43
docs/corrective/C2-001-command-registry-and-validation.md
Normal file
43
docs/corrective/C2-001-command-registry-and-validation.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# C2-001 command_registry_and_validation
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P2
|
||||
Gate:G2
|
||||
依赖:`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。
|
||||
33
docs/corrective/C2-002-atomic-main-mutation.md
Normal file
33
docs/corrective/C2-002-atomic-main-mutation.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# C2-002 atomic_main_mutation
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P2
|
||||
Gate:G2
|
||||
依赖:`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。
|
||||
32
docs/corrective/C2-003-undo-redo-save-invariants.md
Normal file
32
docs/corrective/C2-003-undo-redo-save-invariants.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# C2-003 undo_redo_save_invariants
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P2
|
||||
Gate:G2
|
||||
依赖:`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 与 revision,save 清除
|
||||
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。
|
||||
34
docs/corrective/C3-001-asset-catalog-resource-provider.md
Normal file
34
docs/corrective/C3-001-asset-catalog-resource-provider.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# C3-001 asset_catalog_resource_provider
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P3
|
||||
Gate:G3
|
||||
依赖:`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。
|
||||
34
docs/corrective/C3-002-asset-catalog-positive-command.md
Normal file
34
docs/corrective/C3-002-asset-catalog-positive-command.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# C3-002 asset_catalog_positive_command
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P3
|
||||
Gate:G3
|
||||
依赖:`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。
|
||||
34
docs/corrective/C3-003-asset-catalog-pilot-e2e.md
Normal file
34
docs/corrective/C3-003-asset-catalog-pilot-e2e.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# C3-003 asset_catalog_pilot_e2e
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P3
|
||||
Gate:G3
|
||||
依赖:`C3-002`
|
||||
lifecycleStatus:`done`
|
||||
blockedBy:`none`
|
||||
writeScope:`production_pilot`
|
||||
queueMutationAllowed:`false`
|
||||
|
||||
## 目标
|
||||
|
||||
在 Chromium production pilot 中运行同一 Asset Catalog fixture 和 command,覆盖
|
||||
至少五个正/负 cases:append、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。
|
||||
32
docs/corrective/C4-001-modifier-positive-pilot.md
Normal file
32
docs/corrective/C4-001-modifier-positive-pilot.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# C4-001 modifier_positive_pilot
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P4
|
||||
Gate:G4
|
||||
依赖:`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。
|
||||
32
docs/corrective/C4-002-mesh-positive-pilot.md
Normal file
32
docs/corrective/C4-002-mesh-positive-pilot.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# C4-002 mesh_positive_pilot
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P4
|
||||
Gate:G4
|
||||
依赖:`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。
|
||||
31
docs/corrective/C4-003-pilot-negative-matrix.md
Normal file
31
docs/corrective/C4-003-pilot-negative-matrix.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# C4-003 pilot_negative_matrix
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P4
|
||||
Gate:G4
|
||||
依赖:`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。
|
||||
28
docs/corrective/C5-001-cluster-legacy-gaps.md
Normal file
28
docs/corrective/C5-001-cluster-legacy-gaps.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# C5-001 cluster_legacy_gaps
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P5
|
||||
Gate:G4
|
||||
依赖:`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。
|
||||
30
docs/corrective/C5-002-modularize-gap-runner.md
Normal file
30
docs/corrective/C5-002-modularize-gap-runner.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# C5-002 modularize_gap_runner
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P5
|
||||
Gate:G4
|
||||
依赖:`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。
|
||||
31
docs/corrective/C5-003-migrate-legacy-gap-inventory.md
Normal file
31
docs/corrective/C5-003-migrate-legacy-gap-inventory.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# C5-003 migrate_legacy_gap_inventory
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P5
|
||||
Gate:G4
|
||||
依赖:`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`。
|
||||
29
docs/corrective/C6-001-chromium-workflow-gate.md
Normal file
29
docs/corrective/C6-001-chromium-workflow-gate.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# C6-001 chromium_workflow_gate
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P6
|
||||
Gate:G5
|
||||
依赖:`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`。
|
||||
29
docs/corrective/C6-002-performance-security-gate.md
Normal file
29
docs/corrective/C6-002-performance-security-gate.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# C6-002 performance_security_gate
|
||||
|
||||
状态:done
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P6
|
||||
Gate:G5
|
||||
依赖:`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。
|
||||
35
docs/corrective/C6-003-reactivate-queue.md
Normal file
35
docs/corrective/C6-003-reactivate-queue.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# C6-003 reactivate_queue
|
||||
|
||||
状态:in_progress
|
||||
计划:`BLENDER_WASM_CORRECTIVE_TASK_PLAN`
|
||||
阶段:P6
|
||||
Gate:G5
|
||||
依赖:`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
14
docs/status/C0-001.md
Normal 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
47
docs/status/C0-002.md
Normal 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
22
docs/status/C0-003.md
Normal 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
21
docs/status/C1-001.md
Normal 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
19
docs/status/C1-002.md
Normal 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
25
docs/status/C1-003.md
Normal 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
23
docs/status/C2-001.md
Normal 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
21
docs/status/C2-002.md
Normal 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
20
docs/status/C2-003.md
Normal 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
20
docs/status/C3-001.md
Normal 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
20
docs/status/C3-002.md
Normal 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
22
docs/status/C3-003.md
Normal 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
22
docs/status/C4-001.md
Normal 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
22
docs/status/C4-002.md
Normal 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
20
docs/status/C4-003.md
Normal 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
21
docs/status/C5-001.md
Normal 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
20
docs/status/C5-002.md
Normal 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
16
docs/status/C5-003.md
Normal 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
19
docs/status/C6-001.md
Normal 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
19
docs/status/C6-002.md
Normal 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
18
docs/status/C6-003.md
Normal 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/`.
|
||||
29
docs/status/M16-GAP-00276.md
Normal file
29
docs/status/M16-GAP-00276.md
Normal 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`
|
||||
28
docs/status/M16-GAP-00277.md
Normal file
28
docs/status/M16-GAP-00277.md
Normal 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`
|
||||
27
docs/status/M16-GAP-00278.md
Normal file
27
docs/status/M16-GAP-00278.md
Normal 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`
|
||||
27
docs/status/M16-GAP-00279.md
Normal file
27
docs/status/M16-GAP-00279.md
Normal 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`
|
||||
27
docs/status/M16-GAP-00280.md
Normal file
27
docs/status/M16-GAP-00280.md
Normal 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`
|
||||
27
docs/status/M16-GAP-00281.md
Normal file
27
docs/status/M16-GAP-00281.md
Normal 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`
|
||||
11
docs/status/WBV2-BASELINE.md
Normal file
11
docs/status/WBV2-BASELINE.md
Normal 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`
|
||||
22
docs/status/WBV2-P0-001.md
Normal file
22
docs/status/WBV2-P0-001.md
Normal 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`
|
||||
37
docs/tasks/M16-GAP-00277.md
Normal file
37
docs/tasks/M16-GAP-00277.md
Normal 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.
|
||||
37
docs/tasks/M16-GAP-00278.md
Normal file
37
docs/tasks/M16-GAP-00278.md
Normal 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.
|
||||
37
docs/tasks/M16-GAP-00279.md
Normal file
37
docs/tasks/M16-GAP-00279.md
Normal 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.
|
||||
37
docs/tasks/M16-GAP-00280.md
Normal file
37
docs/tasks/M16-GAP-00280.md
Normal 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.
|
||||
37
docs/tasks/M16-GAP-00281.md
Normal file
37
docs/tasks/M16-GAP-00281.md
Normal 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
47
docs/tasks/WBV2-P0-001.md
Normal 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
47
docs/tasks/WBV2-P0-002.md
Normal 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.
|
||||
18
nextTask.md
18
nextTask.md
@@ -27,9 +27,10 @@ stop condition is reached:
|
||||
2. Read only the current task card, parent manifest/status, and the focused
|
||||
files named by the task context. Never open the full
|
||||
`next-task-plan.json`, all `docs/status` logs, or historical plans.
|
||||
3. Complete exactly the current task: implement the scoped behavior, generate
|
||||
the fixture, run the focused desktop Blender check, npm comparator, and
|
||||
direct comparator, then verify save/reopen and the malformed/negative case.
|
||||
3. Complete exactly the current task using the commands in its task card. Legacy
|
||||
`M*-GAP-*` tasks are coverage-only; capability `WBV2-*` tasks own production
|
||||
behavior and may use shared desktop/WASM/Chromium runners. Do not run a
|
||||
desktop fixture or comparator unless the current card requires it.
|
||||
Chromium is the only permitted browser runtime.
|
||||
4. Keep long output in `tests/golden/<task>/command.log`; report only exit
|
||||
codes, short tails, artifact paths, and SHA-256 values.
|
||||
@@ -39,6 +40,7 @@ stop condition is reached:
|
||||
6. Run every post-handoff gate:
|
||||
|
||||
```bash
|
||||
node tools/web/check-execution-control-plane.mjs
|
||||
node tools/web/check-blender-next-task-plan.mjs
|
||||
node tools/web/check-task-index.mjs
|
||||
npm --prefix web run test:task-context
|
||||
@@ -238,12 +240,12 @@ Recorded: 2026-08-22 America/New_York
|
||||
|
||||
| Field | Value |
|
||||
| --- | --- |
|
||||
| Current task when this file was written | `M16-GAP-00227` |
|
||||
| Current task when this file was written | `WBV2-P0-002` |
|
||||
| Current task state | `in_progress` |
|
||||
| Parent manifest | `tests/golden/M16-GAP-00226/manifest.json` |
|
||||
| Current task card | `docs/tasks/M16-GAP-00227.md` |
|
||||
| Current task-context nextTask | `M16-GAP-00228` |
|
||||
| Focused command | `npm --prefix web run test:generated-gap -- --task M16-GAP-00227` |
|
||||
| Parent manifest | `tests/golden/WBV2-P0-001/manifest.json` |
|
||||
| Current task card | `docs/tasks/WBV2-P0-002.md` |
|
||||
| Current task-context nextTask | `WBV2-P0-003` |
|
||||
| Focused command | `node tools/web/check-execution-control-plane.mjs` |
|
||||
|
||||
The snapshot is informational and may become stale. On every resume, the queue,
|
||||
parent manifest, and fresh `print-task-context` output win. Never infer a task
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
tests/files/web/generated/WebGapAssetClearSingle.blend
Normal file
BIN
tests/files/web/generated/WebGapAssetClearSingle.blend
Normal file
Binary file not shown.
BIN
tests/files/web/generated/WebGapAssetLibraryRefresh.blend
Normal file
BIN
tests/files/web/generated/WebGapAssetLibraryRefresh.blend
Normal file
Binary file not shown.
BIN
tests/files/web/generated/WebGapAssetLibraryReloadListing.blend
Normal file
BIN
tests/files/web/generated/WebGapAssetLibraryReloadListing.blend
Normal file
Binary file not shown.
BIN
tests/files/web/generated/WebGapOpenContaining.blend
Normal file
BIN
tests/files/web/generated/WebGapOpenContaining.blend
Normal file
Binary file not shown.
@@ -273,5 +273,11 @@
|
||||
"operator:asset.catalog_undo",
|
||||
"operator:asset.catalog_undo_push",
|
||||
"operator:asset.catalogs_save",
|
||||
"operator:asset.clear"
|
||||
"operator:asset.clear",
|
||||
"operator:asset.clear_single",
|
||||
"operator:asset.library_refresh",
|
||||
"operator:asset.library_reload_listing",
|
||||
"operator:asset.mark",
|
||||
"operator:asset.mark_single",
|
||||
"operator:asset.open_containing_blend_file"
|
||||
]
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
},
|
||||
"completions": {
|
||||
"path": "tests/golden/M15-03A/completed-gap-tasks.json",
|
||||
"sha256": "32f4c11ebf8563f3aa500583f3979c1b38d711cc7328a428968118f0375b90b4"
|
||||
"sha256": "1dfc9c4ae8fb9a135e624ca4f9fe1ea10500ef16a2567a3cccdcfe48fbc38466"
|
||||
}
|
||||
},
|
||||
"summary": {
|
||||
"taskCount": 6900,
|
||||
"active": 1,
|
||||
"pending": 6624,
|
||||
"completed": 275,
|
||||
"pending": 6618,
|
||||
"completed": 281,
|
||||
"blocked": 0,
|
||||
"byWave": {
|
||||
"M16": 2667,
|
||||
@@ -6363,7 +6363,7 @@
|
||||
"gapId": "operator:asset.clear_single",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"sourceTask": "M15-01B",
|
||||
"state": "active",
|
||||
"state": "completed",
|
||||
"dependencies": [],
|
||||
"targetImplementationClass": "LOCAL_EXACT",
|
||||
"fixture": {
|
||||
@@ -6386,7 +6386,7 @@
|
||||
"gapId": "operator:asset.library_refresh",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"sourceTask": "M15-01B",
|
||||
"state": "pending",
|
||||
"state": "completed",
|
||||
"dependencies": [],
|
||||
"targetImplementationClass": "LOCAL_EXACT",
|
||||
"fixture": {
|
||||
@@ -6409,7 +6409,7 @@
|
||||
"gapId": "operator:asset.library_reload_listing",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"sourceTask": "M15-01B",
|
||||
"state": "pending",
|
||||
"state": "completed",
|
||||
"dependencies": [],
|
||||
"targetImplementationClass": "LOCAL_EXACT",
|
||||
"fixture": {
|
||||
@@ -6432,7 +6432,7 @@
|
||||
"gapId": "operator:asset.mark",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"sourceTask": "M15-01B",
|
||||
"state": "pending",
|
||||
"state": "completed",
|
||||
"dependencies": [],
|
||||
"targetImplementationClass": "LOCAL_EXACT",
|
||||
"fixture": {
|
||||
@@ -6455,7 +6455,7 @@
|
||||
"gapId": "operator:asset.mark_single",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"sourceTask": "M15-01B",
|
||||
"state": "pending",
|
||||
"state": "completed",
|
||||
"dependencies": [],
|
||||
"targetImplementationClass": "LOCAL_EXACT",
|
||||
"fixture": {
|
||||
@@ -6478,7 +6478,7 @@
|
||||
"gapId": "operator:asset.open_containing_blend_file",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"sourceTask": "M15-01B",
|
||||
"state": "pending",
|
||||
"state": "completed",
|
||||
"dependencies": [],
|
||||
"targetImplementationClass": "LOCAL_EXACT",
|
||||
"fixture": {
|
||||
@@ -6501,7 +6501,7 @@
|
||||
"gapId": "operator:asset.screenshot_preview",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"sourceTask": "M15-01B",
|
||||
"state": "pending",
|
||||
"state": "active",
|
||||
"dependencies": [],
|
||||
"targetImplementationClass": "LOCAL_EXACT",
|
||||
"fixture": {
|
||||
@@ -158734,7 +158734,7 @@
|
||||
]
|
||||
}
|
||||
],
|
||||
"firstTask": "M16-GAP-00276",
|
||||
"firstTask": "M16-GAP-00282",
|
||||
"closureGate": "M15-03E",
|
||||
"nextTask": "M15-03B"
|
||||
}
|
||||
|
||||
@@ -273,13 +273,13 @@
|
||||
{"id":"M16-GAP-00273","gapId":"operator:asset.catalog_undo_push","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00274","gapId":"operator:asset.catalogs_save","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00275","gapId":"operator:asset.clear","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00276","gapId":"operator:asset.clear_single","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"active","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00277","gapId":"operator:asset.library_refresh","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00278","gapId":"operator:asset.library_reload_listing","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00279","gapId":"operator:asset.mark","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00280","gapId":"operator:asset.mark_single","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00281","gapId":"operator:asset.open_containing_blend_file","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00282","gapId":"operator:asset.screenshot_preview","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00276","gapId":"operator:asset.clear_single","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00277","gapId":"operator:asset.library_refresh","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00278","gapId":"operator:asset.library_reload_listing","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00279","gapId":"operator:asset.mark","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00280","gapId":"operator:asset.mark_single","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00281","gapId":"operator:asset.open_containing_blend_file","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"completed","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00282","gapId":"operator:asset.screenshot_preview","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"active","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00283","gapId":"operator:asset.tag_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00284","gapId":"operator:asset.tag_remove","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
{"id":"M16-GAP-00285","gapId":"operator:boid.rule_add","ownerFamily":"OPERATOR","sourceTask":"M15-01B","state":"pending","targetImplementationClass":"LOCAL_EXACT"}
|
||||
|
||||
File diff suppressed because one or more lines are too long
18
tests/golden/M16-GAP-00192/WebGapAnimKeyingSetExportSet.py
Normal file
18
tests/golden/M16-GAP-00192/WebGapAnimKeyingSetExportSet.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Keying Set: WebGapAnimKeyingSetExportSet
|
||||
import bpy
|
||||
|
||||
scene = bpy.context.scene
|
||||
|
||||
# Keying Set Level declarations
|
||||
ks = scene.keying_sets.new(idname='WebGapAnimKeyingSetExportSet', name='WebGapAnimKeyingSetExportSet')
|
||||
ks.bl_description = ''
|
||||
|
||||
ks.use_insertkey_needed = False
|
||||
ks.use_insertkey_visual = False
|
||||
|
||||
# ID's that are commonly used
|
||||
id_0 = bpy.data.objects["WebGapAnimKeyingSetExportObject"]
|
||||
|
||||
# Path Definitions
|
||||
ksp = ks.paths.add(id_0, '["export_target"]', index=0)
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"after": {
|
||||
"filepath": "//WebGapAssetClearSingle.blend",
|
||||
"name": "WebGapAssetClearSingle.blend",
|
||||
"packed": false
|
||||
},
|
||||
"before": {
|
||||
"filepath": "//WebGapAssetClearSingle.blend",
|
||||
"name": "WebGapAssetClearSingle.blend",
|
||||
"packed": false
|
||||
},
|
||||
"blenderVersion": "5.2.0 LTS",
|
||||
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00276-operator-asset.clear_single.blend",
|
||||
"fixtureSha256": "28a672f360e4bfb459c3281999a811654a736e70949f721ee1e263e90b2c80fe",
|
||||
"mainMutation": "NONE",
|
||||
"operation": "ASSET_CLEAR_SINGLE_DESKTOP",
|
||||
"operatorStatus": "CANCELLED",
|
||||
"poll": false,
|
||||
"saveReopen": "EXACT",
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00276"
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00276",
|
||||
"operation": "ASSET_CLEAR_SINGLE_LOCAL_EXACT",
|
||||
"fixture": {
|
||||
"path": "tests/files/web/generated/M16-GAP-00276-operator-asset.clear_single.blend",
|
||||
"sha256": "28a672f360e4bfb459c3281999a811654a736e70949f721ee1e263e90b2c80fe"
|
||||
},
|
||||
"desktop": {
|
||||
"status": "EXACT",
|
||||
"report": "tests/golden/M16-GAP-00276/asset-clear-single-desktop-report.json",
|
||||
"poll": false,
|
||||
"operatorStatus": "CANCELLED",
|
||||
"mainMutation": "NONE"
|
||||
},
|
||||
"wasm": {
|
||||
"status": "EXACT",
|
||||
"libraryId": "library:WebGapAssetClearSingle.blend",
|
||||
"sourcePath": "//WebGapAssetClearSingle.blend",
|
||||
"libraryStatus": "EXTERNAL_REQUIRED",
|
||||
"dependencyIds": []
|
||||
},
|
||||
"saveReopen": "EXACT",
|
||||
"negative": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
},
|
||||
"nextTask": "M16-GAP-00277"
|
||||
}
|
||||
29
tests/golden/M16-GAP-00276/manifest.json
Normal file
29
tests/golden/M16-GAP-00276/manifest.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00276",
|
||||
"parentTask": "M16-GAP-00275",
|
||||
"enablingTask": false,
|
||||
"parityStateChange": true,
|
||||
"runtime": "BLENDER_5_2_LOCAL_EXACT",
|
||||
"operation": "ASSET_CLEAR_SINGLE_LOCAL_EXACT",
|
||||
"status": "done",
|
||||
"artifacts": {
|
||||
"parentManifest": {"path": "tests/golden/M16-GAP-00275/manifest.json", "sha256": "c0db50bd8d2a3cbe9fd609714d1cb3dce75e1942855666ebcf5f12446e414949"},
|
||||
"fixture": {"path": "tests/files/web/generated/M16-GAP-00276-operator-asset.clear_single.blend", "sha256": "28a672f360e4bfb459c3281999a811654a736e70949f721ee1e263e90b2c80fe"},
|
||||
"librarySource": {"path": "tests/files/web/generated/WebGapAssetClearSingle.blend", "sha256": "927e7d562a3f9f03416fed5c8e2943ad2bacf49a2c6e89ff7eb2f55ad9f51922"},
|
||||
"generator": {"path": "tools/web/generated/M16-GAP-00276.py", "sha256": "4db9afe38293f5fd231feb7e59b3a14323f19cb49d7d7b7a5d6e9fbd78e12da1"},
|
||||
"desktopChecker": {"path": "tools/web/check-action-asset-clear-single-desktop.py", "sha256": "14fee29a5e77fa4193f4a2c930e11dbf2e6a192f582ae71e74dfd157d5cae396"},
|
||||
"webChecker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "75ab17e39e0a575e13e1c73ca86214424c59a270d2ba1d83600ebb6937ecdb2c"},
|
||||
"reader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "9c0af422cc14634979497e2c8585e945a8402ab9f30b182d882da46786a1a711"},
|
||||
"nativeStub": {"path": "web/engine/web_engine_native_reader_stub.cpp", "sha256": "2a1526e08cf446bb23a91c8c2ae799db38a0aeed0a809a15ead427780600481a"},
|
||||
"wasm": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "aa26c3b422e79ff84557245dc8d5870125f237aa365ac7ebdc727c2d0b83f615"},
|
||||
"wasmPublic": {"path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "aa26c3b422e79ff84557245dc8d5870125f237aa365ac7ebdc727c2d0b83f615"},
|
||||
"wasmJs": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"},
|
||||
"wasmJsPublic": {"path": "web/app/public/vendor/blender/web_engine.js", "sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"},
|
||||
"desktopReport": {"path": "tests/golden/M16-GAP-00276/asset-clear-single-desktop-report.json", "sha256": "032345a71948560fa9348bbd73ff9f54508a808d0f6d3561b271aa4542aa49da"},
|
||||
"webReport": {"path": "tests/golden/M16-GAP-00276/asset-clear-single-local-exact-report.json", "sha256": "6a9329b1f8d4b09343d92cf2aeaffab2bb90c6cf0165de7cf7376bdab05680b6"},
|
||||
"status": {"path": "docs/status/M16-GAP-00276.md", "sha256": "95a58460d0eaf26559db74d42e8823338d89c00369f770ca8feca911d2bceba0"},
|
||||
"taskContext": {"path": "tests/golden/M16-GAP-00276/task-context.json", "sha256": "ccbd1d071bace3b02e53fa59922b6f93398ce1fc028c25083edd5bd8fc3926ec"}
|
||||
},
|
||||
"nextTask": "M16-GAP-00277"
|
||||
}
|
||||
185
tests/golden/M16-GAP-00276/task-context.json
Normal file
185
tests/golden/M16-GAP-00276/task-context.json
Normal file
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00276",
|
||||
"parentTask": "M16-GAP-00275",
|
||||
"status": "in_progress",
|
||||
"goal": "Make the same minimal fixture produce observable operator:asset.clear_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.",
|
||||
"scope": {
|
||||
"gap": "operator:asset.clear_single",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"implementationClass": "LOCAL_EXACT"
|
||||
},
|
||||
"commands": [
|
||||
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00276.py -- tests/files/web/generated/M16-GAP-00276-operator-asset.clear_single.blend",
|
||||
"npm --prefix web run test:generated-gap -- --task M16-GAP-00276",
|
||||
"node tools/web/check-generated-gap.mjs --task M16-GAP-00276"
|
||||
],
|
||||
"inputPaths": [
|
||||
"tools/web/generated/M16-GAP-00276.py"
|
||||
],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 1847,
|
||||
"contextRemainingTokens": 461
|
||||
},
|
||||
"source": {
|
||||
"bytes": 8057,
|
||||
"tokens": 2015
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "tools/web/generated/M16-GAP-00276.py",
|
||||
"bytes": 1457,
|
||||
"tokens": 365
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/files/web/generated/M16-GAP-00276-operator-asset.clear_single.blend",
|
||||
"bytes": 85897,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
|
||||
"bytes": 240371,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tools/web/check-generated-gap.mjs",
|
||||
"bytes": 831637,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00276/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00276.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00276/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 1,
|
||||
"bytes": 1457,
|
||||
"tokens": 365
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"desktop fixture evidence exists",
|
||||
"WASM uses the same fixture",
|
||||
"comparator passes",
|
||||
"save/reopen preserves Main",
|
||||
"manifest hashes all artifacts"
|
||||
],
|
||||
"nextTask": "M16-GAP-00277",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/M16-GAP-00276.md",
|
||||
"taskIndex": "tests/golden/M15-03A/task-index.json",
|
||||
"parentManifest": "tests/golden/M16-GAP-00275/manifest.json",
|
||||
"parentStatus": "docs/status/M16-GAP-00275.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/M16-GAP-00276.md",
|
||||
"tests/golden/M16-GAP-00275/manifest.json",
|
||||
"docs/status/M16-GAP-00275.md"
|
||||
],
|
||||
"machineOnly": [
|
||||
"tests/golden/M15-03A/task-index.json",
|
||||
"tests/golden/M15-03A/task-catalog.jsonl"
|
||||
],
|
||||
"optionalByNeed": [
|
||||
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
|
||||
"任务卡列出的精确协议/生产路径",
|
||||
"任务卡明确命名的长期计划小节"
|
||||
],
|
||||
"forbiddenByDefault": [
|
||||
"完整 CURRENT_EXECUTION_PLAN.md",
|
||||
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
|
||||
"全部 docs/status/*.md",
|
||||
"完整 parity/WBS 计划",
|
||||
"README 历史和 test-results/"
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"manifest": {
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00275",
|
||||
"parentTask": "M16-GAP-00274",
|
||||
"status": "done",
|
||||
"nextTask": "M16-GAP-00276",
|
||||
"artifactCount": 16
|
||||
},
|
||||
"statusSummary": [
|
||||
"# M16-GAP-00275 Status",
|
||||
"status: done",
|
||||
"task: asset.clear operator LOCAL_EXACT slice",
|
||||
"updated: 2026-08-23 America/New_York",
|
||||
"scope:",
|
||||
"- The fixture links one object from external `WebGapAssetClear.blend`.",
|
||||
" Blender desktop observes the no-local-asset boundary as `poll=false`,",
|
||||
" records `CANCELLED` for `ASSET_OT_clear`, and confirms no Main mutation."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1779,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 38,
|
||||
"taskTokens": 445
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2495,
|
||||
"lines": 47,
|
||||
"tokens": 624
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/M16-GAP-00276.md",
|
||||
"bytes": 1779,
|
||||
"lines": 38,
|
||||
"tokens": 445
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00275/manifest.json",
|
||||
"bytes": 2788,
|
||||
"lines": 30,
|
||||
"tokens": 697
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00275.md",
|
||||
"bytes": 995,
|
||||
"lines": 27,
|
||||
"tokens": 249
|
||||
}
|
||||
],
|
||||
"sourceTokens": 2015,
|
||||
"evidenceFiles": 1,
|
||||
"evidenceBytes": 1457,
|
||||
"evidenceTokens": 365,
|
||||
"totalTokens": 2380,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3404,
|
||||
"serializedContextTokens": 753,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"after": {
|
||||
"filepath": "//WebGapAssetLibraryRefresh.blend",
|
||||
"name": "WebGapAssetLibraryRefresh.blend",
|
||||
"packed": false
|
||||
},
|
||||
"before": {
|
||||
"filepath": "//WebGapAssetLibraryRefresh.blend",
|
||||
"name": "WebGapAssetLibraryRefresh.blend",
|
||||
"packed": false
|
||||
},
|
||||
"blenderVersion": "5.2.0 LTS",
|
||||
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00277-operator-asset.library_refresh.blend",
|
||||
"fixtureSha256": "afc722ccb0278518c4bae713a72642e2bec8789a0a7b12f6255ab9370782e437",
|
||||
"mainMutation": "NONE",
|
||||
"operation": "ASSET_LIBRARY_REFRESH_DESKTOP",
|
||||
"operatorStatus": "CANCELLED",
|
||||
"poll": false,
|
||||
"saveReopen": "EXACT",
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00277"
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00277",
|
||||
"operation": "ASSET_LIBRARY_REFRESH_LOCAL_EXACT",
|
||||
"fixture": {
|
||||
"path": "tests/files/web/generated/M16-GAP-00277-operator-asset.library_refresh.blend",
|
||||
"sha256": "afc722ccb0278518c4bae713a72642e2bec8789a0a7b12f6255ab9370782e437"
|
||||
},
|
||||
"desktop": {
|
||||
"status": "EXACT",
|
||||
"report": "tests/golden/M16-GAP-00277/asset-library-refresh-desktop-report.json",
|
||||
"poll": false,
|
||||
"operatorStatus": "CANCELLED",
|
||||
"mainMutation": "NONE"
|
||||
},
|
||||
"wasm": {
|
||||
"status": "EXACT",
|
||||
"libraryId": "library:WebGapAssetLibraryRefresh.blend",
|
||||
"sourcePath": "//WebGapAssetLibraryRefresh.blend",
|
||||
"libraryStatus": "EXTERNAL_REQUIRED",
|
||||
"dependencyIds": []
|
||||
},
|
||||
"saveReopen": "EXACT",
|
||||
"negative": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
},
|
||||
"nextTask": "M16-GAP-00278"
|
||||
}
|
||||
77
tests/golden/M16-GAP-00277/manifest.json
Normal file
77
tests/golden/M16-GAP-00277/manifest.json
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00277",
|
||||
"parentTask": "M16-GAP-00276",
|
||||
"enablingTask": false,
|
||||
"parityStateChange": true,
|
||||
"runtime": "BLENDER_5_2_LOCAL_EXACT",
|
||||
"operation": "ASSET_LIBRARY_REFRESH_LOCAL_EXACT",
|
||||
"status": "done",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/M16-GAP-00276/manifest.json",
|
||||
"sha256": "fa533919efd82e97be6e14a521f8ca8b64a5d12d125b5d3880f36c02bd502fc0"
|
||||
},
|
||||
"fixture": {
|
||||
"path": "tests/files/web/generated/M16-GAP-00277-operator-asset.library_refresh.blend",
|
||||
"sha256": "afc722ccb0278518c4bae713a72642e2bec8789a0a7b12f6255ab9370782e437"
|
||||
},
|
||||
"librarySource": {
|
||||
"path": "tests/files/web/generated/WebGapAssetLibraryRefresh.blend",
|
||||
"sha256": "c274d8aa13b1dff0808a34289387b71c1ea2733e5feb8dfba7c4894af2728247"
|
||||
},
|
||||
"generator": {
|
||||
"path": "tools/web/generated/M16-GAP-00277.py",
|
||||
"sha256": "feaeb2df7ff3b127a7a16900f5a210548e035872433b05e53061d95876602503"
|
||||
},
|
||||
"desktopChecker": {
|
||||
"path": "tools/web/check-action-asset-library-refresh-desktop.py",
|
||||
"sha256": "ae264963a87d8bbd9c82a0806fb64b79731ddf7ee2efdf30170dffdc3c7aa452"
|
||||
},
|
||||
"webChecker": {
|
||||
"path": "tools/web/check-generated-gap.mjs",
|
||||
"sha256": "74f5e88ba582aef9ec7173d222845d8bbe477ee2b58e58387bd22b72afed5301"
|
||||
},
|
||||
"reader": {
|
||||
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
|
||||
"sha256": "9c0af422cc14634979497e2c8585e945a8402ab9f30b182d882da46786a1a711"
|
||||
},
|
||||
"nativeStub": {
|
||||
"path": "web/engine/web_engine_native_reader_stub.cpp",
|
||||
"sha256": "2a1526e08cf446bb23a91c8c2ae799db38a0aeed0a809a15ead427780600481a"
|
||||
},
|
||||
"wasm": {
|
||||
"path": "web/app/src/vendor/blender/web_engine.wasm",
|
||||
"sha256": "aa26c3b422e79ff84557245dc8d5870125f237aa365ac7ebdc727c2d0b83f615"
|
||||
},
|
||||
"wasmPublic": {
|
||||
"path": "web/app/public/vendor/blender/web_engine.wasm",
|
||||
"sha256": "aa26c3b422e79ff84557245dc8d5870125f237aa365ac7ebdc727c2d0b83f615"
|
||||
},
|
||||
"wasmJs": {
|
||||
"path": "web/app/src/vendor/blender/web_engine.js",
|
||||
"sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"
|
||||
},
|
||||
"wasmJsPublic": {
|
||||
"path": "web/app/public/vendor/blender/web_engine.js",
|
||||
"sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"
|
||||
},
|
||||
"desktopReport": {
|
||||
"path": "tests/golden/M16-GAP-00277/asset-library-refresh-desktop-report.json",
|
||||
"sha256": "535b7e49f358b454c59a7377859c2fc1d0670a7558b23cbba7db6e901138342f"
|
||||
},
|
||||
"webReport": {
|
||||
"path": "tests/golden/M16-GAP-00277/asset-library-refresh-local-exact-report.json",
|
||||
"sha256": "abaf6522c6aa2fc8e02f558717e18add7a731a7e42f4728877280d815b9e216b"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/M16-GAP-00277.md",
|
||||
"sha256": "463c5b20a9010ca2af33989442f23ad4723001f7b96650cd40116456c0490da4"
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/M16-GAP-00277/task-context.json",
|
||||
"sha256": "1cf23718ef2778a6b3085119f49606a541f09135fd7fe4619dc77b96ea452664"
|
||||
}
|
||||
},
|
||||
"nextTask": "M16-GAP-00278"
|
||||
}
|
||||
185
tests/golden/M16-GAP-00277/task-context.json
Normal file
185
tests/golden/M16-GAP-00277/task-context.json
Normal file
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00277",
|
||||
"parentTask": "M16-GAP-00276",
|
||||
"status": "in_progress",
|
||||
"goal": "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.",
|
||||
"scope": {
|
||||
"gap": "operator:asset.library_refresh",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"implementationClass": "LOCAL_EXACT"
|
||||
},
|
||||
"commands": [
|
||||
"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"
|
||||
],
|
||||
"inputPaths": [
|
||||
"tools/web/generated/M16-GAP-00277.py"
|
||||
],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 1562,
|
||||
"contextRemainingTokens": 389
|
||||
},
|
||||
"source": {
|
||||
"bytes": 8342,
|
||||
"tokens": 2087
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "tools/web/generated/M16-GAP-00277.py",
|
||||
"bytes": 1472,
|
||||
"tokens": 368
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/files/web/generated/M16-GAP-00277-operator-asset.library_refresh.blend",
|
||||
"bytes": 85890,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
|
||||
"bytes": 240371,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tools/web/check-generated-gap.mjs",
|
||||
"bytes": 835228,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00277/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00277.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00277/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 1,
|
||||
"bytes": 1472,
|
||||
"tokens": 368
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"desktop fixture evidence exists",
|
||||
"WASM uses the same fixture",
|
||||
"comparator passes",
|
||||
"save/reopen preserves Main",
|
||||
"manifest hashes all artifacts"
|
||||
],
|
||||
"nextTask": "M16-GAP-00278",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/M16-GAP-00277.md",
|
||||
"taskIndex": "tests/golden/M15-03A/task-index.json",
|
||||
"parentManifest": "tests/golden/M16-GAP-00276/manifest.json",
|
||||
"parentStatus": "docs/status/M16-GAP-00276.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/M16-GAP-00277.md",
|
||||
"tests/golden/M16-GAP-00276/manifest.json",
|
||||
"docs/status/M16-GAP-00276.md"
|
||||
],
|
||||
"machineOnly": [
|
||||
"tests/golden/M15-03A/task-index.json",
|
||||
"tests/golden/M15-03A/task-catalog.jsonl"
|
||||
],
|
||||
"optionalByNeed": [
|
||||
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
|
||||
"任务卡列出的精确协议/生产路径",
|
||||
"任务卡明确命名的长期计划小节"
|
||||
],
|
||||
"forbiddenByDefault": [
|
||||
"完整 CURRENT_EXECUTION_PLAN.md",
|
||||
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
|
||||
"全部 docs/status/*.md",
|
||||
"完整 parity/WBS 计划",
|
||||
"README 历史和 test-results/"
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"manifest": {
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00276",
|
||||
"parentTask": "M16-GAP-00275",
|
||||
"status": "done",
|
||||
"nextTask": "M16-GAP-00277",
|
||||
"artifactCount": 16
|
||||
},
|
||||
"statusSummary": [
|
||||
"# 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."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1794,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 38,
|
||||
"taskTokens": 449
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2495,
|
||||
"lines": 47,
|
||||
"tokens": 624
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/M16-GAP-00277.md",
|
||||
"bytes": 1794,
|
||||
"lines": 38,
|
||||
"tokens": 449
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00276/manifest.json",
|
||||
"bytes": 2829,
|
||||
"lines": 30,
|
||||
"tokens": 708
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00276.md",
|
||||
"bytes": 1224,
|
||||
"lines": 30,
|
||||
"tokens": 306
|
||||
}
|
||||
],
|
||||
"sourceTokens": 2087,
|
||||
"evidenceFiles": 1,
|
||||
"evidenceBytes": 1472,
|
||||
"evidenceTokens": 368,
|
||||
"totalTokens": 2455,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3479,
|
||||
"serializedContextTokens": 755,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"after": {
|
||||
"filepath": "//WebGapAssetLibraryReloadListing.blend",
|
||||
"name": "WebGapAssetLibraryReloadListing.blend",
|
||||
"packed": false
|
||||
},
|
||||
"before": {
|
||||
"filepath": "//WebGapAssetLibraryReloadListing.blend",
|
||||
"name": "WebGapAssetLibraryReloadListing.blend",
|
||||
"packed": false
|
||||
},
|
||||
"blenderVersion": "5.2.0 LTS",
|
||||
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00278-operator-asset.library_reload_listing.blend",
|
||||
"fixtureSha256": "a00495252942d98e3fc89e8777220bf86dacadb71cea9c67b5181a27657cfb67",
|
||||
"mainMutation": "NONE",
|
||||
"operation": "ASSET_LIBRARY_RELOAD_LISTING_DESKTOP",
|
||||
"operatorStatus": "CANCELLED",
|
||||
"poll": false,
|
||||
"saveReopen": "EXACT",
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00278"
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00278",
|
||||
"operation": "ASSET_LIBRARY_RELOAD_LISTING_LOCAL_EXACT",
|
||||
"fixture": {
|
||||
"path": "tests/files/web/generated/M16-GAP-00278-operator-asset.library_reload_listing.blend",
|
||||
"sha256": "a00495252942d98e3fc89e8777220bf86dacadb71cea9c67b5181a27657cfb67"
|
||||
},
|
||||
"desktop": {
|
||||
"status": "EXACT",
|
||||
"report": "tests/golden/M16-GAP-00278/asset-library-reload-listing-desktop-report.json",
|
||||
"poll": false,
|
||||
"operatorStatus": "CANCELLED",
|
||||
"mainMutation": "NONE"
|
||||
},
|
||||
"wasm": {
|
||||
"status": "EXACT",
|
||||
"libraryId": "library:WebGapAssetLibraryReloadListing.blend",
|
||||
"sourcePath": "//WebGapAssetLibraryReloadListing.blend",
|
||||
"libraryStatus": "EXTERNAL_REQUIRED",
|
||||
"dependencyIds": []
|
||||
},
|
||||
"saveReopen": "EXACT",
|
||||
"negative": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
},
|
||||
"nextTask": "M16-GAP-00279"
|
||||
}
|
||||
29
tests/golden/M16-GAP-00278/manifest.json
Normal file
29
tests/golden/M16-GAP-00278/manifest.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00278",
|
||||
"parentTask": "M16-GAP-00277",
|
||||
"enablingTask": false,
|
||||
"parityStateChange": true,
|
||||
"runtime": "BLENDER_5_2_LOCAL_EXACT",
|
||||
"operation": "ASSET_LIBRARY_RELOAD_LISTING_LOCAL_EXACT",
|
||||
"status": "done",
|
||||
"artifacts": {
|
||||
"parentManifest": {"path": "tests/golden/M16-GAP-00277/manifest.json", "sha256": "e28fb129b023f3adca72433bb09a13a981705cd6a7c379f3f410120837d21f72"},
|
||||
"fixture": {"path": "tests/files/web/generated/M16-GAP-00278-operator-asset.library_reload_listing.blend", "sha256": "a00495252942d98e3fc89e8777220bf86dacadb71cea9c67b5181a27657cfb67"},
|
||||
"librarySource": {"path": "tests/files/web/generated/WebGapAssetLibraryReloadListing.blend", "sha256": "ff841fd2f2dba15fb990bba24856064aeced5a5339205de749af4451cbd4062e"},
|
||||
"generator": {"path": "tools/web/generated/M16-GAP-00278.py", "sha256": "bc00a04cc1fab867862b4ad54feb41cac8eb3507cba57e9ec7870c2989925784"},
|
||||
"desktopChecker": {"path": "tools/web/check-action-asset-library-reload-listing-desktop.py", "sha256": "b1bdfbcf5f2cb95afdc8309922e04437175ac90825517f6d3b2f5bc1098972a5"},
|
||||
"webChecker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "f0ce94b6bef7224d17c2f6ac280b1ed4b9fa780ff0c3422b759e098326d3050e"},
|
||||
"reader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "9c0af422cc14634979497e2c8585e945a8402ab9f30b182d882da46786a1a711"},
|
||||
"nativeStub": {"path": "web/engine/web_engine_native_reader_stub.cpp", "sha256": "2a1526e08cf446bb23a91c8c2ae799db38a0aeed0a809a15ead427780600481a"},
|
||||
"wasm": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "aa26c3b422e79ff84557245dc8d5870125f237aa365ac7ebdc727c2d0b83f615"},
|
||||
"wasmPublic": {"path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "aa26c3b422e79ff84557245dc8d5870125f237aa365ac7ebdc727c2d0b83f615"},
|
||||
"wasmJs": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"},
|
||||
"wasmJsPublic": {"path": "web/app/public/vendor/blender/web_engine.js", "sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"},
|
||||
"desktopReport": {"path": "tests/golden/M16-GAP-00278/asset-library-reload-listing-desktop-report.json", "sha256": "b99fee3dc4c04dfa89c50cf9d575a89b6363eebec97b3c07e5fda82c1c64f46a"},
|
||||
"webReport": {"path": "tests/golden/M16-GAP-00278/asset-library-reload-listing-local-exact-report.json", "sha256": "a25d22cded541a11baa4961993dfab85d7aee4510c213cc73d7b6131106b1da7"},
|
||||
"status": {"path": "docs/status/M16-GAP-00278.md", "sha256": "698c779a806776ec51183336d390fb0c8ed9a1ca558dc2e4f4e75ecfc0843741"},
|
||||
"taskContext": {"path": "tests/golden/M16-GAP-00278/task-context.json", "sha256": "898677874b73caeef7b00e5207fdf040fb4462f0730436f0d896f272a74a92ac"}
|
||||
},
|
||||
"nextTask": "M16-GAP-00279"
|
||||
}
|
||||
182
tests/golden/M16-GAP-00278/task-context.json
Normal file
182
tests/golden/M16-GAP-00278/task-context.json
Normal file
@@ -0,0 +1,182 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00278",
|
||||
"parentTask": "M16-GAP-00277",
|
||||
"status": "in_progress",
|
||||
"goal": "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.",
|
||||
"scope": {
|
||||
"gap": "operator:asset.library_reload_listing",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"implementationClass": "LOCAL_EXACT"
|
||||
},
|
||||
"commands": [
|
||||
"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"
|
||||
],
|
||||
"inputPaths": [],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 1277,
|
||||
"contextRemainingTokens": 318
|
||||
},
|
||||
"source": {
|
||||
"bytes": 8627,
|
||||
"tokens": 2158
|
||||
},
|
||||
"selected": [],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/files/web/generated/M16-GAP-00278-operator-asset.library_reload_listing.blend",
|
||||
"bytes": 85924,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tools/web/generated/M16-GAP-00278.py",
|
||||
"bytes": 1504,
|
||||
"reason": "CONTEXT_REMAINING_SPACE"
|
||||
},
|
||||
{
|
||||
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
|
||||
"bytes": 240371,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tools/web/check-generated-gap.mjs",
|
||||
"bytes": 838860,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00278/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00278.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00278/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 0,
|
||||
"bytes": 0,
|
||||
"tokens": 0
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"desktop fixture evidence exists",
|
||||
"WASM uses the same fixture",
|
||||
"comparator passes",
|
||||
"save/reopen preserves Main",
|
||||
"manifest hashes all artifacts"
|
||||
],
|
||||
"nextTask": "M16-GAP-00279",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/M16-GAP-00278.md",
|
||||
"taskIndex": "tests/golden/M15-03A/task-index.json",
|
||||
"parentManifest": "tests/golden/M16-GAP-00277/manifest.json",
|
||||
"parentStatus": "docs/status/M16-GAP-00277.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/M16-GAP-00278.md",
|
||||
"tests/golden/M16-GAP-00277/manifest.json",
|
||||
"docs/status/M16-GAP-00277.md"
|
||||
],
|
||||
"machineOnly": [
|
||||
"tests/golden/M15-03A/task-index.json",
|
||||
"tests/golden/M15-03A/task-catalog.jsonl"
|
||||
],
|
||||
"optionalByNeed": [
|
||||
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
|
||||
"任务卡列出的精确协议/生产路径",
|
||||
"任务卡明确命名的长期计划小节"
|
||||
],
|
||||
"forbiddenByDefault": [
|
||||
"完整 CURRENT_EXECUTION_PLAN.md",
|
||||
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
|
||||
"全部 docs/status/*.md",
|
||||
"完整 parity/WBS 计划",
|
||||
"README 历史和 test-results/"
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"manifest": {
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00277",
|
||||
"parentTask": "M16-GAP-00276",
|
||||
"status": "done",
|
||||
"nextTask": "M16-GAP-00278",
|
||||
"artifactCount": 16
|
||||
},
|
||||
"statusSummary": [
|
||||
"# 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"
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1829,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 38,
|
||||
"taskTokens": 458
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2495,
|
||||
"lines": 47,
|
||||
"tokens": 624
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/M16-GAP-00278.md",
|
||||
"bytes": 1829,
|
||||
"lines": 38,
|
||||
"tokens": 458
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00277/manifest.json",
|
||||
"bytes": 3135,
|
||||
"lines": 78,
|
||||
"tokens": 784
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00277.md",
|
||||
"bytes": 1168,
|
||||
"lines": 29,
|
||||
"tokens": 292
|
||||
}
|
||||
],
|
||||
"sourceTokens": 2158,
|
||||
"evidenceFiles": 0,
|
||||
"evidenceBytes": 0,
|
||||
"evidenceTokens": 0,
|
||||
"totalTokens": 2158,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3182,
|
||||
"serializedContextTokens": 725,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
30
tests/golden/M16-GAP-00279/asset-mark-desktop-report.json
Normal file
30
tests/golden/M16-GAP-00279/asset-mark-desktop-report.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"after": {
|
||||
"assetMarked": true,
|
||||
"author": "M16 Fixture",
|
||||
"description": "Asset mark operator fixture",
|
||||
"name": "WebGapAssetMarkObject",
|
||||
"tags": [
|
||||
"operator-mark"
|
||||
]
|
||||
},
|
||||
"before": {
|
||||
"assetMarked": true,
|
||||
"author": "M16 Fixture",
|
||||
"description": "Asset mark operator fixture",
|
||||
"name": "WebGapAssetMarkObject",
|
||||
"tags": [
|
||||
"operator-mark"
|
||||
]
|
||||
},
|
||||
"blenderVersion": "5.2.0 LTS",
|
||||
"fixture": "/home/mes123456/workinf_Blender_Wasm/tests/files/web/generated/M16-GAP-00279-operator-asset.mark.blend",
|
||||
"fixtureSha256": "e2d2ee3b4fc59538e519c4131e40b90f36a83cf84c4c6731db8bb2fd65538d8b",
|
||||
"mainMutation": "NONE",
|
||||
"operation": "ASSET_MARK_DESKTOP",
|
||||
"operatorStatus": "CANCELLED",
|
||||
"poll": false,
|
||||
"saveReopen": "EXACT",
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00279"
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00279",
|
||||
"operation": "ASSET_MARK_LOCAL_EXACT",
|
||||
"fixture": {
|
||||
"path": "tests/files/web/generated/M16-GAP-00279-operator-asset.mark.blend",
|
||||
"sha256": "e2d2ee3b4fc59538e519c4131e40b90f36a83cf84c4c6731db8bb2fd65538d8b"
|
||||
},
|
||||
"desktop": {
|
||||
"status": "EXACT",
|
||||
"report": "tests/golden/M16-GAP-00279/asset-mark-desktop-report.json",
|
||||
"poll": false,
|
||||
"operatorStatus": "CANCELLED",
|
||||
"mainMutation": "NONE"
|
||||
},
|
||||
"wasm": {
|
||||
"status": "EXACT",
|
||||
"objectId": "object:WebGapAssetMarkObject",
|
||||
"assetData": {
|
||||
"activeTag": 0,
|
||||
"author": "M16 Fixture",
|
||||
"catalogSimpleName": "",
|
||||
"copyright": "",
|
||||
"description": "Asset mark operator fixture",
|
||||
"license": "",
|
||||
"marked": true,
|
||||
"preferredImportMethod": 1,
|
||||
"tags": [
|
||||
"operator-mark"
|
||||
]
|
||||
}
|
||||
},
|
||||
"saveReopen": "EXACT",
|
||||
"negative": {
|
||||
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
|
||||
},
|
||||
"nextTask": "M16-GAP-00280"
|
||||
}
|
||||
29
tests/golden/M16-GAP-00279/manifest.json
Normal file
29
tests/golden/M16-GAP-00279/manifest.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00279",
|
||||
"parentTask": "M16-GAP-00278",
|
||||
"enablingTask": false,
|
||||
"parityStateChange": true,
|
||||
"runtime": "BLENDER_5_2_LOCAL_EXACT",
|
||||
"operation": "ASSET_MARK_LOCAL_EXACT",
|
||||
"status": "done",
|
||||
"artifacts": {
|
||||
"parentManifest": {"path": "tests/golden/M16-GAP-00278/manifest.json", "sha256": "5ea558d23c10de4933484ff6c926ce5971d71bc5190223ae9bf1b0536cb171a5"},
|
||||
"fixture": {"path": "tests/files/web/generated/M16-GAP-00279-operator-asset.mark.blend", "sha256": "e2d2ee3b4fc59538e519c4131e40b90f36a83cf84c4c6731db8bb2fd65538d8b"},
|
||||
"generator": {"path": "tools/web/generated/M16-GAP-00279.py", "sha256": "f6ea8cdec792b31ca1c7008046062b426e2c639bda03c490982beebc647b3536"},
|
||||
"desktopChecker": {"path": "tools/web/check-action-asset-mark-desktop.py", "sha256": "03605b412d6abadb89a2acbe7f34abc3f56b47569b1857a51cc57ef9f1569ac0"},
|
||||
"webChecker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "fd3d7ccd837b92b1087ea5f35da6777d094bac1f10dcfa4670c8ab133f018b04"},
|
||||
"reader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "050abd03517a7e826facadcfa241985c410865d46141997a31a97529da47cb1b"},
|
||||
"sceneIrProtocol": {"path": "web/protocol/scene-ir.ts", "sha256": "fbf15c996758dc9f2dab934ba7bb1252705453fe2b57f73a84cb37bfafa8a3b8"},
|
||||
"nativeStub": {"path": "web/engine/web_engine_native_reader_stub.cpp", "sha256": "2a1526e08cf446bb23a91c8c2ae799db38a0aeed0a809a15ead427780600481a"},
|
||||
"wasm": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "269a4bbff670e0cbc8c2fd6cc3eabfadc03ba50929b30c8bd3695d958f399169"},
|
||||
"wasmPublic": {"path": "web/app/public/vendor/blender/web_engine.wasm", "sha256": "269a4bbff670e0cbc8c2fd6cc3eabfadc03ba50929b30c8bd3695d958f399169"},
|
||||
"wasmJs": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"},
|
||||
"wasmJsPublic": {"path": "web/app/public/vendor/blender/web_engine.js", "sha256": "2263ccecdf7193aeb8508119accfe01c65fa991124969e0e7ede7b3af3057b35"},
|
||||
"desktopReport": {"path": "tests/golden/M16-GAP-00279/asset-mark-desktop-report.json", "sha256": "907c40ffa8d36efe882300b5261ca7ef459b8420928c3c52a8a1a52d2c97fdfc"},
|
||||
"webReport": {"path": "tests/golden/M16-GAP-00279/asset-mark-local-exact-report.json", "sha256": "089816cd63bd18eecf95ebbc0b6e363e6e452db6b15c4d5ce4e6ba702d364fc1"},
|
||||
"status": {"path": "docs/status/M16-GAP-00279.md", "sha256": "002721d45174316fdef73861acf389f130f5c10bc37ad398edb4fa1e73ad1ad0"},
|
||||
"taskContext": {"path": "tests/golden/M16-GAP-00279/task-context.json", "sha256": "402cd9054d04c0e13fe2f9fa18271f46c3cecdb02e89ae4062f44643131513de"}
|
||||
},
|
||||
"nextTask": "M16-GAP-00280"
|
||||
}
|
||||
185
tests/golden/M16-GAP-00279/task-context.json
Normal file
185
tests/golden/M16-GAP-00279/task-context.json
Normal file
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00279",
|
||||
"parentTask": "M16-GAP-00278",
|
||||
"status": "in_progress",
|
||||
"goal": "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.",
|
||||
"scope": {
|
||||
"gap": "operator:asset.mark",
|
||||
"ownerFamily": "OPERATOR",
|
||||
"implementationClass": "LOCAL_EXACT"
|
||||
},
|
||||
"commands": [
|
||||
"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"
|
||||
],
|
||||
"inputPaths": [
|
||||
"tools/web/generated/M16-GAP-00279.py"
|
||||
],
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 1590,
|
||||
"contextRemainingTokens": 397
|
||||
},
|
||||
"source": {
|
||||
"bytes": 8314,
|
||||
"tokens": 2079
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "tools/web/generated/M16-GAP-00279.py",
|
||||
"bytes": 1153,
|
||||
"tokens": 289
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/files/web/generated/M16-GAP-00279-operator-asset.mark.blend",
|
||||
"bytes": 86527,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
|
||||
"bytes": 242091,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tools/web/check-generated-gap.mjs",
|
||||
"bytes": 842156,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00279/",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00279.md",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00279/manifest.json",
|
||||
"bytes": null,
|
||||
"reason": "GENERATED_EVIDENCE_OUTPUT"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 1,
|
||||
"bytes": 1153,
|
||||
"tokens": 289
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"desktop fixture evidence exists",
|
||||
"WASM uses the same fixture",
|
||||
"comparator passes",
|
||||
"save/reopen preserves Main",
|
||||
"manifest hashes all artifacts"
|
||||
],
|
||||
"nextTask": "M16-GAP-00280",
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/M16-GAP-00279.md",
|
||||
"taskIndex": "tests/golden/M15-03A/task-index.json",
|
||||
"parentManifest": "tests/golden/M16-GAP-00278/manifest.json",
|
||||
"parentStatus": "docs/status/M16-GAP-00278.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/M16-GAP-00279.md",
|
||||
"tests/golden/M16-GAP-00278/manifest.json",
|
||||
"docs/status/M16-GAP-00278.md"
|
||||
],
|
||||
"machineOnly": [
|
||||
"tests/golden/M15-03A/task-index.json",
|
||||
"tests/golden/M15-03A/task-catalog.jsonl"
|
||||
],
|
||||
"optionalByNeed": [
|
||||
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
|
||||
"任务卡列出的精确协议/生产路径",
|
||||
"任务卡明确命名的长期计划小节"
|
||||
],
|
||||
"forbiddenByDefault": [
|
||||
"完整 CURRENT_EXECUTION_PLAN.md",
|
||||
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
|
||||
"全部 docs/status/*.md",
|
||||
"完整 parity/WBS 计划",
|
||||
"README 历史和 test-results/"
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"manifest": {
|
||||
"schemaVersion": 1,
|
||||
"task": "M16-GAP-00278",
|
||||
"parentTask": "M16-GAP-00277",
|
||||
"status": "done",
|
||||
"nextTask": "M16-GAP-00279",
|
||||
"artifactCount": 16
|
||||
},
|
||||
"statusSummary": [
|
||||
"# 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."
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1739,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 38,
|
||||
"taskTokens": 435
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 2495,
|
||||
"lines": 47,
|
||||
"tokens": 624
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/M16-GAP-00279.md",
|
||||
"bytes": 1739,
|
||||
"lines": 38,
|
||||
"tokens": 435
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/M16-GAP-00278/manifest.json",
|
||||
"bytes": 2888,
|
||||
"lines": 30,
|
||||
"tokens": 722
|
||||
},
|
||||
{
|
||||
"path": "docs/status/M16-GAP-00278.md",
|
||||
"bytes": 1192,
|
||||
"lines": 28,
|
||||
"tokens": 298
|
||||
}
|
||||
],
|
||||
"sourceTokens": 2079,
|
||||
"evidenceFiles": 1,
|
||||
"evidenceBytes": 1153,
|
||||
"evidenceTokens": 289,
|
||||
"totalTokens": 2368,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3392,
|
||||
"serializedContextTokens": 747,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user